diff options
author | Keith Whitwell <[email protected]> | 2003-11-21 15:49:24 +0000 |
---|---|---|
committer | Keith Whitwell <[email protected]> | 2003-11-21 15:49:24 +0000 |
commit | 3ec97611d2dc04e27c2ab6a9b1c15ac0bbd0b589 (patch) | |
tree | c1b8932d709403c2a3050714a9750978718ebf21 /src/mesa | |
parent | f2f09abce4c6ac398eb8623ea89ec4419e48e2a4 (diff) |
Merge head into branch
Diffstat (limited to 'src/mesa')
255 files changed, 21569 insertions, 17795 deletions
diff --git a/src/mesa/Makefile.OSMesa16 b/src/mesa/Makefile.OSMesa16 new file mode 100644 index 00000000000..f451685a1a2 --- /dev/null +++ b/src/mesa/Makefile.OSMesa16 @@ -0,0 +1,300 @@ + +# Mesa 3-D graphics library +# Version: 5.1 +# Copyright (C) 1995-2003 Brian Paul + +# Makefile for building Mesa for 16/32-bit/channel rendering with the OSMesa +# driver. + + +##### MACROS ##### + +TOP = ../.. + +GL_MAJOR = 1 +GL_MINOR = 4 +GL_TINY = 0$(MESA_MAJOR)0$(MESA_MINOR)0$(MESA_TINY) + +GL_LIB_NAME = "GL" # may be overridden in Make-config +OSMESA_LIB_NAME = "OSMesa16" # may be overridden in Make-config + +VPATH = RCS + +LIBDIR = $(TOP)/lib + + +### Lists of source files + +MAIN_SOURCES = \ + main/api_arrayelt.c \ + main/api_loopback.c \ + main/api_noop.c \ + main/api_validate.c \ + main/accum.c \ + main/arbprogram.c \ + main/arbfragparse.c \ + main/arbvertparse.c \ + main/attrib.c \ + main/blend.c \ + main/bufferobj.c \ + main/buffers.c \ + main/clip.c \ + main/colortab.c \ + main/context.c \ + main/convolve.c \ + main/debug.c \ + main/depth.c \ + main/dispatch.c \ + main/dlist.c \ + main/drawpix.c \ + main/enable.c \ + main/enums.c \ + main/eval.c \ + main/extensions.c \ + main/feedback.c \ + main/fog.c \ + main/get.c \ + main/hash.c \ + main/hint.c \ + main/histogram.c \ + main/image.c \ + main/imports.c \ + main/light.c \ + main/lines.c \ + main/matrix.c \ + main/nvprogram.c \ + main/nvfragparse.c \ + main/nvvertexec.c \ + main/nvvertparse.c \ + main/occlude.c \ + main/pixel.c \ + main/points.c \ + main/polygon.c \ + main/program.c \ + main/rastpos.c \ + main/state.c \ + main/stencil.c \ + main/texcompress.c \ + main/texformat.c \ + main/teximage.c \ + main/texobj.c \ + main/texstate.c \ + main/texstore.c \ + main/texutil.c \ + main/varray.c \ + main/vtxfmt.c + +GLAPI_SOURCES = \ + glapi/glapi.c \ + glapi/glthread.c + +MATH_SOURCES = \ + math/m_debug_clip.c \ + math/m_debug_norm.c \ + math/m_debug_xform.c \ + math/m_eval.c \ + math/m_matrix.c \ + math/m_translate.c \ + math/m_vector.c \ + math/m_xform.c + +ARRAY_CACHE_SOURCES = \ + array_cache/ac_context.c \ + array_cache/ac_import.c + +SWRAST_SOURCES = \ + swrast/s_aaline.c \ + swrast/s_aatriangle.c \ + swrast/s_accum.c \ + swrast/s_alpha.c \ + swrast/s_alphabuf.c \ + swrast/s_bitmap.c \ + swrast/s_blend.c \ + swrast/s_buffers.c \ + swrast/s_copypix.c \ + swrast/s_context.c \ + swrast/s_depth.c \ + swrast/s_drawpix.c \ + swrast/s_feedback.c \ + swrast/s_fog.c \ + swrast/s_imaging.c \ + swrast/s_lines.c \ + swrast/s_logic.c \ + swrast/s_masking.c \ + swrast/s_nvfragprog.c \ + swrast/s_pixeltex.c \ + swrast/s_points.c \ + swrast/s_readpix.c \ + swrast/s_span.c \ + swrast/s_stencil.c \ + swrast/s_texture.c \ + swrast/s_texstore.c \ + swrast/s_triangle.c \ + swrast/s_zoom.c + +SWRAST_SETUP_SOURCES = \ + swrast_setup/ss_context.c \ + swrast_setup/ss_triangle.c \ + swrast_setup/ss_vb.c + +TNL_SOURCES = \ + tnl/t_array_api.c \ + tnl/t_array_import.c \ + tnl/t_context.c \ + tnl/t_eval_api.c \ + tnl/t_imm_alloc.c \ + tnl/t_imm_api.c \ + tnl/t_imm_debug.c \ + tnl/t_imm_dlist.c \ + tnl/t_imm_elt.c \ + tnl/t_imm_eval.c \ + tnl/t_imm_exec.c \ + tnl/t_imm_fixup.c \ + tnl/t_pipeline.c \ + tnl/t_vb_fog.c \ + tnl/t_vb_light.c \ + tnl/t_vb_normals.c \ + tnl/t_vb_points.c \ + tnl/t_vb_program.c \ + tnl/t_vb_render.c \ + tnl/t_vb_texgen.c \ + tnl/t_vb_texmat.c \ + tnl/t_vb_vertex.c + +ASM_C_SOURCES = \ + x86/x86.c \ + x86/common_x86.c \ + x86/3dnow.c \ + x86/sse.c \ + sparc/sparc.c + +X86_SOURCES = \ + x86/common_x86_asm.S \ + x86/glapi_x86.S \ + x86/x86_xform2.S \ + x86/x86_xform3.S \ + x86/x86_xform4.S \ + x86/x86_cliptest.S \ + x86/mmx_blend.S \ + x86/3dnow_xform1.S \ + x86/3dnow_xform2.S \ + x86/3dnow_xform3.S \ + x86/3dnow_xform4.S \ + x86/3dnow_normal.S \ + x86/sse_xform1.S \ + x86/sse_xform2.S \ + x86/sse_xform3.S \ + x86/sse_xform4.S \ + x86/sse_normal.S + +SPARC_SOURCES = \ + sparc/clip.S \ + sparc/glapi_sparc.S \ + sparc/norm.S \ + sparc/xform.S + +### Groups of files + +CORE_SOURCES = \ + $(MAIN_SOURCES) \ + $(GLAPI_SOURCES) \ + $(MATH_SOURCES) \ + $(ARRAY_CACHE_SOURCES) \ + $(SWRAST_SOURCES) \ + $(SWRAST_SETUP_SOURCES) \ + $(TNL_SOURCES) \ + $(ASM_C_SOURCES) + +# This will probably get set to $(X86_SOURCES) in Make-config: +ASM_SOURCES = + +OSMESA_DRIVER_SOURCES = \ + drivers/osmesa/osmesa.c + +### Object files + +CORE_OBJECTS = $(CORE_SOURCES:.c=.o) + +ASM_OBJECTS = $(ASM_SOURCES:.S=.o) + +OSMESA_OBJECTS = $(OSMESA_DRIVER_SOURCES:.c=.o) + +OBJECTS = \ + $(CORE_OBJECTS) \ + $(ASM_OBJECTS) \ + $(OSMESA_OBJECTS) + + +### Include directories + +INCLUDE_DIRS = \ + -I$(TOP)/include \ + -I$(TOP)/src/mesa \ + -I$(TOP)/src/mesa/main \ + -I$(TOP)/src/mesa/glapi \ + -I$(TOP)/src/mesa/math \ + -I$(TOP)/src/mesa/transform \ + -I$(TOP)/src/mesa/swrast \ + -I$(TOP)/src/mesa/swrast_setup + +##### RULES ##### + +.c.o: + $(CC) -c $(INCLUDE_DIRS) $(CFLAGS) $< -o $@ + +.S.o: + $(CC) -c $(INCLUDE_DIRS) $(CFLAGS) $< -o $@ + + +x86/matypes.h: main/mtypes.h tnl/t_context.h x86/gen_matypes.c + $(CC) $(INCLUDE_DIRS) $(CFLAGS) x86/gen_matypes.c -o x86/gen_matypes + ./x86/gen_matypes > x86/matypes.h + rm -f x86/gen_matypes x86/*.o + +x86/common_x86_asm.o: x86/matypes.h + + + +##### TARGETS ##### + +default: + @echo "Specify a target configuration" + + +targets: $(LIBDIR)/$(OSMESA16_LIB) + +# Make the 16-bit/channel OSMesa library +$(LIBDIR)/$(OSMESA16_LIB): $(OBJECTS) + $(TOP)/bin/mklib $(MAKELIB_FLAGS) -o $(OSMESA_LIB_NAME) -major $(GL_MAJOR) \ + -minor $(GL_MINOR) -patch $(GL_TINY) -install $(LIBDIR) \ + $(GL_LIB_DEPS) $(OBJECTS) + + + + +# +# Run 'make dep' to update the dependencies if you change what's included +# by any source file. +# +dep: $(CORE_SOURCES) $(OSMESA_DRIVER_SOURCES) $(ASM_SOURCES) + makedepend -fdepend -Y $(INCLUDE_DIRS) -DGGI -DSVGA -DFX \ + $(CORE_SOURCES) $(OSMESA_DRIVER_SOURCES) \ + $(ASM_SOURCES) + +dep: $(CORE_SOURCES) + makedepend -fdepend -Y -I../include $(CORE_SOURCES) + +tags: + etags `find . -name \*.[ch]` `find ../include` + + +# Remove .o and backup files +clean: + -rm *.a + -rm -f */*.o */*~ */*.o */*~ + -rm -f drivers/*/*.o + + +include $(TOP)/Make-config + +include depend diff --git a/src/mesa/Makefile.X11 b/src/mesa/Makefile.X11 index e62907b5523..c1706da5580 100644 --- a/src/mesa/Makefile.X11 +++ b/src/mesa/Makefile.X11 @@ -25,6 +25,7 @@ MAIN_SOURCES = \ main/api_noop.c \ main/api_validate.c \ main/accum.c \ + main/arbparse.c \ main/arbprogram.c \ main/arbfragparse.c \ main/arbvertparse.c \ @@ -207,7 +208,8 @@ GLIDE_DRIVER_SOURCES = \ drivers/glide/fxtexman.c \ drivers/glide/fxtris.c \ drivers/glide/fxvb.c \ - drivers/glide/fxglidew.c + drivers/glide/fxglidew.c \ + drivers/glide/fxg.c SVGA_DRIVER_SOURCES = \ drivers/svga/svgamesa.c \ @@ -234,11 +236,13 @@ CORE_SOURCES = \ # This will probably get set to $(X86_SOURCES) in Make-config: ASM_SOURCES = +ifndef SOLO # This should get set in Make-config someday: DRIVER_SOURCES = \ $(X11_DRIVER_SOURCES) \ $(GLIDE_DRIVER_SOURCES) \ $(SVGA_DRIVER_SOURCES) +endif ### Object files @@ -302,7 +306,7 @@ targets: $(LIBDIR)/$(GL_LIB) $(LIBDIR)/$(OSMESA_LIB) $(LIBMESA) $(LIBDIR)/$(GL_LIB): $(OBJECTS) $(TOP)/bin/mklib -o $(GL_LIB_NAME) -major $(GL_MAJOR) \ -minor $(GL_MINOR) -patch $(GL_TINY) -install $(LIBDIR) \ - $(GL_LIB_DEPS) $(OBJECTS) + $(MKLIB_OPTIONS) $(GL_LIB_DEPS) $(OBJECTS) # Make the OSMesa library @@ -311,7 +315,7 @@ $(LIBDIR)/$(OSMESA_LIB): $(OSMESA_OBJECTS) $(TOP)/bin/mklib -o $(OSMESA_LIB_NAME) -major $(MESA_MAJOR) \ -minor $(MESA_MINOR) -patch $(GL_TINY) -L$(LIBDIR) \ -l$(GL_LIB_NAME) -install $(LIBDIR) \ - $(OSMESA_OBJECTS) ; \ + $(MKLIB_OPTIONS) $(OSMESA_OBJECTS) ; \ fi @@ -346,9 +350,9 @@ tags: # Remove .o and backup files clean: - -rm *.a + -rm -f *.a -rm -f */*.o */*~ */*.o */*~ - -rm -f drivers/*/*.o + -rm -f drivers/*/*.o drivers/*/*/*.o include $(TOP)/Make-config diff --git a/src/mesa/Makefile.mgw b/src/mesa/Makefile.mgw index 0834908ec14..33ea665d29c 100644 --- a/src/mesa/Makefile.mgw +++ b/src/mesa/Makefile.mgw @@ -335,10 +335,10 @@ x86/gen_matypes.exe: x86/gen_matypes.c $(CC) -o $@ $(CFLAGS) -s $< # [dBorca] Hack alert: -# use standard API, to work around Win32 @x names -# also glapi_x86.S is protected against __WIN32__ -main/dispatch.o: main/dispatch.c - $(CC) -o $@ $(CFLAGS) -UUSE_X86_ASM -c $< +# glapi_x86.S needs some adjustments +# in order to generate correct entrypoints +x86/glapi_x86.o: x86/glapi_x86.S + $(CC) -o $@ $(CFLAGS) -U__WIN32__ -DSTDCALL_API -c $< clean: -$(call UNLINK,array_cache/*.o) diff --git a/src/mesa/Makefile.wfx b/src/mesa/Makefile.wfx new file mode 100644 index 00000000000..4a95afe644e --- /dev/null +++ b/src/mesa/Makefile.wfx @@ -0,0 +1,435 @@ +# Mesa 3-D graphics library +# Version: 5.1 +# +# Copyright (C) 1999-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. + +# Win32/FX core makefile for Mesa +# +# Copyright (c) 2003 - Hiroshi Morii +# Email : [email protected] +# URL : http://www.3dfxzone.it/koolsmoky + +# Debug build : nmake -f Makefile.fx.win32 DEBUG=1 +# Optimized build : nmake -f Makefile.fx.win32 +# Remove objects : nmake -f Makefile.fx.win32 clean +# Remove files in bin, lib : nmake -f Makefile.fx.win32 clobber +# Remove all generated files : nmake -f Makefile.fx.win32 realclean + +.SUFFIXES: .S +################################## +# general +################################## +BUILDROOT = ..\.. + +!if "$(GLIDE3SDK)"=="" +GLIDE3SDK = $(BUILDROOT)\glide3 +!endif + +!if "$(GLIDE3SDK)"=="" +!error GLIDE3SDK undefined! Need to specify Glide3x SDK path! +!endif + +GLIDE3LIB = $(GLIDE3SDK)\lib\glide3x.lib +TEXUS2LIB = #$(GLIDE3SDK)\lib\texus2.lib +LIBDIR = $(BUILDROOT)\lib +GL_DLL = OpenGL32.dll + +HAVE_X86 = 1 +HAVE_MMX = 1 +HAVE_SSE = +HAVE_3DNOW = 1 + +################################## +# build flags +################################## +FLAGS = -DH3 -DFX_GLIDE_NAPALM=1 -DH4=1 -DFX_GLIDE_H5_CSIM=1 -DGLIDE3=1 -DGLIDE3_ALPHA=1 -DBUILD_GL32 -DFX #-DGLX_DIRECT_RENDERING + +!if "$(USE_IEEE)"=="1" +FLAGS = $(FLAGS) -D__i386__ +!endif + +!if "$(HAVE_MMX)"=="1" +FLAGS = $(FLAGS) -DUSE_MMX_ASM +!endif +!if "$(HAVE_SSE)"=="1" +FLAGS = $(FLAGS) -DUSE_SSE_ASM +!endif +!if "$(HAVE_3DNOW)"=="1" +FLAGS = $(FLAGS) -DUSE_3DNOW_ASM +!endif +!if "$(HAVE_X86)"=="1" +FLAGS = $(FLAGS) -DUSE_X86_ASM +!endif + +!if "$(DEBUG)" == "1" +FLAGS = $(FLAGS) -DMESA_DEBUG -DFX_DEBUG +!endif + +################################## +# compiler setup +################################## +CC = cl +LINK = link +AR = lib +AS = nasm + +CFLAGS = -nologo -G6 -c -D__MSC__ -D_MSC_VER=1200 -D_WIN32 -DWIN32 -DSTRICT -W3 #-WX -D__WIN32__ +LFLAGS = -nologo /DLL /OPT:WIN98 /MACHINE:IX86 /NODEFAULTLIB #/SUBSYSTEM:WINDOWS,4.00 +ARFLAGS = -nologo +ASFLAGS = -O2 -fwin32 + +!if "$(DEBUG)"== "1" +CFLAGS = $(CFLAGS) -Od -MDd -DDEBUG=1 -D_DEBUG -D_MT -Zi #-D_DLL conflicts with BUILD_GL32 +LFLAGS = $(LFLAGS) -debugtype:both /DEBUG +ARFLAGS = $(ARFLAGS) -debugtype:both +ASFLAGS = $(ASFLAGS) -g -DDEBUG=1 +!else +CFLAGS = $(CFLAGS) -Ox -MD -D_MT +!endif + +################################# +# OS commands +################################# +RM = @del +MV = mv + +################################# +# sources +################################# +MAIN_SOURCES = \ + main\api_arrayelt.c \ + main\api_loopback.c \ + main\api_noop.c \ + main\api_validate.c \ + main\accum.c \ + main\arbprogram.c \ + main\arbfragparse.c \ + main\arbvertparse.c \ + main\attrib.c \ + main\blend.c \ + main\bufferobj.c \ + main\buffers.c \ + main\clip.c \ + main\colortab.c \ + main\context.c \ + main\convolve.c \ + main\debug.c \ + main\depth.c \ + main\dispatch.c \ + main\dlist.c \ + main\drawpix.c \ + main\enable.c \ + main\enums.c \ + main\eval.c \ + main\extensions.c \ + main\feedback.c \ + main\fog.c \ + main\get.c \ + main\hash.c \ + main\hint.c \ + main\histogram.c \ + main\image.c \ + main\imports.c \ + main\light.c \ + main\lines.c \ + main\matrix.c \ + main\nvprogram.c \ + main\nvfragparse.c \ + main\nvvertexec.c \ + main\nvvertparse.c \ + main\occlude.c \ + main\pixel.c \ + main\points.c \ + main\polygon.c \ + main\program.c \ + main\rastpos.c \ + main\state.c \ + main\stencil.c \ + main\texcompress.c \ + main\texformat.c \ + main\teximage.c \ + main\texobj.c \ + main\texstate.c \ + main\texstore.c \ + main\texutil.c \ + main\varray.c \ + main\vtxfmt.c + +GLAPI_SOURCES = \ + glapi\glapi.c \ + glapi\glthread.c + +MATH_SOURCES = \ + math\m_debug_clip.c \ + math\m_debug_norm.c \ + math\m_debug_xform.c \ + math\m_eval.c \ + math\m_matrix.c \ + math\m_translate.c \ + math\m_vector.c \ + math\m_xform.c + +ARRAY_CACHE_SOURCES = \ + array_cache\ac_context.c \ + array_cache\ac_import.c + +SWRAST_SOURCES = \ + swrast\s_aaline.c \ + swrast\s_aatriangle.c \ + swrast\s_accum.c \ + swrast\s_alpha.c \ + swrast\s_alphabuf.c \ + swrast\s_bitmap.c \ + swrast\s_blend.c \ + swrast\s_buffers.c \ + swrast\s_copypix.c \ + swrast\s_context.c \ + swrast\s_depth.c \ + swrast\s_drawpix.c \ + swrast\s_feedback.c \ + swrast\s_fog.c \ + swrast\s_imaging.c \ + swrast\s_lines.c \ + swrast\s_logic.c \ + swrast\s_masking.c \ + swrast\s_nvfragprog.c \ + swrast\s_pixeltex.c \ + swrast\s_points.c \ + swrast\s_readpix.c \ + swrast\s_span.c \ + swrast\s_stencil.c \ + swrast\s_texture.c \ + swrast\s_texstore.c \ + swrast\s_triangle.c \ + swrast\s_zoom.c + +SWRAST_SETUP_SOURCES = \ + swrast_setup\ss_context.c \ + swrast_setup\ss_triangle.c \ + swrast_setup\ss_vb.c + +TNL_SOURCES = \ + tnl\t_array_api.c \ + tnl\t_array_import.c \ + tnl\t_context.c \ + tnl\t_eval_api.c \ + tnl\t_imm_alloc.c \ + tnl\t_imm_api.c \ + tnl\t_imm_debug.c \ + tnl\t_imm_dlist.c \ + tnl\t_imm_elt.c \ + tnl\t_imm_eval.c \ + tnl\t_imm_exec.c \ + tnl\t_imm_fixup.c \ + tnl\t_pipeline.c \ + tnl\t_vb_fog.c \ + tnl\t_vb_light.c \ + tnl\t_vb_normals.c \ + tnl\t_vb_points.c \ + tnl\t_vb_program.c \ + tnl\t_vb_render.c \ + tnl\t_vb_texgen.c \ + tnl\t_vb_texmat.c \ + tnl\t_vb_vertex.c + +DRIVER_SOURCES = \ + drivers\glide\fxapi.c \ + drivers\glide\fxdd.c \ + drivers\glide\fxddspan.c \ + drivers\glide\fxddtex.c \ + drivers\glide\fxsetup.c \ + drivers\glide\fxtexman.c \ + drivers\glide\fxtris.c \ + drivers\glide\fxvb.c \ + drivers\glide\fxglidew.c \ + drivers\glide\fxwgl.c \ + drivers\glide\fxg.c + +X86_SOURCES = \ + x86\x86.c \ + x86\glapi_x86.S \ + x86\common_x86.c \ + x86\common_x86_asm.S \ + x86\x86_xform2.S \ + x86\x86_xform3.S \ + x86\x86_xform4.S \ + x86\x86_cliptest.S + +MMX_SOURCES = \ + x86\mmx_blend.S + +SSE_SOURCES = \ + x86\sse.c \ + x86\sse_xform2.S \ + x86\sse_xform3.S \ + x86\sse_xform4.S \ + x86\sse_normal.S + +K3D_SOURCES = \ + x86\3dnow.c \ + x86\3dnow_xform2.S \ + x86\3dnow_xform3.S \ + x86\3dnow_xform4.S \ + x86\3dnow_normal.S + +!if "$(HAVE_MMX)"=="1" +X86_SOURCES = $(X86_SOURCES) $(MMX_SOURCES) +HAVE_X86 = 1 +!endif +!if "$(HAVE_SSE)"=="1" +X86_SOURCES = $(X86_SOURCES) $(SSE_SOURCES) +HAVE_X86 = 1 +!endif +!if "$(HAVE_3DNOW)"=="1" +X86_SOURCES = $(X86_SOURCES) $(K3D_SOURCES) +HAVE_X86 = 1 +!endif +!if "$(HAVE_X86)"=="1" +!else +X86_SOURCES = +!endif + +EXPORTS = drivers\glide\fxopengl.def + +MAIN_OBJS = $(MAIN_SOURCES:.c=.obj) +GLAPI_OBJS = $(GLAPI_SOURCES:.c=.obj) +MATH_OBJS = $(MATH_SOURCES:.c=.obj) +ARRAY_CACHE_OBJS = $(ARRAY_CACHE_SOURCES:.c=.obj) +SWRAST_OBJS = $(SWRAST_SOURCES:.c=.obj) +SWRAST_SETUP_OBJS = $(SWRAST_SETUP_SOURCES:.c=.obj) +TNL_OBJS = $(TNL_SOURCES:.c=.obj) +DRIVER_OBJS = $(DRIVER_SOURCES:.c=.obj) +X86_OBJS = $(X86_SOURCES:.c=.obj) +X86_OBJS = $(X86_OBJS:.S=.obj) + +RES = drivers\glide\fx.res + +CORE_LIBS = \ + $(LIBDIR)\main.lib \ + $(LIBDIR)\glapi.lib \ + $(LIBDIR)\math.lib \ + $(LIBDIR)\array_cache.lib \ + $(LIBDIR)\swrast.lib \ + $(LIBDIR)\swarst_setup.lib \ + $(LIBDIR)\tnl.lib + +!if "$(X86_SOURCES)"!="" +X86_LIB = $(LIBDIR)\x86.lib +!else +X86_LIB = +!endif + +INCS = -I$(BUILDROOT)\include \ + -I. \ + -I.\drivers\glide \ + -I.\main \ + -I.\glapi \ + -I$(GLIDE3SDK)\include + +DEP_LIB = user32.lib gdi32.lib kernel32.lib + +!if "$(DEBUG)" == "1" +STD_LIB = MSVCRTD.lib +!else +STD_LIB = MSVCRT.lib +!endif + +################################# +# build rules +################################# +default:: all + +all: $(X86_LIB) $(CORE_LIBS) $(LIBDIR)\$(GL_DLL) + +$(LIBDIR)\$(GL_DLL): $(DRIVER_OBJS) $(CORE_LIBS) $(X86_LIB) $(RES) + $(LINK) -out:$@ -def:$(EXPORTS) $(LFLAGS) $(DRIVER_OBJS) $(CORE_LIBS) $(X86_LIB) $(DEP_LIB) $(STD_LIB) $(TEXUS2LIB) $(GLIDE3LIB) $(RES) + +$(LIBDIR)\main.lib: $(MAIN_OBJS) + $(AR) -out:$@ $(ARFLAGS) $(MAIN_OBJS) + +$(LIBDIR)\glapi.lib: $(GLAPI_OBJS) + $(AR) -out:$@ $(ARFLAGS) $(GLAPI_OBJS) + +$(LIBDIR)\math.lib: $(MATH_OBJS) + $(AR) -out:$@ $(ARFLAGS) $(MATH_OBJS) + +$(LIBDIR)\array_cache.lib: $(ARRAY_CACHE_OBJS) + $(AR) -out:$@ $(ARFLAGS) $(ARRAY_CACHE_OBJS) + +$(LIBDIR)\swrast.lib: $(SWRAST_OBJS) + $(AR) -out:$@ $(ARFLAGS) $(SWRAST_OBJS) + +$(LIBDIR)\swarst_setup.lib: $(SWRAST_SETUP_OBJS) + $(AR) -out:$@ $(ARFLAGS) $(SWRAST_SETUP_OBJS) + +$(LIBDIR)\tnl.lib: $(TNL_OBJS) + $(AR) -out:$@ $(ARFLAGS) $(TNL_OBJS) + +x86\matypes.h: x86\gen_matypes.exe + x86\gen_matypes.exe > $@ + +x86\gen_matypes.exe: x86\gen_matypes.obj + $(LINK) -out:$@ -nologo x86\gen_matypes.obj + +$(LIBDIR)\x86.lib: x86\matypes.h $(X86_OBJS) + $(AR) -out:$@ $(ARFLAGS) $(X86_OBJS) + +.c.obj: + $(CC) $(CFLAGS) $(FLAGS) $(INCS) $< /Fo$*.obj + +.S.obj: + $(CC) $(CFLAGS) $(FLAGS) $(INCS) $< -D__WIN32__ -DNASM_ASSEMBLER -EP > $*.i + $(AS) $(ASFLAGS) $(INCS) $*.i -o $*.obj + $(RM) $*.i + +.rc.res: + $(RC) -Fo$@ $(INCS) $(FLAGS) -D__WIN32__ $< + +# [dBorca] Hack alert: +# glapi_x86.S needs some adjustments +# in order to generate correct entrypoints +x86\glapi_x86.obj: x86\glapi_x86.S + $(CC) $(CFLAGS) $(FLAGS) $(INCS) x86\glapi_x86.S -DSTDCALL_API -DNASM_ASSEMBLER -EP > $*.i + $(AS) $(ASFLAGS) $(INCS) $*.i -o $*.obj + $(RM) $*.i + +################################# +# cleanup rules +################################# +realclean: clean clobber + +clean:: + $(RM) array_cache\*.obj + $(RM) glapi\*.obj + $(RM) main\*.obj + $(RM) math\*.obj + $(RM) swrast\*.obj + $(RM) swrast_setup\*.obj + $(RM) tnl\*.obj + $(RM) x86\*.obj + $(RM) drivers\glide\*.obj + $(RM) drivers\glide\*.res + $(RM) $(LIBDIR)\*.pdb + $(RM) *.pdb + +clobber:: + $(RM) $(LIBDIR)\*.lib + $(RM) $(LIBDIR)\*.exp + $(RM) $(LIBDIR)\*.dll diff --git a/src/mesa/array_cache/ac_context.c b/src/mesa/array_cache/ac_context.c index 8bf84d4876e..ebf3a3dc47b 100644 --- a/src/mesa/array_cache/ac_context.c +++ b/src/mesa/array_cache/ac_context.c @@ -336,28 +336,28 @@ void _ac_DestroyContext( GLcontext *ctx ) * not an offset into a buffer object. */ if (ac->Cache.Vertex.Ptr && ac->Cache.Vertex.BufferObj == nullObj) - FREE( ac->Cache.Vertex.Ptr ); + FREE( (void *) ac->Cache.Vertex.Ptr ); if (ac->Cache.Normal.Ptr && ac->Cache.Normal.BufferObj == nullObj) - FREE( ac->Cache.Normal.Ptr ); + FREE( (void *) ac->Cache.Normal.Ptr ); if (ac->Cache.Color.Ptr && ac->Cache.Color.BufferObj == nullObj) - FREE( ac->Cache.Color.Ptr ); + FREE( (void *) ac->Cache.Color.Ptr ); if (ac->Cache.SecondaryColor.Ptr && ac->Cache.SecondaryColor.BufferObj == nullObj) - FREE( ac->Cache.SecondaryColor.Ptr ); + FREE( (void *) ac->Cache.SecondaryColor.Ptr ); if (ac->Cache.EdgeFlag.Ptr && ac->Cache.EdgeFlag.BufferObj == nullObj) - FREE( ac->Cache.EdgeFlag.Ptr ); + FREE( (void *) ac->Cache.EdgeFlag.Ptr ); if (ac->Cache.Index.Ptr && ac->Cache.Index.BufferObj == nullObj) - FREE( ac->Cache.Index.Ptr ); + FREE( (void *) ac->Cache.Index.Ptr ); if (ac->Cache.FogCoord.Ptr && ac->Cache.FogCoord.BufferObj == nullObj) - FREE( ac->Cache.FogCoord.Ptr ); + FREE( (void *) ac->Cache.FogCoord.Ptr ); for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) { if (ac->Cache.TexCoord[i].Ptr && ac->Cache.TexCoord[i].BufferObj == nullObj) - FREE( ac->Cache.TexCoord[i].Ptr ); + FREE( (void *) ac->Cache.TexCoord[i].Ptr ); } for (i = 0; i < VERT_ATTRIB_MAX; i++) { if (ac->Cache.Attrib[i].Ptr && ac->Cache.Attrib[i].BufferObj == nullObj) - FREE( ac->Cache.Attrib[i].Ptr ); + FREE( (void *) ac->Cache.Attrib[i].Ptr ); } if (ac->Elts) diff --git a/src/mesa/drivers/dos/blit.S b/src/mesa/drivers/dos/blit.S index f5888c7e395..1f1c77bd563 100644 --- a/src/mesa/drivers/dos/blit.S +++ b/src/mesa/drivers/dos/blit.S @@ -23,7 +23,7 @@ */ /* - * DOS/DJGPP device driver v1.3 for Mesa + * DOS/DJGPP device driver v1.4 for Mesa * * Copyright (C) 2002 - Borca Daniel * Email : [email protected] @@ -31,7 +31,10 @@ */ - .file "blit.S" +#include "x86/assyntax.h" + + + FILE("blit.S") /* * extern unsigned int vesa_gran_mask, vesa_gran_shift; @@ -41,8 +44,15 @@ * extern int vl_current_stride, vl_current_height; * extern int vl_current_offset, vl_current_delta; */ +EXTERN _vesa_gran_mask, _vesa_gran_shift +EXTERN _vl_video_selector + +EXTERN _vl_current_draw_buffer +EXTERN _vl_current_stride, _vl_current_height +EXTERN _vl_current_offset, _vl_current_delta - .text + SEG_TEXT + USE32 /* Desc: VESA bank switching routine (BIOS) * @@ -51,15 +61,15 @@ * * Note: thrashes EAX */ - .p2align 5,,31 + ALIGNTEXT32 _vesa_swbankBIOS: - movw $0x4f05, %ax - int $0x10 - ret + MOV_W (CONST(0x4f05), AX) + INT (CONST(0x10)) + RET - .p2align 2,,3 - .global _vesa_swbank -_vesa_swbank: .long _vesa_swbankBIOS + ALIGNTEXT8 + GLOBL _vesa_swbank +_vesa_swbank: D_LONG _vesa_swbankBIOS /* Desc: void vesa_b_dump_virtual (void); * @@ -68,60 +78,60 @@ _vesa_swbank: .long _vesa_swbankBIOS * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _vesa_b_dump_virtual + ALIGNTEXT32 + GLOBL _vesa_b_dump_virtual _vesa_b_dump_virtual: - cld - pushl %es - pushl %ebx - pushl %esi - pushl %edi - pushl %ebp - movl _vl_video_selector, %es - movl _vl_current_draw_buffer, %esi - movl _vl_current_offset, %edi - movl _vesa_gran_shift, %ecx - movl _vesa_gran_mask, %ebp - movl %edi, %edx - xorl %ebx, %ebx - andl %ebp, %edi - shrl %cl, %edx - incl %ebp - call *_vesa_swbank - movl _vl_current_stride, %ecx - movl _vl_current_height, %eax - movl _vl_current_delta, %ebx - shrl $2, %ecx - .balign 4 - 0: - pushl %ecx - .balign 4 - 1: - cmpl %ebp, %edi - jb 2f - pushl %eax - pushl %ebx - incl %edx - xorl %ebx, %ebx - call *_vesa_swbank - popl %ebx - popl %eax - subl %ebp, %edi - .balign 4 - 2: - movsl - decl %ecx - jnz 1b - popl %ecx - addl %ebx, %edi - decl %eax - jnz 0b - popl %ebp - popl %edi - popl %esi - popl %ebx - popl %es - ret + CLD + PUSH_SR (ES) + PUSH_L (EBX) + PUSH_L (ESI) + PUSH_L (EDI) + PUSH_L (EBP) + MOV_SR (CONTENT(_vl_video_selector), ES) + MOV_L (CONTENT(_vl_current_draw_buffer), ESI) + MOV_L (CONTENT(_vl_current_offset), EDI) + MOV_L (CONTENT(_vesa_gran_shift), ECX) + MOV_L (CONTENT(_vesa_gran_mask), EBP) + MOV_L (EDI, EDX) + XOR_L (EBX, EBX) + AND_L (EBP, EDI) + SHR_L (CL, EDX) + INC_L (EBP) + CALL (VARINDIRECT(_vesa_swbank)) + MOV_L (CONTENT(_vl_current_stride), ECX) + MOV_L (CONTENT(_vl_current_height), EAX) + MOV_L (CONTENT(_vl_current_delta), EBX) + SHR_L (CONST(2), ECX) + ALIGNTEXT4 + TLBL(0): + PUSH_L (ECX) + ALIGNTEXT4 + TLBL(1): + CMP_L (EBP, EDI) + jb TLBL(2) + PUSH_L (EAX) + PUSH_L (EBX) + INC_L (EDX) + XOR_L (EBX, EBX) + CALL (VARINDIRECT(_vesa_swbank)) + POP_L (EBX) + POP_L (EAX) + SUB_L (EBP, EDI) + ALIGNTEXT4 + TLBL(2): + MOVS_L + DEC_L (ECX) + jnz TLBL(1) + POP_L (ECX) + ADD_L (EBX, EDI) + DEC_L (EAX) + jnz TLBL(0) + POP_L (EBP) + POP_L (EDI) + POP_L (ESI) + POP_L (EBX) + POP_SR (ES) + RET /* Desc: void vesa_l_dump_virtual (void); * @@ -130,32 +140,32 @@ _vesa_b_dump_virtual: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _vesa_l_dump_virtual + ALIGNTEXT32 + GLOBL _vesa_l_dump_virtual _vesa_l_dump_virtual: - cld - pushl %es - pushl %esi - pushl %edi - movl _vl_video_selector, %es - movl _vl_current_draw_buffer, %esi - movl _vl_current_offset, %edi - movl _vl_current_stride, %ecx - movl _vl_current_height, %edx - movl _vl_current_delta, %eax - shrl $2, %ecx - .balign 4 - 0: - pushl %ecx - rep; movsl - popl %ecx - addl %eax, %edi - decl %edx - jnz 0b - popl %edi - popl %esi - popl %es - ret + CLD + PUSH_SR (ES) + PUSH_L (ESI) + PUSH_L (EDI) + MOV_SR (CONTENT(_vl_video_selector), ES) + MOV_L (CONTENT(_vl_current_draw_buffer), ESI) + MOV_L (CONTENT(_vl_current_offset), EDI) + MOV_L (CONTENT(_vl_current_stride), ECX) + MOV_L (CONTENT(_vl_current_height), EDX) + MOV_L (CONTENT(_vl_current_delta), EAX) + SHR_L (CONST(2), ECX) + ALIGNTEXT4 + TLBL(0): + PUSH_L (ECX) + REP MOVS_L + POP_L (ECX) + ADD_L (EAX, EDI) + DEC_L (EDX) + jnz TLBL(0) + POP_L (EDI) + POP_L (ESI) + POP_SR (ES) + RET /* Desc: void vesa_l_dump_virtual_mmx (void); * @@ -164,36 +174,37 @@ _vesa_l_dump_virtual: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _vesa_l_dump_virtual_mmx + ALIGNTEXT32 + GLOBL _vesa_l_dump_virtual_mmx _vesa_l_dump_virtual_mmx: #ifdef USE_MMX_ASM - pushl %esi - pushl %edi - movl _vl_video_selector, %fs - movl _vl_current_draw_buffer, %esi - movl _vl_current_offset, %edi - movl _vl_current_stride, %ecx - movl _vl_current_height, %edx - movl _vl_current_delta, %eax - shrl $3, %ecx - .balign 4 - 0: - pushl %ecx - .balign 4 - 1: - movq (%esi), %mm0 - addl $8, %esi - movq %mm0, %fs:(%edi) - addl $8, %edi - decl %ecx - jnz 1b - popl %ecx - addl %eax, %edi - decl %edx - jnz 0b - popl %edi - popl %esi - emms + PUSH_L (ESI) + PUSH_L (EDI) + MOV_SR (CONTENT(_vl_video_selector), FS) + MOV_L (CONTENT(_vl_current_draw_buffer), ESI) + MOV_L (CONTENT(_vl_current_offset), EDI) + MOV_L (CONTENT(_vl_current_stride), ECX) + MOV_L (CONTENT(_vl_current_height), EDX) + MOV_L (CONTENT(_vl_current_delta), EAX) + SHR_L (CONST(3), ECX) + ALIGNTEXT4 + TLBL(0): + PUSH_L (ECX) + ALIGNTEXT4 + TLBL(1): + MOVQ (REGIND(ESI), MM0) + ADD_L (CONST(8), ESI) + SEGFS + MOVQ (MM0, REGIND(EDI)) + ADD_L (CONST(8), EDI) + DEC_L (ECX) + jnz TLBL(1) + POP_L (ECX) + ADD_L (EAX, EDI) + DEC_L (EDX) + jnz TLBL(0) + POP_L (EDI) + POP_L (ESI) + EMMS #endif - ret + RET diff --git a/src/mesa/drivers/dos/dmesa.c b/src/mesa/drivers/dos/dmesa.c index bfebb91396e..a5d052b39db 100644 --- a/src/mesa/drivers/dos/dmesa.c +++ b/src/mesa/drivers/dos/dmesa.c @@ -1,6 +1,6 @@ /* * Mesa 3-D graphics library - * Version: 5.0.1 + * Version: 5.1 * * Copyright (C) 1999-2003 Brian Paul All Rights Reserved. * @@ -34,6 +34,7 @@ #include "glheader.h" #include "context.h" #ifndef FX +#include "bufferobj.h" #include "extensions.h" #include "macros.h" #include "matrix.h" @@ -1108,11 +1109,22 @@ static void clear (GLcontext *ctx, GLbitfield mask, GLboolean all, +/* + * This function is called to specify which buffer to read and write + * for software rasterization (swrast) fallbacks. This doesn't necessarily + * correspond to glDrawBuffer() or glReadBuffer() calls. + */ static void set_buffer (GLcontext *ctx, GLframebuffer *colorBuffer, GLuint bufferBit) { /* * XXX todo - examine bufferBit and set read/write pointers */ + /* Normally, we would have + * ctx->Driver.ReadBuffer == set_read_buffer + * ctx->Driver.DrawBuffer == set_draw_buffer + * and make sure set_draw_buffer calls _swrast_DrawBuffer, + * which in turn will call this routine via dd->SetBuffer. + */ } @@ -1137,13 +1149,10 @@ static const GLubyte* get_string (GLcontext *ctx, GLenum name) switch (name) { case GL_RENDERER: return (const GLubyte *)"Mesa DJGPP" - #ifdef FX - " (FX)" - #endif #ifdef MATROX " (MGA)" #endif - "\0port (c) Borca Daniel aug-2003"; + "\0port (c) Borca Daniel oct-2003"; default: return NULL; } @@ -1311,7 +1320,7 @@ static void dmesa_init_pointers (GLcontext *ctx) static void dmesa_update_state (GLcontext *ctx, GLuint new_state) { - /* Propogate statechange information to swrast and swrast_setup + /* Propagate statechange information to swrast and swrast_setup * modules. The DMesa driver has no internal GL-dependent state. */ _swrast_InvalidateState( ctx, new_state ); diff --git a/src/mesa/drivers/dos/mga/m_ttemp.h b/src/mesa/drivers/dos/mga/m_ttemp.h index 90d9de35642..e4c65f834b9 100644 --- a/src/mesa/drivers/dos/mga/m_ttemp.h +++ b/src/mesa/drivers/dos/mga/m_ttemp.h @@ -23,7 +23,7 @@ */ /* - * DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W triangle template + * DOS/DJGPP device driver v1.4 for Mesa -- MGA2064W triangle template * * Copyright (c) 2003 - Borca Daniel * Email : [email protected] @@ -83,7 +83,9 @@ void TAG (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v #endif #if defined(INTERP_Z) || defined(INTERP_RGB) +#if !LONG_LONG double one_area; +#endif #ifndef INTERP_RGB int red = v3->color[0]; int green = v3->color[1]; @@ -147,7 +149,9 @@ void TAG (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v /* draw lower triangle */ #if defined(INTERP_Z) || defined(INTERP_RGB) +#if !LONG_LONG one_area = (double)(1<<15) / (double)area; +#endif mga_fifo(1); #else mga_fifo(2); @@ -163,8 +167,13 @@ void TAG (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v /* compute d?/dx and d?/dy derivatives */ eMaj_dz = z3 - z1; eBot_dz = z2 - z1; +#if !LONG_LONG dzdx = (eMaj_dz * eBot_dy - eMaj_dy * eBot_dz) * one_area; dzdy = (eMaj_dx * eBot_dz - eMaj_dz * eBot_dx) * one_area; +#else + dzdx = ((long long)(eMaj_dz * eBot_dy - eMaj_dy * eBot_dz)<<15) / area; + dzdy = ((long long)(eMaj_dx * eBot_dz - eMaj_dz * eBot_dx)<<15) / area; +#endif #ifndef INTERP_RGB mga_fifo(11); @@ -196,12 +205,21 @@ void TAG (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v eBot_db = v2->color[2] - v1->color[2]; /* compute color increments */ +#if !LONG_LONG drdx = (eMaj_dr * eBot_dy - eMaj_dy * eBot_dr) * one_area; drdy = (eMaj_dx * eBot_dr - eMaj_dr * eBot_dx) * one_area; dgdx = (eMaj_dg * eBot_dy - eMaj_dy * eBot_dg) * one_area; dgdy = (eMaj_dx * eBot_dg - eMaj_dg * eBot_dx) * one_area; dbdx = (eMaj_db * eBot_dy - eMaj_dy * eBot_db) * one_area; dbdy = (eMaj_dx * eBot_db - eMaj_db * eBot_dx) * one_area; +#else + drdx = ((long long)(eMaj_dr * eBot_dy - eMaj_dy * eBot_dr)<<15) / area; + drdy = ((long long)(eMaj_dx * eBot_dr - eMaj_dr * eBot_dx)<<15) / area; + dgdx = ((long long)(eMaj_dg * eBot_dy - eMaj_dy * eBot_dg)<<15) / area; + dgdy = ((long long)(eMaj_dx * eBot_dg - eMaj_dg * eBot_dx)<<15) / area; + dbdx = ((long long)(eMaj_db * eBot_dy - eMaj_dy * eBot_db)<<15) / area; + dbdy = ((long long)(eMaj_dx * eBot_db - eMaj_db * eBot_dx)<<15) / area; +#endif mga_fifo(6); mga_outl(M_DR6, drdx); diff --git a/src/mesa/drivers/dos/mga/m_ttemp2.h b/src/mesa/drivers/dos/mga/m_ttemp2.h deleted file mode 100644 index 13ca87d348a..00000000000 --- a/src/mesa/drivers/dos/mga/m_ttemp2.h +++ /dev/null @@ -1,375 +0,0 @@ -/* - * Mesa 3-D graphics library - * Version: 5.0 - * - * Copyright (C) 1999-2002 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 v1.3 for Mesa -- MGA2064W triangle template - * - * Copyright (c) 2003 - Borca Daniel - * Email : [email protected] - * Web : http://www.geocities.com/dborca - */ - - -/* - * Triangle Rasterizer Template - * - * This file is #include'd to generate custom triangle rasterizers. - * - * The following macros may be defined to indicate what auxillary information - * must be interplated across the triangle: - * INTERP_Z - if defined, interpolate Z values - * INTERP_RGB - if defined, interpolate RGB values - * - * TAG - function name - * CULL - enable culling for: 0=no, 1=back, -1=front - * - * SETUP_CODE - to be executed once per triangle (usually HW init) - * - * For flatshaded primitives, the provoking vertex is the final one. - * This code was designed for the origin to be in the upper-left corner. - * - * Inspired by triangle rasterizer code written by Brian Paul. - */ - - - -#define TRI_SWAP(a, b) \ -do { \ - const MGAvertex *tmp = a; \ - a = b; \ - b = tmp; \ -} while (0) - -void TAG (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v3) -{ - int area; - int x1, y1, x2, y2, x3, y3; - int eMaj_dx, eMaj_dy, eBot_dx, eBot_dy, eTop_dx, eTop_dy; -#ifdef INTERP_RGB -#define FIFO_CNT_RGB 3 - int eMaj_dr, eBot_dr, eMaj_dg, eBot_dg, eMaj_db, eBot_db; - int drdx, drdy, dgdx, dgdy, dbdx, dbdy; -#else -#define FIFO_CNT_RGB 0 -#endif -#ifdef INTERP_Z -#define FIFO_CNT_Z 1 - int dzdx, dzdy; - int eMaj_dz, eBot_dz; - int z1, z2, z3; -#else -#define FIFO_CNT_Z 0 -#endif - -#if defined(INTERP_Z) || defined(INTERP_RGB) -#ifndef INTERP_RGB - int red = v3->color[0]; - int green = v3->color[1]; - int blue = v3->color[2]; -#endif -#else - unsigned long color = mga_mixrgb_full(v3->color); -#endif - - int sgn = 0; - - /* sort along the vertical axis */ - if (v2->win[1] < v1->win[1]) { - TRI_SWAP(v1, v2); -#ifdef CULL - cull = -cull; -#endif - } - - if (v3->win[1] < v1->win[1]) { - TRI_SWAP(v1, v3); - TRI_SWAP(v2, v3); - } else if (v3->win[1] < v2->win[1]) { - TRI_SWAP(v2, v3); -#ifdef CULL - cull = -cull; -#endif - } - - x1 = v1->win[0]; - y1 = v1->win[1]; - x2 = v2->win[0]; - y2 = v2->win[1]; - x3 = v3->win[0]; - y3 = v3->win[1]; - - /* compute deltas for each edge */ - eMaj_dx = x3 - x1; - eMaj_dy = y3 - y1; - eBot_dx = x2 - x1; - eBot_dy = y2 - y1; - eTop_dx = x3 - x2; - eTop_dy = y3 - y2; - - /* compute area */ - if ((area = eMaj_dx * eBot_dy - eBot_dx * eMaj_dy) == 0) { - return; - } -#ifdef CULL - if ((area * cull) > 0) { - return; - } -#endif - - mga_select(); - - /* set engine state */ -#ifdef SETUP_CODE - SETUP_CODE -#endif - - /* draw lower triangle */ -#if defined(INTERP_Z) || defined(INTERP_RGB) - mga_fifo(1); -#else - mga_fifo(2); - mga_outl(M_FCOL, color); -#endif - mga_outl(M_YDST, y1); - -#ifdef INTERP_Z - z1 = v1->win[2]; - z2 = v2->win[2]; - z3 = v3->win[2]; - - /* compute d?/dx and d?/dy derivatives */ - eMaj_dz = z3 - z1; - eBot_dz = z2 - z1; - dzdx = ((long long)(eMaj_dz * eBot_dy - eMaj_dy * eBot_dz)<<15) / area; - dzdy = ((long long)(eMaj_dx * eBot_dz - eMaj_dz * eBot_dx)<<15) / area; - -#ifndef INTERP_RGB - mga_fifo(11); - mga_outl(M_DR2, dzdx); - mga_outl(M_DR3, dzdy); - mga_outl(M_DR4, red<<15); - mga_outl(M_DR6, 0); - mga_outl(M_DR7, 0); - mga_outl(M_DR8, green<<15); - mga_outl(M_DR10, 0); - mga_outl(M_DR11, 0); - mga_outl(M_DR12, blue<<15); - mga_outl(M_DR14, 0); - mga_outl(M_DR15, 0); -#else - mga_fifo(2); - mga_outl(M_DR2, dzdx); - mga_outl(M_DR3, dzdy); -#endif -#endif - -#ifdef INTERP_RGB - /* compute color deltas */ - eMaj_dr = v3->color[0] - v1->color[0]; - eBot_dr = v2->color[0] - v1->color[0]; - eMaj_dg = v3->color[1] - v1->color[1]; - eBot_dg = v2->color[1] - v1->color[1]; - eMaj_db = v3->color[2] - v1->color[2]; - eBot_db = v2->color[2] - v1->color[2]; - - /* compute color increments */ - drdx = ((long long)(eMaj_dr * eBot_dy - eMaj_dy * eBot_dr)<<15) / area; - drdy = ((long long)(eMaj_dx * eBot_dr - eMaj_dr * eBot_dx)<<15) / area; - dgdx = ((long long)(eMaj_dg * eBot_dy - eMaj_dy * eBot_dg)<<15) / area; - dgdy = ((long long)(eMaj_dx * eBot_dg - eMaj_dg * eBot_dx)<<15) / area; - dbdx = ((long long)(eMaj_db * eBot_dy - eMaj_dy * eBot_db)<<15) / area; - dbdy = ((long long)(eMaj_dx * eBot_db - eMaj_db * eBot_dx)<<15) / area; - - mga_fifo(6); - mga_outl(M_DR6, drdx); - mga_outl(M_DR7, drdy); - mga_outl(M_DR10, dgdx); - mga_outl(M_DR11, dgdy); - mga_outl(M_DR14, dbdx); - mga_outl(M_DR15, dbdy); -#endif - - if (area > 0) { /* major edge on the right */ - if (eBot_dy) { /* have lower triangle */ - mga_fifo(9 + FIFO_CNT_Z + FIFO_CNT_RGB); - - mga_outl(M_AR0, eBot_dy); - if (x2 < x1) { - mga_outl(M_AR1, eBot_dx + eBot_dy - 1); - mga_outl(M_AR2, eBot_dx); - sgn |= M_SDXL; - } else { - mga_outl(M_AR1, -eBot_dx); - mga_outl(M_AR2, -eBot_dx); - } - - mga_outl(M_AR6, eMaj_dy); - if (x3 < x1) { - mga_outl(M_AR4, eMaj_dx + eMaj_dy - 1); - mga_outl(M_AR5, eMaj_dx); - sgn |= M_SDXR; - } else { - mga_outl(M_AR4, -eMaj_dx); - mga_outl(M_AR5, -eMaj_dx); - } - - mga_outl(M_FXBNDRY, (x1<<16) | x1); -#ifdef INTERP_Z - mga_outl(M_DR0, z1<<15); -#endif -#ifdef INTERP_RGB - mga_outl(M_DR4, v1->color[0]<<15); - mga_outl(M_DR8, v1->color[1]<<15); - mga_outl(M_DR12, v1->color[2]<<15); -#endif - mga_outl(M_SGN, sgn); - mga_outl(M_LEN | M_EXEC, eBot_dy); - } else { /* no lower triangle */ - mga_fifo(4 + FIFO_CNT_Z + FIFO_CNT_RGB); - - mga_outl(M_AR6, eMaj_dy); - if (x3 < x1) { - mga_outl(M_AR4, eMaj_dx + eMaj_dy - 1); - mga_outl(M_AR5, eMaj_dx); - sgn |= M_SDXR; - } else { - mga_outl(M_AR4, -eMaj_dx); - mga_outl(M_AR5, -eMaj_dx); - } - - mga_outl(M_FXBNDRY, (x1<<16) | x2); -#ifdef INTERP_Z - mga_outl(M_DR0, z2<<15); -#endif -#ifdef INTERP_RGB - mga_outl(M_DR4, v2->color[0]<<15); - mga_outl(M_DR8, v2->color[1]<<15); - mga_outl(M_DR12, v2->color[2]<<15); -#endif - } - - /* draw upper triangle */ - if (eTop_dy) { - mga_fifo(5); - mga_outl(M_AR0, eTop_dy); - if (x3 < x2) { - mga_outl(M_AR1, eTop_dx + eTop_dy - 1); - mga_outl(M_AR2, eTop_dx); - sgn |= M_SDXL; - } else { - mga_outl(M_AR1, -eTop_dx); - mga_outl(M_AR2, -eTop_dx); - sgn &= ~M_SDXL; - } - mga_outl(M_SGN, sgn); - mga_outl(M_LEN | M_EXEC, eTop_dy); - } - } else { /* major edge on the left */ - if (eBot_dy) { /* have lower triangle */ - mga_fifo(9 + FIFO_CNT_Z + FIFO_CNT_RGB); - - mga_outl(M_AR0, eMaj_dy); - if (x3 < x1) { - mga_outl(M_AR1, eMaj_dx + eMaj_dy - 1); - mga_outl(M_AR2, eMaj_dx); - sgn |= M_SDXL; - } else { - mga_outl(M_AR1, -eMaj_dx); - mga_outl(M_AR2, -eMaj_dx); - } - - mga_outl(M_AR6, eBot_dy); - if (x2 < x1) { - mga_outl(M_AR4, eBot_dx + eBot_dy - 1); - mga_outl(M_AR5, eBot_dx); - sgn |= M_SDXR; - } else { - mga_outl(M_AR4, -eBot_dx); - mga_outl(M_AR5, -eBot_dx); - } - - mga_outl(M_FXBNDRY, (x1<<16) | x1); -#ifdef INTERP_Z - mga_outl(M_DR0, z1<<15); -#endif -#ifdef INTERP_RGB - mga_outl(M_DR4, v1->color[0]<<15); - mga_outl(M_DR8, v1->color[1]<<15); - mga_outl(M_DR12, v1->color[2]<<15); -#endif - mga_outl(M_SGN, sgn); - mga_outl(M_LEN | M_EXEC, eBot_dy); - } else { /* no lower triangle */ - mga_fifo(4 + FIFO_CNT_Z + FIFO_CNT_RGB); - - mga_outl(M_AR0, eMaj_dy); - if (x3 < x1) { - mga_outl(M_AR1, eMaj_dx + eMaj_dy - 1); - mga_outl(M_AR2, eMaj_dx); - sgn |= M_SDXL; - } else { - mga_outl(M_AR1, -eMaj_dx); - mga_outl(M_AR2, -eMaj_dx); - } - - mga_outl(M_FXBNDRY, (x2<<16) | x1); -#ifdef INTERP_Z - mga_outl(M_DR0, z1<<15); -#endif -#ifdef INTERP_RGB - mga_outl(M_DR4, v1->color[0]<<15); - mga_outl(M_DR8, v1->color[1]<<15); - mga_outl(M_DR12, v1->color[2]<<15); -#endif - } - - /* draw upper triangle */ - if (eTop_dy) { - mga_fifo(5); - mga_outl(M_AR6, eTop_dy); - if (x3 < x2) { - mga_outl(M_AR4, eTop_dx + eTop_dy - 1); - mga_outl(M_AR5, eTop_dx); - sgn |= M_SDXR; - } else { - mga_outl(M_AR4, -eTop_dx); - mga_outl(M_AR5, -eTop_dx); - sgn &= ~M_SDXR; - } - mga_outl(M_SGN, sgn); - mga_outl(M_LEN | M_EXEC, eTop_dy); - } - } -} - -#undef FIFO_CNT_RGB -#undef FIFO_CNT_Z - -#undef TRI_SWAP - -#undef SETUP_CODE -#undef INTERP_RGB -#undef INTERP_Z -#undef CULL -#undef TAG diff --git a/src/mesa/drivers/dos/virtual.S b/src/mesa/drivers/dos/virtual.S index c5cc1fe86f8..677f07a6263 100644 --- a/src/mesa/drivers/dos/virtual.S +++ b/src/mesa/drivers/dos/virtual.S @@ -23,7 +23,7 @@ */ /* - * DOS/DJGPP device driver v1.3 for Mesa + * DOS/DJGPP device driver v1.4 for Mesa * * Copyright (C) 2002 - Borca Daniel * Email : [email protected] @@ -31,14 +31,20 @@ */ - .file "virtual.S" +#include "x86/assyntax.h" + + + FILE("virtual.S") /* * extern void *vl_current_draw_buffer; * extern int vl_current_width, vl_current_bytes; */ +EXTERN _vl_current_draw_buffer +EXTERN _vl_current_width, _vl_current_bytes - .text + SEG_TEXT + USE32 /* Desc: void v_clear8 (int color); * @@ -47,14 +53,14 @@ * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_clear8 + ALIGNTEXT32 + GLOBL _v_clear8 _v_clear8: - movl 4(%esp), %eax - movb %al, %ah - pushw %ax - pushw %ax - popl %eax + MOV_L (REGOFF(4, ESP), EAX) + MOV_B (AL, AH) + PUSH_W (AX) + PUSH_W (AX) + POP_L (EAX) jmp _v_clear_common /* Desc: void v_clear16 (int color); @@ -64,13 +70,13 @@ _v_clear8: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_clear16 + ALIGNTEXT32 + GLOBL _v_clear16 _v_clear16: - movl 4(%esp), %eax - pushw %ax - pushw %ax - popl %eax + MOV_L (REGOFF(4, ESP), EAX) + PUSH_W (AX) + PUSH_W (AX) + POP_L (EAX) jmp _v_clear_common /* Desc: void v_clear32 (int color); @@ -80,22 +86,22 @@ _v_clear16: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_clear32 + ALIGNTEXT32 + GLOBL _v_clear32 _v_clear32: - movl 4(%esp), %eax - .balign 4 + MOV_L (REGOFF(4, ESP), EAX) + ALIGNTEXT4 _v_clear_common: - movl _vl_current_bytes, %ecx - movl _vl_current_draw_buffer, %edx - shrl $2, %ecx - .balign 4 - 0: - movl %eax, (%edx) - addl $4, %edx - decl %ecx - jnz 0b - ret + MOV_L (CONTENT(_vl_current_bytes), ECX) + MOV_L (CONTENT(_vl_current_draw_buffer), EDX) + SHR_L (CONST(2), ECX) + ALIGNTEXT4 + TLBL(0): + MOV_L (EAX, REGIND(EDX)) + ADD_L (CONST(4), EDX) + DEC_L (ECX) + jnz TLBL(0) + RET /* Desc: void v_clear8_mmx (int color); * @@ -104,13 +110,13 @@ _v_clear_common: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_clear8_mmx + ALIGNTEXT32 + GLOBL _v_clear8_mmx _v_clear8_mmx: #ifdef USE_MMX_ASM - movd 4(%esp), %mm0 - punpcklbw %mm0, %mm0 - punpcklwd %mm0, %mm0 + MOVD (REGOFF(4, ESP), MM0) + PUNPCKLBW (MM0, MM0) + PUNPCKLWD (MM0, MM0) jmp _v_clear_common_mmx #endif @@ -121,12 +127,12 @@ _v_clear8_mmx: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_clear16_mmx + ALIGNTEXT32 + GLOBL _v_clear16_mmx _v_clear16_mmx: #ifdef USE_MMX_ASM - movd 4(%esp), %mm0 - punpcklwd %mm0, %mm0 + MOVD (REGOFF(4, ESP), MM0) + PUNPCKLWD (MM0, MM0) jmp _v_clear_common_mmx #endif @@ -137,26 +143,26 @@ _v_clear16_mmx: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_clear32_mmx + ALIGNTEXT32 + GLOBL _v_clear32_mmx _v_clear32_mmx: #ifdef USE_MMX_ASM - movd 4(%esp), %mm0 - .balign 4 + MOVD (REGOFF(4, ESP), MM0) + ALIGNTEXT4 _v_clear_common_mmx: - punpckldq %mm0, %mm0 - movl _vl_current_bytes, %ecx - movl _vl_current_draw_buffer, %edx - shrl $3, %ecx - .balign 4 - 0: - movq %mm0, (%edx) - addl $8, %edx - decl %ecx - jnz 0b - emms + PUNPCKLDQ (MM0, MM0) + MOV_L (CONTENT(_vl_current_bytes), ECX) + MOV_L (CONTENT(_vl_current_draw_buffer), EDX) + SHR_L (CONST(3), ECX) + ALIGNTEXT4 + TLBL(0): + MOVQ (MM0, REGIND(EDX)) + ADD_L (CONST(8), EDX) + DEC_L (ECX) + jnz TLBL(0) + EMMS #endif - ret + RET /* Desc: void v_clear24 (int color); * @@ -165,26 +171,26 @@ _v_clear_common_mmx: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_clear24 + ALIGNTEXT32 + GLOBL _v_clear24 _v_clear24: - movl $0xaaaaaaab, %eax - mull _vl_current_bytes - movl 4(%esp), %eax - movl %edx, %ecx - pushl %ebx - movl _vl_current_draw_buffer, %edx - shrl %ecx - movb 10(%esp), %bl - .balign 4 - 0: - movw %ax, (%edx) - movb %bl, 2(%edx) - addl $3, %edx - decl %ecx - jnz 0b - popl %ebx - ret + MOV_L (CONST(0xaaaaaaab), EAX) + MUL_L (CONTENT(_vl_current_bytes)) + MOV_L (REGOFF(4, ESP), EAX) + MOV_L (EDX, ECX) + PUSH_L (EBX) + MOV_L (CONTENT(_vl_current_draw_buffer), EDX) + SHR_L (CONST(1), ECX) + MOV_B (REGOFF(10,ESP), BL) + ALIGNTEXT4 + TLBL(0): + MOV_W (AX, REGIND(EDX)) + MOV_B (BL, REGOFF(2,EDX)) + ADD_L (CONST(3), EDX) + DEC_L (ECX) + jnz TLBL(0) + POP_L (EBX) + RET /* Desc: void v_clear24_mmx (int color); * @@ -193,47 +199,47 @@ _v_clear24: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_clear24_mmx + ALIGNTEXT32 + GLOBL _v_clear24_mmx _v_clear24_mmx: #ifdef USE_MMX_ASM - movl 4(%esp), %eax - movl %eax, %edx - movl %eax, %ecx - shll $16, %edx - rorl $8, %ecx - movw %cx, %dx - rorl $16, %ecx - movb %dh, %cl - shll $8, %eax - movb %ch, %al - rorl $8, %eax + MOV_L (REGOFF(4, ESP), EAX) + MOV_L (EAX, EDX) + MOV_L (EAX, ECX) + SHL_L (CONST(16), EDX) + ROR_L (CONST(8), ECX) + MOV_W (CX, DX) + ROR_L (CONST(16), ECX) + MOV_B (DH, CL) + SHL_L (CONST(8), EAX) + MOV_B (CH, AL) + ROR_L (CONST(8), EAX) - pushl %edx - pushl %eax - movq (%esp), %mm0 - pushl %ecx - movq (%esp), %mm1 - pushl %edx - movq (%esp), %mm2 + PUSH_L (EDX) + PUSH_L (EAX) + MOVQ (REGIND(ESP), MM0) + PUSH_L (ECX) + MOVQ (REGIND(ESP), MM1) + PUSH_L (EDX) + MOVQ (REGIND(ESP), MM2) - movl $0xaaaaaaab, %eax - mull _vl_current_bytes - movl %edx, %ecx - movl _vl_current_draw_buffer, %edx - shrl $4, %ecx - .balign 4 - 0: - movq %mm0, (%edx) - movq %mm1, 8(%edx) - movq %mm2, 16(%edx) - addl $24, %edx - decl %ecx - jnz 0b - emms - addl $16, %esp + MOV_L (CONST(0xaaaaaaab), EAX) + MUL_L (CONTENT(_vl_current_bytes)) + MOV_L (EDX, ECX) + MOV_L (CONTENT(_vl_current_draw_buffer), EDX) + SHR_L (CONST(4), ECX) + ALIGNTEXT4 + TLBL(0): + MOVQ (MM0, REGIND(EDX)) + MOVQ (MM1, REGOFF(8,EDX)) + MOVQ (MM2, REGOFF(16,EDX)) + ADD_L (CONST(24), EDX) + DEC_L (ECX) + jnz TLBL(0) + EMMS + ADD_L (CONST(16), ESP) #endif - ret + RET /* Desc: void v_rect8 (int color); * @@ -242,51 +248,51 @@ _v_clear24_mmx: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_rect8 + ALIGNTEXT32 + GLOBL _v_rect8 _v_rect8: - cld - pushl %esi - pushl %edi - movl 28(%esp), %eax - movl _vl_current_width, %esi - movl 16(%esp), %edi - movb %al, %ah - movl 20(%esp), %ecx - imull %esi, %edi - movl 24(%esp), %edx - subl %ecx, %esi - addl 12(%esp), %edi - pushw %ax - pushw %ax - pushl %ds - popl %es - addl _vl_current_draw_buffer, %edi - popl %eax - pushl %ebx - movl %ecx, %ebx - andl $3, %ebx - .balign 4 - 0: - pushl %ecx - .balign 4 - 1: - shrl $2, %ecx - rep; stosl - testl %ebx, %ebx - jz 2f - movl %ebx, %ecx - rep; stosb - .balign 4 - 2: - popl %ecx - addl %esi, %edi - decl %edx - jnz 0b - popl %ebx - popl %edi - popl %esi - ret + CLD + PUSH_L (ESI) + PUSH_L (EDI) + MOV_L (REGOFF(28, ESP), EAX) + MOV_L (CONTENT(_vl_current_width), ESI) + MOV_L (REGOFF(16, ESP), EDI) + MOV_B (AL, AH) + MOV_L (REGOFF(20, ESP), ECX) + IMUL_L (ESI, EDI) + MOV_L (REGOFF(24, ESP), EDX) + SUB_L (ECX, ESI) + ADD_L (REGOFF(12, ESP), EDI) + PUSH_W (AX) + PUSH_W (AX) + PUSH_SR (DS) + POP_SR (ES) + ADD_L (CONTENT(_vl_current_draw_buffer), EDI) + POP_L (EAX) + PUSH_L (EBX) + MOV_L (ECX, EBX) + AND_L (CONST(3), EBX) + ALIGNTEXT4 + TLBL(0): + PUSH_L (ECX) + ALIGNTEXT4 + TLBL(1): + SHR_L (CONST(2), ECX) + REP STOS_L + TEST_L (EBX, EBX) + jz TLBL(2) + MOV_L (EBX, ECX) + REP STOS_B + ALIGNTEXT4 + TLBL(2): + POP_L (ECX) + ADD_L (ESI, EDI) + DEC_L (EDX) + jnz TLBL(0) + POP_L (EBX) + POP_L (EDI) + POP_L (ESI) + RET /* Desc: void v_rect16 (int color); * @@ -295,46 +301,46 @@ _v_rect8: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_rect16 + ALIGNTEXT32 + GLOBL _v_rect16 _v_rect16: - cld - pushl %esi - pushl %edi - movl 28(%esp), %eax - movl _vl_current_width, %esi - movl 16(%esp), %edi - movl 20(%esp), %ecx - imull %esi, %edi - movl 24(%esp), %edx - subl %ecx, %esi - addl 12(%esp), %edi - pushw %ax - shll %esi - pushw %ax - shll %edi - pushl %ds - popl %es - addl _vl_current_draw_buffer, %edi - popl %eax - .balign 4 - 0: - pushl %ecx - .balign 4 - 1: - shrl %ecx - rep; stosl - jnc 2f - stosw - .balign 4 - 2: - popl %ecx - addl %esi, %edi - decl %edx - jnz 0b - popl %edi - popl %esi - ret + CLD + PUSH_L (ESI) + PUSH_L (EDI) + MOV_L (REGOFF(28, ESP), EAX) + MOV_L (CONTENT(_vl_current_width), ESI) + MOV_L (REGOFF(16, ESP), EDI) + MOV_L (REGOFF(20, ESP), ECX) + IMUL_L (ESI, EDI) + MOV_L (REGOFF(24, ESP), EDX) + SUB_L (ECX, ESI) + ADD_L (REGOFF(12, ESP), EDI) + PUSH_W (AX) + SHL_L (CONST(1), ESI) + PUSH_W (AX) + SHL_L (CONST(1), EDI) + PUSH_SR (DS) + POP_SR (ES) + ADD_L (CONTENT(_vl_current_draw_buffer), EDI) + POP_L (EAX) + ALIGNTEXT4 + TLBL(0): + PUSH_L (ECX) + ALIGNTEXT4 + TLBL(1): + SHR_L (CONST(1), ECX) + REP STOS_L + jnc TLBL(2) + STOS_W + ALIGNTEXT4 + TLBL(2): + POP_L (ECX) + ADD_L (ESI, EDI) + DEC_L (EDX) + jnz TLBL(0) + POP_L (EDI) + POP_L (ESI) + RET /* Desc: void v_rect24 (int color); * @@ -343,43 +349,43 @@ _v_rect16: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_rect24 + ALIGNTEXT32 + GLOBL _v_rect24 _v_rect24: - pushl %esi - pushl %edi - movl 28(%esp), %eax - movl _vl_current_width, %esi - movl 16(%esp), %edi - movl 20(%esp), %ecx - imull %esi, %edi - movl 24(%esp), %edx - subl %ecx, %esi - addl 12(%esp), %edi - leal (%esi, %esi, 2), %esi - pushl %ebx - leal (%edi, %edi, 2), %edi - movl %eax, %ebx - addl _vl_current_draw_buffer, %edi - shrl $16, %ebx - .balign 4 - 0: - pushl %ecx - .balign 4 - 1: - movw %ax, (%edi) - movb %bl, 2(%edi) - addl $3, %edi - decl %ecx - jnz 1b - popl %ecx - addl %esi, %edi - decl %edx - jnz 0b - popl %ebx - popl %edi - popl %esi - ret + PUSH_L (ESI) + PUSH_L (EDI) + MOV_L (REGOFF(28, ESP), EAX) + MOV_L (CONTENT(_vl_current_width), ESI) + MOV_L (REGOFF(16, ESP), EDI) + MOV_L (REGOFF(20, ESP), ECX) + IMUL_L (ESI, EDI) + MOV_L (REGOFF(24, ESP), EDX) + SUB_L (ECX, ESI) + ADD_L (REGOFF(12, ESP), EDI) + LEA_L (REGBIS(ESI, ESI, 2), ESI) + PUSH_L (EBX) + LEA_L (REGBIS(EDI, EDI, 2), EDI) + MOV_L (EAX, EBX) + ADD_L (CONTENT(_vl_current_draw_buffer), EDI) + SHR_L (CONST(16), EBX) + ALIGNTEXT4 + TLBL(0): + PUSH_L (ECX) + ALIGNTEXT4 + TLBL(1): + MOV_W (AX, REGIND(EDI)) + MOV_B (BL, REGOFF(2,EDI)) + ADD_L (CONST(3), EDI) + DEC_L (ECX) + jnz TLBL(1) + POP_L (ECX) + ADD_L (ESI, EDI) + DEC_L (EDX) + jnz TLBL(0) + POP_L (EBX) + POP_L (EDI) + POP_L (ESI) + RET /* Desc: void v_rect32 (int color); * @@ -388,38 +394,38 @@ _v_rect24: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_rect32 + ALIGNTEXT32 + GLOBL _v_rect32 _v_rect32: - pushl %esi - pushl %edi - movl _vl_current_width, %esi - movl 16(%esp), %edi - movl 20(%esp), %ecx - imull %esi, %edi - movl 24(%esp), %edx - subl %ecx, %esi - addl 12(%esp), %edi - shll $2, %esi - shll $2, %edi - movl 28(%esp), %eax - addl _vl_current_draw_buffer, %edi - .balign 4 - 0: - pushl %ecx - .balign 4 - 1: - movl %eax, (%edi) - addl $4, %edi - decl %ecx - jnz 1b - popl %ecx - addl %esi, %edi - decl %edx - jnz 0b - popl %edi - popl %esi - ret + PUSH_L (ESI) + PUSH_L (EDI) + MOV_L (CONTENT(_vl_current_width), ESI) + MOV_L (REGOFF(16, ESP), EDI) + MOV_L (REGOFF(20, ESP), ECX) + IMUL_L (ESI, EDI) + MOV_L (REGOFF(24, ESP), EDX) + SUB_L (ECX, ESI) + ADD_L (REGOFF(12, ESP), EDI) + SHL_L (CONST(2), ESI) + SHL_L (CONST(2), EDI) + MOV_L (REGOFF(28, ESP), EAX) + ADD_L (CONTENT(_vl_current_draw_buffer), EDI) + ALIGNTEXT4 + TLBL(0): + PUSH_L (ECX) + ALIGNTEXT4 + TLBL(1): + MOV_L (EAX, REGIND(EDI)) + ADD_L (CONST(4), EDI) + DEC_L (ECX) + jnz TLBL(1) + POP_L (ECX) + ADD_L (ESI, EDI) + DEC_L (EDX) + jnz TLBL(0) + POP_L (EDI) + POP_L (ESI) + RET /* Desc: void v_putpixel8 (unsigned int offset, int color); * @@ -428,14 +434,14 @@ _v_rect32: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_putpixel8 + ALIGNTEXT32 + GLOBL _v_putpixel8 _v_putpixel8: - movl 8(%esp), %ecx - movl 4(%esp), %edx - movl _vl_current_draw_buffer, %eax - movb %cl, (%eax,%edx) - ret + MOV_L (REGOFF(8, ESP), ECX) + MOV_L (REGOFF(4, ESP), EDX) + MOV_L (CONTENT(_vl_current_draw_buffer), EAX) + MOV_B (CL, REGBI(EAX,EDX)) + RET /* Desc: void v_putpixel16 (unsigned int offset, int color); * @@ -444,14 +450,14 @@ _v_putpixel8: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_putpixel16 + ALIGNTEXT32 + GLOBL _v_putpixel16 _v_putpixel16: - movl 8(%esp), %ecx - movl 4(%esp), %edx - movl _vl_current_draw_buffer, %eax - movw %cx, (%eax,%edx,2) - ret + MOV_L (REGOFF(8, ESP), ECX) + MOV_L (REGOFF(4, ESP), EDX) + MOV_L (CONTENT(_vl_current_draw_buffer), EAX) + MOV_W (CX, REGBIS(EAX,EDX,2)) + RET /* Desc: void v_putpixel24 (unsigned int offset, int color); * @@ -460,17 +466,17 @@ _v_putpixel16: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_putpixel24 + ALIGNTEXT32 + GLOBL _v_putpixel24 _v_putpixel24: - movl 4(%esp), %eax - movl 8(%esp), %edx - movl _vl_current_draw_buffer, %ecx - leal (%eax,%eax,2), %eax - movw %dx, (%ecx,%eax) - shrl $16, %edx - movb %dl, 2(%ecx,%eax) - ret + MOV_L (REGOFF(4, ESP), EAX) + MOV_L (REGOFF(8, ESP), EDX) + MOV_L (CONTENT(_vl_current_draw_buffer), ECX) + LEA_L (REGBIS(EAX,EAX,2), EAX) + MOV_W (DX, REGBI(ECX,EAX)) + SHR_L (CONST(16), EDX) + MOV_B (DL, REGBID(ECX,EAX,2)) + RET /* Desc: void v_putpixel32 (unsigned int offset, int color); * @@ -479,11 +485,11 @@ _v_putpixel24: * * Note: uses current draw buffer */ - .p2align 5,,31 - .global _v_putpixel32 + ALIGNTEXT32 + GLOBL _v_putpixel32 _v_putpixel32: - movl 8(%esp), %ecx - movl 4(%esp), %edx - movl _vl_current_draw_buffer, %eax - movl %ecx, (%eax,%edx,4) - ret + MOV_L (REGOFF(8, ESP), ECX) + MOV_L (REGOFF(4, ESP), EDX) + MOV_L (CONTENT(_vl_current_draw_buffer), EAX) + MOV_L (ECX, REGBIS(EAX,EDX,4)) + RET diff --git a/src/mesa/drivers/dri/common/hwlog.c b/src/mesa/drivers/dri/common/hwlog.c deleted file mode 100644 index ff6e7d92119..00000000000 --- a/src/mesa/drivers/dri/common/hwlog.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * GLX Hardware Device Driver common code - * - * Based on the original MGA G200 driver (c) 1999 Wittawat Yamwong - * - * 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 - * WITTAWAT YAMWONG, OR ANY OTHER CONTRIBUTORS 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. - * - * - * Wittawat Yamwong <[email protected]> - */ -/* $XFree86: xc/lib/GL/mesa/src/drv/common/hwlog.c,v 1.3 2001/08/18 02:51:03 dawes Exp $ */ - -#include "hwlog.h" -hwlog_t hwlog = { 0,0,0, "[???] "}; - - -/* Should be shared, but is this a good place for it? - */ -#include <sys/time.h> -#include <stdarg.h> - - -int usec( void ) -{ - struct timeval tv; - struct timezone tz; - - gettimeofday( &tv, &tz ); - - return (tv.tv_sec & 2047) * 1000000 + tv.tv_usec; -} - - -#ifdef HW_LOG_ENABLED -int hwOpenLog(const char *filename, char *prefix) -{ - hwCloseLog(); - hwSetLogLevel(0); - hwlog.prefix=prefix; - if (!filename) - return -1; - if ((hwlog.file = fopen(filename,"w")) == NULL) - return -1; - return 0; -} - -void hwCloseLog() -{ - if (hwlog.file) { - fclose(hwlog.file); - hwlog.file = NULL; - } -} - -int hwIsLogReady() -{ - return (hwlog.file != NULL); -} - -void hwSetLogLevel(int level) -{ - hwlog.level = level; -} - -int hwGetLogLevel() -{ - return hwlog.level; -} - -void hwLog(int level, const char *format, ...) -{ - va_list ap; - va_start(ap,format); - hwLogv(level,format,ap); - va_end(ap); -} - -void hwLogv(int l, const char *format, va_list ap) -{ - if (hwlog.file && (l <= hwlog.level)) { - vfprintf(hwlog.file,format,ap); - fflush(hwlog.file); - } -} - -void hwMsg(int l, const char *format, ...) -{ - va_list ap; - va_start(ap, format); - - if (l <= hwlog.level) { - if (hwIsLogReady()) { - int t = usec(); - - hwLog(l, "%6i:", t - hwlog.timeTemp); - hwlog.timeTemp = t; - hwLogv(l, format, ap); - } else { - fprintf(stderr, hwlog.prefix); - vfprintf(stderr, format, ap); - } - } - - va_end(ap); -} - -#else /* ifdef HW_LOG_ENABLED */ - -int hwlogdummy() -{ - return 0; -} - -#endif - -void hwError(const char *format, ...) -{ - va_list ap; - va_start(ap, format); - - fprintf(stderr, hwlog.prefix); - vfprintf(stderr, format, ap); - hwLogv(0, format, ap); - - va_end(ap); -} diff --git a/src/mesa/drivers/dri/common/hwlog.h b/src/mesa/drivers/dri/common/hwlog.h deleted file mode 100644 index 6c5a185552b..00000000000 --- a/src/mesa/drivers/dri/common/hwlog.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * GLX Hardware Device Driver common code - * - * Based on the original MGA G200 driver (c) 1999 Wittawat Yamwong - * - * 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 - * WITTAWAT YAMWONG, OR ANY OTHER CONTRIBUTORS 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. - * - * - * Wittawat Yamwong <[email protected]> - */ -/* $XFree86: xc/lib/GL/mesa/src/drv/common/hwlog.h,v 1.5 2001/10/31 23:22:57 tsi Exp $ */ - -/* Usage: - * - use mgaError for error messages. Always write to X error and log file. - * - use mgaMsg for debugging. Can be disabled by undefining MGA_LOG_ENABLED. - */ - -#ifndef HWLOG_INC -#define HWLOG_INC - - -#include <stdarg.h> -#include <stdio.h> - -#define DBG_LEVEL_BASE 1 -#define DBG_LEVEL_VERBOSE 10 -#define DBG_LEVEL_ENTEREXIT 20 - -typedef struct -{ - FILE *file; - int level; - unsigned int timeTemp; - char *prefix; -} hwlog_t; - -extern hwlog_t hwlog; - - -#ifdef HW_LOG_ENABLED - -/* open and close log file. */ -int hwOpenLog(const char *filename, char *prefix); -void hwCloseLog(void); - -/* return 1 if log file is succesfully opened */ -int hwIsLogReady(void); - -/* set current log level to 'level'. Messages with level less than or equal - the current log level will be written to the log file. */ -void hwSetLogLevel(int level); -int hwGetLogLevel(void); - -/* hwLog and hwLogv write a message to the log file. */ -/* do not call these directly, use hwMsg() instead */ -void hwLog(int level, const char *format, ...); -void hwLogv(int level, const char *format, va_list ap); - -int usec( void ); - -/* hwMsg writes a message to the log file or to the standard X error file. */ -void hwMsg(int level, const char *format, ...); - - -#else - - -static __inline__ int hwOpenLog(const char *f, char *prefix) { hwlog.prefix=prefix; return -1; } -#define hwIsLogReady() (0) -#define hwGetLogLevel() (-1) -#define hwLogLevel(n) (0) -#define hwLog() -#define hwMsg() - -#define hwCloseLog() -#define hwSetLogLevel(x) -#define hwLogv(l,f,a) - - -#endif - -void hwError(const char *format, ...); - - -#endif diff --git a/src/mesa/drivers/dri/common/mm.c b/src/mesa/drivers/dri/common/mm.c index b3be95471d5..6572ccd9914 100644 --- a/src/mesa/drivers/dri/common/mm.c +++ b/src/mesa/drivers/dri/common/mm.c @@ -27,14 +27,13 @@ #include <stdio.h> #include "mm.h" -#include "hwlog.h" void mmDumpMemInfo( memHeap_t *heap ) { TMemBlock *p; - fprintf(stderr, "Memory heap %p:\n", heap); + fprintf(stderr, "Memory heap %p:\n", (void *)heap); if (heap == 0) { fprintf(stderr, " heap == 0\n"); } else { diff --git a/src/mesa/drivers/dri/common/texmem.c b/src/mesa/drivers/dri/common/texmem.c index a8878b694d6..4ed05219db9 100644 --- a/src/mesa/drivers/dri/common/texmem.c +++ b/src/mesa/drivers/dri/common/texmem.c @@ -1,6 +1,6 @@ /* * Copyright 2000-2001 VA Linux Systems, Inc. - * (c) Copyright IBM Corporation 2002 + * (C) Copyright IBM Corporation 2002, 2003 * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a @@ -46,6 +46,7 @@ #include "texmem.h" #include "simple_list.h" #include "imports.h" +#include "macros.h" #include <assert.h> @@ -156,22 +157,22 @@ static void printLocalLRU( driTexHeap * heap, const char *callername ) continue; if (!t->tObj) { fprintf( stderr, "Placeholder (%p) %d at 0x%x sz 0x%x\n", - t, + (void *)t, t->memBlock->ofs / sz, t->memBlock->ofs, t->memBlock->size ); } else { fprintf( stderr, "Texture (%p) at 0x%x sz 0x%x\n", - t, + (void *)t, t->memBlock->ofs, t->memBlock->size ); } } foreach ( t, heap->swapped_objects ) { if (!t->tObj) { - fprintf( stderr, "Swapped Placeholder (%p)\n", t ); + fprintf( stderr, "Swapped Placeholder (%p)\n", (void *)t ); } else { - fprintf( stderr, "Swapped Texture (%p)\n", t ); + fprintf( stderr, "Swapped Texture (%p)\n", (void *)t ); } } @@ -190,7 +191,7 @@ static void printGlobalLRU( driTexHeap * heap, const char *callername ) int i, j; fprintf( stderr, "%s in %s:\nGlobal LRU, heap %d list %p:\n", - __FUNCTION__, callername, heap->heapId, list ); + __FUNCTION__, callername, heap->heapId, (void *)list ); for ( i = 0, j = heap->nrRegions ; i < heap->nrRegions ; i++ ) { fprintf( stderr, "list[%d] age %d next %d prev %d in_use %d\n", @@ -323,9 +324,9 @@ void driDestroyTextureObject( driTextureObject * t ) if ( 0 ) { fprintf( stderr, "[%s:%d] freeing %p (tObj = %p, DriverData = %p)\n", __FILE__, __LINE__, - t, - (t != NULL) ? t->tObj : NULL, - (t != NULL && t->tObj != NULL) ? t->tObj->DriverData : NULL ); + (void *)t, + (void *)((t != NULL) ? t->tObj : NULL), + (void *)((t != NULL && t->tObj != NULL) ? t->tObj->DriverData : NULL )); } if ( t != NULL ) { @@ -355,7 +356,7 @@ void driDestroyTextureObject( driTextureObject * t ) } if ( 0 ) { - fprintf( stderr, "[%s:%d] done freeing %p\n", __FILE__, __LINE__, t ); + fprintf( stderr, "[%s:%d] done freeing %p\n", __FILE__, __LINE__, (void *)t ); } } @@ -645,7 +646,7 @@ driCreateTextureHeap( unsigned heap_id, void * context, unsigned size, if ( 0 ) fprintf( stderr, "%s( %u, %p, %u, %u, %u )\n", __FUNCTION__, - heap_id, context, size, alignmentShift, nr_regions ); + heap_id, (void *)context, size, alignmentShift, nr_regions ); heap = (driTexHeap *) CALLOC( sizeof( driTexHeap ) ); if ( heap != NULL ) { @@ -688,7 +689,7 @@ driCreateTextureHeap( unsigned heap_id, void * context, unsigned size, if ( 0 ) - fprintf( stderr, "%s returning %p\n", __FUNCTION__, heap ); + fprintf( stderr, "%s returning %p\n", __FUNCTION__, (void *)heap ); return heap; } @@ -894,7 +895,7 @@ get_max_size( unsigned nr_heaps, /** * Given the amount of texture memory, the number of texture units, and the * maximum size of a texel, calculate the maximum texture size the driver can - * adverteise. + * advertise. * * \param heaps Texture heaps for this card * \param nr_heap Number of texture heaps @@ -1097,7 +1098,7 @@ driValidateTextureHeaps( driTexHeap * const * texture_heaps, if ( !check_in_heap( t, heap ) ) { fprintf( stderr, "%s memory block for texture object @ %p not " "found in heap #%d\n", - __FUNCTION__, t, i ); + __FUNCTION__, (void *)t, i ); return GL_FALSE; } @@ -1105,7 +1106,7 @@ driValidateTextureHeaps( driTexHeap * const * texture_heaps, if ( t->totalSize > t->memBlock->size ) { fprintf( stderr, "%s: Memory block for texture object @ %p is " "only %u bytes, but %u are required\n", - __FUNCTION__, t, t->totalSize, t->memBlock->size ); + __FUNCTION__, (void *)t, t->totalSize, t->memBlock->size ); return GL_FALSE; } @@ -1159,15 +1160,76 @@ driValidateTextureHeaps( driTexHeap * const * texture_heaps, foreach ( t, swapped ) { if ( t->memBlock != NULL ) { fprintf( stderr, "%s: Swapped texobj %p has non-NULL memblock %p\n", - __FUNCTION__, t, t->memBlock ); + __FUNCTION__, (void *)t, (void *)t->memBlock ); return GL_FALSE; } i++; } #if 0 - fprintf( stderr, "%s: swapped texture count = %u\n", i ); + fprintf( stderr, "%s: swapped texture count = %u\n", __FUNCTION__, i ); #endif return GL_TRUE; } + + + + +/****************************************************************************/ +/** + * Compute which mipmap levels that really need to be sent to the hardware. + * This depends on the base image size, GL_TEXTURE_MIN_LOD, + * GL_TEXTURE_MAX_LOD, GL_TEXTURE_BASE_LEVEL, and GL_TEXTURE_MAX_LEVEL. + */ + +void +driCalculateTextureFirstLastLevel( driTextureObject * t ) +{ + struct gl_texture_object * const tObj = t->tObj; + const struct gl_texture_image * const baseImage = + tObj->Image[tObj->BaseLevel]; + + /* These must be signed values. MinLod and MaxLod can be negative numbers, + * and having firstLevel and lastLevel as signed prevents the need for + * extra sign checks. + */ + int firstLevel; + int lastLevel; + + /* Yes, this looks overly complicated, but it's all needed. + */ + + switch (tObj->Target) { + case GL_TEXTURE_1D: + case GL_TEXTURE_2D: + case GL_TEXTURE_3D: + case GL_TEXTURE_CUBE_MAP: + if (tObj->MinFilter == GL_NEAREST || tObj->MinFilter == GL_LINEAR) { + /* GL_NEAREST and GL_LINEAR only care about GL_TEXTURE_BASE_LEVEL. + */ + + firstLevel = lastLevel = tObj->BaseLevel; + } + else { + firstLevel = tObj->BaseLevel + (GLint)(tObj->MinLod + 0.5); + firstLevel = MAX2(firstLevel, tObj->BaseLevel); + lastLevel = tObj->BaseLevel + (GLint)(tObj->MaxLod + 0.5); + lastLevel = MAX2(lastLevel, t->tObj->BaseLevel); + lastLevel = MIN2(lastLevel, t->tObj->BaseLevel + baseImage->MaxLog2); + lastLevel = MIN2(lastLevel, t->tObj->MaxLevel); + lastLevel = MAX2(firstLevel, lastLevel); /* need at least one level */ + } + break; + case GL_TEXTURE_RECTANGLE_NV: + case GL_TEXTURE_4D_SGIS: + firstLevel = lastLevel = 0; + break; + default: + return; + } + + /* save these values */ + t->firstLevel = firstLevel; + t->lastLevel = lastLevel; +} diff --git a/src/mesa/drivers/dri/common/texmem.h b/src/mesa/drivers/dri/common/texmem.h index 7199704612a..9afbb0c865b 100644 --- a/src/mesa/drivers/dri/common/texmem.h +++ b/src/mesa/drivers/dri/common/texmem.h @@ -290,4 +290,6 @@ void driInitTextureObjects( GLcontext *ctx, driTextureObject * swapped, GLboolean driValidateTextureHeaps( driTexHeap * const * texture_heaps, unsigned nr_heaps, const driTextureObject * swapped ); +extern void driCalculateTextureFirstLastLevel( driTextureObject * t ); + #endif /* DRI_TEXMEM_H */ diff --git a/src/mesa/drivers/dri/common/vblank.c b/src/mesa/drivers/dri/common/vblank.c index e91dd65260c..d20f743bc9a 100644 --- a/src/mesa/drivers/dri/common/vblank.c +++ b/src/mesa/drivers/dri/common/vblank.c @@ -33,6 +33,7 @@ #include "macros.h" #include "dd.h" #include "vblank.h" +#include "xmlpool.h" /****************************************************************************/ @@ -127,7 +128,7 @@ int driWaitForMSC32( __DRIdrawablePrivate *priv, if ( drmWaitVBlank( priv->driScreenPriv->fd, &vbl ) != 0 ) { /* FIXME: This doesn't seem like the right thing to return here. */ -#ifndef _SOLO +#ifndef _SOLO return GLX_BAD_CONTEXT; #else return -1; @@ -163,9 +164,9 @@ int driWaitForMSC32( __DRIdrawablePrivate *priv, /* FIXME: This doesn't seem like the right thing to return here. */ #ifndef _SOLO - return GLX_BAD_CONTEXT; + return GLX_BAD_CONTEXT; #else - return -1; + return -1; #endif } } @@ -183,20 +184,35 @@ int driWaitForMSC32( __DRIdrawablePrivate *priv, /****************************************************************************/ /** * Gets a set of default vertical-blank-wait flags based on the internal GLX - * API version and several environment variables. + * API version and several configuration options. */ -GLuint driGetDefaultVBlankFlags( void ) +GLuint driGetDefaultVBlankFlags( const driOptionCache *optionCache ) { GLuint flags = 0; - + int vblank_mode; flags |= (driCompareGLXAPIVersion( 20030317 ) >= 0) ? VBLANK_FLAG_INTERVAL : 0; - flags |= (getenv("LIBGL_SYNC_REFRESH") != NULL) - ? VBLANK_FLAG_SYNC : 0; - flags |= (getenv("LIBGL_THROTTLE_REFRESH") != NULL) - ? VBLANK_FLAG_THROTTLE : 0; + + if ( driCheckOption( optionCache, "vblank_mode", DRI_ENUM ) ) + vblank_mode = driQueryOptioni( optionCache, "vblank_mode" ); + else + vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; + + switch (vblank_mode) { + case DRI_CONF_VBLANK_NEVER: + flags = 0; + break; + case DRI_CONF_VBLANK_DEF_INTERVAL_0: + break; + case DRI_CONF_VBLANK_DEF_INTERVAL_1: + flags |= VBLANK_FLAG_THROTTLE; + break; + case DRI_CONF_VBLANK_ALWAYS_SYNC: + flags |= VBLANK_FLAG_SYNC; + break; + } return flags; } @@ -204,6 +220,22 @@ GLuint driGetDefaultVBlankFlags( void ) /****************************************************************************/ /** + * Sets the default swap interval when the drawable is first bound to a + * direct rendering context. + */ + +void driDrawableInitVBlank( __DRIdrawablePrivate *priv, GLuint flags ) +{ +#ifndef _SOLO + if ( priv->pdraw->swap_interval == (unsigned)-1 ) { + priv->pdraw->swap_interval = (flags & VBLANK_FLAG_THROTTLE) != 0 ? 1 : 0; + } +#endif +} + + +/****************************************************************************/ +/** * Wrapper to call \c drmWaitVBlank. The main purpose of this function is to * wrap the error message logging. The error message should only be logged * the first time the \c drmWaitVBlank fails. If \c drmWaitVBlank is @@ -265,7 +297,10 @@ driWaitForVBlank( const __DRIdrawablePrivate *priv, GLuint * vbl_seq, *missed_deadline = GL_FALSE; - if ( (flags & VBLANK_FLAG_NO_IRQ) != 0 ) { + if ( (flags & (VBLANK_FLAG_INTERVAL | + VBLANK_FLAG_THROTTLE | + VBLANK_FLAG_SYNC)) == 0 || + (flags & VBLANK_FLAG_NO_IRQ) != 0 ) { return 0; } @@ -293,11 +328,14 @@ driWaitForVBlank( const __DRIdrawablePrivate *priv, GLuint * vbl_seq, vbl.request.type = DRM_VBLANK_ABSOLUTE; if ( (flags & VBLANK_FLAG_INTERVAL) != 0 ) { -#ifndef _SOLO +#ifndef _SOLO interval = priv->pdraw->swap_interval; #else interval = 0; -#endif +#endif + /* this must have been initialized when the drawable was first bound + * to a direct rendering context. */ + assert ( interval != (unsigned)-1 ); } else if ( (flags & VBLANK_FLAG_THROTTLE) != 0 ) { interval = 1; diff --git a/src/mesa/drivers/dri/common/vblank.h b/src/mesa/drivers/dri/common/vblank.h index 3dab4ead3c2..d460d7a84ad 100644 --- a/src/mesa/drivers/dri/common/vblank.h +++ b/src/mesa/drivers/dri/common/vblank.h @@ -32,6 +32,7 @@ #include "context.h" #include "dri_util.h" +#include "xmlconfig.h" #define VBLANK_FLAG_INTERVAL (1U << 0) /* Respect the swap_interval setting */ @@ -45,7 +46,8 @@ extern int driGetMSC32( __DRIscreenPrivate * priv, int64_t * count ); extern int driWaitForMSC32( __DRIdrawablePrivate *priv, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t * msc ); -extern GLuint driGetDefaultVBlankFlags( void ); +extern GLuint driGetDefaultVBlankFlags( const driOptionCache *optionCache ); +extern void driDrawableInitVBlank ( __DRIdrawablePrivate *priv, GLuint flags ); extern int driWaitForVBlank( const __DRIdrawablePrivate *priv, GLuint * vbl_seq, GLuint flags, GLboolean * missed_deadline ); diff --git a/src/mesa/drivers/dri/common/xmlconfig.c b/src/mesa/drivers/dri/common/xmlconfig.c new file mode 100644 index 00000000000..a6d4c8ab941 --- /dev/null +++ b/src/mesa/drivers/dri/common/xmlconfig.c @@ -0,0 +1,862 @@ +/* + * XML DRI client-side driver configuration + * Copyright (C) 2003 Felix Kuehling + * + * 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 + * FELIX KUEHLING, OR ANY OTHER CONTRIBUTORS 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 xmlconfig.c + * \brief Driver-independent client-side part of the XML configuration + * \author Felix Kuehling + */ + +#include "glheader.h" + +#include <string.h> +#include <assert.h> +#include <expat.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include "imports.h" +#include "dri_util.h" +#include "xmlconfig.h" + +/* + * OS dependent ways of getting the name of the running program + */ +#if (defined(__unix__) || defined(unix)) && !defined(USG) +#include <sys/param.h> +#endif + +#undef GET_PROGRAM_NAME + +#if defined(__GNU_LIBRARY__) || defined(__GLIBC__) +# define GET_PROGRAM_NAME() program_invocation_short_name +#elif defined(__FreeBSD__) && (__FreeBSD__ >= 2) +# include <osreldate.h> +# if (__FreeBSD_version >= 440000) +# include <stdlib.h> +# define GET_PROGRAM_NAME() getprogname() +# endif +#elif defined(__NetBSD__) && defined(__NetBSD_Version) && (__NetBSD_Version >= 106000100) +# include <stdlib.h> +# define GET_PROGRAM_NAME() getprogname() +#endif + +#if !defined(GET_PROGRAM_NAME) +# if defined(OpenBSD) || defined(NetBSD) +/* This is a hack. It's said to work on OpenBSD, NetBSD and GNU. It's + * used as a last resort, if there is no documented facility available. */ +static const char *__getProgramName () { + extern const char *__progname; + return progname; +} +# define GET_PROGRAM_NAME() __getProgramName() +# else +# define GET_PROGRAM_NAME() "" +# warning "Per application configuration won't with your OS version work." +# endif +#endif + +/** \brief Find an option in an option cache with the name as key */ +static GLuint findOption (const driOptionCache *cache, const char *name) { + GLuint len = strlen (name); + GLuint size = 1 << cache->tableSize, mask = size - 1; + GLuint hash = 0; + GLuint i, shift; + + /* compute a hash from the variable length name */ + for (i = 0, shift = 0; i < len; ++i, shift = (shift+8) & 31) + hash += (GLuint)name[i] << shift; + hash *= hash; + hash = (hash >> (16-cache->tableSize/2)) & mask; + + /* this is just the starting point of the linear search for the option */ + for (i = 0; i < size; ++i, hash = (hash+1) & mask) { + /* if we hit an empty entry then the option is not defined (yet) */ + if (cache->info[hash].name == 0) + break; + else if (!strcmp (name, cache->info[hash].name)) + break; + } + /* this assertion fails if the hash table is full */ + assert (i < size); + + return hash; +} + +/** \brief Count the real number of options in an option cache */ +static GLuint countOptions (const driOptionCache *cache) { + GLuint size = 1 << cache->tableSize; + GLuint i, count = 0; + for (i = 0; i < size; ++i) + if (cache->info[i].name) + count++; + return count; +} + +/** \brief Like strdup but using MALLOC and with error checking. */ +#define XSTRDUP(dest,source) do { \ + GLuint len = strlen (source); \ + if (!(dest = MALLOC (len+1))) { \ + fprintf (stderr, "%s: %d: out of memory.\n", __FILE__, __LINE__); \ + abort(); \ + } \ + memcpy (dest, source, len+1); \ +} while (0) + +static int compare (const void *a, const void *b) { + return strcmp (*(char *const*)a, *(char *const*)b); +} +/** \brief Binary search in a string array. */ +static GLuint bsearchStr (const XML_Char *name, + const XML_Char *elems[], GLuint count) { + const XML_Char **found; + found = bsearch (&name, elems, count, sizeof (XML_Char *), compare); + if (found) + return found - elems; + else + return count; +} + +/** \brief Parse a value of a given type. */ +static GLboolean parseValue (driOptionValue *v, driOptionType type, + const XML_Char *string) { + const XML_Char *tail; + /* skip leading white-space */ + string += strspn (string, " \f\n\r\t\v"); + switch (type) { + case DRI_BOOL: + if (!strcmp (string, "false")) { + v->_bool = GL_FALSE; + tail = string + 5; + } else if (!strcmp (string, "true")) { + v->_bool = GL_TRUE; + tail = string + 4; + } + else + return GL_FALSE; + break; + case DRI_ENUM: /* enum is just a special integer */ + case DRI_INT: + v->_int = strtol (string, (char **)&tail, 0); + break; + case DRI_FLOAT: + v->_float = strtod (string, (char **)&tail); + break; + } + + if (tail == string) + return GL_FALSE; /* empty string (or containing only white-space) */ + /* skip trailing white space */ + if (*tail) + tail += strspn (tail, " \f\n\r\t\v"); + if (*tail) + return GL_FALSE; /* something left over that is not part of value */ + + return GL_TRUE; +} + +/** \brief Parse a list of ranges of type info->type. */ +static GLboolean parseRanges (driOptionInfo *info, const XML_Char *string) { + XML_Char *cp, *range; + GLuint nRanges, i; + driOptionRange *ranges; + + XSTRDUP (cp, string); + /* pass 1: determine the number of ranges (number of commas + 1) */ + range = cp; + for (nRanges = 1; *range; ++range) + if (*range == ',') + ++nRanges; + + if ((ranges = MALLOC (nRanges*sizeof(driOptionRange))) == NULL) { + fprintf (stderr, "%s: %d: out of memory.\n", __FILE__, __LINE__); + abort(); + } + + /* pass 2: parse all ranges into preallocated array */ + range = cp; + for (i = 0; i < nRanges; ++i) { + XML_Char *end, *sep; + assert (range); + end = strchr (range, ','); + if (end) + *end = '\0'; + sep = strchr (range, ':'); + if (sep) { /* non-empty interval */ + *sep = '\0'; + if (!parseValue (&ranges[i].start, info->type, range) || + !parseValue (&ranges[i].end, info->type, sep+1)) + break; + if (info->type == DRI_INT && + ranges[i].start._int > ranges[i].end._int) + break; + if (info->type == DRI_FLOAT && + ranges[i].start._float > ranges[i].end._float) + break; + } else { /* empty interval */ + if (!parseValue (&ranges[i].start, info->type, range)) + break; + ranges[i].end = ranges[i].start; + } + if (end) + range = end+1; + else + range = NULL; + } + FREE (cp); + if (i < nRanges) { + FREE (ranges); + return GL_FALSE; + } else + assert (range == NULL); + + info->nRanges = nRanges; + info->ranges = ranges; + return GL_TRUE; +} + +/** \brief Check if a value is in one of info->ranges. */ +static GLboolean checkValue (const driOptionValue *v, const driOptionInfo *info) { + GLuint i; + assert (info->type != DRI_BOOL); /* should be caught by the parser */ + if (info->nRanges == 0) + return GL_TRUE; + switch (info->type) { + case DRI_ENUM: /* enum is just a special integer */ + case DRI_INT: + for (i = 0; i < info->nRanges; ++i) + if (v->_int >= info->ranges[i].start._int && + v->_int <= info->ranges[i].end._int) + return GL_TRUE; + break; + case DRI_FLOAT: + for (i = 0; i < info->nRanges; ++i) + if (v->_float >= info->ranges[i].start._float && + v->_float <= info->ranges[i].end._float) + return GL_TRUE; + break; + default: + assert (0); /* should never happen */ + } + return GL_FALSE; +} + +/** \brief Output a warning message. */ +#define XML_WARNING1(msg) do {\ + __driUtilMessage ("Warning in %s line %d, column %d: "msg, data->name, \ + XML_GetCurrentLineNumber(data->parser), \ + XML_GetCurrentColumnNumber(data->parser)); \ +} while (0) +#define XML_WARNING(msg,args...) do { \ + __driUtilMessage ("Warning in %s line %d, column %d: "msg, data->name, \ + XML_GetCurrentLineNumber(data->parser), \ + XML_GetCurrentColumnNumber(data->parser), \ + args); \ +} while (0) +/** \brief Output an error message. */ +#define XML_ERROR1(msg) do { \ + __driUtilMessage ("Error in %s line %d, column %d: "msg, data->name, \ + XML_GetCurrentLineNumber(data->parser), \ + XML_GetCurrentColumnNumber(data->parser)); \ +} while (0) +#define XML_ERROR(msg,args...) do { \ + __driUtilMessage ("Error in %s line %d, column %d: "msg, data->name, \ + XML_GetCurrentLineNumber(data->parser), \ + XML_GetCurrentColumnNumber(data->parser), \ + args); \ +} while (0) +/** \brief Output a fatal error message and abort. */ +#define XML_FATAL1(msg) do { \ + fprintf (stderr, "Fatal error in %s line %d, column %d: "msg"\n", \ + data->name, \ + XML_GetCurrentLineNumber(data->parser), \ + XML_GetCurrentColumnNumber(data->parser)); \ + abort();\ +} while (0) +#define XML_FATAL(msg,args...) do { \ + fprintf (stderr, "Fatal error in %s line %d, column %d: "msg"\n", \ + data->name, \ + XML_GetCurrentLineNumber(data->parser), \ + XML_GetCurrentColumnNumber(data->parser), \ + args); \ + abort();\ +} while (0) + +/** \brief Parser context for __driConfigOptions. */ +struct OptInfoData { + const char *name; + XML_Parser parser; + driOptionCache *cache; + GLboolean inDriInfo; + GLboolean inSection; + GLboolean inDesc; + GLboolean inOption; + GLboolean inEnum; + int curOption; +}; + +/** \brief Elements in __driConfigOptions. */ +enum OptInfoElem { + OI_DESCRIPTION = 0, OI_DRIINFO, OI_ENUM, OI_OPTION, OI_SECTION, OI_COUNT +}; +static const XML_Char *OptInfoElems[] = { + "description", "driinfo", "enum", "option", "section" +}; + +/** \brief Parse attributes of an enum element. + * + * We're not actually interested in the data. Just make sure this is ok + * for external configuration tools. + */ +static void parseEnumAttr (struct OptInfoData *data, const XML_Char **attr) { + GLuint i; + const XML_Char *value = NULL, *text = NULL; + driOptionValue v; + GLuint opt = data->curOption; + for (i = 0; attr[i]; i += 2) { + if (!strcmp (attr[i], "value")) value = attr[i+1]; + else if (!strcmp (attr[i], "text")) text = attr[i+1]; + else XML_FATAL("illegal enum attribute: %s.", attr[i]); + } + if (!value) XML_FATAL1 ("value attribute missing in enum."); + if (!text) XML_FATAL1 ("text attribute missing in enum."); + if (!parseValue (&v, data->cache->info[opt].type, value)) + XML_FATAL ("illegal enum value: %s.", value); + if (!checkValue (&v, &data->cache->info[opt])) + XML_FATAL ("enum value out of valid range: %s.", value); +} + +/** \brief Parse attributes of a description element. + * + * We're not actually interested in the data. Just make sure this is ok + * for external configuration tools. + */ +static void parseDescAttr (struct OptInfoData *data, const XML_Char **attr) { + GLuint i; + const XML_Char *lang = NULL, *text = NULL; + for (i = 0; attr[i]; i += 2) { + if (!strcmp (attr[i], "lang")) lang = attr[i+1]; + else if (!strcmp (attr[i], "text")) text = attr[i+1]; + else XML_FATAL("illegal description attribute: %s.", attr[i]); + } + if (!lang) XML_FATAL1 ("lang attribute missing in description."); + if (!text) XML_FATAL1 ("text attribute missing in description."); +} + +/** \brief Parse attributes of an option element. */ +static void parseOptInfoAttr (struct OptInfoData *data, const XML_Char **attr) { + enum OptAttr {OA_DEFAULT = 0, OA_NAME, OA_TYPE, OA_VALID, OA_COUNT}; + static const XML_Char *optAttr[] = {"default", "name", "type", "valid"}; + const XML_Char *attrVal[OA_COUNT] = {NULL, NULL, NULL, NULL}; + const char *defaultVal; + driOptionCache *cache = data->cache; + GLuint opt, i; + for (i = 0; attr[i]; i += 2) { + GLuint attrName = bsearchStr (attr[i], optAttr, OA_COUNT); + if (attrName >= OA_COUNT) + XML_FATAL ("illegal option attribute: %s", attr[i]); + attrVal[attrName] = attr[i+1]; + } + if (!attrVal[OA_NAME]) XML_FATAL1 ("name attribute missing in option."); + if (!attrVal[OA_TYPE]) XML_FATAL1 ("type attribute missing in option."); + if (!attrVal[OA_DEFAULT]) XML_FATAL1 ("default attribute missing in option."); + + opt = findOption (cache, attrVal[OA_NAME]); + if (cache->info[opt].name) + XML_FATAL ("option %s redefined.", attrVal[OA_NAME]); + data->curOption = opt; + + XSTRDUP (cache->info[opt].name, attrVal[OA_NAME]); + + if (!strcmp (attrVal[OA_TYPE], "bool")) + cache->info[opt].type = DRI_BOOL; + else if (!strcmp (attrVal[OA_TYPE], "enum")) + cache->info[opt].type = DRI_ENUM; + else if (!strcmp (attrVal[OA_TYPE], "int")) + cache->info[opt].type = DRI_INT; + else if (!strcmp (attrVal[OA_TYPE], "float")) + cache->info[opt].type = DRI_FLOAT; + else + XML_FATAL ("illegal type in option: %s.", attrVal[OA_TYPE]); + + defaultVal = getenv (cache->info[opt].name); + if (defaultVal != NULL) { + /* don't use XML_WARNING, we want the user to see this! */ + fprintf (stderr, + "ATTENTION: default value of option %s overridden by environment.\n", + cache->info[opt].name); + } else + defaultVal = attrVal[OA_DEFAULT]; + if (!parseValue (&cache->values[opt], cache->info[opt].type, defaultVal)) + XML_FATAL ("illegal default value: %s.", defaultVal); + + if (attrVal[OA_VALID]) { + if (cache->info[opt].type == DRI_BOOL) + XML_FATAL1 ("boolean option with valid attribute."); + if (!parseRanges (&cache->info[opt], attrVal[OA_VALID])) + XML_FATAL ("illegal valid attribute: %s.", attrVal[OA_VALID]); + if (!checkValue (&cache->values[opt], &cache->info[opt])) + XML_FATAL ("default value out of valid range '%s': %s.", + attrVal[OA_VALID], defaultVal); + } else if (cache->info[opt].type == DRI_ENUM) { + XML_FATAL1 ("valid attribute missing in option (mandatory for enums)."); + } else { + cache->info[opt].nRanges = 0; + cache->info[opt].ranges = NULL; + } +} + +/** \brief Handler for start element events. */ +static void optInfoStartElem (void *userData, const XML_Char *name, + const XML_Char **attr) { + struct OptInfoData *data = (struct OptInfoData *)userData; + enum OptInfoElem elem = bsearchStr (name, OptInfoElems, OI_COUNT); + switch (elem) { + case OI_DRIINFO: + if (data->inDriInfo) + XML_FATAL1 ("nested <driinfo> elements."); + if (attr[0]) + XML_FATAL1 ("attributes specified on <driinfo> element."); + data->inDriInfo = GL_TRUE; + break; + case OI_SECTION: + if (!data->inDriInfo) + XML_FATAL1 ("<section> must be inside <driinfo>."); + if (data->inSection) + XML_FATAL1 ("nested <section> elements."); + if (attr[0]) + XML_FATAL1 ("attributes specified on <section> element."); + data->inSection = GL_TRUE; + break; + case OI_DESCRIPTION: + if (!data->inSection && !data->inOption) + XML_FATAL1 ("<description> must be inside <description> or <option."); + if (data->inDesc) + XML_FATAL1 ("nested <description> elements."); + data->inDesc = GL_TRUE; + parseDescAttr (data, attr); + break; + case OI_OPTION: + if (!data->inSection) + XML_FATAL1 ("<option> must be inside <section>."); + if (data->inDesc) + XML_FATAL1 ("<option> nested in <description> element."); + if (data->inOption) + XML_FATAL1 ("nested <option> elements."); + data->inOption = GL_TRUE; + parseOptInfoAttr (data, attr); + break; + case OI_ENUM: + if (!(data->inOption && data->inDesc)) + XML_FATAL1 ("<enum> must be inside <option> and <description>."); + if (data->inEnum) + XML_FATAL1 ("nested <enum> elements."); + data->inEnum = GL_TRUE; + parseEnumAttr (data, attr); + break; + default: + XML_FATAL ("unknown element: %s.", name); + } +} + +/** \brief Handler for end element events. */ +static void optInfoEndElem (void *userData, const XML_Char *name) { + struct OptInfoData *data = (struct OptInfoData *)userData; + enum OptInfoElem elem = bsearchStr (name, OptInfoElems, OI_COUNT); + switch (elem) { + case OI_DRIINFO: + data->inDriInfo = GL_FALSE; + break; + case OI_SECTION: + data->inSection = GL_FALSE; + break; + case OI_DESCRIPTION: + data->inDesc = GL_FALSE; + break; + case OI_OPTION: + data->inOption = GL_FALSE; + break; + case OI_ENUM: + data->inEnum = GL_FALSE; + break; + default: + assert (0); /* should have been caught by StartElem */ + } +} + +void driParseOptionInfo (driOptionCache *info) { + XML_Parser p; + int status; + struct OptInfoData userData; + struct OptInfoData *data = &userData; + GLuint nOptions; + + /* determine hash table size and allocate memory */ + GLuint size, log2size; + for (size = 1, log2size = 0; size < __driNConfigOptions*3/2; + size <<= 1, ++log2size); + info->tableSize = log2size; + info->info = CALLOC (size * sizeof (driOptionInfo)); + info->values = CALLOC (size * sizeof (driOptionInfo)); + if (info->info == NULL || info->values == NULL) { + fprintf (stderr, "%s: %d: out of memory.\n", __FILE__, __LINE__); + abort(); + } + + p = XML_ParserCreate ("UTF-8"); /* always UTF-8 */ + XML_SetElementHandler (p, optInfoStartElem, optInfoEndElem); + XML_SetUserData (p, data); + + userData.name = "__driConfigOptions"; + userData.parser = p; + userData.cache = info; + userData.inDriInfo = GL_FALSE; + userData.inSection = GL_FALSE; + userData.inDesc = GL_FALSE; + userData.inOption = GL_FALSE; + userData.inEnum = GL_FALSE; + userData.curOption = -1; + + status = XML_Parse (p, __driConfigOptions, strlen (__driConfigOptions), 1); + if (!status) + XML_FATAL ("%s.", XML_ErrorString(XML_GetErrorCode(p))); + + XML_ParserFree (p); + + /* Check if the actual number of options matches __driNConfigOptions. + * A mismatch is not fatal (a hash table overflow would be) but we + * want the driver developer's attention anyway. */ + nOptions = countOptions (info); + if (nOptions != __driNConfigOptions) { + fprintf (stderr, + "Error: __driNConfigOptions (%u) does not match the actual number of options in\n" + " __driConfigOptions (%u).\n", + __driNConfigOptions, nOptions); + } +} + +/** \brief Parser context for configuration files. */ +struct OptConfData { + const char *name; + XML_Parser parser; + driOptionCache *cache; + GLint screenNum; + const char *driverName, *execName; + GLuint ignoringDevice; + GLuint ignoringApp; + GLuint inDriConf; + GLuint inDevice; + GLuint inApp; + GLuint inOption; +}; + +/** \brief Elements in configuration files. */ +enum OptConfElem { + OC_APPLICATION = 0, OC_DEVICE, OC_DRICONF, OC_OPTION, OC_COUNT +}; +static const XML_Char *OptConfElems[] = { + "application", "device", "driconf", "option" +}; + +/** \brief Parse attributes of a device element. */ +static void parseDeviceAttr (struct OptConfData *data, const XML_Char **attr) { + GLuint i; + const XML_Char *driver = NULL, *screen = NULL; + for (i = 0; attr[i]; i += 2) { + if (!strcmp (attr[i], "driver")) driver = attr[i+1]; + else if (!strcmp (attr[i], "screen")) screen = attr[i+1]; + else XML_WARNING("unkown device attribute: %s.", attr[i]); + } + if (driver && strcmp (driver, data->driverName)) + data->ignoringDevice = data->inDevice; + else if (screen) { + driOptionValue screenNum; + if (!parseValue (&screenNum, DRI_INT, screen)) + XML_WARNING("illegal screen number: %s.", screen); + else if (screenNum._int != data->screenNum) + data->ignoringDevice = data->inDevice; + } +} + +/** \brief Parse attributes of an application element. */ +static void parseAppAttr (struct OptConfData *data, const XML_Char **attr) { + GLuint i; + const XML_Char *name = NULL, *exec = NULL; + for (i = 0; attr[i]; i += 2) { + if (!strcmp (attr[i], "name")) name = attr[i+1]; + else if (!strcmp (attr[i], "executable")) exec = attr[i+1]; + else XML_WARNING("unkown application attribute: %s.", attr[i]); + } + if (exec && strcmp (exec, data->execName)) + data->ignoringApp = data->inApp; +} + +/** \brief Parse attributes of an option element. */ +static void parseOptConfAttr (struct OptConfData *data, const XML_Char **attr) { + GLuint i; + const XML_Char *name = NULL, *value = NULL; + for (i = 0; attr[i]; i += 2) { + if (!strcmp (attr[i], "name")) name = attr[i+1]; + else if (!strcmp (attr[i], "value")) value = attr[i+1]; + else XML_WARNING("unkown option attribute: %s.", attr[i]); + } + if (!name) XML_WARNING1 ("name attribute missing in option."); + if (!value) XML_WARNING1 ("value attribute missing in option."); + if (name && value) { + driOptionCache *cache = data->cache; + GLuint opt = findOption (cache, name); + if (cache->info[opt].name == NULL) + XML_WARNING ("undefined option: %s.", name); + else if (getenv (cache->info[opt].name)) + /* don't use XML_WARNING, we want the user to see this! */ + fprintf (stderr, "ATTENTION: option value of option %s ignored.\n", + cache->info[opt].name); + else if (!parseValue (&cache->values[opt], cache->info[opt].type, value)) + XML_WARNING ("illegal option value: %s.", value); + } +} + +/** \brief Handler for start element events. */ +static void optConfStartElem (void *userData, const XML_Char *name, + const XML_Char **attr) { + struct OptConfData *data = (struct OptConfData *)userData; + enum OptConfElem elem = bsearchStr (name, OptConfElems, OC_COUNT); + switch (elem) { + case OC_DRICONF: + if (data->inDriConf) + XML_WARNING1 ("nested <driconf> elements."); + if (attr[0]) + XML_WARNING1 ("attributes specified on <driconf> element."); + data->inDriConf++; + break; + case OC_DEVICE: + if (!data->inDriConf) + XML_WARNING1 ("<device> should be inside <driconf>."); + if (data->inDevice) + XML_WARNING1 ("nested <device> elements."); + data->inDevice++; + if (!data->ignoringDevice && !data->ignoringApp) + parseDeviceAttr (data, attr); + break; + case OC_APPLICATION: + if (!data->inDevice) + XML_WARNING1 ("<application> should be inside <device>."); + if (data->inApp) + XML_WARNING1 ("nested <application> elements."); + data->inApp++; + if (!data->ignoringDevice && !data->ignoringApp) + parseAppAttr (data, attr); + break; + case OC_OPTION: + if (!data->inApp) + XML_WARNING1 ("<option> should be inside <application>."); + if (data->inOption) + XML_WARNING1 ("nested <option> elements."); + data->inOption++; + if (!data->ignoringDevice && !data->ignoringApp) + parseOptConfAttr (data, attr); + break; + default: + XML_WARNING ("unknown element: %s.", name); + } +} + +/** \brief Handler for end element events. */ +static void optConfEndElem (void *userData, const XML_Char *name) { + struct OptConfData *data = (struct OptConfData *)userData; + enum OptConfElem elem = bsearchStr (name, OptConfElems, OC_COUNT); + switch (elem) { + case OC_DRICONF: + data->inDriConf--; + break; + case OC_DEVICE: + if (data->inDevice-- == data->ignoringDevice) + data->ignoringDevice = 0; + break; + case OC_APPLICATION: + if (data->inApp-- == data->ignoringApp) + data->ignoringApp = 0; + break; + case OC_OPTION: + data->inOption--; + break; + default: + /* unknown element, warning was produced on start tag */; + } +} + +/** \brief Initialize an option cache based on info */ +static void initOptionCache (driOptionCache *cache, driOptionCache *info) { + cache->info = info->info; + cache->tableSize = info->tableSize; + cache->values = MALLOC ((1<<info->tableSize) * sizeof (driOptionValue)); + if (cache->values == NULL) { + fprintf (stderr, "%s: %d: out of memory.\n", __FILE__, __LINE__); + abort(); + } + memcpy (cache->values, info->values, + (1<<info->tableSize) * sizeof (driOptionValue)); +} + +/** \brief Parse the named configuration file */ +static void parseOneConfigFile (XML_Parser p) { +#define BUF_SIZE 0x1000 + struct OptConfData *data = (struct OptConfData *)XML_GetUserData (p); + int status; + int fd; + + if ((fd = open (data->name, O_RDONLY)) == -1) { + __driUtilMessage ("Can't open configuration file %s: %s.", + data->name, strerror (errno)); + return; + } + + while (1) { + int bytesRead; + void *buffer = XML_GetBuffer (p, BUF_SIZE); + if (!buffer) { + __driUtilMessage ("Can't allocate parser buffer."); + break; + } + bytesRead = read (fd, buffer, BUF_SIZE); + if (bytesRead == -1) { + __driUtilMessage ("Error reading from configuration file %s: %s.", + data->name, strerror (errno)); + break; + } + status = XML_ParseBuffer (p, bytesRead, bytesRead == 0); + if (!status) { + XML_ERROR ("%s.", XML_ErrorString(XML_GetErrorCode(p))); + break; + } + if (bytesRead == 0) + break; + } + + close (fd); +#undef BUF_SIZE +} + +void driParseConfigFiles (driOptionCache *cache, driOptionCache *info, + GLint screenNum, const char *driverName) { + char *filenames[2] = {"/etc/drirc", NULL}; + char *home; + GLuint i; + struct OptConfData userData; + + initOptionCache (cache, info); + + userData.cache = cache; + userData.screenNum = screenNum; + userData.driverName = driverName; +#ifndef _SOLO + userData.execName = GET_PROGRAM_NAME(); +#else + userData.execName = "Solo"; +#endif + + if ((home = getenv ("HOME"))) { + GLuint len = strlen (home); + filenames[1] = MALLOC (len + 7+1); + if (filenames[1] == NULL) + __driUtilMessage ("Can't allocate memory for %s/.drirc.", home); + else { + memcpy (filenames[1], home, len); + memcpy (filenames[1] + len, "/.drirc", 7+1); + } + } + + for (i = 0; i < 2; ++i) { + XML_Parser p; + if (filenames[i] == NULL) + continue; + + p = XML_ParserCreate (NULL); /* use encoding specified by file */ + XML_SetElementHandler (p, optConfStartElem, optConfEndElem); + XML_SetUserData (p, &userData); + userData.parser = p; + userData.name = filenames[i]; + userData.ignoringDevice = 0; + userData.ignoringApp = 0; + userData.inDriConf = 0; + userData.inDevice = 0; + userData.inApp = 0; + userData.inOption = 0; + + parseOneConfigFile (p); + XML_ParserFree (p); + } + + if (filenames[1]) + FREE (filenames[1]); +} + +void driDestroyOptionInfo (driOptionCache *info) { + driDestroyOptionCache (info); + if (info->info) { + GLuint i, size = 1 << info->tableSize; + for (i = 0; i < size; ++i) { + if (info->info[i].name) { + FREE (info->info[i].name); + if (info->info[i].ranges) + FREE (info->info[i].ranges); + } + } + FREE (info->info); + } +} + +void driDestroyOptionCache (driOptionCache *cache) { + if (cache->values) + FREE (cache->values); +} + +GLboolean driCheckOption (const driOptionCache *cache, const char *name, + driOptionType type) { + GLuint i = findOption (cache, name); + return cache->info[i].name != NULL && cache->info[i].type == type; +} + +GLboolean driQueryOptionb (const driOptionCache *cache, const char *name) { + GLuint i = findOption (cache, name); + /* make sure the option is defined and has the correct type */ + assert (cache->info[i].name != NULL); + assert (cache->info[i].type == DRI_BOOL); + return cache->values[i]._bool; +} + +GLint driQueryOptioni (const driOptionCache *cache, const char *name) { + GLuint i = findOption (cache, name); + /* make sure the option is defined and has the correct type */ + assert (cache->info[i].name != NULL); + assert (cache->info[i].type == DRI_INT || cache->info[i].type == DRI_ENUM); + return cache->values[i]._int; +} + +GLfloat driQueryOptionf (const driOptionCache *cache, const char *name) { + GLuint i = findOption (cache, name); + /* make sure the option is defined and has the correct type */ + assert (cache->info[i].name != NULL); + assert (cache->info[i].type == DRI_FLOAT); + return cache->values[i]._float; +} diff --git a/src/mesa/drivers/dri/common/xmlconfig.h b/src/mesa/drivers/dri/common/xmlconfig.h new file mode 100644 index 00000000000..710e328e015 --- /dev/null +++ b/src/mesa/drivers/dri/common/xmlconfig.h @@ -0,0 +1,125 @@ +/* + * XML DRI client-side driver configuration + * Copyright (C) 2003 Felix Kuehling + * + * 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 + * FELIX KUEHLING, OR ANY OTHER CONTRIBUTORS 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 xmlconfig.h + * \brief Driver-independent client-side part of the XML configuration + * \author Felix Kuehling + */ + +#ifndef __XMLCONFIG_H +#define __XMLCONFIG_H + +/** \brief Option data types */ +typedef enum driOptionType { + DRI_BOOL, DRI_ENUM, DRI_INT, DRI_FLOAT +} driOptionType; + +/** \brief Option value */ +typedef union driOptionValue { + GLboolean _bool; /**< \brief Boolean */ + GLint _int; /**< \brief Integer or Enum */ + GLfloat _float; /**< \brief Floating-point */ +} driOptionValue; + +/** \brief Single range of valid values + * + * For empty ranges (a single value) start == end */ +typedef struct driOptionRange { + driOptionValue start; /**< \brief Start */ + driOptionValue end; /**< \brief End */ +} driOptionRange; + +/** \brief Information about an option */ +typedef struct driOptionInfo { + char *name; /**< \brief Name */ + driOptionType type; /**< \brief Type */ + driOptionRange *ranges; /**< \brief Array of ranges */ + GLuint nRanges; /**< \brief Number of ranges */ +} driOptionInfo; + +/** \brief Option cache + * + * \li One in <driver>Screen caching option info and the default values + * \li One in each <driver>Context with the actual values for that context */ +typedef struct driOptionCache { + driOptionInfo *info; + /**< \brief Array of option infos + * + * Points to the same array in the screen and all contexts */ + driOptionValue *values; + /**< \brief Array of option values + * + * \li Default values in screen + * \li Actual values in contexts + */ + GLuint tableSize; + /**< \brief Size of the arrays + * + * Depending on the hash function this may differ from __driNConfigOptions. + * In the current implementation it's not actually a size but log2(size). + * The value is the same in the screen and all contexts. */ +} driOptionCache; + +/** \brief XML document describing available options + * + * This must be defined in a driver-specific soure file. xmlpool.h + * defines helper macros and common options. */ +extern const char __driConfigOptions[]; +/** \brief The number of options supported by a driver + * + * This is used to choose an appropriate hash table size. So any value + * larger than the actual number of options will work. */ +extern const GLuint __driNConfigOptions; + +/** \brief Parse XML option info from __driConfigOptions + * + * To be called in <driver>CreateScreen */ +void driParseOptionInfo (driOptionCache *info); +/** \brief Initialize option cache from info and parse configuration files + * + * To be called in <driver>CreateContext. screenNum and driverName select + * device sections. */ +void driParseConfigFiles (driOptionCache *cache, driOptionCache *info, + GLint screenNum, const char *driverName); +/** \brief Destroy option info + * + * To be called in <driver>DestroyScreen */ +void driDestroyOptionInfo (driOptionCache *info); +/** \brief Destroy option cache + * + * To be called in <driver>DestroyContext */ +void driDestroyOptionCache (driOptionCache *cache); + +/** \brief Check if there exists a certain option */ +GLboolean driCheckOption (const driOptionCache *cache, const char *name, + driOptionType type); + +/** \brief Query a boolean option value */ +GLboolean driQueryOptionb (const driOptionCache *cache, const char *name); +/** \brief Query an integer option value */ +GLint driQueryOptioni (const driOptionCache *cache, const char *name); +/** \brief Query a floating-point option value */ +GLfloat driQueryOptionf (const driOptionCache *cache, const char *name); + +#endif diff --git a/src/mesa/drivers/dri/common/xmlpool.h b/src/mesa/drivers/dri/common/xmlpool.h new file mode 100644 index 00000000000..c1553734782 --- /dev/null +++ b/src/mesa/drivers/dri/common/xmlpool.h @@ -0,0 +1,203 @@ +/* -*- mode:C; coding: mult-utf-8-unix -*- + * + * !!! Important: This file is encoded in UTF-8 !!! + * + * Note (Emacs): You need Mule. In Debian the package is called + * mule-ucs. + * + * Note (Emacs): You may have to enable multibyte characters in the + * Mule customization group or by setting + * default-enable-multibyte-characters to t in your .emacs: + */ +/* + * XML DRI client-side driver configuration + * Copyright (C) 2003 Felix Kuehling + * + * 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 + * FELIX KUEHLING, OR ANY OTHER CONTRIBUTORS 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 xmlpool.h + * \brief Pool of common options + * \author Felix Kuehling + * + * This file defines macros that can be used to construct driConfigOptions + * in the drivers. + */ + +#ifndef __XMLPOOL_H +#define __XMLPOOL_H + +/* + * generic macros + */ + +/** \brief Begin __driConfigOptions */ +#define DRI_CONF_BEGIN \ +"<driinfo>\n" + +/** \brief End __driConfigOptions */ +#define DRI_CONF_END \ +"</driinfo>\n" + +/** \brief Begin a section of related options */ +#define DRI_CONF_SECTION_BEGIN \ +"<section>\n" + +/** \brief End a section of related options */ +#define DRI_CONF_SECTION_END \ +"</section>\n" + +/** \brief Begin an option definition */ +#define DRI_CONF_OPT_BEGIN(name,type,def) \ +"<option name=\""#name"\" type=\""#type"\" default=\""#def"\">\n" + +/** \brief Begin an option definition with restrictions on valid values */ +#define DRI_CONF_OPT_BEGIN_V(name,type,def,valid) \ +"<option name=\""#name"\" type=\""#type"\" default=\""#def"\" valid=\""valid"\">\n" + +/** \brief End an option description */ +#define DRI_CONF_OPT_END \ +"</option>\n" + +/** \brief A verbal description in a specified language (empty version) */ +#define DRI_CONF_DESC(lang,text) \ +"<description lang=\""#lang"\" text=\""text"\"/>\n" + +/** \brief A verbal description in a specified language */ +#define DRI_CONF_DESC_BEGIN(lang,text) \ +"<description lang=\""#lang"\" text=\""text"\">\n" + +/** \brief End a description */ +#define DRI_CONF_DESC_END \ +"</description>\n" + +/** \brief A verbal description of an enum value */ +#define DRI_CONF_ENUM(value,text) \ +"<enum value=\""#value"\" text=\""text"\"/>\n" + +/* + * predefined option sections and options with multi-lingual descriptions + */ + +/** \brief Debugging options */ +#define DRI_CONF_SECTION_DEBUG \ +DRI_CONF_SECTION_BEGIN \ + DRI_CONF_DESC(en,"Debugging") \ + DRI_CONF_DESC(de,"Fehlersuche") + +#define DRI_CONF_NO_RAST(def) \ +DRI_CONF_OPT_BEGIN(no_rast,bool,def) \ + DRI_CONF_DESC(en,"Disable 3D acceleration") \ + DRI_CONF_DESC(de,"3D-Beschleunigung abschalten") \ +DRI_CONF_OPT_END + +#define DRI_CONF_PERFORMANCE_BOXES(def) \ +DRI_CONF_OPT_BEGIN(performance_boxes,bool,def) \ + DRI_CONF_DESC(en,"Show performance boxes") \ + DRI_CONF_DESC(de,"Zeige Performanceboxen") \ +DRI_CONF_OPT_END + +#define DRI_CONF_DEBUG_DMA(def) \ +DRI_CONF_OPT_BEGIN(debug_dma,bool,def) \ + DRI_CONF_DESC(en,"Debug DMA buffers") \ + DRI_CONF_DESC(de,"DMA Puffer debuggen") \ +DRI_CONF_OPT_END + + +/** \brief Texture-related options */ +#define DRI_CONF_SECTION_QUALITY \ +DRI_CONF_SECTION_BEGIN \ + DRI_CONF_DESC(en,"Image Quality") \ + DRI_CONF_DESC(de,"Bildqualität") + +#define DRI_CONF_PREFERRED_BPT(def,valid) \ +DRI_CONF_OPT_BEGIN_V(preferred_bpt,enum,def,valid) \ + DRI_CONF_DESC_BEGIN(en,"Preferred texture color depth") \ + DRI_CONF_ENUM(0,"Same as frame buffer") \ + DRI_CONF_DESC_END \ + DRI_CONF_DESC_BEGIN(de,"Bevorzugte Textur Farbtiefe") \ + DRI_CONF_ENUM(0,"So wie der Framebuffer") \ + DRI_CONF_DESC_END \ +DRI_CONF_OPT_END + +/** \brief Performance-related options */ +#define DRI_CONF_SECTION_PERFORMANCE \ +DRI_CONF_SECTION_BEGIN \ + DRI_CONF_DESC(en,"Performance") \ + DRI_CONF_DESC(de,"Leistung") + +#define DRI_CONF_TCL_SW 0 +#define DRI_CONF_TCL_PIPELINED 1 +#define DRI_CONF_TCL_VTXFMT 2 +#define DRI_CONF_TCL_CODEGEN 3 +#define DRI_CONF_TCL_MODE(def) \ +DRI_CONF_OPT_BEGIN_V(tcl_mode,enum,def,"0:3") \ + DRI_CONF_DESC_BEGIN(en,"TCL mode (Transformation, Clipping, Lighting)") \ + DRI_CONF_ENUM(0,"Software") \ + DRI_CONF_ENUM(1,"TCL stage in MESA pipeline") \ + DRI_CONF_ENUM(2,"Bypass MESA's pipeline") \ + DRI_CONF_ENUM(3,"Bypass MESA's pipeline with state-based code generation") \ + DRI_CONF_DESC_END \ + DRI_CONF_DESC_BEGIN(de,"TCL Modus (Transformation, Clipping, Licht)") \ + DRI_CONF_ENUM(0,"Software") \ + DRI_CONF_ENUM(1,"TCL Stufe in MESA Pipeline") \ + DRI_CONF_ENUM(2,"Umgehe MESA's Pipeline") \ + DRI_CONF_ENUM(3,"Umgehe MESA's Pipeline mit zustandsbasierter Codegenerierung") \ + DRI_CONF_DESC_END \ +DRI_CONF_OPT_END + +#define DRI_CONF_FTHROTTLE_BUSY 0 +#define DRI_CONF_FTHROTTLE_USLEEPS 1 +#define DRI_CONF_FTHROTTLE_IRQS 2 +#define DRI_CONF_FTHROTTLE_MODE(def) \ +DRI_CONF_OPT_BEGIN_V(fthrottle_mode,enum,def,"0:2") \ + DRI_CONF_DESC_BEGIN(en,"Frame throttling") \ + DRI_CONF_ENUM(0,"Busy waiting") \ + DRI_CONF_ENUM(1,"Usleeps") \ + DRI_CONF_ENUM(2,"Software interrupts") \ + DRI_CONF_DESC_END \ + DRI_CONF_DESC_BEGIN(de,"Framethrottling") \ + DRI_CONF_ENUM(0,"Aktives Warten") \ + DRI_CONF_ENUM(1,"Usleeps") \ + DRI_CONF_ENUM(2,"Sortware Interrutps") \ + DRI_CONF_DESC_END \ +DRI_CONF_OPT_END + +#define DRI_CONF_VBLANK_NEVER 0 +#define DRI_CONF_VBLANK_DEF_INTERVAL_0 1 +#define DRI_CONF_VBLANK_DEF_INTERVAL_1 2 +#define DRI_CONF_VBLANK_ALWAYS_SYNC 3 +#define DRI_CONF_VBLANK_MODE(def) \ +DRI_CONF_OPT_BEGIN_V(vblank_mode,enum,def,"0:3") \ + DRI_CONF_DESC_BEGIN(en,"Synchronization with vertical refresh (swap intervals)") \ + DRI_CONF_ENUM(0,"Never, FPS rulez!") \ + DRI_CONF_ENUM(1,"Application preference, default interval 0") \ + DRI_CONF_ENUM(2,"Application preference, default interval 1") \ + DRI_CONF_ENUM(3,"Application preference, always synchronize with refresh") \ + DRI_CONF_DESC_END \ + DRI_CONF_DESC_BEGIN(de,"Synchronisation mit dem vertikalen Bildaufbau (swap intervals)") \ + DRI_CONF_ENUM(0,"Niemals, immer die maximale Framerate") \ + DRI_CONF_ENUM(1,"Anwendung entscheidet, Standardinterval 0") \ + DRI_CONF_ENUM(2,"Anwendung entscheidet, Standardinterval 1") \ + DRI_CONF_ENUM(3,"Anwendung entscheidet, immer mit Bildaufbau synchronisieren") \ + DRI_CONF_DESC_END \ +DRI_CONF_OPT_END + +#endif diff --git a/src/mesa/drivers/dri/fb/Makefile.X11 b/src/mesa/drivers/dri/fb/Makefile.X11 index 4a3c7a3fd79..356c1bb3453 100644 --- a/src/mesa/drivers/dri/fb/Makefile.X11 +++ b/src/mesa/drivers/dri/fb/Makefile.X11 @@ -1,4 +1,4 @@ -# $Id: Makefile.X11,v 1.2 2003/08/23 04:58:24 jonsmirl Exp $ +# $Id: Makefile.X11,v 1.2.2.1 2003/11/21 15:49:29 keithw Exp $ # Mesa 3-D graphics library # Version: 5.0 @@ -57,6 +57,10 @@ fb_dri.so: $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile.X11 rm -f $(TOP)/lib/fb_dri.so && \ install fb_dri.so $(TOP)/lib/fb_dri.so +$(TOP)/lib/fb_dri.so: fb_dri.so + rm -f $(TOP)/lib/fb_dri.so && \ + install fb_dri.so $(TOP)/lib/fb_dri.so + # Run 'make -f Makefile.X11 dep' to update the dependencies if you change # what's included by any source file. depend: $(C_SOURCES) $(ASM_SOURCES) diff --git a/src/mesa/drivers/dri/fb/fb_dri.c b/src/mesa/drivers/dri/fb/fb_dri.c index 794e3d1fc8c..59c068beb89 100644 --- a/src/mesa/drivers/dri/fb/fb_dri.c +++ b/src/mesa/drivers/dri/fb/fb_dri.c @@ -1,4 +1,4 @@ -/* $Id: fb_dri.c,v 1.2 2003/10/08 01:53:30 kendallb Exp $ */ +/* $Id: fb_dri.c,v 1.1.2.1 2003/11/21 15:49:29 keithw Exp $ */ /* * Mesa 3-D graphics library diff --git a/src/mesa/drivers/dri/gamma/Makefile.X11 b/src/mesa/drivers/dri/gamma/Makefile.X11 new file mode 100644 index 00000000000..4a7c9168ee0 --- /dev/null +++ b/src/mesa/drivers/dri/gamma/Makefile.X11 @@ -0,0 +1,123 @@ +# $Id: Makefile.X11,v 1.2.2.1 2003/11/21 15:49:29 keithw Exp $ + +# Mesa 3-D graphics library +# Version: 5.0 +# Copyright (C) 1995-2002 Brian Paul + +TOP = ../../../../.. + +default: linux-solo + +SHARED_INCLUDES = $(INCLUDE_DIRS) -I. -I../common -Iserver +MINIGLX_INCLUDES = -I$(TOP)/src/glx/mini + +DEFINES += \ + -D_HAVE_SWRAST=1 \ + -D_HAVE_SWTNL=1 \ + -D_HAVE_SANITY=1 \ + -D_HAVE_CODEGEN=1 \ + -D_HAVE_LIGHTING=1 \ + -D_HAVE_TEXGEN=1 \ + -D_HAVE_USERCLIP=1 \ + -DGLX_DIRECT_RENDERING + +# Not yet +# MINIGLX_SOURCES = server/gamma_dri.c + +DRIVER_SOURCES = \ + gamma_context.c \ + gamma_dd.c \ + gamma_inithw.c \ + gamma_lock.c \ + gamma_render.c \ + gamma_screen.c \ + gamma_span.c \ + gamma_state.c \ + gamma_tex.c \ + gamma_texmem.c \ + gamma_texstate.c \ + gamma_tris.c \ + gamma_vb.c \ + gamma_xmesa.c \ + ../common/mm.c \ + ../common/utils.c \ + ../common/texmem.c \ + ../common/vblank.c + +INCLUDES = $(MINIGLX_INCLUDES) \ + $(SHARED_INCLUDES) + + +C_SOURCES = $(DRIVER_SOURCES) \ + $(MINIGLX_SOURCES) + +MESA_MODULES = $(TOP)/src/mesa/mesa.a + + +ifeq ($(WINDOW_SYSTEM),dri) +WINOBJ=$(MESABUILDDIR)/dri/dri.a +WINLIB= +else +WINOBJ= +WINLIB=-L$(MESA)/src/glx/mini +endif + +ASM_SOURCES = +OBJECTS = $(C_SOURCES:.c=.o) \ + $(ASM_SOURCES:.S=.o) + +### Include directories + +INCLUDE_DIRS = \ + -I$(TOP)/include \ + -I$(TOP)/src/mesa \ + -I$(TOP)/src/mesa/main \ + -I$(TOP)/src/mesa/glapi \ + -I$(TOP)/src/mesa/math \ + -I$(TOP)/src/mesa/transform \ + -I$(TOP)/src/mesa/swrast \ + -I$(TOP)/src/mesa/swrast_setup + + +##### RULES ##### + +.c.o: + $(CC) -c $(SHARED_INCLUDES) $(MINIGLX_INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@ + +.S.o: + $(CC) -c $(SHARED_INCLUDES) $(MINIGLX_INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@ + + +##### TARGETS ##### + +targets: depend gamma_dri.so + +gamma_dri.so: $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile.X11 + rm -f $@ && gcc -o $@ -shared $(OBJECTS) $(MESA_MODULES) $(WINOBJ) $(WINLIB) -lc $(GL_LIB_DEPS) + rm -f $(TOP)/lib/gamma_dri.so && \ + install gamma_dri.so $(TOP)/lib/gamma_dri.so + +$(TOP)/lib/gamma_dri.so: gamma_dri.so + rm -f $(TOP)/lib/gamma_dri.so && \ + install gamma_dri.so $(TOP)/lib/gamma_dri.so + +# Run 'make -f Makefile.X11 dep' to update the dependencies if you change +# what's included by any source file. +depend: $(C_SOURCES) $(ASM_SOURCES) + makedepend -fdepend -Y $(SHARED_INCLUDES) $(MINIGLX_INCLUDES) \ + $(C_SOURCES) $(ASM_SOURCES) + + +# Emacs tags +tags: + etags `find . -name \*.[ch]` `find ../include` + + +# Remove .o and backup files +clean: + -rm -f *.o */*.o *~ *.o *~ *.so server/*.o + + +include $(TOP)/Make-config + +include depend diff --git a/src/mesa/drivers/dri/gamma/gamma_xmesa.c b/src/mesa/drivers/dri/gamma/gamma_xmesa.c index 67bcf019d0c..c0a298cb859 100644 --- a/src/mesa/drivers/dri/gamma/gamma_xmesa.c +++ b/src/mesa/drivers/dri/gamma/gamma_xmesa.c @@ -66,7 +66,7 @@ gammaDestroyContext(__DRIcontextPrivate *driContextPriv) gmesa->glCtx->DriverCtx = NULL; _mesa_destroy_context(gmesa->glCtx); - Xfree(gmesa); + FREE(gmesa); driContextPriv->driverPrivate = NULL; } } diff --git a/src/mesa/drivers/dri/i810/Makefile.X11 b/src/mesa/drivers/dri/i810/Makefile.X11 index 461da451e15..95bcfa535cb 100644 --- a/src/mesa/drivers/dri/i810/Makefile.X11 +++ b/src/mesa/drivers/dri/i810/Makefile.X11 @@ -1,4 +1,4 @@ -# $Id: Makefile.X11,v 1.1 2003/09/30 10:54:15 alanh Exp $ +# $Id: Makefile.X11,v 1.1.2.1 2003/11/21 15:49:29 keithw Exp $ # Mesa 3-D graphics library # Version: 5.0 @@ -94,6 +94,10 @@ i810_dri.so: $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile.X11 rm -f $(TOP)/lib/i810_dri.so && \ install i810_dri.so $(TOP)/lib/i810_dri.so +$(TOP)/lib/i810_dri.so: i810_dri.so + rm -f $(TOP)/lib/i810_dri.so && \ + install i810_dri.so $(TOP)/lib/i810_dri.so + # Run 'make -f Makefile.X11 dep' to update the dependencies if you change # what's included by any source file. depend: $(C_SOURCES) $(ASM_SOURCES) diff --git a/src/mesa/drivers/dri/i810/i810screen.c b/src/mesa/drivers/dri/i810/i810screen.c index 9e457f42cd9..53f1251fa9d 100644 --- a/src/mesa/drivers/dri/i810/i810screen.c +++ b/src/mesa/drivers/dri/i810/i810screen.c @@ -34,6 +34,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "glheader.h" +#include "imports.h" #include "context.h" #include "matrix.h" #include "simple_list.h" @@ -68,12 +69,12 @@ static drmBufMapPtr i810_create_empty_buffers(void) { drmBufMapPtr retval; - retval = (drmBufMapPtr)MALLOC(sizeof(drmBufMap)); + retval = (drmBufMapPtr)ALIGN_MALLOC(sizeof(drmBufMap), 32); if(retval == NULL) return NULL; memset(retval, 0, sizeof(drmBufMap)); - retval->list = (drmBufPtr)MALLOC(sizeof(drmBuf) * I810_DMA_BUF_NR); + retval->list = (drmBufPtr)ALIGN_MALLOC(sizeof(drmBuf) * I810_DMA_BUF_NR, 32); if(retval->list == NULL) { - Xfree(retval); + ALIGN_FREE(retval); return NULL; } memset(retval->list, 0, sizeof(drmBuf) * I810_DMA_BUF_NR); @@ -143,7 +144,7 @@ i810InitDriver(__DRIscreenPrivate *sPriv) i810Screen->bufs = i810_create_empty_buffers(); if (i810Screen->bufs == NULL) { __driUtilMessage("i810InitDriver: i810_create_empty_buffers() failed"); - Xfree(i810Screen); + FREE(i810Screen); return GL_FALSE; } @@ -154,7 +155,7 @@ i810InitDriver(__DRIscreenPrivate *sPriv) i810Screen->back.handle, i810Screen->back.size, (drmAddress *)&i810Screen->back.map) != 0) { - Xfree(i810Screen); + FREE(i810Screen); sPriv->private = NULL; __driUtilMessage("i810InitDriver: drmMap failed"); return GL_FALSE; @@ -167,7 +168,7 @@ i810InitDriver(__DRIscreenPrivate *sPriv) i810Screen->depth.handle, i810Screen->depth.size, (drmAddress *)&i810Screen->depth.map) != 0) { - Xfree(i810Screen); + FREE(i810Screen); drmUnmap(i810Screen->back.map, i810Screen->back.size); sPriv->private = NULL; __driUtilMessage("i810InitDriver: drmMap (2) failed"); @@ -181,7 +182,7 @@ i810InitDriver(__DRIscreenPrivate *sPriv) i810Screen->tex.handle, i810Screen->tex.size, (drmAddress *)&i810Screen->tex.map) != 0) { - Xfree(i810Screen); + FREE(i810Screen); drmUnmap(i810Screen->back.map, i810Screen->back.size); drmUnmap(i810Screen->depth.map, i810Screen->depth.size); sPriv->private = NULL; @@ -205,7 +206,7 @@ i810DestroyScreen(__DRIscreenPrivate *sPriv) drmUnmap(i810Screen->depth.map, i810Screen->depth.size); drmUnmap(i810Screen->tex.map, i810Screen->tex.size); - Xfree(i810Screen); + FREE(i810Screen); sPriv->private = NULL; } diff --git a/src/mesa/drivers/dri/i830/Makefile.X11 b/src/mesa/drivers/dri/i830/Makefile.X11 index 622e5281cf5..d27432dbe65 100644 --- a/src/mesa/drivers/dri/i830/Makefile.X11 +++ b/src/mesa/drivers/dri/i830/Makefile.X11 @@ -1,4 +1,4 @@ -# $Id: Makefile.X11,v 1.2 2003/09/30 11:05:46 alanh Exp $ +# $Id: Makefile.X11,v 1.2.2.1 2003/11/21 15:49:29 keithw Exp $ # Mesa 3-D graphics library # Version: 5.0 @@ -95,6 +95,10 @@ i830_dri.so: $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile.X11 rm -f $(TOP)/lib/i830_dri.so && \ install i830_dri.so $(TOP)/lib/i830_dri.so +$(TOP)/lib/i830_dri.so: i830_dri.so + rm -f $(TOP)/lib/i830_dri.so && \ + install i830_dri.so $(TOP)/lib/i830_dri.so + # Run 'make -f Makefile.X11 dep' to update the dependencies if you change # what's included by any source file. depend: $(C_SOURCES) $(ASM_SOURCES) diff --git a/src/mesa/drivers/dri/i830/i830_screen.c b/src/mesa/drivers/dri/i830/i830_screen.c index cd3c74c5841..b0117210f52 100644 --- a/src/mesa/drivers/dri/i830/i830_screen.c +++ b/src/mesa/drivers/dri/i830/i830_screen.c @@ -57,7 +57,7 @@ static int i830_malloc_proxy_buf(drmBufMapPtr buffers) drmBufPtr buf; int i; - buffer = MALLOC(I830_DMA_BUF_SZ); + buffer = ALIGN_MALLOC(I830_DMA_BUF_SZ, 32); if(buffer == NULL) return -1; for(i = 0; i < I830_DMA_BUF_NR; i++) { buf = &(buffers->list[i]); @@ -71,12 +71,12 @@ static drmBufMapPtr i830_create_empty_buffers(void) { drmBufMapPtr retval; - retval = (drmBufMapPtr)MALLOC(sizeof(drmBufMap)); + retval = (drmBufMapPtr)ALIGN_MALLOC(sizeof(drmBufMap), 32); if(retval == NULL) return NULL; memset(retval, 0, sizeof(drmBufMap)); - retval->list = (drmBufPtr)MALLOC(sizeof(drmBuf) * I830_DMA_BUF_NR); + retval->list = (drmBufPtr)ALIGN_MALLOC(sizeof(drmBuf) * I830_DMA_BUF_NR, 32); if(retval->list == NULL) { - Xfree(retval); + FREE(retval); return NULL; } @@ -182,7 +182,7 @@ static GLboolean i830InitDriver(__DRIscreenPrivate *sPriv) if(i830Screen->bufs == NULL) { fprintf(stderr,"\nERROR: Failed to create empty buffers in %s \n", __FUNCTION__); - Xfree(i830Screen); + FREE(i830Screen); return GL_FALSE; } @@ -203,7 +203,7 @@ static GLboolean i830InitDriver(__DRIscreenPrivate *sPriv) (drmAddress *)&i830Screen->back.map) != 0) { fprintf(stderr, "\nERROR: line %d, Function %s, File %s\n", __LINE__, __FUNCTION__, __FILE__); - Xfree(i830Screen); + FREE(i830Screen); sPriv->private = NULL; return GL_FALSE; } @@ -217,7 +217,7 @@ static GLboolean i830InitDriver(__DRIscreenPrivate *sPriv) (drmAddress *)&i830Screen->depth.map) != 0) { fprintf(stderr, "\nERROR: line %d, Function %s, File %s\n", __LINE__, __FUNCTION__, __FILE__); - Xfree(i830Screen); + FREE(i830Screen); drmUnmap(i830Screen->back.map, i830Screen->back.size); sPriv->private = NULL; return GL_FALSE; @@ -232,7 +232,7 @@ static GLboolean i830InitDriver(__DRIscreenPrivate *sPriv) (drmAddress *)&i830Screen->tex.map) != 0) { fprintf(stderr, "\nERROR: line %d, Function %s, File %s\n", __LINE__, __FUNCTION__, __FILE__); - Xfree(i830Screen); + FREE(i830Screen); drmUnmap(i830Screen->back.map, i830Screen->back.size); drmUnmap(i830Screen->depth.map, i830Screen->depth.size); sPriv->private = NULL; @@ -288,7 +288,7 @@ static void i830DestroyScreen(__DRIscreenPrivate *sPriv) drmUnmap(i830Screen->back.map, i830Screen->back.size); drmUnmap(i830Screen->depth.map, i830Screen->depth.size); drmUnmap(i830Screen->tex.map, i830Screen->tex.size); - Xfree(i830Screen); + FREE(i830Screen); sPriv->private = NULL; } diff --git a/src/mesa/drivers/dri/mga/Makefile.X11 b/src/mesa/drivers/dri/mga/Makefile.X11 index 4f20c7a8331..ceaa6746422 100644 --- a/src/mesa/drivers/dri/mga/Makefile.X11 +++ b/src/mesa/drivers/dri/mga/Makefile.X11 @@ -1,4 +1,4 @@ -# $Id: Makefile.X11,v 1.3 2003/08/24 04:44:23 jonsmirl Exp $ +# $Id: Makefile.X11,v 1.3.2.1 2003/11/21 15:49:29 keithw Exp $ # Mesa 3-D graphics library # Version: 5.0 @@ -31,7 +31,8 @@ DRIVER_SOURCES = mgadd.c \ ../common/mm.c \ ../common/utils.c \ ../common/texmem.c \ - ../common/vblank.c + ../common/vblank.c \ + ../common/xmlconfig.c FULL_DRIVER_SOURCES = \ mgapixel.c \ @@ -39,6 +40,7 @@ FULL_DRIVER_SOURCES = \ mgatex.c \ mgatexmem.c \ mga_texstate.c \ + mga_texcombine.c \ mgavb.c \ mga_xmesa.c @@ -99,6 +101,10 @@ mga_dri.so: $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile.X11 rm -f $(TOP)/lib/mga_dri.so && \ install mga_dri.so $(TOP)/lib/mga_dri.so +$(TOP)/lib/mga_dri.so: mga_dri.so + rm -f $(TOP)/lib/mga_dri.so && \ + install mga_dri.so $(TOP)/lib/mga_dri.so + # Run 'make -f Makefile.X11 dep' to update the dependencies if you change # what's included by any source file. depend: $(C_SOURCES) $(ASM_SOURCES) diff --git a/src/mesa/drivers/dri/mga/mga_texcombine.c b/src/mesa/drivers/dri/mga/mga_texcombine.c new file mode 100644 index 00000000000..f0664e37cfa --- /dev/null +++ b/src/mesa/drivers/dri/mga/mga_texcombine.c @@ -0,0 +1,647 @@ +/* + * Copyright (c) 2003 Ville Syrjala + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Ville Syrjala <[email protected]> + */ + +#include "glheader.h" + +#include "mgacontext.h" +#include "mgatex.h" +#include "mgaregs.h" + +/* + * GL_ARB_texture_env_combine + * GL_EXT_texture_env_combine + * GL_ARB_texture_env_crossbar + * GL_ATI_texture_env_combine3 + */ + +#define ARG_DISABLE 0xffffffff +#define MGA_ARG1 0 +#define MGA_ARG2 1 +#define MGA_ALPHA 2 + +GLboolean mgaUpdateTextureEnvCombine( GLcontext *ctx, int unit ) +{ + mgaContextPtr mmesa = MGA_CONTEXT(ctx); + const int source = mmesa->tmu_source[unit]; + const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[source]; + GLuint *reg = ((GLuint *)&mmesa->setup.tdualstage0 + unit); + GLuint numColorArgs = 0, numAlphaArgs = 0; + GLuint arg1[3], arg2[3], alpha[3]; + int args[3]; + int i; + + switch (texUnit->CombineModeRGB) { + case GL_REPLACE: + numColorArgs = 1; + break; + case GL_MODULATE: + case GL_ADD: + case GL_ADD_SIGNED: + case GL_SUBTRACT: + numColorArgs = 2; + break; + case GL_INTERPOLATE: + case GL_MODULATE_ADD_ATI: + case GL_MODULATE_SIGNED_ADD_ATI: + case GL_MODULATE_SUBTRACT_ATI: + numColorArgs = 3; + break; + default: + return GL_FALSE; + } + + switch (texUnit->CombineModeA) { + case GL_REPLACE: + numAlphaArgs = 1; + break; + case GL_MODULATE: + case GL_ADD: + case GL_ADD_SIGNED: + case GL_SUBTRACT: + numAlphaArgs = 2; + break; + default: + return GL_FALSE; + } + + /* Start fresh :) */ + *reg = 0; + + /* COLOR */ + for (i = 0; i < 3; i++) { + arg1[i] = 0; + arg2[i] = 0; + alpha[i] = 0; + } + + for (i = 0;i < numColorArgs; i++) { + switch (texUnit->CombineSourceRGB[i]) { + case GL_TEXTURE: + arg1[i] |= 0; + arg2[i] |= ARG_DISABLE; + alpha[i] |= TD0_color_alpha_currtex; + break; + case GL_TEXTURE0: + if (source == 0) { + arg1[i] |= 0; + arg2[i] |= ARG_DISABLE; + alpha[i] |= TD0_color_alpha_currtex; + } else { + if (ctx->Texture._EnabledUnits != 0x03) { + /* disable texturing */ + mmesa->setup.dwgctl &= DC_opcod_MASK; + mmesa->setup.dwgctl |= DC_opcod_trap; + mmesa->hw.alpha_sel = AC_alphasel_diffused; + /* return GL_TRUE since we don't need a fallback */ + return GL_TRUE; + } + arg1[i] |= ARG_DISABLE; + arg2[i] |= ARG_DISABLE; + alpha[i] |= TD0_color_alpha_prevtex; + } + break; + case GL_TEXTURE1: + if (source == 0) { + if (ctx->Texture._EnabledUnits != 0x03) { + /* disable texturing */ + mmesa->setup.dwgctl &= DC_opcod_MASK; + mmesa->setup.dwgctl |= DC_opcod_trap; + mmesa->hw.alpha_sel = AC_alphasel_diffused; + /* return GL_TRUE since we don't need a fallback */ + return GL_TRUE; + } + arg1[i] |= ARG_DISABLE; + /* G400 specs (TDUALSTAGE0) */ + arg2[i] |= TD0_color_arg2_prevstage; + alpha[i] |= TD0_color_alpha_prevstage; + } else { + arg1[i] |= 0; + arg2[i] |= ARG_DISABLE; + alpha[i] |= TD0_color_alpha_currtex; + } + break; + case GL_CONSTANT: + arg1[i] |= ARG_DISABLE; + arg2[i] |= TD0_color_arg2_fcol; + alpha[i] |= TD0_color_alpha_fcol; + break; + case GL_PRIMARY_COLOR: + arg1[i] |= ARG_DISABLE; + /* G400 specs (TDUALSTAGE1) */ + if (unit == 0 || (mmesa->setup.tdualstage0 & + ((TD0_color_sel_mul & TD0_color_sel_add) | + (TD0_alpha_sel_mul & TD0_alpha_sel_add)))) { + arg2[i] |= TD0_color_arg2_diffuse; + alpha[i] |= TD0_color_alpha_diffuse; + } else { + arg2[i] |= ARG_DISABLE; + alpha[i] |= ARG_DISABLE; + } + break; + case GL_PREVIOUS: + arg1[i] |= ARG_DISABLE; + if (unit == 0) { + arg2[i] |= TD0_color_arg2_diffuse; + alpha[i] |= TD0_color_alpha_diffuse; + } else { + arg2[i] |= TD0_color_arg2_prevstage; + alpha[i] |= TD0_color_alpha_prevstage; + } + break; + default: + return GL_FALSE; + } + + switch (texUnit->CombineOperandRGB[i]) { + case GL_SRC_COLOR: + arg1[i] |= 0; + arg2[i] |= 0; + alpha[i] |= ARG_DISABLE; + break; + case GL_ONE_MINUS_SRC_COLOR: + arg1[i] |= TD0_color_arg1_inv_enable; + arg2[i] |= TD0_color_arg2_inv_enable; + alpha[i] |= ARG_DISABLE; + break; + case GL_SRC_ALPHA: + arg1[i] |= TD0_color_arg1_replicatealpha_enable; + arg2[i] |= TD0_color_arg2_replicatealpha_enable; + alpha[i] |= 0; + break; + case GL_ONE_MINUS_SRC_ALPHA: + arg1[i] |= (TD0_color_arg1_replicatealpha_enable | + TD0_color_arg1_inv_enable); + arg2[i] |= (TD0_color_arg2_replicatealpha_enable | + TD0_color_arg2_inv_enable); + alpha[i] |= (TD0_color_alpha1inv_enable | + TD0_color_alpha2inv_enable); + break; + } + } + + switch (texUnit->CombineModeRGB) { + case GL_MODULATE_ADD_ATI: + case GL_MODULATE_SIGNED_ADD_ATI: + /* Special handling for ATI_texture_env_combine3. + * If Arg1 == Arg0 or Arg1 == Arg2 we can use arg1 or arg2 as input for + * both multiplier and adder. + */ + /* Arg1 == arg1 */ + if (arg1[1] == arg1[0]) { + if ((arg1[1] | arg2[2]) != ARG_DISABLE) { + *reg |= arg1[1] | arg2[2]; + args[0] = MGA_ARG1; args[1] = MGA_ARG1; args[2] = MGA_ARG2; + break; + } else + if ((arg1[1] | alpha[2]) != ARG_DISABLE) { + *reg |= arg1[1] | alpha[2]; + args[0] = MGA_ARG1; args[1] = MGA_ARG1; args[2] = MGA_ALPHA; + break; + } + } + if (arg1[1] == arg1[2]) { + if ((arg1[1] | arg2[0]) != ARG_DISABLE) { + *reg |= arg1[1] | arg2[0]; + args[0] = MGA_ARG2; args[1] = MGA_ARG1; args[2] = MGA_ARG1; + break; + } else + if ((arg1[1] | alpha[0]) != ARG_DISABLE) { + *reg |= arg1[1] | alpha[0]; + args[0] = MGA_ALPHA; args[1] = MGA_ARG1; args[2] = MGA_ARG1; + break; + } + } + /* fallthrough */ + case GL_MODULATE_SUBTRACT_ATI: + /* Arg1 == arg2 */ + if (arg2[1] == arg2[0]) { + if ((arg2[1] | arg1[2]) != ARG_DISABLE) { + *reg |= arg2[1] | arg1[2]; + args[0] = MGA_ARG2; args[1] = MGA_ARG2; args[2] = MGA_ARG1; + break; + } else + if ((arg2[1] | alpha[2]) != ARG_DISABLE) { + *reg |= arg2[1] | alpha[2]; + args[0] = MGA_ARG2; args[1] = MGA_ARG2; args[2] = MGA_ALPHA; + break; + } + } + if (arg2[1] == arg2[2]) { + if ((arg2[1] | arg1[0]) != ARG_DISABLE) { + *reg |= arg2[1] | arg1[0]; + args[0] = MGA_ARG1; args[1] = MGA_ARG2; args[2] = MGA_ARG2; + break; + } else + if ((arg2[1] | alpha[0]) != ARG_DISABLE) { + *reg |= arg2[1] | alpha[0]; + args[0] = MGA_ALPHA; args[1] = MGA_ARG2; args[2] = MGA_ARG2; + break; + } + } + /* fallthrough */ + default: + /* Find working combo of arg1, arg2 and alpha. + * + * Keep the Arg0 != alpha cases first since there's + * no way to get alpha out by itself (GL_REPLACE). + * + * Keep the Arg2 == alpha cases first because only alpha has the + * capabilities to function as Arg2 (GL_INTERPOLATE). Also good for + * GL_ADD, GL_ADD_SIGNED, GL_SUBTRACT since we can't get alpha to the + * adder. + * + * Keep the Arg1 == alpha cases last for GL_MODULATE_ADD_ATI, + * GL_MODULATE_SIGNED_ADD_ATI. Again because we can't get alpha to the + * adder. + * + * GL_MODULATE_SUBTRACT_ATI needs special treatment since it requires + * that Arg1 == arg2. This requirement clashes with those of other modes. + */ + if ((arg1[0] | arg2[1] | alpha[2]) != ARG_DISABLE) { + *reg |= arg1[0] | arg2[1] | alpha[2]; + args[0] = MGA_ARG1; args[1] = MGA_ARG2; args[2] = MGA_ALPHA; + } else + if ((arg1[1] | arg2[0] | alpha[2]) != ARG_DISABLE && + texUnit->CombineModeRGB != GL_MODULATE_SUBTRACT_ATI) { + *reg |= arg1[1] | arg2[0] | alpha[2]; + args[0] = MGA_ARG2; args[1] = MGA_ARG1; args[2] = MGA_ALPHA; + } else + if ((arg1[1] | arg2[2] | alpha[0]) != ARG_DISABLE && + texUnit->CombineModeRGB != GL_MODULATE_SUBTRACT_ATI) { + *reg |= arg1[1] | arg2[2] | alpha[0]; + args[0] = MGA_ALPHA; args[1] = MGA_ARG1; args[2] = MGA_ARG2; + } else + if ((arg1[2] | arg2[1] | alpha[0]) != ARG_DISABLE) { + *reg |= arg1[2] | arg2[1] | alpha[0]; + args[0] = MGA_ALPHA; args[1] = MGA_ARG2; args[2] = MGA_ARG1; + } else + if ((arg1[0] | arg2[2] | alpha[1]) != ARG_DISABLE) { + *reg |= arg1[0] | arg2[2] | alpha[1]; + args[0] = MGA_ARG1; args[1] = MGA_ALPHA; args[2] = MGA_ARG2; + } else + if ((arg1[2] | arg2[0] | alpha[1]) != ARG_DISABLE) { + *reg |= arg1[2] | arg2[0] | alpha[1]; + args[0] = MGA_ARG2; args[1] = MGA_ALPHA; args[2] = MGA_ARG1; + } else { + /* nothing suitable */ + return GL_FALSE; + } + } + + switch (texUnit->CombineModeRGB) { + case GL_REPLACE: + if (texUnit->CombineScaleShiftRGB) { + return GL_FALSE; + } + + if (args[0] == MGA_ARG1) { + *reg |= TD0_color_sel_arg1; + } else if (args[0] == MGA_ARG2) { + *reg |= TD0_color_sel_arg2; + } else if (args[0] == MGA_ALPHA) { + /* Can't get alpha out by itself */ + return GL_FALSE; + } + break; + case GL_MODULATE: + if (texUnit->CombineScaleShiftRGB == 1) { + *reg |= TD0_color_modbright_2x; + } else if (texUnit->CombineScaleShiftRGB == 2) { + *reg |= TD0_color_modbright_4x; + } + + *reg |= TD0_color_sel_mul; + + if (args[0] == MGA_ALPHA || args[1] == MGA_ALPHA) { + if (args[0] == MGA_ARG1 || args[1] == MGA_ARG1) { + *reg |= TD0_color_arg2mul_alpha2; + } else if (args[0] == MGA_ARG2 || args[1] == MGA_ARG2) { + *reg |= TD0_color_arg1mul_alpha1; + } + } + break; + case GL_ADD_SIGNED: + *reg |= TD0_color_addbias_enable; + /* fallthrough */ + case GL_ADD: + if (args[0] == MGA_ALPHA || args[1] == MGA_ALPHA){ + /* Can't get alpha to the adder */ + return GL_FALSE; + } + if (texUnit->CombineScaleShiftRGB == 1) { + *reg |= TD0_color_add2x_enable; + } else if (texUnit->CombineScaleShiftRGB == 2) { + return GL_FALSE; + } + + *reg |= (TD0_color_add_add | + TD0_color_sel_add); + break; + case GL_INTERPOLATE: + if (args[2] != MGA_ALPHA) { + /* Only alpha can function as Arg2 */ + return GL_FALSE; + } + if (texUnit->CombineScaleShiftRGB == 1) { + *reg |= TD0_color_add2x_enable; + } else if (texUnit->CombineScaleShiftRGB == 2) { + return GL_FALSE; + } + + *reg |= (TD0_color_arg1mul_alpha1 | + TD0_color_blend_enable | + TD0_color_arg1add_mulout | + TD0_color_arg2add_mulout | + TD0_color_add_add | + TD0_color_sel_add); + + /* Have to do this with xor since GL_ONE_MINUS_SRC_ALPHA may have + * already touched this bit. + */ + *reg ^= TD0_color_alpha1inv_enable; + + if (args[0] == MGA_ARG2) { + /* Swap arguments */ + *reg ^= (TD0_color_arg1mul_alpha1 | + TD0_color_arg2mul_alpha2 | + TD0_color_alpha1inv_enable | + TD0_color_alpha2inv_enable); + } + + if (ctx->Texture._EnabledUnits != 0x03) { + /* Linear blending mode needs dualtex enabled */ + *(reg+1) = (TD0_color_arg2_prevstage | + TD0_color_sel_arg2 | + TD0_alpha_arg2_prevstage | + TD0_alpha_sel_arg2); + mmesa->dualtex_env = GL_TRUE; + } + break; + case GL_SUBTRACT: + if (args[0] == MGA_ALPHA || args[1] == MGA_ALPHA) { + /* Can't get alpha to the adder */ + return GL_FALSE; + } + if (texUnit->CombineScaleShiftRGB == 1) { + *reg |= TD0_color_add2x_enable; + } else if (texUnit->CombineScaleShiftRGB == 2) { + return GL_FALSE; + } + + *reg |= (TD0_color_add_sub | + TD0_color_sel_add); + + if (args[0] == MGA_ARG2) { + /* Swap arguments */ + *reg ^= (TD0_color_arg1_inv_enable | + TD0_color_arg2_inv_enable); + } + break; + case GL_MODULATE_SIGNED_ADD_ATI: + *reg |= TD0_color_addbias_enable; + /* fallthrough */ + case GL_MODULATE_ADD_ATI: + if (args[1] == MGA_ALPHA) { + /* Can't get alpha to the adder */ + return GL_FALSE; + } + if (texUnit->CombineScaleShiftRGB == 1) { + *reg |= TD0_color_add2x_enable; + } else if (texUnit->CombineScaleShiftRGB == 2) { + return GL_FALSE; + } + + *reg |= (TD0_color_add_add | + TD0_color_sel_add); + + if (args[1] == args[0] || args[1] == args[2]) { + *reg |= TD0_color_arg1add_mulout; + if (args[0] == MGA_ALPHA || args[2] == MGA_ALPHA) + *reg |= TD0_color_arg1mul_alpha1; + + if (args[1] == MGA_ARG1) { + /* Swap adder arguments */ + *reg ^= (TD0_color_arg1add_mulout | + TD0_color_arg2add_mulout); + if (args[0] == MGA_ALPHA || args[2] == MGA_ALPHA) { + /* Swap multiplier arguments */ + *reg ^= (TD0_color_arg1mul_alpha1 | + TD0_color_arg2mul_alpha2); + } + } + } else { + *reg |= (TD0_color_arg2mul_alpha2 | + TD0_color_arg1add_mulout); + + if (args[1] == MGA_ARG1) { + /* Swap arguments */ + *reg ^= (TD0_color_arg1mul_alpha1 | + TD0_color_arg2mul_alpha2 | + TD0_color_arg1add_mulout | + TD0_color_arg2add_mulout); + } + } + break; + case GL_MODULATE_SUBTRACT_ATI: + if (args[1] != MGA_ARG2) { + /* Can't swap arguments */ + return GL_FALSE; + } + if (texUnit->CombineScaleShiftRGB == 1) { + *reg |= TD0_color_add2x_enable; + } else if (texUnit->CombineScaleShiftRGB == 2) { + return GL_FALSE; + } + + *reg |= (TD0_color_add_sub | + TD0_color_sel_add); + + if (args[1] == args[0] || args[1] == args[2]) { + *reg |= TD0_color_arg1add_mulout; + if (args[0] == MGA_ALPHA || args[2] == MGA_ALPHA) + *reg |= TD0_color_arg1mul_alpha1; + } else { + *reg |= (TD0_color_arg2mul_alpha2 | + TD0_color_arg1add_mulout); + } + break; + } + + + /* ALPHA */ + for (i = 0; i < 2; i++) { + arg1[i] = 0; + arg2[i] = 0; + } + + for (i = 0; i < numAlphaArgs; i++) { + switch (texUnit->CombineSourceA[i]) { + case GL_TEXTURE: + arg1[i] |= 0; + arg2[i] |= ARG_DISABLE; + break; + case GL_TEXTURE0: + if (source == 0) { + arg1[i] |= 0; + arg2[i] |= ARG_DISABLE; + } else { + if (ctx->Texture._EnabledUnits != 0x03) { + /* disable texturing */ + mmesa->setup.dwgctl &= DC_opcod_MASK; + mmesa->setup.dwgctl |= DC_opcod_trap; + mmesa->hw.alpha_sel = AC_alphasel_diffused; + /* return GL_TRUE since we don't need a fallback */ + return GL_TRUE; + } + arg1[i] |= ARG_DISABLE; + arg2[i] |= TD0_alpha_arg2_prevtex; + } + break; + case GL_TEXTURE1: + if (source == 0) { + if (ctx->Texture._EnabledUnits != 0x03) { + /* disable texturing */ + mmesa->setup.dwgctl &= DC_opcod_MASK; + mmesa->setup.dwgctl |= DC_opcod_trap; + mmesa->hw.alpha_sel = AC_alphasel_diffused; + /* return GL_TRUE since we don't need a fallback */ + return GL_TRUE; + } + arg1[i] |= ARG_DISABLE; + /* G400 specs (TDUALSTAGE0) */ + arg2[i] |= TD0_alpha_arg2_prevstage; + } else { + arg1[i] |= 0; + arg2[i] |= ARG_DISABLE; + } + break; + case GL_CONSTANT: + arg1[i] |= ARG_DISABLE; + arg2[i] |= TD0_alpha_arg2_fcol; + break; + case GL_PRIMARY_COLOR: + arg1[i] |= ARG_DISABLE; + /* G400 specs (TDUALSTAGE1) */ + if (unit == 0 || (mmesa->setup.tdualstage0 & + ((TD0_color_sel_mul & TD0_color_sel_add) | + (TD0_alpha_sel_mul & TD0_alpha_sel_add)))) { + arg2[i] |= TD0_alpha_arg2_diffuse; + } else { + arg2[i] |= ARG_DISABLE; + } + break; + case GL_PREVIOUS: + arg1[i] |= ARG_DISABLE; + if (unit == 0) { + arg2[i] |= TD0_alpha_arg2_diffuse; + } else { + arg2[i] |= TD0_alpha_arg2_prevstage; + } + break; + default: + return GL_FALSE; + } + + switch (texUnit->CombineOperandA[i]) { + case GL_SRC_ALPHA: + arg1[i] |= 0; + arg2[i] |= 0; + break; + case GL_ONE_MINUS_SRC_ALPHA: + arg1[i] |= TD0_alpha_arg1_inv_enable; + arg2[i] |= TD0_alpha_arg2_inv_enable; + break; + } + } + + /* Find a working combo of arg1 and arg2 */ + if ((arg1[0] | arg2[1]) != ARG_DISABLE) { + *reg |= arg1[0] | arg2[1]; + args[0] = MGA_ARG1; args[1] = MGA_ARG2; + } else + if ((arg1[1] | arg2[0]) != ARG_DISABLE) { + *reg |= arg1[1] | arg2[0]; + args[0] = MGA_ARG2; args[1] = MGA_ARG1; + } else { + /* nothing suitable */ + return GL_FALSE; + } + + switch (texUnit->CombineModeA) { + case GL_REPLACE: + if (texUnit->CombineScaleShiftA) { + return GL_FALSE; + } + + if (args[0] == MGA_ARG1){ + *reg |= TD0_alpha_sel_arg1; + } else if (args[0] == MGA_ARG2) { + *reg |= TD0_alpha_sel_arg2; + } + break; + case GL_MODULATE: + if (texUnit->CombineScaleShiftA == 1) { + *reg |= TD0_alpha_modbright_2x; + } else if (texUnit->CombineScaleShiftA == 2) { + *reg |= TD0_alpha_modbright_4x; + } + + *reg |= TD0_alpha_sel_mul; + break; + case GL_ADD_SIGNED: + *reg |= TD0_alpha_addbias_enable; + /* fallthrough */ + case GL_ADD: + if (texUnit->CombineScaleShiftA == 1) { + *reg |= TD0_alpha_add2x_enable; + } else if (texUnit->CombineScaleShiftA == 2) { + return GL_FALSE; + } + + *reg |= (TD0_alpha_add_enable | + TD0_alpha_sel_add); + break; + case GL_SUBTRACT: + if (texUnit->CombineScaleShiftA == 1) { + *reg |= TD0_alpha_add2x_enable; + } else if (texUnit->CombineScaleShiftA == 2) { + return GL_FALSE; + } + + *reg |= (TD0_alpha_add_disable | + TD0_alpha_sel_add); + + if (args[0] == MGA_ARG2) { + /* Swap arguments */ + *reg ^= (TD0_alpha_arg1_inv_enable | + TD0_alpha_arg2_inv_enable); + } + break; + } + + return GL_TRUE; +} + + diff --git a/src/mesa/drivers/dri/mga/mga_texstate.c b/src/mesa/drivers/dri/mga/mga_texstate.c index fc1406cab9e..5f3e1b1bacc 100644 --- a/src/mesa/drivers/dri/mga/mga_texstate.c +++ b/src/mesa/drivers/dri/mga/mga_texstate.c @@ -52,6 +52,8 @@ static const unsigned TMC_tformat[ TMC_nr_tformat ] = [MESA_FORMAT_RGB565] = TMC_tformat_tw16 | TMC_takey_1 | TMC_tamask_0, [MESA_FORMAT_ARGB4444] = TMC_tformat_tw12 | TMC_takey_1 | TMC_tamask_0, [MESA_FORMAT_ARGB1555] = TMC_tformat_tw15 | TMC_takey_1 | TMC_tamask_0, + [MESA_FORMAT_AL88] = TMC_tformat_tw8al | TMC_takey_1 | TMC_tamask_0, + [MESA_FORMAT_I8] = TMC_tformat_tw8a | TMC_takey_1 | TMC_tamask_0, [MESA_FORMAT_CI8] = TMC_tformat_tw8 | TMC_takey_1 | TMC_tamask_0, [MESA_FORMAT_YCBCR] = TMC_tformat_tw422uyvy | TMC_takey_1 | TMC_tamask_0, [MESA_FORMAT_YCBCR_REV] = TMC_tformat_tw422 | TMC_takey_1 | TMC_tamask_0, @@ -67,7 +69,7 @@ mgaSetTexImages( mgaContextPtr mmesa, GLint totalSize; GLint width, height; GLint i; - GLint firstLevel, lastLevel, numLevels; + GLint numLevels; GLint log2Width, log2Height; GLuint txformat = 0; GLint ofs; @@ -81,6 +83,8 @@ mgaSetTexImages( mgaContextPtr mmesa, case MESA_FORMAT_RGB565: txformat = TMC_tformat_tw16; break; case MESA_FORMAT_ARGB4444: txformat = TMC_tformat_tw12; break; case MESA_FORMAT_ARGB1555: txformat = TMC_tformat_tw15; break; + case MESA_FORMAT_AL88: txformat = TMC_tformat_tw8al; break; + case MESA_FORMAT_I8: txformat = TMC_tformat_tw8a; break; case MESA_FORMAT_CI8: txformat = TMC_tformat_tw8; break; case MESA_FORMAT_YCBCR: txformat = TMC_tformat_tw422uyvy; break; case MESA_FORMAT_YCBCR_REV: txformat = TMC_tformat_tw422; break; @@ -101,39 +105,21 @@ mgaSetTexImages( mgaContextPtr mmesa, #endif /* MGA_USE_TABLE_FOR_FORMAT */ - if (tObj->MinFilter == GL_NEAREST || tObj->MinFilter == GL_LINEAR) { - /* GL_NEAREST and GL_LINEAR only care about GL_TEXTURE_BASE_LEVEL. - */ - - firstLevel = lastLevel = tObj->BaseLevel; - } else { - /* Compute which mipmap levels we really want to send to the hardware. - * This depends on the base image size, GL_TEXTURE_MIN_LOD, - * GL_TEXTURE_MAX_LOD, GL_TEXTURE_BASE_LEVEL, and GL_TEXTURE_MAX_LEVEL. - * Yes, this looks overly complicated, but it's all needed. - */ - - firstLevel = tObj->BaseLevel + (GLint)(tObj->MinLod + 0.5); - firstLevel = MAX2(firstLevel, tObj->BaseLevel); - lastLevel = tObj->BaseLevel + (GLint)(tObj->MaxLod + 0.5); - lastLevel = MAX2(lastLevel, tObj->BaseLevel); - lastLevel = MIN2(lastLevel, tObj->BaseLevel + baseImage->MaxLog2); - lastLevel = MIN2(lastLevel, tObj->MaxLevel); - lastLevel = MAX2(firstLevel, lastLevel); /* need at least one level */ - } + driCalculateTextureFirstLastLevel( (driTextureObject *) t ); + log2Width = tObj->Image[t->base.firstLevel]->WidthLog2; + log2Height = tObj->Image[t->base.firstLevel]->HeightLog2; - log2Width = tObj->Image[firstLevel]->WidthLog2; - log2Height = tObj->Image[firstLevel]->HeightLog2; - width = tObj->Image[firstLevel]->Width; - height = tObj->Image[firstLevel]->Height; + width = tObj->Image[t->base.firstLevel]->Width; + height = tObj->Image[t->base.firstLevel]->Height; - numLevels = MIN2( lastLevel - firstLevel + 1, + numLevels = MIN2( t->base.lastLevel - t->base.firstLevel + 1, MGA_IS_G200(mmesa) ? G200_TEX_MAXLEVELS : G400_TEX_MAXLEVELS); totalSize = 0; for ( i = 0 ; i < numLevels ; i++ ) { - const struct gl_texture_image * const texImage = tObj->Image[i+firstLevel]; + const struct gl_texture_image * const texImage = + tObj->Image[ i + t->base.firstLevel ]; if ( (texImage == NULL) || ((i != 0) @@ -149,13 +135,9 @@ mgaSetTexImages( mgaContextPtr mmesa, baseImage->TexFormat->TexelBytes) + 31) & ~31; } - numLevels = i; - lastLevel = firstLevel + numLevels - 1; - /* save these values */ - t->base.firstLevel = firstLevel; - t->base.lastLevel = lastLevel; - + numLevels = i; + t->base.lastLevel = t->base.firstLevel + numLevels - 1; t->base.totalSize = totalSize; /* setup hardware register values */ @@ -225,7 +207,7 @@ static void mgaUpdateTextureEnvG200( GLcontext *ctx, GLuint unit ) t->setup.texctl2 |= TMC_decalblend_enable; break; case GL_BLEND: - FALLBACK( ctx, MGA_FALLBACK_TEXTURE, GL_TRUE ); + t->texenv_fallback = GL_TRUE; break; default: break; @@ -251,29 +233,160 @@ static const GLuint g400_color_combine[][MGA_MAX_COMBFUNC] = (0), /* GL_REPLACE + * Cv = Cs + * Av = Af */ (TD0_color_sel_arg1 | TD0_alpha_arg2_diffuse | - TD0_alpha_sel_arg2 ), + TD0_alpha_sel_arg2), /* GL_MODULATE + * Cv = Cf Cs + * Av = Af */ (TD0_color_arg2_diffuse | TD0_color_sel_mul | TD0_alpha_arg2_diffuse | - TD0_alpha_sel_mul), + TD0_alpha_sel_arg2), /* GL_DECAL + * Cv = Cs + * Av = Af */ (TD0_color_sel_arg1 | TD0_alpha_arg2_diffuse | TD0_alpha_sel_arg2), - /* GL_BLEND + /* GL_BLEND (Cc=0.0) + * Cv = Cf ( 1 - Cs ) + * Av = Af + */ + (TD0_color_arg1_inv_enable | + TD0_color_arg2_diffuse | + TD0_color_sel_mul | + TD0_alpha_arg2_diffuse | + TD0_alpha_sel_arg2), + + /* GL_ADD + * Cv = Cf + Cs + * Av = Af + */ + (TD0_color_arg2_diffuse | + TD0_color_add_add | + TD0_color_sel_add | + TD0_alpha_arg2_diffuse | + TD0_alpha_sel_arg2), + }, + + /* Unit 1: + */ + { + /* Disable combiner stage */ (0), + + /* GL_REPLACE + * Cv = Cs + * Av = Ap + */ + (TD0_color_sel_arg1 | + TD0_alpha_arg2_prevstage | + TD0_alpha_sel_arg2), + + /* GL_MODULATE + * Cv = Cp Cs + * Av = Ap + */ + (TD0_color_arg2_prevstage | + TD0_color_sel_mul | + TD0_alpha_arg2_prevstage | + TD0_alpha_sel_arg2), + + /* GL_DECAL + * Cv = Cs + * Av = Ap + */ + (TD0_color_sel_arg1 | + TD0_alpha_arg2_prevstage | + TD0_alpha_sel_arg2), + + /* GL_BLEND (Cc=0.0) + * Cv = Cp ( 1 - Cs ) + * Av = Ap + */ + (TD0_color_arg1_inv_enable | + TD0_color_arg2_prevstage | + TD0_color_sel_mul | + TD0_alpha_arg2_prevstage | + TD0_alpha_sel_arg2), + + /* GL_ADD + * Cv = Cp + Cs + * Av = Ap + */ + (TD0_color_arg2_prevstage | + TD0_color_add_add | + TD0_color_sel_add | + TD0_alpha_arg2_prevstage | + TD0_alpha_sel_arg2), + }, +}; + +static const GLuint g400_color_alpha_combine[][MGA_MAX_COMBFUNC] = +{ + /* Unit 0: + */ + { + /* Disable combiner stage + */ + (0), + + /* GL_REPLACE + * Cv = Cs + * Av = As + */ + (TD0_color_sel_arg1 | + TD0_alpha_sel_arg1), + + /* GL_MODULATE + * Cv = Cf Cs + * Av = Af As + */ + (TD0_color_arg2_diffuse | + TD0_color_sel_mul | + TD0_alpha_arg2_diffuse | + TD0_alpha_sel_mul), + + /* GL_DECAL + * tmp = Cf ( 1 - As ) + * Cv = tmp + Cs As + * Av = Af + */ + (TD0_color_arg2_diffuse | + TD0_color_alpha_currtex | + TD0_color_alpha1inv_enable | + TD0_color_arg1mul_alpha1 | + TD0_color_blend_enable | + TD0_color_arg1add_mulout | + TD0_color_arg2add_mulout | + TD0_color_add_add | + TD0_color_sel_add | + TD0_alpha_arg2_diffuse | + TD0_alpha_sel_arg2), + + /* GL_BLEND (Cc=0.0) + * Cv = Cf ( 1 - Cs ) + * Av = Af As + */ + (TD0_color_arg1_inv_enable | + TD0_color_arg2_diffuse | + TD0_color_sel_mul | + TD0_alpha_arg2_diffuse | + TD0_alpha_sel_mul), /* GL_ADD + * Cv = Cf + Cs + * Av = Af As */ (TD0_color_arg2_diffuse | TD0_color_add_add | @@ -290,33 +403,53 @@ static const GLuint g400_color_combine[][MGA_MAX_COMBFUNC] = (0), /* GL_REPLACE + * Cv = Cs + * Av = As */ (TD0_color_sel_arg1 | - TD0_alpha_arg2_diffuse | - TD0_alpha_sel_arg2 ), + TD0_alpha_sel_arg1), /* GL_MODULATE + * Cv = Cp Cs + * Av = Ap As */ (TD0_color_arg2_prevstage | - TD0_color_alpha_prevstage | TD0_color_sel_mul | TD0_alpha_arg2_prevstage | TD0_alpha_sel_mul), /* GL_DECAL + * tmp = Cp ( 1 - As ) + * Cv = tmp + Cs As + * Av = Ap */ - (TD0_color_sel_arg1 | + (TD0_color_arg2_prevstage | + TD0_color_alpha_currtex | + TD0_color_alpha1inv_enable | + TD0_color_arg1mul_alpha1 | + TD0_color_blend_enable | + TD0_color_arg1add_mulout | + TD0_color_arg2add_mulout | + TD0_color_add_add | + TD0_color_sel_add | TD0_alpha_arg2_prevstage | - TD0_alpha_sel_arg2 ), + TD0_alpha_sel_arg2), - /* GL_BLEND + /* GL_BLEND (Cc=0.0) + * Cv = Cp ( 1 - Cs ) + * Av = Ap As */ - (0), + (TD0_color_arg1_inv_enable | + TD0_color_arg2_prevstage | + TD0_color_sel_mul | + TD0_alpha_arg2_prevstage | + TD0_alpha_sel_mul), /* GL_ADD + * Cv = Cp + Cs + * Av = Ap As */ (TD0_color_arg2_prevstage | - TD0_color_alpha_prevstage | TD0_color_add_add | TD0_color_sel_add | TD0_alpha_arg2_prevstage | @@ -334,20 +467,25 @@ static const GLuint g400_alpha_combine[][MGA_MAX_COMBFUNC] = (0), /* GL_REPLACE + * Cv = Cf + * Av = As */ - (TD0_color_sel_arg2 | - TD0_color_arg2_diffuse | - TD0_alpha_sel_arg1 ), + (TD0_color_arg2_diffuse | + TD0_color_sel_arg2 | + TD0_alpha_sel_arg1), /* GL_MODULATE - * FIXME: Is this correct? + * Cv = Cf + * Av = Af As */ (TD0_color_arg2_diffuse | - TD0_color_sel_mul | + TD0_color_sel_arg2 | TD0_alpha_arg2_diffuse | TD0_alpha_sel_mul), - /* GL_DECAL + /* GL_DECAL (undefined) + * Cv = Cf + * Av = Af */ (TD0_color_arg2_diffuse | TD0_color_sel_arg2 | @@ -355,16 +493,20 @@ static const GLuint g400_alpha_combine[][MGA_MAX_COMBFUNC] = TD0_alpha_sel_arg2), /* GL_BLEND + * Cv = Cf + * Av = Af As */ (TD0_color_arg2_diffuse | - TD0_color_sel_mul | + TD0_color_sel_arg2 | TD0_alpha_arg2_diffuse | TD0_alpha_sel_mul), /* GL_ADD + * Cv = Cf + * Av = Af As */ (TD0_color_arg2_diffuse | - TD0_color_sel_mul | + TD0_color_sel_arg2 | TD0_alpha_arg2_diffuse | TD0_alpha_sel_mul), }, @@ -377,21 +519,25 @@ static const GLuint g400_alpha_combine[][MGA_MAX_COMBFUNC] = (0), /* GL_REPLACE + * Cv = Cp + * Av = As */ - (TD0_color_sel_arg2 | - TD0_color_arg2_diffuse | - TD0_alpha_sel_arg1 ), + (TD0_color_arg2_prevstage | + TD0_color_sel_arg2 | + TD0_alpha_sel_arg1), /* GL_MODULATE - * FIXME: Is this correct? + * Cv = Cp + * Av = Ap As */ (TD0_color_arg2_prevstage | - TD0_color_alpha_prevstage | - TD0_color_sel_mul | + TD0_color_sel_arg2 | TD0_alpha_arg2_prevstage | TD0_alpha_sel_mul), - /* GL_DECAL + /* GL_DECAL (undefined) + * Cv = Cp + * Av = Ap */ (TD0_color_arg2_prevstage | TD0_color_sel_arg2 | @@ -399,16 +545,20 @@ static const GLuint g400_alpha_combine[][MGA_MAX_COMBFUNC] = TD0_alpha_sel_arg2), /* GL_BLEND + * Cv = Cp + * Av = Ap As */ - (TD0_color_arg2_diffuse | - TD0_color_sel_mul | - TD0_alpha_arg2_diffuse | + (TD0_color_arg2_prevstage | + TD0_color_sel_arg2 | + TD0_alpha_arg2_prevstage | TD0_alpha_sel_mul), /* GL_ADD + * Cv = Cp + * Av = Ap As */ (TD0_color_arg2_prevstage | - TD0_color_sel_mul | + TD0_color_sel_arg2 | TD0_alpha_arg2_prevstage | TD0_alpha_sel_mul), }, @@ -421,143 +571,236 @@ static void mgaUpdateTextureEnvG400( GLcontext *ctx, GLuint unit ) const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[source]; const struct gl_texture_object *tObj = texUnit->_Current; GLuint *reg = ((GLuint *)&mmesa->setup.tdualstage0 + unit); + mgaTextureObjectPtr t; GLenum format; - if ( tObj != ctx->Texture.Unit[source].Current2D || !tObj ) + if ( !tObj || + (tObj != ctx->Texture.Unit[source].Current2D && + tObj != ctx->Texture.Unit[source].CurrentRect) ) return; format = tObj->Image[tObj->BaseLevel]->Format; + t = (mgaTextureObjectPtr) tObj->DriverData; + switch (ctx->Texture.Unit[source].EnvMode) { case GL_REPLACE: - if (format == GL_RGB || format == GL_LUMINANCE) { - *reg = g400_color_combine[unit][MGA_REPLACE]; - } - else if (format == GL_ALPHA) { + if (format == GL_ALPHA) { *reg = g400_alpha_combine[unit][MGA_REPLACE]; - } - else { - *reg = (TD0_color_sel_arg1 | - TD0_alpha_sel_arg1 ); + } else if (format == GL_RGB || format == GL_LUMINANCE) { + *reg = g400_color_combine[unit][MGA_REPLACE]; + } else { + *reg = g400_color_alpha_combine[unit][MGA_REPLACE]; } break; case GL_MODULATE: - *reg = g400_color_combine[unit][MGA_MODULATE]; + if (format == GL_ALPHA) { + *reg = g400_alpha_combine[unit][MGA_MODULATE]; + } else if (format == GL_RGB || format == GL_LUMINANCE) { + *reg = g400_color_combine[unit][MGA_MODULATE]; + } else { + *reg = g400_color_alpha_combine[unit][MGA_MODULATE]; + } break; + case GL_DECAL: if (format == GL_RGB) { - *reg = g400_color_combine[unit][MGA_DECAL]; + *reg = g400_color_combine[unit][MGA_DECAL]; + } else if (format == GL_RGBA) { + *reg = g400_color_alpha_combine[unit][MGA_DECAL]; + if (ctx->Texture._EnabledUnits != 0x03) { + /* Linear blending mode needs dual texturing enabled */ + *(reg+1) = (TD0_color_arg2_prevstage | + TD0_color_sel_arg2 | + TD0_alpha_arg2_prevstage | + TD0_alpha_sel_arg2); + mmesa->dualtex_env = GL_TRUE; + } + } else { + /* Undefined */ + *reg = g400_alpha_combine[unit][MGA_DECAL]; } - else if ( format == GL_RGBA ) { -#if 0 + break; + + case GL_ADD: + if (format == GL_ALPHA) { + *reg = g400_alpha_combine[unit][MGA_ADD]; + } else if (format == GL_RGB || format == GL_LUMINANCE) { + *reg = g400_color_combine[unit][MGA_ADD]; + } else if (format == GL_RGBA || format == GL_LUMINANCE_ALPHA) { + *reg = g400_color_alpha_combine[unit][MGA_ADD]; + } else if (format == GL_INTENSITY) { + /* Cv = Cf + Cs + * Av = Af + As + */ if (unit == 0) { - /* this doesn't work */ *reg = (TD0_color_arg2_diffuse | - TD0_color_alpha_currtex | - TD0_color_alpha2inv_enable | - TD0_color_arg2mul_alpha2 | - TD0_color_arg1mul_alpha1 | - TD0_color_blend_enable | - TD0_color_arg1add_mulout | - TD0_color_arg2add_mulout | TD0_color_add_add | - TD0_color_sel_mul | + TD0_color_sel_add | TD0_alpha_arg2_diffuse | - TD0_alpha_sel_arg2 ); - } - else { + TD0_alpha_add_enable | + TD0_alpha_sel_add); + } else { *reg = (TD0_color_arg2_prevstage | - TD0_color_alpha_currtex | - TD0_color_alpha2inv_enable | - TD0_color_arg2mul_alpha2 | - TD0_color_arg1mul_alpha1 | TD0_color_add_add | TD0_color_sel_add | TD0_alpha_arg2_prevstage | - TD0_alpha_sel_arg2 ); + TD0_alpha_add_enable | + TD0_alpha_sel_add); } -#else - /* s/w fallback, pretty sure we can't do in h/w */ - FALLBACK( ctx, MGA_FALLBACK_TEXTURE, GL_TRUE ); - if ( MGA_DEBUG & DEBUG_VERBOSE_FALLBACK ) - fprintf( stderr, "FALLBACK: GL_DECAL RGBA texture, unit=%d\n", - unit ); -#endif - } - else { - *reg = g400_alpha_combine[unit][MGA_DECAL]; } break; - case GL_ADD: - if (format == GL_INTENSITY) { - if (unit == 0) { - *reg = ( TD0_color_arg2_diffuse | - TD0_color_add_add | - TD0_color_sel_add | - TD0_alpha_arg2_diffuse | - TD0_alpha_add_enable | - TD0_alpha_sel_add); - } - else { - *reg = ( TD0_color_arg2_prevstage | - TD0_color_add_add | - TD0_color_sel_add | - TD0_alpha_arg2_prevstage | - TD0_alpha_add_enable | - TD0_alpha_sel_add); - } - } - else if (format == GL_ALPHA) { - *reg = g400_alpha_combine[unit][MGA_ADD]; - } - else { - *reg = g400_color_combine[unit][MGA_ADD]; - } - break; - case GL_BLEND: if (format == GL_ALPHA) { - *reg = g400_alpha_combine[unit][MGA_BLEND]; - } - else { - FALLBACK( ctx, MGA_FALLBACK_TEXTURE, GL_TRUE ); - if ( MGA_DEBUG & DEBUG_VERBOSE_FALLBACK ) - fprintf( stderr, "FALLBACK: GL_BLEND envcolor=0x%08x\n", - mmesa->envcolor ); - - /* Do singletexture GL_BLEND with 'all ones' env-color - * by using both texture units. Multitexture gl_blend - * is a fallback. - */ - if (unit == 0) { - /* Part 1: R1 = Rf ( 1 - Rt ) - * A1 = Af At - */ - *reg = ( TD0_color_arg2_diffuse | - TD0_color_arg1_inv_enable | - TD0_color_sel_mul | - TD0_alpha_arg2_diffuse | - TD0_alpha_sel_arg1); + *reg = g400_alpha_combine[unit][MGA_BLEND]; + } else { + if (mmesa->blend_flags & MGA_BLEND_RGB_ZERO) { + if (format == GL_RGB || format == GL_LUMINANCE) { + *reg = g400_color_combine[unit][MGA_BLEND]; + } else if (format == GL_RGBA || format == GL_LUMINANCE_ALPHA) { + *reg = g400_color_alpha_combine[unit][MGA_BLEND]; + } else if (format == GL_INTENSITY) { + if (mmesa->blend_flags & MGA_BLEND_ALPHA_ZERO) { + /* Cv = Cf ( 1 - Cs ) + * Av = Af ( 1 - As ) + */ + if (unit == 0) { + *reg = (TD0_color_arg1_inv_enable | + TD0_color_arg2_diffuse | + TD0_color_sel_mul | + TD0_alpha_arg1_inv_enable | + TD0_alpha_arg2_diffuse | + TD0_alpha_sel_mul); + } else { + *reg = (TD0_color_arg1_inv_enable | + TD0_color_arg2_prevstage | + TD0_color_sel_mul | + TD0_alpha_arg1_inv_enable | + TD0_alpha_arg2_prevstage | + TD0_alpha_sel_mul); + } + } else if (mmesa->blend_flags & MGA_BLEND_ALPHA_ONE && + ctx->Texture._EnabledUnits != 0x03) { + /* C1 = Cf ( 1 - Cs ) + * A1 = Af ( 1 - As ) + */ + *reg = (TD0_color_arg1_inv_enable | + TD0_color_arg2_diffuse | + TD0_color_sel_mul | + TD0_alpha_arg1_inv_enable | + TD0_alpha_arg2_diffuse | + TD0_alpha_sel_mul); + /* Cv = C1 + * Av = A1 + As + */ + *(reg+1) = (TD0_color_arg2_prevstage | + TD0_color_sel_arg2 | + TD0_alpha_arg2_prevstage | + TD0_alpha_add_enable | + TD0_alpha_sel_add); + mmesa->dualtex_env = GL_TRUE; + } else { + t->texenv_fallback = GL_TRUE; + } + } + } else if (mmesa->blend_flags & MGA_BLEND_RGB_ONE && + ctx->Texture._EnabledUnits != 0x03) { + if (format == GL_RGB || format == GL_LUMINANCE) { + /* C1 = Cf ( 1 - Cs ) + * A1 = Af + */ + *reg = (TD0_color_arg1_inv_enable | + TD0_color_arg2_diffuse | + TD0_color_sel_mul | + TD0_alpha_arg2_diffuse | + TD0_alpha_sel_arg2); + /* Cv = C1 + Cs + * Av = A1 + */ + *(reg+1) = (TD0_color_arg2_prevstage | + TD0_color_add_add | + TD0_color_sel_add | + TD0_alpha_arg2_prevstage | + TD0_alpha_sel_arg2); + mmesa->dualtex_env = GL_TRUE; + } else if (format == GL_RGBA || format == GL_LUMINANCE_ALPHA) { + /* C1 = Cf ( 1 - Cs ) + * A1 = Af As + */ + *reg = (TD0_color_arg1_inv_enable | + TD0_color_arg2_diffuse | + TD0_color_sel_mul | + TD0_alpha_arg2_diffuse | + TD0_alpha_sel_mul); + /* Cv = C1 + Cs + * Av = A1 + */ + *(reg+1) = (TD0_color_arg2_prevstage | + TD0_color_add_add | + TD0_color_sel_add | + TD0_alpha_arg2_prevstage | + TD0_alpha_sel_arg2); + mmesa->dualtex_env = GL_TRUE; + } else if (format == GL_INTENSITY) { + if (mmesa->blend_flags & MGA_BLEND_ALPHA_ZERO) { + /* C1 = Cf ( 1 - Cs ) + * A1 = Af ( 1 - As ) + */ + *reg = (TD0_color_arg1_inv_enable | + TD0_color_arg2_diffuse | + TD0_color_sel_mul | + TD0_alpha_arg1_inv_enable | + TD0_alpha_arg2_diffuse | + TD0_alpha_sel_mul); + /* Cv = C1 + Cs + * Av = A1 + */ + *(reg+1) = (TD0_color_arg2_prevstage | + TD0_color_add_add | + TD0_color_sel_add | + TD0_alpha_arg2_prevstage | + TD0_alpha_sel_arg2); + mmesa->dualtex_env = GL_TRUE; + } else if (mmesa->blend_flags & MGA_BLEND_ALPHA_ONE) { + /* C1 = Cf ( 1 - Cs ) + * A1 = Af ( 1 - As ) + */ + *reg = (TD0_color_arg1_inv_enable | + TD0_color_arg2_diffuse | + TD0_color_sel_mul | + TD0_alpha_arg1_inv_enable | + TD0_alpha_arg2_diffuse | + TD0_alpha_sel_mul); + /* Cv = C1 + Cs + * Av = A1 + As + */ + *(reg+1) = (TD0_color_arg2_prevstage | + TD0_color_add_add | + TD0_color_sel_add | + TD0_alpha_arg2_prevstage | + TD0_alpha_add_enable | + TD0_alpha_sel_add); + mmesa->dualtex_env = GL_TRUE; + } else { + t->texenv_fallback = GL_TRUE; + } + } } else { - /* Part 2: R2 = R1 + Rt - * A2 = A1 - */ - *reg = ( TD0_color_arg2_prevstage | - TD0_color_add_add | - TD0_color_sel_add | - TD0_alpha_arg2_prevstage | - TD0_alpha_sel_arg2); + t->texenv_fallback = GL_TRUE; } } break; + case GL_COMBINE_EXT: + if (!mgaUpdateTextureEnvCombine(ctx, unit)) + t->texenv_fallback = GL_TRUE; + break; default: break; } } - static void disable_tex( GLcontext *ctx, int unit ) { mgaContextPtr mmesa = MGA_CONTEXT( ctx ); @@ -573,7 +816,7 @@ static void disable_tex( GLcontext *ctx, int unit ) mmesa->CurrentTexObj[unit] = NULL; } - if ( unit != 0 ) { + if ( unit != 0 && !mmesa->dualtex_env ) { mmesa->setup.tdualstage1 = mmesa->setup.tdualstage0; } @@ -586,7 +829,7 @@ static void disable_tex( GLcontext *ctx, int unit ) mmesa->dirty |= MGA_UPLOAD_CONTEXT | (MGA_UPLOAD_TEX0 << unit); } -static GLboolean enable_tex_2d( GLcontext *ctx, int unit ) +static GLboolean enable_tex( GLcontext *ctx, int unit ) { mgaContextPtr mmesa = MGA_CONTEXT(ctx); const int source = mmesa->tmu_source[unit]; @@ -649,6 +892,14 @@ static GLboolean update_tex_common( GLcontext *ctx, int unit ) t->setup.texctl2 |= TMC_dualtex_enable; } + t->texenv_fallback = GL_FALSE; + + /* Set this before mgaUpdateTextureEnvG400() since + * GL_ARB_texture_env_crossbar may have to disable texturing. + */ + mmesa->setup.dwgctl &= DC_opcod_MASK; + mmesa->setup.dwgctl |= DC_opcod_texture_trap; + /* FIXME: The Radeon has some cached state so that it can avoid calling * FIXME: UpdateTextureEnv in some cases. Is that possible here? */ @@ -680,13 +931,10 @@ static GLboolean update_tex_common( GLcontext *ctx, int unit ) mgaUpdateTextureEnvG200( ctx, unit ); } - - mmesa->setup.dwgctl &= DC_opcod_MASK; - mmesa->setup.dwgctl |= DC_opcod_texture_trap; mmesa->dirty |= MGA_UPLOAD_CONTEXT | (MGA_UPLOAD_TEX0 << unit); FALLBACK( ctx, MGA_FALLBACK_BORDER_MODE, t->border_fallback ); - return !t->border_fallback; + return !t->border_fallback && !t->texenv_fallback; } @@ -697,8 +945,9 @@ static GLboolean updateTextureUnit( GLcontext *ctx, int unit ) const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[source]; - if ( texUnit->_ReallyEnabled == TEXTURE_2D_BIT) { - return(enable_tex_2d( ctx, unit ) && + if ( texUnit->_ReallyEnabled == TEXTURE_2D_BIT || + texUnit->_ReallyEnabled == TEXTURE_RECT_BIT ) { + return(enable_tex( ctx, unit ) && update_tex_common( ctx, unit )); } else if ( texUnit->_ReallyEnabled ) { @@ -718,6 +967,7 @@ void mgaUpdateTextureState( GLcontext *ctx ) GLboolean ok; unsigned i; + mmesa->dualtex_env = GL_FALSE; /* This works around a quirk with the MGA hardware. If only OpenGL * TEXTURE1 is enabled, then the hardware TEXTURE0 must be used. The @@ -740,8 +990,4 @@ void mgaUpdateTextureState( GLcontext *ctx ) } FALLBACK( ctx, MGA_FALLBACK_TEXTURE, !ok ); - - /* FIXME: I believe that ChooseVertexState should be called here instead of - * FIXME: in mgaDDValidateState. - */ } diff --git a/src/mesa/drivers/dri/mga/mga_xmesa.c b/src/mesa/drivers/dri/mga/mga_xmesa.c index 49e8cbec696..11daf9aaf4f 100644 --- a/src/mesa/drivers/dri/mga/mga_xmesa.c +++ b/src/mesa/drivers/dri/mga/mga_xmesa.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mga_xmesa.c,v 1.18 2002/12/16 16:18:52 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mga_xmesa.c,v 1.19 2003/03/26 20:43:49 tsi Exp $ */ /* * Copyright 2000-2001 VA Linux Systems, Inc. * All Rights Reserved. @@ -56,11 +56,23 @@ #include "utils.h" #include "vblank.h" -#include "dri_util.h" + #ifndef _SOLO #include "glxextensions.h" #endif +/* MGA configuration + */ +#include "xmlpool.h" + +const char __driConfigOptions[] = +DRI_CONF_BEGIN + DRI_CONF_SECTION_PERFORMANCE + DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0) + DRI_CONF_SECTION_END +DRI_CONF_END; +const GLuint __driNConfigOptions = 1; + #ifndef MGA_DEBUG int MGA_DEBUG = 0; #endif @@ -97,7 +109,7 @@ mgaInitDriver(__DRIscreenPrivate *sPriv) &gp, sizeof(gp)); if (ret) { fprintf(stderr, "drmMgaGetParam (MGA_PARAM_IRQ_NR): %d\n", ret); - free(mgaScreen); + FREE(mgaScreen); sPriv->private = NULL; return GL_FALSE; } @@ -105,23 +117,26 @@ mgaInitDriver(__DRIscreenPrivate *sPriv) mgaScreen->linecomp_sane = (sPriv->ddxMajor > 1) || (sPriv->ddxMinor > 1) || ((sPriv->ddxMinor == 1) && (sPriv->ddxPatch > 0)); -#ifndef _SOLO - if ( ! mgaScreen->linecomp_sane ) { - PFNGLXDISABLEEXTENSIONPROC glx_disable_extension; +#ifndef _SOLO + if ( driCompareGLXAPIVersion( 20030813 ) >= 0 ) { + PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension = + (PFNGLXSCRENABLEEXTENSIONPROC) glXGetProcAddress( (const GLubyte *) "__glXScrEnableExtension" ); + void * const psc = sPriv->psc->screenConfigs; - glx_disable_extension = (PFNGLXDISABLEEXTENSIONPROC) - glXGetProcAddress( "__glXDisableExtension" ); + if ( glx_enable_extension != NULL ) { + if ( mgaScreen->linecomp_sane ) { + (*glx_enable_extension)( psc, "GLX_SGI_swap_control" ); + (*glx_enable_extension)( psc, "GLX_SGI_video_sync" ); + (*glx_enable_extension)( psc, "GLX_MESA_swap_control" ); + } - if ( glx_disable_extension != NULL ) { - (*glx_disable_extension)( "GLX_SGI_swap_control" ); - (*glx_disable_extension)( "GLX_SGI_video_sync" ); - (*glx_disable_extension)( "GLX_MESA_swap_control" ); + (*glx_enable_extension)( psc, "GLX_MESA_swap_frame_usage" ); } } #endif if (serverInfo->chipset != MGA_CARD_TYPE_G200 && serverInfo->chipset != MGA_CARD_TYPE_G400) { - free(mgaScreen); + FREE(mgaScreen); sPriv->private = NULL; __driUtilMessage("Unrecognized chipset"); return GL_FALSE; @@ -168,7 +183,7 @@ mgaInitDriver(__DRIscreenPrivate *sPriv) mgaScreen->agp.size, (drmAddress *)&mgaScreen->agp.map) != 0) { - free(mgaScreen); + Xfree(mgaScreen); sPriv->private = NULL; __driUtilMessage("Couldn't map agp region"); return GL_FALSE; @@ -194,7 +209,7 @@ mgaInitDriver(__DRIscreenPrivate *sPriv) serverInfo->agpTextureSize, (drmAddress *)&mgaScreen->texVirtual[MGA_AGP_HEAP]) != 0) { - free(mgaScreen); + FREE(mgaScreen); sPriv->private = NULL; __driUtilMessage("Couldn't map agptexture region"); return GL_FALSE; @@ -214,13 +229,16 @@ mgaInitDriver(__DRIscreenPrivate *sPriv) mgaScreen->bufs = drmMapBufs(sPriv->fd); if (!mgaScreen->bufs) { /*drmUnmap(mgaScreen->agp_tex.map, mgaScreen->agp_tex.size);*/ - free(mgaScreen); + FREE(mgaScreen); sPriv->private = NULL; __driUtilMessage("Couldn't map dma buffers"); return GL_FALSE; } mgaScreen->sarea_priv_offset = serverInfo->sarea_priv_offset; + /* parse information in __driConfigOptions */ + driParseOptionInfo (&mgaScreen->optionCache); + return GL_TRUE; } @@ -234,7 +252,11 @@ mgaDestroyScreen(__DRIscreenPrivate *sPriv) fprintf(stderr, "mgaDestroyScreen\n"); /*drmUnmap(mgaScreen->agp_tex.map, mgaScreen->agp_tex.size);*/ - free(mgaScreen); + + /* free all option information */ + driDestroyOptionInfo (&mgaScreen->optionCache); + + FREE(mgaScreen); sPriv->private = NULL; } @@ -263,6 +285,10 @@ static const char * const g400_extensions[] = "GL_ARB_multitexture", "GL_ARB_texture_env_add", "GL_EXT_texture_env_add", + "GL_ARB_texture_env_combine", + "GL_EXT_texture_env_combine", + "GL_ARB_texture_env_crossbar", + "GL_ATI_texture_env_combine3", "GL_EXT_texture_edge_clamp", "GL_SGIS_texture_edge_clamp", #if defined (MESA_packed_depth_stencil) @@ -286,6 +312,7 @@ static const char * const card_extensions[] = "GL_MESA_ycbcr_texture", "GL_SGIS_generate_mipmap", "GL_SGIS_texture_lod", + "GL_NV_texture_rectangle", NULL }; @@ -353,6 +380,10 @@ mgaCreateContext( const __GLcontextModes *mesaVis, mmesa->sarea = (void *)saPriv; mmesa->glBuffer = NULL; + /* Parse configuration files */ + driParseConfigFiles (&mmesa->optionCache, &mgaScreen->optionCache, + sPriv->myNum, "mga"); + (void) memset( mmesa->texture_heaps, 0, sizeof( mmesa->texture_heaps ) ); make_empty_list( & mmesa->swapped ); @@ -388,10 +419,10 @@ mgaCreateContext( const __GLcontextModes *mesaVis, mmesa->nr_heaps, & ctx->Const, 4, - 11, /* max 2D texture size is 1024x1024 */ + 11, /* max 2D texture size is 2048x2048 */ 0, /* 3D textures unsupported. */ 0, /* cube textures unsupported. */ - 0, /* texture rectangles unsupported. */ + 11, /* max texture rect size is 2048x2048 */ maxlevels, GL_FALSE ); @@ -487,14 +518,15 @@ mgaCreateContext( const __GLcontextModes *mesaVis, mmesa->vblank_flags = ((mmesa->mgaScreen->irq == 0) || !mmesa->mgaScreen->linecomp_sane) - ? VBLANK_FLAG_NO_IRQ : driGetDefaultVBlankFlags(); + ? VBLANK_FLAG_NO_IRQ : driGetDefaultVBlankFlags(&mmesa->optionCache); #ifndef _SOLO - mmesa->get_ust = (PFNGLXGETUSTPROC) glXGetProcAddress( "__glXGetUST" ); - if ( mmesa->get_ust == NULL ) -#endif - { + mmesa->get_ust = (PFNGLXGETUSTPROC) glXGetProcAddress( (const GLubyte *) "__glXGetUST" ); + if ( mmesa->get_ust == NULL ) { mmesa->get_ust = get_ust_nop; } +#else + mmesa->get_ust = get_ust_nop; +#endif (*mmesa->get_ust)( & mmesa->swap_ust ); @@ -541,6 +573,9 @@ mgaDestroyContext(__DRIcontextPrivate *driContextPriv) } } + /* free the option cache */ + driDestroyOptionCache (&mmesa->optionCache); + FREE(mmesa); } @@ -614,6 +649,7 @@ mgaMakeCurrent(__DRIcontextPrivate *driContextPriv, mgaContextPtr mmesa = (mgaContextPtr) driContextPriv->driverPrivate; if (mmesa->driDrawable != driDrawPriv) { + driDrawableInitVBlank( driDrawPriv, mmesa->vblank_flags ); mmesa->driDrawable = driDrawPriv; mmesa->dirty = ~0; mmesa->dirty_cliprects = (MGA_FRONT|MGA_BACK); @@ -695,7 +731,7 @@ static const struct __DriverAPIRec mgaAPI = { * The __driCreateScreen name is the symbol that libGL.so fetches. * Return: pointer to a __DRIscreenPrivate. */ -#ifndef _SOLO +#ifndef _SOLO void *__driCreateScreen(Display *dpy, int scrn, __DRIscreen *psc, int numConfigs, __GLXvisualConfig *config) { @@ -714,30 +750,6 @@ void *__driCreateScreen(struct DRIDriverRec *driver, #endif -#ifndef _SOLO -/* This function is called by libGL.so as soon as libGL.so is loaded. - * This is where we'd register new extension functions with the dispatcher. - */ -void -__driRegisterExtensions( void ) -{ - PFNGLXENABLEEXTENSIONPROC glx_enable_extension; - - - if ( driCompareGLXAPIVersion( 20030317 ) >= 0 ) { - glx_enable_extension = (PFNGLXENABLEEXTENSIONPROC) - glXGetProcAddress( "__glXEnableExtension" ); - - if ( glx_enable_extension != NULL ) { - (*glx_enable_extension)( "GLX_SGI_swap_control", GL_FALSE ); - (*glx_enable_extension)( "GLX_SGI_video_sync", GL_FALSE ); - (*glx_enable_extension)( "GLX_MESA_swap_control", GL_FALSE ); - (*glx_enable_extension)( "GLX_MESA_swap_frame_usage", GL_FALSE ); - } - } -} -#endif - /** * Get information about previous buffer swaps. */ diff --git a/src/mesa/drivers/dri/mga/mga_xmesa.h b/src/mesa/drivers/dri/mga/mga_xmesa.h index de349da0895..d372abe0120 100644 --- a/src/mesa/drivers/dri/mga/mga_xmesa.h +++ b/src/mesa/drivers/dri/mga/mga_xmesa.h @@ -36,6 +36,7 @@ #include "mtypes.h" #include "mgaregs.h" #include "mga_common.h" +#include "xmlconfig.h" typedef struct mga_screen_private_s { @@ -78,6 +79,9 @@ typedef struct mga_screen_private_s { drmRegion primary; drmRegion buffers; unsigned int sarea_priv_offset; + + /* Configuration cache with default values for all contexts */ + driOptionCache optionCache; } mgaScreenPrivate; diff --git a/src/mesa/drivers/dri/mga/mgacontext.h b/src/mesa/drivers/dri/mga/mgacontext.h index 7188f6d9552..50efe4c817f 100644 --- a/src/mesa/drivers/dri/mga/mgacontext.h +++ b/src/mesa/drivers/dri/mga/mgacontext.h @@ -38,6 +38,7 @@ #include "mga_sarea.h" #include "texmem.h" #include "macros.h" +#include "xmlconfig.h" #define MGA_SET_FIELD(reg,mask,val) reg = ((reg) & (mask)) | ((val) & ~(mask)) #define MGA_FIELD(field,val) (((val) << (field ## _SHIFT)) & ~(field ## _MASK)) @@ -79,10 +80,12 @@ typedef void (*mga_point_func)( mgaContextPtr, mgaVertex * ); -/* Reasons why the GL_BLEND fallback mightn't work: +/* GL_BLEND has some limitations */ -#define MGA_BLEND_ENV_COLOR 0x1 -#define MGA_BLEND_MULTITEX 0x2 +#define MGA_BLEND_RGB_ZERO 0x1 +#define MGA_BLEND_RGB_ONE 0x2 +#define MGA_BLEND_ALPHA_ZERO 0x4 +#define MGA_BLEND_ALPHA_ONE 0x8 struct mga_texture_object_s; struct mga_screen_private_s; @@ -149,6 +152,10 @@ typedef struct mga_texture_object_s * to fallback for GL_CLAMP_TO_BORDER. */ GLboolean border_fallback; + /* Depending on multitxturing and environment color + * GL_BLEND may have to be a software fallback. + */ + GLboolean texenv_fallback; } mgaTextureObject_t; struct mga_hw_state { @@ -202,10 +209,11 @@ struct mga_context_t { struct gl_client_array UbyteColor; struct gl_client_array UbyteSecondaryColor; - /* Support for limited GL_BLEND fallback + /* Support for GL_DECAL and GL_BLEND */ unsigned int blend_flags; unsigned int envcolor; + GLboolean dualtex_env; /* Rasterization state */ @@ -299,6 +307,10 @@ struct mga_context_t { __DRIscreenPrivate *driScreen; struct mga_screen_private_s *mgaScreen; MGASAREAPrivPtr sarea; + + /* Configuration cache + */ + driOptionCache optionCache; }; #define MGA_CONTEXT(ctx) ((mgaContextPtr)(ctx->DriverCtx)) diff --git a/src/mesa/drivers/dri/mga/mgaioctl.c b/src/mesa/drivers/dri/mga/mgaioctl.c index 6b50af202a8..fc53912af4c 100644 --- a/src/mesa/drivers/dri/mga/mgaioctl.c +++ b/src/mesa/drivers/dri/mga/mgaioctl.c @@ -26,9 +26,8 @@ * Gareth Hughes <[email protected]> */ /* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgaioctl.c,v 1.16 2002/12/16 16:18:52 dawes Exp $ */ - -#include <sched.h> #include <errno.h> +#include <sched.h> #include "mtypes.h" #include "macros.h" diff --git a/src/mesa/drivers/dri/mga/mgastate.c b/src/mesa/drivers/dri/mga/mgastate.c index 0d304966d7e..29815008be9 100644 --- a/src/mesa/drivers/dri/mga/mgastate.c +++ b/src/mesa/drivers/dri/mga/mgastate.c @@ -401,7 +401,7 @@ static void mgaDDColorMask(GLcontext *ctx, */ static int mgaStipples[16] = { - 0xffff1, /* See above note */ + 0xffff, 0xa5a5, 0x5a5a, 0xa0a0, @@ -425,9 +425,6 @@ static int mgaStipples[16] = { * * \param ctx GL rendering context to be affected * \param mask Pointer to the 32x32 stipple mask - * - * \note the fully opaque pattern (0xffff) has been disabled in order - * to work around a conformance issue. */ static void mgaDDPolygonStipple( GLcontext *ctx, const GLubyte *mask ) @@ -492,8 +489,7 @@ static void updateSpecularLighting( GLcontext *ctx ) mgaContextPtr mmesa = MGA_CONTEXT(ctx); unsigned int specen; - specen = (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR && - ctx->Light.Enabled) ? TMC_specen_enable : 0; + specen = (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) ? TMC_specen_enable : 0; if ( specen != mmesa->hw.specen ) { mmesa->hw.specen = specen; @@ -519,14 +515,6 @@ static void mgaDDLightModelfv(GLcontext *ctx, GLenum pname, } -static void mgaDDShadeModel(GLcontext *ctx, GLenum mode) -{ - /* FIXME: This used to FLUSH_BATCH and set MGA_NEW_TEXTURE in new_state, - * FIXME: so I'm not sure what to do here now. - */ -} - - /* ============================================================= * Stencil */ @@ -671,6 +659,12 @@ static void mgaDDStencilOp(GLcontext *ctx, GLenum fail, GLenum zfail, case GL_DECR: stencilctl |= SC_szpassop_decrsat; break; + case GL_INCR_WRAP: + stencilctl |= SC_szpassop_incr; + break; + case GL_DECR_WRAP: + stencilctl |= SC_szpassop_decr; + break; case GL_INVERT: stencilctl |= SC_szpassop_invert; break; @@ -826,8 +820,10 @@ void mgaUpdateRects( mgaContextPtr mmesa, GLuint buffers ) else mgaXMesaSetBackClipRects( mmesa ); +#ifndef _SOLO + sarea->req_drawable = driDrawable->draw; sarea->req_draw_buffer = mmesa->draw_buffer; - +#endif mgaUpdateClipping( mmesa->glCtx ); mgaCalcViewport( mmesa->glCtx ); @@ -888,6 +884,11 @@ static void mgaDDEnable(GLcontext *ctx, GLenum cap, GLboolean state) mgaContextPtr mmesa = MGA_CONTEXT( ctx ); switch(cap) { + case GL_LIGHTING: + case GL_COLOR_SUM_EXT: + FLUSH_BATCH( mmesa ); + updateSpecularLighting( ctx ); + break; case GL_ALPHA_TEST: FLUSH_BATCH( mmesa ); mmesa->hw.alpha_func_enable = (state) ? ~0 : 0; @@ -1034,25 +1035,24 @@ void mgaEmitHwStateLocked( mgaContextPtr mmesa ) } if ((mmesa->dirty & MGA_UPLOAD_TEX0) && mmesa->CurrentTexObj[0]) { - mmesa->CurrentTexObj[0]->setup.texctl2 &= ~TMC_specen_enable; - mmesa->CurrentTexObj[0]->setup.texctl2 |= mmesa->hw.specen; - memcpy(&sarea->TexState[0], &mmesa->CurrentTexObj[0]->setup, sizeof(sarea->TexState[0])); } if ((mmesa->dirty & MGA_UPLOAD_TEX1) && mmesa->CurrentTexObj[1]) { - mmesa->CurrentTexObj[1]->setup.texctl2 &= ~TMC_specen_enable; - mmesa->CurrentTexObj[1]->setup.texctl2 |= mmesa->hw.specen; - memcpy(&sarea->TexState[1], &mmesa->CurrentTexObj[1]->setup, sizeof(sarea->TexState[1])); } - if ( (sarea->TexState[0].texctl2 & TMC_borderen_MASK) != - (sarea->TexState[1].texctl2 & TMC_borderen_MASK) ) { + if (mmesa->dualtex_env) { + sarea->TexState[0].texctl2 |= TMC_dualtex_enable; + memcpy( &sarea->TexState[1], &sarea->TexState[0], + sizeof(sarea->TexState[0]) ); + mmesa->dirty |= MGA_UPLOAD_TEX1|MGA_UPLOAD_TEX0; + } else if ( (sarea->TexState[0].texctl2 & TMC_borderen_MASK) != + (sarea->TexState[1].texctl2 & TMC_borderen_MASK) ) { const int borderen = sarea->TexState[1].texctl2 & ~TMC_borderen_MASK; memcpy( &sarea->TexState[1], &sarea->TexState[0], @@ -1070,15 +1070,10 @@ void mgaEmitHwStateLocked( mgaContextPtr mmesa ) mmesa->sarea->dirty |= mmesa->dirty; mmesa->dirty &= MGA_UPLOAD_CLIPRECTS; - /* This is a bit of a hack but seems to be the best place to ensure - * that separate specular is disabled when not needed. - */ - if (ctx->Texture._EnabledUnits == 0 || - !ctx->Light.Enabled || - ctx->Light.Model.ColorControl == GL_SINGLE_COLOR) { - sarea->TexState[0].texctl2 &= ~TMC_specen_enable; - sarea->TexState[1].texctl2 &= ~TMC_specen_enable; - } + sarea->TexState[0].texctl2 &= ~TMC_specen_enable; + sarea->TexState[1].texctl2 &= ~TMC_specen_enable; + sarea->TexState[0].texctl2 |= mmesa->hw.specen; + sarea->TexState[1].texctl2 |= mmesa->hw.specen; } @@ -1089,21 +1084,21 @@ void mgaEmitHwStateLocked( mgaContextPtr mmesa ) static void mgaDDValidateState( GLcontext *ctx ) { mgaContextPtr mmesa = MGA_CONTEXT( ctx ); - int new_state = mmesa->NewGLState; - FLUSH_BATCH( mmesa ); - if (mmesa->NewGLState & _MGA_NEW_RASTERSETUP) { - mgaChooseVertexState( ctx ); + if (mmesa->NewGLState & _NEW_TEXTURE) { + mgaUpdateTextureState(ctx); } - if (mmesa->NewGLState & _MGA_NEW_RENDERSTATE) { - mgaChooseRenderState( ctx ); - } + if (!mmesa->Fallback) { + if (mmesa->NewGLState & _MGA_NEW_RASTERSETUP) { + mgaChooseVertexState( ctx ); + } - if (new_state & _NEW_TEXTURE) { - mgaUpdateTextureState(ctx); + if (mmesa->NewGLState & _MGA_NEW_RENDERSTATE) { + mgaChooseRenderState( ctx ); + } } mmesa->NewGLState = 0; @@ -1186,13 +1181,14 @@ void mgaInitState( mgaContextPtr mmesa ) break; } + mmesa->hw.blend_func = AC_src_one | AC_dst_zero; mmesa->hw.zmode = DC_zmode_zlt | DC_atype_zi; mmesa->hw.stencil = (0x0ff << S_smsk_SHIFT) | (0x0ff << S_swtmsk_SHIFT); mmesa->hw.stencilctl = SC_smode_salways | SC_sfailop_keep | SC_szfailop_keep | SC_szpassop_keep; mmesa->hw.stencil_enable = 0; - mmesa->hw.cull = _CULL_NEGATIVE; - mmesa->hw.cull_dualtex = _CULL_POSITIVE; + mmesa->hw.cull = _CULL_DISABLE; + mmesa->hw.cull_dualtex = _CULL_DISABLE; mmesa->hw.specen = 0; mmesa->setup.dwgctl = (DC_opcod_trap | @@ -1227,6 +1223,10 @@ void mgaInitState( mgaContextPtr mmesa ) mmesa->setup.tdualstage1 = 0; mmesa->setup.fcol = 0; mmesa->dirty |= MGA_UPLOAD_CONTEXT; + + mmesa->envcolor = 0; + mmesa->blend_flags = MGA_BLEND_RGB_ZERO | MGA_BLEND_ALPHA_ZERO; + mmesa->dualtex_env = GL_FALSE; } @@ -1243,7 +1243,6 @@ void mgaDDInitStateFuncs( GLcontext *ctx ) ctx->Driver.DepthMask = mgaDDDepthMask; ctx->Driver.Fogfv = mgaDDFogfv; ctx->Driver.Scissor = mgaDDScissor; - ctx->Driver.ShadeModel = mgaDDShadeModel; ctx->Driver.CullFace = mgaDDCullFaceFrontFace; ctx->Driver.FrontFace = mgaDDCullFaceFrontFace; ctx->Driver.ColorMask = mgaDDColorMask; diff --git a/src/mesa/drivers/dri/mga/mgatex.c b/src/mesa/drivers/dri/mga/mgatex.c index 82eccc81498..166bdfc22f3 100644 --- a/src/mesa/drivers/dri/mga/mgatex.c +++ b/src/mesa/drivers/dri/mga/mgatex.c @@ -221,7 +221,7 @@ mgaChooseTextureFormat( GLcontext *ctx, GLint internalFormat, case GL_ALPHA16: case GL_COMPRESSED_ALPHA: /* FIXME: This will report incorrect component sizes... */ - return &_mesa_texformat_argb4444; + return MGA_IS_G400(mmesa) ? &_mesa_texformat_al88 : &_mesa_texformat_argb4444; case 1: case GL_LUMINANCE: @@ -231,7 +231,7 @@ mgaChooseTextureFormat( GLcontext *ctx, GLint internalFormat, case GL_LUMINANCE16: case GL_COMPRESSED_LUMINANCE: /* FIXME: This will report incorrect component sizes... */ - return &_mesa_texformat_rgb565; + return MGA_IS_G400(mmesa) ? &_mesa_texformat_al88 : &_mesa_texformat_rgb565; case 2: case GL_LUMINANCE_ALPHA: @@ -243,7 +243,7 @@ mgaChooseTextureFormat( GLcontext *ctx, GLint internalFormat, case GL_LUMINANCE16_ALPHA16: case GL_COMPRESSED_LUMINANCE_ALPHA: /* FIXME: This will report incorrect component sizes... */ - return &_mesa_texformat_argb4444; + return MGA_IS_G400(mmesa) ? &_mesa_texformat_al88 : &_mesa_texformat_argb4444; case GL_INTENSITY: case GL_INTENSITY4: @@ -252,7 +252,7 @@ mgaChooseTextureFormat( GLcontext *ctx, GLint internalFormat, case GL_INTENSITY16: case GL_COMPRESSED_INTENSITY: /* FIXME: This will report incorrect component sizes... */ - return &_mesa_texformat_argb4444; + return MGA_IS_G400(mmesa) ? &_mesa_texformat_i8 : &_mesa_texformat_argb4444; case GL_YCBCR_MESA: if (MGA_IS_G400(mmesa) && @@ -309,6 +309,7 @@ mgaAllocTexObj( struct gl_texture_object *tObj ) | TF_uvoffset_OGL); t->border_fallback = GL_FALSE; + t->texenv_fallback = GL_FALSE; make_empty_list( & t->base ); @@ -328,31 +329,31 @@ static void mgaDDTexEnv( GLcontext *ctx, GLenum target, struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; mgaContextPtr mmesa = MGA_CONTEXT(ctx); - switch( pname ) { case GL_TEXTURE_ENV_COLOR: { GLubyte c[4]; - GLuint envColor; UNCLAMPED_FLOAT_TO_RGBA_CHAN( c, texUnit->EnvColor ); - envColor = mgaPackColor( mmesa->mgaScreen->cpp, c[0], c[1], c[2], c[3] ); mmesa->envcolor = PACK_COLOR_8888( c[3], c[0], c[1], c[2] ); - if (mmesa->setup.fcol != envColor) { + if (mmesa->setup.fcol != mmesa->envcolor) { FLUSH_BATCH(mmesa); - mmesa->setup.fcol = envColor; + mmesa->setup.fcol = mmesa->envcolor; mmesa->dirty |= MGA_UPLOAD_CONTEXT; - mmesa->blend_flags &= ~MGA_BLEND_ENV_COLOR; + mmesa->blend_flags = 0; + + if ((mmesa->envcolor & 0xffffff) == 0x0) { + mmesa->blend_flags |= MGA_BLEND_RGB_ZERO; + } else if ((mmesa->envcolor & 0xffffff) == 0xffffff) { + mmesa->blend_flags |= MGA_BLEND_RGB_ONE; + } - /* Actually just require all four components to be - * equal. This permits a single-pass GL_BLEND. - * - * More complex multitexture/multipass fallbacks - * for blend can be done later. - */ - if (mmesa->envcolor != 0x0 && mmesa->envcolor != 0xffffffff) - mmesa->blend_flags |= MGA_BLEND_ENV_COLOR; + if ((mmesa->envcolor >> 24) == 0x0) { + mmesa->blend_flags |= MGA_BLEND_ALPHA_ZERO; + } else if ((mmesa->envcolor >> 24) == 0xff) { + mmesa->blend_flags |= MGA_BLEND_ALPHA_ONE; + } } break; } @@ -445,8 +446,9 @@ mgaDDTexParameter( GLcontext *ctx, GLenum target, * to do anything now */ - if ( (t == NULL) - || (target != GL_TEXTURE_2D) ) { + if ( (t == NULL) || + (target != GL_TEXTURE_2D && + target != GL_TEXTURE_RECTANGLE_NV) ) { return; } @@ -492,7 +494,8 @@ static void mgaDDBindTexture( GLcontext *ctx, GLenum target, struct gl_texture_object *tObj ) { - if ( target == GL_TEXTURE_2D ) { + if ( target == GL_TEXTURE_2D || + target == GL_TEXTURE_RECTANGLE_NV ) { if ( tObj->DriverData == NULL ) { mgaAllocTexObj( tObj ); } @@ -547,5 +550,7 @@ mgaDDInitTextureFuncs( GLcontext *ctx ) ctx->Driver.TexEnv = mgaDDTexEnv; ctx->Driver.TexParameter = mgaDDTexParameter; - driInitTextureObjects( ctx, & mmesa->swapped, DRI_TEXMGR_DO_TEXTURE_2D ); + driInitTextureObjects( ctx, & mmesa->swapped, + (DRI_TEXMGR_DO_TEXTURE_2D | + DRI_TEXMGR_DO_TEXTURE_RECT) ); } diff --git a/src/mesa/drivers/dri/mga/mgatex.h b/src/mesa/drivers/dri/mga/mgatex.h index 282577e9f80..94547e38862 100644 --- a/src/mesa/drivers/dri/mga/mgatex.h +++ b/src/mesa/drivers/dri/mga/mgatex.h @@ -46,4 +46,6 @@ void mgaDestroyTexObj( mgaContextPtr mmesa, mgaTextureObjectPtr t ); void mgaDDInitTextureFuncs( GLcontext *ctx ); +GLboolean mgaUpdateTextureEnvCombine( GLcontext *ctx, int unit ); + #endif diff --git a/src/mesa/drivers/dri/mga/mgatris.c b/src/mesa/drivers/dri/mga/mgatris.c index 054c7f0635d..1c193066ff3 100644 --- a/src/mesa/drivers/dri/mga/mgatris.c +++ b/src/mesa/drivers/dri/mga/mgatris.c @@ -676,8 +676,7 @@ static void mgaFastRenderClippedPoly( GLcontext *ctx, const GLuint *elts, #define POINT_FALLBACK (DD_POINT_SMOOTH) #define LINE_FALLBACK (DD_LINE_SMOOTH | DD_LINE_STIPPLE) #define TRI_FALLBACK (DD_TRI_SMOOTH | DD_TRI_UNFILLED) -#define ANY_FALLBACK_FLAGS (POINT_FALLBACK|LINE_FALLBACK|TRI_FALLBACK| \ - DD_TRI_STIPPLE) +#define ANY_FALLBACK_FLAGS (POINT_FALLBACK|LINE_FALLBACK|TRI_FALLBACK) #define ANY_RASTER_FLAGS (DD_FLATSHADE|DD_TRI_LIGHT_TWOSIDE|DD_TRI_OFFSET| \ DD_TRI_UNFILLED) @@ -688,7 +687,7 @@ void mgaChooseRenderState(GLcontext *ctx) GLuint flags = ctx->_TriangleCaps; GLuint index = 0; - if (flags & (ANY_FALLBACK_FLAGS|ANY_RASTER_FLAGS)) { + if (flags & (ANY_FALLBACK_FLAGS|ANY_RASTER_FLAGS|DD_TRI_STIPPLE)) { if (flags & ANY_RASTER_FLAGS) { if (flags & DD_TRI_LIGHT_TWOSIDE) index |= MGA_TWOSIDE_BIT; if (flags & DD_TRI_OFFSET) index |= MGA_OFFSET_BIT; @@ -713,9 +712,11 @@ void mgaChooseRenderState(GLcontext *ctx) if (flags & TRI_FALLBACK) mmesa->draw_tri = mga_fallback_tri; - if ((flags & DD_TRI_STIPPLE) && !mmesa->haveHwStipple) - mmesa->draw_tri = mga_fallback_tri; - + index |= MGA_FALLBACK_BIT; + } + + if ((flags & DD_TRI_STIPPLE) && !mmesa->haveHwStipple) { + mmesa->draw_tri = mga_fallback_tri; index |= MGA_FALLBACK_BIT; } } @@ -782,10 +783,9 @@ void mgaRasterPrimitive( GLcontext *ctx, GLenum prim, GLuint hwprim ) if (ctx->Polygon.StippleFlag && mmesa->haveHwStipple) { mmesa->dirty |= MGA_UPLOAD_CONTEXT; + mmesa->setup.dwgctl &= ~(0xf<<20); if (mmesa->raster_primitive == GL_TRIANGLES) mmesa->setup.dwgctl |= mmesa->poly_stipple; - else - mmesa->setup.dwgctl &= ~(0xf<<20); } } diff --git a/src/mesa/drivers/dri/mga/mgavb.c b/src/mesa/drivers/dri/mga/mgavb.c index 29b6d05340d..63de3563c45 100644 --- a/src/mesa/drivers/dri/mga/mgavb.c +++ b/src/mesa/drivers/dri/mga/mgavb.c @@ -24,7 +24,7 @@ * Authors: * Keith Whitwell <[email protected]> */ -/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgavb.c,v 1.14 2002/10/30 12:51:36 alanh Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgavb.c,v 1.15 2003/03/26 20:43:49 tsi Exp $ */ #include "mgacontext.h" #include "mgavb.h" @@ -340,6 +340,9 @@ void mgaCheckTexSizes( GLcontext *ctx ) tnl->Driver.Render.Interp = setup_tab[mmesa->SetupIndex].interp; tnl->Driver.Render.CopyPV = setup_tab[mmesa->SetupIndex].copy_pv; } + if (mmesa->Fallback) { + tnl->Driver.Render.Start(ctx); + } } } @@ -456,7 +459,7 @@ void mgaInitVB( GLcontext *ctx ) mgaContextPtr mmesa = MGA_CONTEXT(ctx); GLuint size = TNL_CONTEXT(ctx)->vb.Size; - mmesa->verts = ALIGN_MALLOC(size * sizeof(mgaVertex), 32); + mmesa->verts = (GLubyte *)ALIGN_MALLOC(size * sizeof(mgaVertex), 32); { static int firsttime = 1; diff --git a/src/mesa/drivers/dri/r128/Makefile.X11 b/src/mesa/drivers/dri/r128/Makefile.X11 index 8ae146af915..2a76159cae5 100644 --- a/src/mesa/drivers/dri/r128/Makefile.X11 +++ b/src/mesa/drivers/dri/r128/Makefile.X11 @@ -1,4 +1,4 @@ -# $Id: Makefile.X11,v 1.1 2003/08/22 20:11:44 brianp Exp $ +# $Id: Makefile.X11,v 1.1.2.1 2003/11/21 15:49:30 keithw Exp $ # Mesa 3-D graphics library # Version: 5.0 @@ -36,10 +36,11 @@ DRIVER_SOURCES = \ r128_span.c \ r128_texmem.c \ r128_vb.c \ - ../common/mm.c \ - ../common/utils.c \ - ../common/texmem.c \ - ../common/vblank.c + ../common/mm.c \ + ../common/utils.c \ + ../common/texmem.c \ + ../common/vblank.c \ + ../common/xmlconfig.c INCLUDES = $(MINIGLX_INCLUDES) \ $(SHARED_INCLUDES) @@ -94,6 +95,10 @@ r128_dri.so: $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile.X11 rm -f $(TOP)/lib/r128_dri.so && \ install r128_dri.so $(TOP)/lib/r128_dri.so +$(TOP)/lib/r128_dri.so: r128_dri.so + rm -f $(TOP)/lib/r128_dri.so && \ + install r128_dri.so $(TOP)/lib/r128_dri.so + # Run 'make -f Makefile.X11 dep' to update the dependencies if you change # what's included by any source file. depend: $(C_SOURCES) $(ASM_SOURCES) diff --git a/src/mesa/drivers/dri/r128/r128_context.c b/src/mesa/drivers/dri/r128/r128_context.c index f7f6d7141d2..e1b003a3587 100644 --- a/src/mesa/drivers/dri/r128/r128_context.c +++ b/src/mesa/drivers/dri/r128/r128_context.c @@ -60,6 +60,27 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "utils.h" #include "texmem.h" +/* R128 configuration + */ +#include "xmlpool.h" + +const char __driConfigOptions[] = +DRI_CONF_BEGIN +#if ENABLE_PERF_BOXES + DRI_CONF_SECTION_DEBUG + DRI_CONF_PERFORMANCE_BOXES(false) + DRI_CONF_SECTION_END +#endif + DRI_CONF_SECTION_PERFORMANCE + DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0) + DRI_CONF_SECTION_END +DRI_CONF_END; +#if ENABLE_PERF_BOXES +const GLuint __driNConfigOptions = 2; +#else +const GLuint __driNConfigOptions = 1; +#endif + #ifndef R128_DEBUG int R128_DEBUG = 0; #endif @@ -127,6 +148,10 @@ GLboolean r128CreateContext( const __GLcontextModes *glVisual, r128scrn = rmesa->r128Screen = (r128ScreenPtr)(sPriv->private); + /* Parse configuration files */ + driParseConfigFiles (&rmesa->optionCache, &r128scrn->optionCache, + r128scrn->driScreen->myNum, "r128"); + rmesa->sarea = (R128SAREAPrivPtr)((char *)sPriv->pSAREA + r128scrn->sarea_priv_offset); @@ -191,7 +216,7 @@ GLboolean r128CreateContext( const __GLcontextModes *glVisual, ctx->Const.LineWidthGranularity = 1.0; #if ENABLE_PERF_BOXES - rmesa->boxes = (getenv( "LIBGL_PERFORMANCE_BOXES" ) != NULL); + rmesa->boxes = driQueryOptionb(&rmesa->optionCache, "performance_boxes"); #endif /* Initialize the software rasterizer and helper modules. @@ -224,10 +249,8 @@ GLboolean r128CreateContext( const __GLcontextModes *glVisual, r128DDInitTextureFuncs( ctx ); r128DDInitState( rmesa ); - rmesa->do_irqs = (rmesa->r128Screen->irq && !getenv("R128_NO_IRQS")); - - rmesa->vblank_flags = (rmesa->do_irqs) - ? driGetDefaultVBlankFlags() : VBLANK_FLAG_NO_IRQ; + rmesa->vblank_flags = (rmesa->r128Screen->irq != 0) + ? driGetDefaultVBlankFlags(&rmesa->optionCache) : VBLANK_FLAG_NO_IRQ; driContextPriv->driverPrivate = (void *)rmesa; @@ -277,6 +300,9 @@ void r128DestroyContext( __DRIcontextPrivate *driContextPriv ) } } + /* free the option cache */ + driDestroyOptionCache (&rmesa->optionCache); + FREE( rmesa ); } @@ -305,6 +331,7 @@ r128MakeCurrent( __DRIcontextPrivate *driContextPriv, newR128Ctx->dirty = R128_UPLOAD_ALL; } + driDrawableInitVBlank( driDrawPriv, newR128Ctx->vblank_flags ); newR128Ctx->driDrawable = driDrawPriv; _mesa_make_current2( newR128Ctx->glCtx, diff --git a/src/mesa/drivers/dri/r128/r128_context.h b/src/mesa/drivers/dri/r128/r128_context.h index 9c93012eb0f..453ccb6f537 100644 --- a/src/mesa/drivers/dri/r128/r128_context.h +++ b/src/mesa/drivers/dri/r128/r128_context.h @@ -178,10 +178,6 @@ struct r128_context { */ GLuint doPageFlip; - /* Busy waiting - */ - GLuint do_irqs; - /* Drawable, cliprect and scissor information */ GLint drawOffset, drawPitch; @@ -222,6 +218,10 @@ struct r128_context { */ GLuint vbl_seq; GLuint vblank_flags; + + /* Configuration cache + */ + driOptionCache optionCache; }; #define R128_CONTEXT(ctx) ((r128ContextPtr)(ctx->DriverCtx)) diff --git a/src/mesa/drivers/dri/r128/r128_ioctl.c b/src/mesa/drivers/dri/r128/r128_ioctl.c index c5843473e12..2f1e3ad8f9a 100644 --- a/src/mesa/drivers/dri/r128/r128_ioctl.c +++ b/src/mesa/drivers/dri/r128/r128_ioctl.c @@ -31,7 +31,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. * Gareth Hughes <[email protected]> * */ -#include <errno.h> +#include <errno.h> #include "r128_context.h" #include "r128_state.h" diff --git a/src/mesa/drivers/dri/r128/r128_screen.c b/src/mesa/drivers/dri/r128/r128_screen.c index 8a8fc252177..8eee8bbe068 100644 --- a/src/mesa/drivers/dri/r128/r128_screen.c +++ b/src/mesa/drivers/dri/r128/r128_screen.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_screen.c,v 1.8 2002/12/16 16:18:53 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_screen.c,v 1.9 2003/03/26 20:43:49 tsi Exp $ */ /************************************************************************** Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc., @@ -55,7 +55,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. */ #define PCI_CHIP_RAGE128LE 0x4C45 #define PCI_CHIP_RAGE128LF 0x4C46 -#define PCI_CHIP_RAGE128PD 0x5044 #define PCI_CHIP_RAGE128PF 0x5046 #define PCI_CHIP_RAGE128PR 0x5052 #define PCI_CHIP_RAGE128RE 0x5245 @@ -80,6 +79,9 @@ r128CreateScreen( __DRIscreenPrivate *sPriv ) r128Screen = (r128ScreenPtr) CALLOC( sizeof(*r128Screen) ); if ( !r128Screen ) return NULL; + /* parse information in __driConfigOptions */ + driParseOptionInfo (&r128Screen->optionCache); + /* This is first since which regions we map depends on whether or * not we are using a PCI card. */ @@ -140,7 +142,6 @@ r128CreateScreen( __DRIscreenPrivate *sPriv ) case PCI_CHIP_RAGE128RL: r128Screen->chipset = R128_CARD_TYPE_R128; break; - case PCI_CHIP_RAGE128PD: case PCI_CHIP_RAGE128PF: r128Screen->chipset = R128_CARD_TYPE_R128_PRO; break; @@ -183,7 +184,23 @@ r128CreateScreen( __DRIscreenPrivate *sPriv ) } r128Screen->driScreen = sPriv; +#ifndef _SOLO + if ( driCompareGLXAPIVersion( 20030813 ) >= 0 ) { + PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension = + (PFNGLXSCRENABLEEXTENSIONPROC) glXGetProcAddress( (const GLubyte *) "__glXScrEnableExtension" ); + void * const psc = sPriv->psc->screenConfigs; + + if ( glx_enable_extension != NULL ) { + if ( r128Screen->irq != 0 ) { + (*glx_enable_extension)( psc, "GLX_SGI_swap_control" ); + (*glx_enable_extension)( psc, "GLX_SGI_video_sync" ); + (*glx_enable_extension)( psc, "GLX_MESA_swap_control" ); + } + (*glx_enable_extension)( psc, "GLX_MESA_swap_frame_usage" ); + } + } +#endif return r128Screen; } @@ -204,6 +221,9 @@ r128DestroyScreen( __DRIscreenPrivate *sPriv ) drmUnmapBufs( r128Screen->buffers ); drmUnmap( (drmAddress)r128Screen->mmio.map, r128Screen->mmio.size ); + /* free all option information */ + driDestroyOptionInfo (&r128Screen->optionCache); + FREE( r128Screen ); sPriv->private = NULL; } @@ -290,10 +310,13 @@ r128InitDriver( __DRIscreenPrivate *sPriv ) return GL_TRUE; } - #ifndef _SOLO -/* This function is called by libGL.so as soon as libGL.so is loaded. +/** + * This function is called by libGL.so as soon as libGL.so is loaded. * This is where we register new extension functions with the dispatcher. + * + * \todo This interface has been deprecated, so we should probably remove + * this function before the next XFree86 release. */ void __driRegisterExtensions( void ) { @@ -301,7 +324,7 @@ void __driRegisterExtensions( void ) if ( driCompareGLXAPIVersion( 20030317 ) >= 0 ) { glx_enable_extension = (PFNGLXENABLEEXTENSIONPROC) - glXGetProcAddress( "__glXEnableExtension" ); + glXGetProcAddress( (const GLubyte *) "__glXEnableExtension" ); if ( glx_enable_extension != NULL ) { glx_enable_extension( "GLX_SGI_swap_control", GL_FALSE ); @@ -338,7 +361,7 @@ static struct __DriverAPIRec r128API = { * The __driCreateScreen name is the symbol that libGL.so fetches. * Return: pointer to a __DRIscreenPrivate. */ -#ifndef _SOLO +#ifndef _SOLO void *__driCreateScreen(Display *dpy, int scrn, __DRIscreen *psc, int numConfigs, __GLXvisualConfig *config) { diff --git a/src/mesa/drivers/dri/r128/r128_screen.h b/src/mesa/drivers/dri/r128/r128_screen.h index 4b1a57292d9..affe9e69ef1 100644 --- a/src/mesa/drivers/dri/r128/r128_screen.h +++ b/src/mesa/drivers/dri/r128/r128_screen.h @@ -39,6 +39,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #ifdef GLX_DIRECT_RENDERING #include "r128_sarea.h" +#include "xmlconfig.h" typedef struct { drmHandle handle; /* Handle to the DRM region */ @@ -77,6 +78,9 @@ typedef struct { __DRIscreenPrivate *driScreen; unsigned int sarea_priv_offset; + /* Configuration cache with default values for all contexts */ + driOptionCache optionCache; + } r128ScreenRec, *r128ScreenPtr; diff --git a/src/mesa/drivers/dri/r128/r128_state.c b/src/mesa/drivers/dri/r128/r128_state.c index 85b3b68402d..110a16a8316 100644 --- a/src/mesa/drivers/dri/r128/r128_state.c +++ b/src/mesa/drivers/dri/r128/r128_state.c @@ -706,7 +706,7 @@ static void r128DDDrawBuffer( GLcontext *ctx, GLenum mode ) break; } - /* We want to update the s/w rast state too so that r200SetBuffer() + /* We want to update the s/w rast state too so that r128DDSetBuffer() * gets called. */ _swrast_DrawBuffer(ctx, mode); diff --git a/src/mesa/drivers/dri/r128/r128_texmem.c b/src/mesa/drivers/dri/r128/r128_texmem.c index f6a5dfbbcf3..7bffaf46287 100644 --- a/src/mesa/drivers/dri/r128/r128_texmem.c +++ b/src/mesa/drivers/dri/r128/r128_texmem.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_tex.c,v 1.7 2001/01/08 01:07:21 martin Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_texmem.c,v 1.1 2002/02/22 21:44:58 dawes Exp $ */ /************************************************************************** Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc., diff --git a/src/mesa/drivers/dri/r128/r128_texstate.c b/src/mesa/drivers/dri/r128/r128_texstate.c index 3f4347b02e8..3c43eb45286 100644 --- a/src/mesa/drivers/dri/r128/r128_texstate.c +++ b/src/mesa/drivers/dri/r128/r128_texstate.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_tex.c,v 1.7 2001/01/08 01:07:21 martin Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_texstate.c,v 1.1 2002/02/22 21:44:58 dawes Exp $ */ /************************************************************************** Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc., @@ -90,17 +90,11 @@ static void r128SetTexImages( r128ContextPtr rmesa, }; /* Compute which mipmap levels we really want to send to the hardware. - * This depends on the base image size, GL_TEXTURE_MIN_LOD, - * GL_TEXTURE_MAX_LOD, GL_TEXTURE_BASE_LEVEL, and GL_TEXTURE_MAX_LEVEL. - * Yes, this looks overly complicated, but it's all needed. */ - firstLevel = tObj->BaseLevel + (GLint) (tObj->MinLod + 0.5); - firstLevel = MAX2(firstLevel, tObj->BaseLevel); - lastLevel = tObj->BaseLevel + (GLint) (tObj->MaxLod + 0.5); - lastLevel = MAX2(lastLevel, tObj->BaseLevel); - lastLevel = MIN2(lastLevel, tObj->BaseLevel + baseImage->MaxLog2); - lastLevel = MIN2(lastLevel, tObj->MaxLevel); - lastLevel = MAX2(firstLevel, lastLevel); /* need at least one level */ + + driCalculateTextureFirstLastLevel( (driTextureObject *) t ); + firstLevel = t->base.firstLevel; + lastLevel = t->base.lastLevel; log2Pitch = tObj->Image[firstLevel]->WidthLog2; log2Height = tObj->Image[firstLevel]->HeightLog2; diff --git a/src/mesa/drivers/dri/r128/r128_vb.c b/src/mesa/drivers/dri/r128/r128_vb.c index 48cdcd5e368..6c52975286f 100644 --- a/src/mesa/drivers/dri/r128/r128_vb.c +++ b/src/mesa/drivers/dri/r128/r128_vb.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_vb.c,v 1.15 2002/10/30 12:51:43 alanh Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_vb.c,v 1.16 2003/03/26 20:43:49 tsi Exp $ */ /************************************************************************** Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and @@ -361,6 +361,9 @@ void r128CheckTexSizes( GLcontext *ctx ) tnl->Driver.Render.Interp = setup_tab[rmesa->SetupIndex].interp; tnl->Driver.Render.CopyPV = setup_tab[rmesa->SetupIndex].copy_pv; } + if (rmesa->Fallback) { + tnl->Driver.Render.Start(ctx); + } } } @@ -489,7 +492,7 @@ void r128InitVB( GLcontext *ctx ) r128ContextPtr rmesa = R128_CONTEXT(ctx); GLuint size = TNL_CONTEXT(ctx)->vb.Size; - rmesa->verts = ALIGN_MALLOC(size * 4 * 16, 32); + rmesa->verts = (GLubyte *)ALIGN_MALLOC(size * 4 * 16, 32); { static int firsttime = 1; diff --git a/src/mesa/drivers/dri/r200/Makefile.X11 b/src/mesa/drivers/dri/r200/Makefile.X11 index 62f4b4b94c1..4d3ea1b9e03 100644 --- a/src/mesa/drivers/dri/r200/Makefile.X11 +++ b/src/mesa/drivers/dri/r200/Makefile.X11 @@ -1,4 +1,4 @@ -# $Id: Makefile.X11,v 1.4 2003/10/03 14:03:18 brianp Exp $ +# $Id: Makefile.X11,v 1.3.2.1 2003/11/21 15:49:30 keithw Exp $ # Mesa 3-D graphics library # Version: 5.0 @@ -33,6 +33,7 @@ DRIVER_SOURCES = r200_context.c \ ../common/utils.c \ ../common/texmem.c \ ../common/vblank.c \ + ../common/xmlconfig.c \ r200_cmdbuf.c \ r200_pixel.c \ r200_tex.c \ @@ -118,6 +119,10 @@ r200_dri.so: $(SYMLINKS) $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile.X11 rm -f $(TOP)/lib/r200_dri.so && \ install r200_dri.so $(TOP)/lib/r200_dri.so +$(TOP)/lib/r200_dri.so: r200_dri.so + rm -f $(TOP)/lib/r200_dri.so && \ + install r200_dri.so $(TOP)/lib/r200_dri.so + # Run 'make -f Makefile.X11 dep' to update the dependencies if you change # what's included by any source file. depend: $(C_SOURCES) $(ASM_SOURCES) diff --git a/src/mesa/drivers/dri/r200/r200_cmdbuf.c b/src/mesa/drivers/dri/r200/r200_cmdbuf.c index a64b32d9160..3a4fa30bcf6 100644 --- a/src/mesa/drivers/dri/r200/r200_cmdbuf.c +++ b/src/mesa/drivers/dri/r200/r200_cmdbuf.c @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_cmdbuf.c,v 1.1 2002/10/30 12:51:51 alanh Exp $ */ /* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. diff --git a/src/mesa/drivers/dri/r200/r200_context.c b/src/mesa/drivers/dri/r200/r200_context.c index ca6ce4974ae..53aa711cc1e 100644 --- a/src/mesa/drivers/dri/r200/r200_context.c +++ b/src/mesa/drivers/dri/r200/r200_context.c @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_context.c,v 1.3 2003/05/06 23:52:08 daenzer Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the @@ -69,7 +68,26 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. int R200_DEBUG = (0); #endif - +/* R200 configuration + */ +#include "xmlpool.h" + + +const char __driConfigOptions[] = +DRI_CONF_BEGIN + DRI_CONF_SECTION_PERFORMANCE + DRI_CONF_TCL_MODE(DRI_CONF_TCL_CODEGEN) + DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS) + DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0) + DRI_CONF_SECTION_END + DRI_CONF_SECTION_QUALITY + DRI_CONF_PREFERRED_BPT(0,"0,16,32") + DRI_CONF_SECTION_END + DRI_CONF_SECTION_DEBUG + DRI_CONF_NO_RAST(false) + DRI_CONF_SECTION_END +DRI_CONF_END; +const GLuint __driNConfigOptions = 5; /* Return the width and height of the given buffer. */ @@ -224,7 +242,7 @@ static const struct dri_debug_control debug_control[] = static int -get_ust_nop( int64_t * ust ) +get_ust_nop( uint64_t * ust ) { *ust = 1; return 0; @@ -242,6 +260,7 @@ GLboolean r200CreateContext( const __GLcontextModes *glVisual, r200ContextPtr rmesa; GLcontext *ctx, *shareCtx; int i; + int tcl_mode, fthrottle_mode, preferred_bpt; assert(glVisual); assert(driContextPriv); @@ -273,6 +292,9 @@ GLboolean r200CreateContext( const __GLcontextModes *glVisual, rmesa->dri.fd = sPriv->fd; rmesa->dri.drmMinor = sPriv->drmMinor; + /* Parse configuration files */ + driParseConfigFiles (&rmesa->optionCache, &screen->optionCache, + screen->driScreen->myNum, "r200"); rmesa->r200Screen = screen; rmesa->sarea = (RADEONSAREAPrivPtr)((GLubyte *)sPriv->pSAREA + screen->sarea_priv_offset); @@ -295,6 +317,9 @@ GLboolean r200CreateContext( const __GLcontextModes *glVisual, sizeof( r200TexObj ), (destroy_texture_object_t *) r200DestroyTexObj ); } + preferred_bpt = driQueryOptioni (&rmesa->optionCache, "preferred_bpt"); + rmesa->default32BitTextures = + ( ( preferred_bpt == 0 && screen->cpp == 4 ) || preferred_bpt == 32 ); rmesa->swtcl.RenderIndex = ~0; rmesa->lost_context = 1; @@ -382,36 +407,38 @@ GLboolean r200CreateContext( const __GLcontextModes *glVisual, r200InitState( rmesa ); r200InitSwtcl( ctx ); + fthrottle_mode = driQueryOptioni(&rmesa->optionCache, "fthrottle_mode"); rmesa->iw.irq_seq = -1; rmesa->irqsEmitted = 0; rmesa->do_irqs = (rmesa->dri.drmMinor >= 6 && - !getenv("R200_NO_IRQS") && + fthrottle_mode == DRI_CONF_FTHROTTLE_IRQS && rmesa->r200Screen->irq); + rmesa->do_usleeps = (fthrottle_mode == DRI_CONF_FTHROTTLE_USLEEPS); + if (!rmesa->do_irqs) - fprintf(stderr, - "IRQ's not enabled, falling back to busy waits: %d %d %d\n", + fprintf(stderr, + "IRQ's not enabled, falling back to %s: %d %d %d\n", + rmesa->do_usleeps ? "usleeps" : "busy waits", rmesa->dri.drmMinor, - !!getenv("R200_NO_IRQS"), + fthrottle_mode, rmesa->r200Screen->irq); + rmesa->vblank_flags = (rmesa->r200Screen->irq != 0) + ? driGetDefaultVBlankFlags(&rmesa->optionCache) : VBLANK_FLAG_NO_IRQ; - rmesa->do_usleeps = !getenv("R200_NO_USLEEPS"); - - rmesa->vblank_flags = (rmesa->do_irqs) - ? driGetDefaultVBlankFlags() : VBLANK_FLAG_NO_IRQ; - - rmesa->prefer_agp_client_texturing = - (getenv("R200_AGP_CLIENT_TEXTURES") != 0); - -#ifndef _SOLO - rmesa->get_ust = (PFNGLXGETUSTPROC) glXGetProcAddress( "__glXGetUST" ); + rmesa->prefer_gart_client_texturing = + (getenv("R200_GART_CLIENT_TEXTURES") != 0); +#ifndef _SOLO + rmesa->get_ust = (PFNGLXGETUSTPROC) glXGetProcAddress( (const GLubyte *) "__glXGetUST" ); if ( rmesa->get_ust == NULL ) { rmesa->get_ust = get_ust_nop; } - - (*rmesa->get_ust)( & rmesa->swap_ust ); +#else + rmesa->get_ust = get_ust_nop; #endif + (*rmesa->get_ust)( & rmesa->swap_ust ); + #if DO_DEBUG R200_DEBUG = driParseDebugString( getenv( "R200_DEBUG" ), @@ -420,17 +447,18 @@ GLboolean r200CreateContext( const __GLcontextModes *glVisual, debug_control ); #endif - if (getenv("R200_NO_RAST")) { + tcl_mode = driQueryOptioni(&rmesa->optionCache, "tcl_mode"); + if (driQueryOptionb(&rmesa->optionCache, "no_rast")) { fprintf(stderr, "disabling 3D acceleration\n"); FALLBACK(rmesa, R200_FALLBACK_DISABLE, 1); } - else if (getenv("R200_NO_TCL")) { + else if (tcl_mode == DRI_CONF_TCL_SW) { fprintf(stderr, "disabling TCL support\n"); TCL_FALLBACK(rmesa->glCtx, R200_TCL_FALLBACK_TCL_DISABLE, 1); } else { - if (!getenv("R200_NO_VTXFMT")) { - r200VtxfmtInit( ctx ); + if (tcl_mode >= DRI_CONF_TCL_VTXFMT) { + r200VtxfmtInit( ctx, tcl_mode >= DRI_CONF_TCL_CODEGEN ); } _tnl_need_dlist_norm_lengths( ctx, GL_FALSE ); } @@ -474,9 +502,11 @@ void r200DestroyContext( __DRIcontextPrivate *driContextPriv ) r200FlushCmdBuf( rmesa, __FUNCTION__ ); } - if (!rmesa->TclFallback & R200_TCL_FALLBACK_TCL_DISABLE) - if (!getenv("R200_NO_VTXFMT")) + if (!(rmesa->TclFallback & R200_TCL_FALLBACK_TCL_DISABLE)) { + int tcl_mode = driQueryOptioni(&rmesa->optionCache, "tcl_mode"); + if (tcl_mode >= DRI_CONF_TCL_VTXFMT) r200VtxfmtDestroy( rmesa->glCtx ); + } /* free the Mesa context */ rmesa->glCtx->DriverCtx = NULL; @@ -492,7 +522,7 @@ void r200DestroyContext( __DRIcontextPrivate *driContextPriv ) * texture object data. */ int i; - + /* this assert is wrong. The default textures are always on swap list assert( is_empty_list( & rmesa->swapped ) ); */ @@ -502,6 +532,9 @@ void r200DestroyContext( __DRIcontextPrivate *driContextPriv ) } } + /* free the option cache */ + driDestroyOptionCache (&rmesa->optionCache); + FREE( rmesa ); } } @@ -550,6 +583,7 @@ r200MakeCurrent( __DRIcontextPrivate *driContextPriv, fprintf(stderr, "%s ctx %p\n", __FUNCTION__, newCtx->glCtx); if ( newCtx->dri.drawable != driDrawPriv ) { + driDrawableInitVBlank( driDrawPriv, newCtx->vblank_flags ); newCtx->dri.drawable = driDrawPriv; r200UpdateWindow( newCtx->glCtx ); r200UpdateViewportOffset( newCtx->glCtx ); diff --git a/src/mesa/drivers/dri/r200/r200_context.h b/src/mesa/drivers/dri/r200/r200_context.h index 9e00d7a3585..7421db97e6c 100644 --- a/src/mesa/drivers/dri/r200/r200_context.h +++ b/src/mesa/drivers/dri/r200/r200_context.h @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_context.h,v 1.2 2002/12/16 16:18:54 dawes Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the @@ -532,7 +531,7 @@ struct r200_dma_buffer { drmBufPtr buf; }; -#define GET_START(rvb) (rmesa->r200Screen->agp_buffer_offset + \ +#define GET_START(rvb) (rmesa->r200Screen->gart_buffer_offset + \ (rvb)->address - rmesa->dma.buf0_address + \ (rvb)->start) @@ -779,6 +778,7 @@ struct r200_context { unsigned nr_heaps; driTexHeap * texture_heaps[ R200_NR_TEX_HEAPS ]; driTextureObject swapped; + GLboolean default32BitTextures; /* Rasterization and vertex state: @@ -812,7 +812,7 @@ struct r200_context { /* Clientdata textures; */ - GLuint prefer_agp_client_texturing; + GLuint prefer_gart_client_texturing; /* Drawable, cliprect and scissor information */ @@ -863,6 +863,10 @@ struct r200_context { /* Mirrors of some DRI state */ struct r200_dri_mirror dri; + + /* Configuration cache + */ + driOptionCache optionCache; }; #define R200_CONTEXT(ctx) ((r200ContextPtr)(ctx->DriverCtx)) diff --git a/src/mesa/drivers/dri/r200/r200_ioctl.c b/src/mesa/drivers/dri/r200/r200_ioctl.c index 480121a094d..af7c3a0e629 100644 --- a/src/mesa/drivers/dri/r200/r200_ioctl.c +++ b/src/mesa/drivers/dri/r200/r200_ioctl.c @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_ioctl.c,v 1.4 2002/12/17 00:32:56 dawes Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the @@ -33,7 +32,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * Authors: * Keith Whitwell <[email protected]> */ - + #include <sched.h> #include <errno.h> @@ -773,7 +772,7 @@ void r200Finish( GLcontext *ctx ) } -/* This version of AllocateMemoryNV allocates only agp memory, and +/* This version of AllocateMemoryMESA allocates only GART memory, and * only does so after the point at which the driver has been * initialized. * @@ -782,8 +781,9 @@ void r200Finish( GLcontext *ctx ) * the kernel data structures, and the current context to get the * device fd. */ -void *r200AllocateMemoryNV(GLsizei size, GLfloat readfreq, - GLfloat writefreq, GLfloat priority) +void *r200AllocateMemoryMESA(GLsizei size, + GLfloat readfreq, GLfloat writefreq, + GLfloat priority) { GET_CURRENT_CONTEXT(ctx); r200ContextPtr rmesa; @@ -795,7 +795,7 @@ void *r200AllocateMemoryNV(GLsizei size, GLfloat readfreq, fprintf(stderr, "%s sz %d %f/%f/%f\n", __FUNCTION__, size, readfreq, writefreq, priority); - if (!ctx || !(rmesa = R200_CONTEXT(ctx)) || rmesa->r200Screen->IsPCI ) + if (!ctx || !(rmesa = R200_CONTEXT(ctx)) || !rmesa->r200Screen->gartTextures.map) return NULL; if (getenv("R200_NO_ALLOC")) @@ -804,7 +804,7 @@ void *r200AllocateMemoryNV(GLsizei size, GLfloat readfreq, if (rmesa->dri.drmMinor < 6) return NULL; - alloc.region = RADEON_MEM_REGION_AGP; + alloc.region = RADEON_MEM_REGION_GART; alloc.alignment = 0; alloc.size = size; alloc.region_offset = ®ion_offset; @@ -819,14 +819,14 @@ void *r200AllocateMemoryNV(GLsizei size, GLfloat readfreq, } { - char *region_start = (char *)rmesa->r200Screen->agpTextures.map; + char *region_start = (char *)rmesa->r200Screen->gartTextures.map; return (void *)(region_start + region_offset); } } -/* Called via glXFreeMemoryNV() */ -void r200FreeMemoryNV(GLvoid *pointer) +/* Called via glXFreeMemoryMESA() */ +void r200FreeMemoryMESA(GLvoid *pointer) { GET_CURRENT_CONTEXT(ctx); r200ContextPtr rmesa; @@ -837,7 +837,7 @@ void r200FreeMemoryNV(GLvoid *pointer) if (R200_DEBUG & DEBUG_IOCTL) fprintf(stderr, "%s %p\n", __FUNCTION__, pointer); - if (!ctx || !(rmesa = R200_CONTEXT(ctx)) || rmesa->r200Screen->IsPCI ) { + if (!ctx || !(rmesa = R200_CONTEXT(ctx)) || !rmesa->r200Screen->gartTextures.map) { fprintf(stderr, "%s: no context\n", __FUNCTION__); return; } @@ -845,16 +845,16 @@ void r200FreeMemoryNV(GLvoid *pointer) if (rmesa->dri.drmMinor < 6) return; - region_offset = (char *)pointer - (char *)rmesa->r200Screen->agpTextures.map; + region_offset = (char *)pointer - (char *)rmesa->r200Screen->gartTextures.map; if (region_offset < 0 || - region_offset > rmesa->r200Screen->agpTextures.size) { + region_offset > rmesa->r200Screen->gartTextures.size) { fprintf(stderr, "offset %d outside range 0..%d\n", region_offset, - rmesa->r200Screen->agpTextures.size); + rmesa->r200Screen->gartTextures.size); return; } - memfree.region = RADEON_MEM_REGION_AGP; + memfree.region = RADEON_MEM_REGION_GART; memfree.region_offset = region_offset; ret = drmCommandWrite( rmesa->r200Screen->driScreen->fd, @@ -865,8 +865,8 @@ void r200FreeMemoryNV(GLvoid *pointer) fprintf(stderr, "%s: DRM_RADEON_FREE ret %d\n", __FUNCTION__, ret); } -/* Called via glXGetAGPOffsetMESA() */ -GLuint r200GetAGPOffset(const GLvoid *pointer) +/* Called via glXGetMemoryOffsetMESA() */ +GLuint r200GetMemoryOffsetMESA(const GLvoid *pointer) { GET_CURRENT_CONTEXT(ctx); r200ContextPtr rmesa; @@ -877,41 +877,41 @@ GLuint r200GetAGPOffset(const GLvoid *pointer) return ~0; } - if (!r200IsAgpMemory( rmesa, pointer, 0 )) + if (!r200IsGartMemory( rmesa, pointer, 0 )) return ~0; if (rmesa->dri.drmMinor < 6) return ~0; - card_offset = r200AgpOffsetFromVirtual( rmesa, pointer ); + card_offset = r200GartOffsetFromVirtual( rmesa, pointer ); - return card_offset - rmesa->r200Screen->agp_base; + return card_offset - rmesa->r200Screen->gart_base; } -GLboolean r200IsAgpMemory( r200ContextPtr rmesa, const GLvoid *pointer, +GLboolean r200IsGartMemory( r200ContextPtr rmesa, const GLvoid *pointer, GLint size ) { - int offset = (char *)pointer - (char *)rmesa->r200Screen->agpTextures.map; + int offset = (char *)pointer - (char *)rmesa->r200Screen->gartTextures.map; int valid = (size >= 0 && offset >= 0 && - offset + size < rmesa->r200Screen->agpTextures.size); + offset + size < rmesa->r200Screen->gartTextures.size); if (R200_DEBUG & DEBUG_IOCTL) - fprintf(stderr, "r200IsAgpMemory( %p ) : %d\n", pointer, valid ); + fprintf(stderr, "r200IsGartMemory( %p ) : %d\n", pointer, valid ); return valid; } -GLuint r200AgpOffsetFromVirtual( r200ContextPtr rmesa, const GLvoid *pointer ) +GLuint r200GartOffsetFromVirtual( r200ContextPtr rmesa, const GLvoid *pointer ) { - int offset = (char *)pointer - (char *)rmesa->r200Screen->agpTextures.map; + int offset = (char *)pointer - (char *)rmesa->r200Screen->gartTextures.map; - if (offset < 0 || offset > rmesa->r200Screen->agpTextures.size) + if (offset < 0 || offset > rmesa->r200Screen->gartTextures.size) return ~0; else - return rmesa->r200Screen->agp_texture_offset + offset; + return rmesa->r200Screen->gart_texture_offset + offset; } diff --git a/src/mesa/drivers/dri/r200/r200_ioctl.h b/src/mesa/drivers/dri/r200/r200_ioctl.h index 5025c1d2304..a76dbd2ad12 100644 --- a/src/mesa/drivers/dri/r200/r200_ioctl.h +++ b/src/mesa/drivers/dri/r200/r200_ioctl.h @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_ioctl.h,v 1.1 2002/10/30 12:51:52 alanh Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the @@ -106,15 +105,15 @@ extern void r200WaitForIdleLocked( r200ContextPtr rmesa ); extern void r200WaitForVBlank( r200ContextPtr rmesa ); extern void r200InitIoctlFuncs( GLcontext *ctx ); -extern void *r200AllocateMemoryNV( GLsizei size, GLfloat readfreq, +extern void *r200AllocateMemoryMESA( GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority ); -extern void r200FreeMemoryNV( GLvoid *pointer ); -extern GLuint r200GetAGPOffset( const GLvoid *pointer ); -extern GLboolean r200IsAgpMemory( r200ContextPtr rmesa, const GLvoid *pointer, - GLint size ); +extern void r200FreeMemoryMESA( GLvoid *pointer ); +extern GLuint r200GetMemoryOffsetMESA( const GLvoid *pointer ); +extern GLboolean r200IsGartMemory( r200ContextPtr rmesa, const GLvoid *pointer, + GLint size ); -extern GLuint r200AgpOffsetFromVirtual( r200ContextPtr rmesa, - const GLvoid *pointer ); +extern GLuint r200GartOffsetFromVirtual( r200ContextPtr rmesa, + const GLvoid *pointer ); /* ================================================================ * Helper macros: diff --git a/src/mesa/drivers/dri/r200/r200_lock.c b/src/mesa/drivers/dri/r200/r200_lock.c index c2c5d30c582..9d6cff50ae4 100644 --- a/src/mesa/drivers/dri/r200/r200_lock.c +++ b/src/mesa/drivers/dri/r200/r200_lock.c @@ -1,5 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_lock.c,v 1.1 2002/10/30 12:51:52 alanh Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the @@ -81,6 +81,7 @@ r200UpdatePageFlipping( r200ContextPtr rmesa ) void r200GetLock( r200ContextPtr rmesa, GLuint flags ) { __DRIdrawablePrivate *dPriv = rmesa->dri.drawable; + __DRIscreenPrivate *sPriv = rmesa->dri.screen; RADEONSAREAPrivPtr sarea = rmesa->sarea; int i; diff --git a/src/mesa/drivers/dri/r200/r200_lock.h b/src/mesa/drivers/dri/r200/r200_lock.h index 59bc1d656e1..7a4dfcf15cc 100644 --- a/src/mesa/drivers/dri/r200/r200_lock.h +++ b/src/mesa/drivers/dri/r200/r200_lock.h @@ -1,5 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_lock.h,v 1.1 2002/10/30 12:51:52 alanh Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the diff --git a/src/mesa/drivers/dri/r200/r200_maos.h b/src/mesa/drivers/dri/r200/r200_maos.h index 0dfcc5c3ffb..a430497db98 100644 --- a/src/mesa/drivers/dri/r200/r200_maos.h +++ b/src/mesa/drivers/dri/r200/r200_maos.h @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_maos.h,v 1.1 2002/10/30 12:51:52 alanh Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the diff --git a/src/mesa/drivers/dri/r200/r200_maos_arrays.c b/src/mesa/drivers/dri/r200/r200_maos_arrays.c index 0263d009026..b442dce207a 100644 --- a/src/mesa/drivers/dri/r200/r200_maos_arrays.c +++ b/src/mesa/drivers/dri/r200/r200_maos_arrays.c @@ -1,5 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_maos_arrays.c,v 1.3 2003/02/23 23:59:01 dawes Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the @@ -174,6 +174,28 @@ static void emit_ubyte_rgba( GLcontext *ctx, } +static void emit_vec4( GLcontext *ctx, + struct r200_dma_region *rvb, + char *data, + int stride, + int count ) +{ + int i; + int *out = (int *)(rvb->address + rvb->start); + + if (R200_DEBUG & DEBUG_VERTS) + fprintf(stderr, "%s count %d stride %d\n", + __FUNCTION__, count, stride); + + if (stride == 4) + COPY_DWORDS( out, data, count ); + else + for (i = 0; i < count; i++) { + out[0] = *(int *)data; + out++; + data += stride; + } +} static void emit_vec8( GLcontext *ctx, @@ -284,6 +306,9 @@ static void emit_vector( GLcontext *ctx, /* Emit the data */ switch (size) { + case 1: + emit_vec4( ctx, rvb, data, stride, count ); + break; case 2: emit_vec8( ctx, rvb, data, stride, count ); break; @@ -303,7 +328,7 @@ static void emit_vector( GLcontext *ctx, -/* Emit any changed arrays to new agp memory, re-emit a packet to +/* Emit any changed arrays to new GART memory, re-emit a packet to * update the arrays. */ void r200EmitArrays( GLcontext *ctx, GLuint inputs ) diff --git a/src/mesa/drivers/dri/r200/r200_maos_vbtmp.h b/src/mesa/drivers/dri/r200/r200_maos_vbtmp.h index a36be45b275..ce258d7988a 100644 --- a/src/mesa/drivers/dri/r200/r200_maos_vbtmp.h +++ b/src/mesa/drivers/dri/r200/r200_maos_vbtmp.h @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_maos_vbtmp.h,v 1.2 2002/12/16 16:18:54 dawes Exp $ */ /* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. diff --git a/src/mesa/drivers/dri/r200/r200_maos_verts.c b/src/mesa/drivers/dri/r200/r200_maos_verts.c index cd866f661f7..872bbd47f5c 100644 --- a/src/mesa/drivers/dri/r200/r200_maos_verts.c +++ b/src/mesa/drivers/dri/r200/r200_maos_verts.c @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_maos_verts.c,v 1.1 2002/10/30 12:51:52 alanh Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the diff --git a/src/mesa/drivers/dri/r200/r200_pixel.c b/src/mesa/drivers/dri/r200/r200_pixel.c index 94977efd186..29eab6cd2fb 100644 --- a/src/mesa/drivers/dri/r200/r200_pixel.c +++ b/src/mesa/drivers/dri/r200/r200_pixel.c @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_pixel.c,v 1.2 2002/12/16 16:18:54 dawes Exp $ */ /* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. @@ -160,12 +160,12 @@ r200TryReadPixels( GLcontext *ctx, if (R200_DEBUG & DEBUG_PIXEL) fprintf(stderr, "%s\n", __FUNCTION__); - /* Only accelerate reading to agp buffers. + /* Only accelerate reading to GART buffers. */ - if ( !r200IsAgpMemory(rmesa, pixels, + if ( !r200IsGartMemory(rmesa, pixels, pitch * height * rmesa->r200Screen->cpp ) ) { if (R200_DEBUG & DEBUG_PIXEL) - fprintf(stderr, "%s: dest not agp\n", __FUNCTION__); + fprintf(stderr, "%s: dest not GART\n", __FUNCTION__); return GL_FALSE; } @@ -217,7 +217,7 @@ r200TryReadPixels( GLcontext *ctx, int nbox = dPriv->numClipRects; int src_offset = rmesa->state.color.drawOffset; int src_pitch = rmesa->state.color.drawPitch * rmesa->r200Screen->cpp; - int dst_offset = r200AgpOffsetFromVirtual( rmesa, pixels); + int dst_offset = r200GartOffsetFromVirtual( rmesa, pixels ); int dst_pitch = pitch * rmesa->r200Screen->cpp; XF86DRIClipRectRec *box = dPriv->pClipRects; int i; @@ -297,7 +297,7 @@ static void do_draw_pix( GLcontext *ctx, int i; int blit_format; int size; - int src_offset = r200AgpOffsetFromVirtual( rmesa, pixels); + int src_offset = r200GartOffsetFromVirtual( rmesa, pixels ); int src_pitch = pitch * rmesa->r200Screen->cpp; if (R200_DEBUG & DEBUG_PIXEL) @@ -402,11 +402,11 @@ r200TryDrawPixels( GLcontext *ctx, if (planemask != ~0) return GL_FALSE; /* fix me -- should be possible */ - /* Can't do conversions on agp reads/draws. + /* Can't do conversions on GART reads/draws. */ - if ( !r200IsAgpMemory( rmesa, pixels, size ) ) { + if ( !r200IsGartMemory( rmesa, pixels, size ) ) { if (R200_DEBUG & DEBUG_PIXEL) - fprintf(stderr, "%s: not agp memory\n", __FUNCTION__); + fprintf(stderr, "%s: not GART memory\n", __FUNCTION__); return GL_FALSE; } @@ -426,7 +426,7 @@ r200TryDrawPixels( GLcontext *ctx, return GL_FALSE; } - if ( r200IsAgpMemory(rmesa, pixels, size) ) + if ( r200IsGartMemory(rmesa, pixels, size) ) { do_draw_pix( ctx, x, y, width, height, pitch, pixels, dest, planemask ); diff --git a/src/mesa/drivers/dri/r200/r200_pixel.h b/src/mesa/drivers/dri/r200/r200_pixel.h index 8e7aca1a16e..9282d2b147d 100644 --- a/src/mesa/drivers/dri/r200/r200_pixel.h +++ b/src/mesa/drivers/dri/r200/r200_pixel.h @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_pixel.h,v 1.1 2002/10/30 12:51:52 alanh Exp $ */ /* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. diff --git a/src/mesa/drivers/dri/r200/r200_reg.h b/src/mesa/drivers/dri/r200/r200_reg.h index cc0ae503279..8e9126342f1 100644 --- a/src/mesa/drivers/dri/r200/r200_reg.h +++ b/src/mesa/drivers/dri/r200/r200_reg.h @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_reg.h,v 1.2 2002/12/16 16:18:54 dawes Exp $ */ /* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. @@ -1434,11 +1434,5 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define R200_CP_CMD_BITBLT_MULTI 0xC0009B00 #define R200_CP_CMD_TRANS_BITBLT 0xC0009C00 - -#define R200_AGP_TEX_OFFSET 0x02000000 - - - - #endif diff --git a/src/mesa/drivers/dri/r200/r200_sanity.c b/src/mesa/drivers/dri/r200/r200_sanity.c index 11dd36a05cc..291536d5603 100644 --- a/src/mesa/drivers/dri/r200/r200_sanity.c +++ b/src/mesa/drivers/dri/r200/r200_sanity.c @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_sanity.c,v 1.1 2002/10/30 12:51:52 alanh Exp $ */ /************************************************************************** Copyright 2002 ATI Technologies Inc., Ontario, Canada, and @@ -32,7 +32,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. * Keith Whitwell <[email protected]> * */ -#include <errno.h> + +#include <errno.h> #include "glheader.h" #include "imports.h" diff --git a/src/mesa/drivers/dri/r200/r200_screen.c b/src/mesa/drivers/dri/r200/r200_screen.c index ee52d68a779..4216046d198 100644 --- a/src/mesa/drivers/dri/r200/r200_screen.c +++ b/src/mesa/drivers/dri/r200/r200_screen.c @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_screen.c,v 1.4 2003/05/08 09:25:35 herrb Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the @@ -43,14 +42,14 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "r200_screen.h" #include "r200_context.h" #include "r200_ioctl.h" +#include "radeon_macros.h" +#include "radeon_reg.h" #include "utils.h" #include "vblank.h" - #ifndef _SOLO #include "glxextensions.h" -#endif - +#endif #if 1 /* Including xf86PciInfo.h introduces a bunch of errors... */ @@ -108,6 +107,8 @@ r200CreateScreen( __DRIscreenPrivate *sPriv ) break; } + /* parse information in __driConfigOptions */ + driParseOptionInfo (&screen->optionCache); /* This is first since which regions we map depends on whether or * not we are using a PCI card. @@ -118,30 +119,26 @@ r200CreateScreen( __DRIscreenPrivate *sPriv ) int ret; drmRadeonGetParam gp; - gp.param = RADEON_PARAM_AGP_BUFFER_OFFSET; - gp.value = &screen->agp_buffer_offset; + gp.param = RADEON_PARAM_GART_BUFFER_OFFSET; + gp.value = &screen->gart_buffer_offset; ret = drmCommandWriteRead( sPriv->fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp)); if (ret) { FREE( screen ); - fprintf(stderr, "drmRadeonGetParam (RADEON_PARAM_AGP_BUFFER_OFFSET): %d\n", ret); + fprintf(stderr, "drmRadeonGetParam (RADEON_PARAM_GART_BUFFER_OFFSET): %d\n", ret); return NULL; } - screen->agp_texture_offset = - screen->agp_buffer_offset + 2*1024*1024; - - if (sPriv->drmMinor >= 6) { - gp.param = RADEON_PARAM_AGP_BASE; - gp.value = &screen->agp_base; + gp.param = RADEON_PARAM_GART_BASE; + gp.value = &screen->gart_base; ret = drmCommandWriteRead( sPriv->fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp)); if (ret) { FREE( screen ); - fprintf(stderr, "drmR200GetParam (RADEON_PARAM_AGP_BASE): %d\n", ret); + fprintf(stderr, "drmR200GetParam (RADEON_PARAM_GART_BASE): %d\n", ret); return NULL; } @@ -196,23 +193,27 @@ r200CreateScreen( __DRIscreenPrivate *sPriv ) return NULL; } - if ( !screen->IsPCI ) { - screen->agpTextures.handle = dri_priv->agpTexHandle; - screen->agpTextures.size = dri_priv->agpTexMapSize; + if ( dri_priv->gartTexHandle && dri_priv->gartTexMapSize ) { + unsigned char *RADEONMMIO = screen->mmio.map; + + screen->gartTextures.handle = dri_priv->gartTexHandle; + screen->gartTextures.size = dri_priv->gartTexMapSize; if ( drmMap( sPriv->fd, - screen->agpTextures.handle, - screen->agpTextures.size, - (drmAddressPtr)&screen->agpTextures.map ) ) { + screen->gartTextures.handle, + screen->gartTextures.size, + (drmAddressPtr)&screen->gartTextures.map ) ) { drmUnmapBufs( screen->buffers ); drmUnmap( screen->status.map, screen->status.size ); drmUnmap( screen->mmio.map, screen->mmio.size ); FREE( screen ); - __driUtilMessage("%s: IsPCI failed\n", __FUNCTION__); + __driUtilMessage("%s: drmMAP failed for GART texture area\n", __FUNCTION__); return NULL; } - } - + screen->gart_texture_offset = dri_priv->gartTexOffset + ( screen->IsPCI + ? INREG( RADEON_AIC_LO_ADDR ) + : ( ( INREG( RADEON_MC_AGP_LOCATION ) & 0x0ffffU ) << 16 ) ); + } screen->cpp = dri_priv->bpp / 8; screen->AGPMode = dri_priv->AGPMode; @@ -229,22 +230,46 @@ r200CreateScreen( __DRIscreenPrivate *sPriv ) screen->logTexGranularity[RADEON_CARD_HEAP] = dri_priv->log2TexGran; - if ( screen->IsPCI ) { + if ( !screen->gartTextures.map ) { screen->numTexHeaps = RADEON_NR_TEX_HEAPS - 1; - screen->texOffset[RADEON_AGP_HEAP] = 0; - screen->texSize[RADEON_AGP_HEAP] = 0; - screen->logTexGranularity[RADEON_AGP_HEAP] = 0; + screen->texOffset[RADEON_GART_HEAP] = 0; + screen->texSize[RADEON_GART_HEAP] = 0; + screen->logTexGranularity[RADEON_GART_HEAP] = 0; } else { screen->numTexHeaps = RADEON_NR_TEX_HEAPS; - screen->texOffset[RADEON_AGP_HEAP] = - dri_priv->agpTexOffset + R200_AGP_TEX_OFFSET; - screen->texSize[RADEON_AGP_HEAP] = dri_priv->agpTexMapSize; - screen->logTexGranularity[RADEON_AGP_HEAP] = - dri_priv->log2AGPTexGran; + screen->texOffset[RADEON_GART_HEAP] = screen->gart_texture_offset; + screen->texSize[RADEON_GART_HEAP] = dri_priv->gartTexMapSize; + screen->logTexGranularity[RADEON_GART_HEAP] = + dri_priv->log2GARTTexGran; } screen->driScreen = sPriv; screen->sarea_priv_offset = dri_priv->sarea_priv_offset; +#ifndef _SOLO + if ( driCompareGLXAPIVersion( 20030813 ) >= 0 ) { + PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension = + (PFNGLXSCRENABLEEXTENSIONPROC) glXGetProcAddress( (const GLubyte *) "__glXScrEnableExtension" ); + void * const psc = sPriv->psc->screenConfigs; + + if ( glx_enable_extension != NULL ) { + if ( screen->irq != 0 ) { + (*glx_enable_extension)( psc, "GLX_SGI_swap_control" ); + (*glx_enable_extension)( psc, "GLX_SGI_video_sync" ); + (*glx_enable_extension)( psc, "GLX_MESA_swap_control" ); + } + + (*glx_enable_extension)( psc, "GLX_MESA_swap_frame_usage" ); + + if ( driCompareGLXAPIVersion( 20030818 ) >= 0 ) { + sPriv->psc->allocateMemory = r200AllocateMemoryMESA; + sPriv->psc->freeMemory = r200FreeMemoryMESA; + sPriv->psc->memoryOffset = r200GetMemoryOffsetMESA; + + (*glx_enable_extension)( psc, "GLX_MESA_allocate_memory" ); + } + } + } +#endif return screen; } @@ -258,14 +283,16 @@ r200DestroyScreen( __DRIscreenPrivate *sPriv ) if (!screen) return; - if ( !screen->IsPCI ) { - drmUnmap( screen->agpTextures.map, - screen->agpTextures.size ); + if ( screen->gartTextures.map ) { + drmUnmap( screen->gartTextures.map, screen->gartTextures.size ); } drmUnmapBufs( screen->buffers ); drmUnmap( screen->status.map, screen->status.size ); drmUnmap( screen->mmio.map, screen->mmio.size ); + /* free all option information */ + driDestroyOptionInfo (&screen->optionCache); + FREE( screen ); sPriv->private = NULL; } @@ -362,7 +389,7 @@ static struct __DriverAPIRec r200API = { * Return: pointer to a __DRIscreenPrivate. * */ -#ifndef _SOLO +#ifndef _SOLO void *__driCreateScreen(Display *dpy, int scrn, __DRIscreen *psc, int numConfigs, __GLXvisualConfig *config) { @@ -380,56 +407,31 @@ void *__driCreateScreen(struct DRIDriverRec *driver, } #endif - - #ifndef _SOLO -/* This function is called by libGL.so to allow the driver to dynamically +/** + * This function is called by libGL.so to allow the driver to dynamically * extend libGL. We can add new GLX functions and/or new GL functions. * Note that _mesa_create_context() will probably add most of the newer * OpenGL extension functions into the dispatcher. + * + * \todo This interface has been deprecated, so we should probably remove + * this function before the next XFree86 release. */ void __driRegisterExtensions( void ) { PFNGLXENABLEEXTENSIONPROC glx_enable_extension; - typedef void *(*registerFunc)(const char *funcName, void *funcAddr); - registerFunc regFunc; if ( driCompareGLXAPIVersion( 20030317 ) >= 0 ) { glx_enable_extension = (PFNGLXENABLEEXTENSIONPROC) - glXGetProcAddress( "__glXEnableExtension" ); + glXGetProcAddress( (const GLubyte *) "__glXEnableExtension" ); if ( glx_enable_extension != NULL ) { - glx_enable_extension( "GLX_SGI_swap_control", GL_FALSE ); - glx_enable_extension( "GLX_SGI_video_sync", GL_FALSE ); - glx_enable_extension( "GLX_MESA_swap_control", GL_FALSE ); - glx_enable_extension( "GLX_MESA_swap_frame_usage", GL_FALSE ); - - - /* Get pointers to libGL's __glXRegisterGLXFunction - * and __glXRegisterGLXExtensionString, if they exist. - */ - regFunc = (registerFunc) glXGetProcAddress( "__glXRegisterGLXFunction" ); - - if (regFunc) { - /* register our GLX extensions with libGL */ - void *p; - p = regFunc("glXAllocateMemoryNV", (void *) r200AllocateMemoryNV); - if (p) - ; /* XXX already registered - what to do, wrap? */ - - p = regFunc("glXFreeMemoryNV", (void *) r200FreeMemoryNV); - if (p) - ; /* XXX already registered - what to do, wrap? */ - - p = regFunc("glXGetAGPOffsetMESA", (void *) r200GetAGPOffset); - if (p) - ; /* XXX already registered - what to do, wrap? */ - - glx_enable_extension( "GLX_NV_vertex_array_range", GL_TRUE ); - glx_enable_extension( "GLX_MESA_agp_offset", GL_TRUE ); - } + (*glx_enable_extension)( "GLX_SGI_swap_control", GL_FALSE ); + (*glx_enable_extension)( "GLX_SGI_video_sync", GL_FALSE ); + (*glx_enable_extension)( "GLX_MESA_swap_control", GL_FALSE ); + (*glx_enable_extension)( "GLX_MESA_swap_frame_usage", GL_FALSE ); } } } diff --git a/src/mesa/drivers/dri/r200/r200_screen.h b/src/mesa/drivers/dri/r200/r200_screen.h index 1e1f125b0d5..3ed4f550282 100644 --- a/src/mesa/drivers/dri/r200/r200_screen.h +++ b/src/mesa/drivers/dri/r200/r200_screen.h @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_screen.h,v 1.1 2002/10/30 12:51:52 alanh Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the @@ -43,6 +42,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "xf86drm.h" #include "radeon_common.h" #include "radeon_sarea.h" +#include "xmlconfig.h" typedef struct { drmHandle handle; /* Handle to the DRM region */ @@ -80,7 +80,7 @@ typedef struct { r200RegionRec mmio; r200RegionRec status; - r200RegionRec agpTextures; + r200RegionRec gartTextures; drmBufMapPtr buffers; @@ -88,11 +88,14 @@ typedef struct { __DRIscreenPrivate *driScreen; unsigned int sarea_priv_offset; - unsigned int agp_buffer_offset; /* offset in card memory space */ - unsigned int agp_texture_offset; /* offset in card memory space */ - unsigned int agp_base; + unsigned int gart_buffer_offset; /* offset in card memory space */ + unsigned int gart_texture_offset; /* offset in card memory space */ + unsigned int gart_base; GLboolean drmSupportsCubeMaps; /* need radeon kernel module >=1.7 */ + + /* Configuration cache with default values for all contexts */ + driOptionCache optionCache; } r200ScreenRec, *r200ScreenPtr; #endif diff --git a/src/mesa/drivers/dri/r200/r200_span.c b/src/mesa/drivers/dri/r200/r200_span.c index b469aec429b..7e48a9d5afb 100644 --- a/src/mesa/drivers/dri/r200/r200_span.c +++ b/src/mesa/drivers/dri/r200/r200_span.c @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_span.c,v 1.1 2002/10/30 12:51:52 alanh Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the diff --git a/src/mesa/drivers/dri/r200/r200_span.h b/src/mesa/drivers/dri/r200/r200_span.h index 269ac0593fd..72911e9455c 100644 --- a/src/mesa/drivers/dri/r200/r200_span.h +++ b/src/mesa/drivers/dri/r200/r200_span.h @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_span.h,v 1.1 2002/10/30 12:51:52 alanh Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the diff --git a/src/mesa/drivers/dri/r200/r200_state.c~ b/src/mesa/drivers/dri/r200/r200_state.c~ deleted file mode 100644 index f025a88472c..00000000000 --- a/src/mesa/drivers/dri/r200/r200_state.c~ +++ /dev/null @@ -1,2168 +0,0 @@ -/* $XFree86$ */ -/************************************************************************** - -Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. - -The Weather Channel (TM) funded Tungsten Graphics to develop the -initial release of the Radeon 8500 driver under the XFree86 license. -This notice must be preserved. - -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 (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 NONINFRINGEMENT. -IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -**************************************************************************/ - -/* - * Authors: - * Keith Whitwell <[email protected]> - */ - -#include "glheader.h" -#include "imports.h" -#include "api_arrayelt.h" -#include "enums.h" -#include "colormac.h" - -#include "swrast/swrast.h" -#include "array_cache/acache.h" -#include "tnl/tnl.h" -#include "tnl/t_pipeline.h" -#include "swrast_setup/swrast_setup.h" - - -#include "r200_context.h" -#include "r200_ioctl.h" -#include "r200_state.h" -#include "r200_tcl.h" -#include "r200_tex.h" -#include "r200_swtcl.h" -#include "r200_vtxfmt.h" - - -/* ============================================================= - * Alpha blending - */ - -static void r200AlphaFunc( GLcontext *ctx, GLenum func, GLfloat ref ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - int pp_misc = rmesa->hw.ctx.cmd[CTX_PP_MISC]; - GLubyte refByte; - - CLAMPED_FLOAT_TO_UBYTE(refByte, ref); - - R200_STATECHANGE( rmesa, ctx ); - - pp_misc &= ~(R200_ALPHA_TEST_OP_MASK | R200_REF_ALPHA_MASK); - pp_misc |= (refByte & R200_REF_ALPHA_MASK); - - switch ( func ) { - case GL_NEVER: - pp_misc |= R200_ALPHA_TEST_FAIL; - break; - case GL_LESS: - pp_misc |= R200_ALPHA_TEST_LESS; - break; - case GL_EQUAL: - pp_misc |= R200_ALPHA_TEST_EQUAL; - break; - case GL_LEQUAL: - pp_misc |= R200_ALPHA_TEST_LEQUAL; - break; - case GL_GREATER: - pp_misc |= R200_ALPHA_TEST_GREATER; - break; - case GL_NOTEQUAL: - pp_misc |= R200_ALPHA_TEST_NEQUAL; - break; - case GL_GEQUAL: - pp_misc |= R200_ALPHA_TEST_GEQUAL; - break; - case GL_ALWAYS: - pp_misc |= R200_ALPHA_TEST_PASS; - break; - } - - rmesa->hw.ctx.cmd[CTX_PP_MISC] = pp_misc; -} - -static void r200BlendEquation( GLcontext *ctx, GLenum mode ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] & ~R200_COMB_FCN_MASK; - - switch ( mode ) { - case GL_FUNC_ADD: - case GL_LOGIC_OP: - b |= R200_COMB_FCN_ADD_CLAMP; - break; - - case GL_FUNC_SUBTRACT: - b |= R200_COMB_FCN_SUB_CLAMP; - break; - - case GL_FUNC_REVERSE_SUBTRACT: - b |= R200_COMB_FCN_RSUB_CLAMP; - break; - - case GL_MIN: - b |= R200_COMB_FCN_MIN; - break; - - case GL_MAX: - b |= R200_COMB_FCN_MAX; - break; - - default: - break; - } - - R200_STATECHANGE( rmesa, ctx ); - rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b; - if ( ctx->Color.ColorLogicOpEnabled ) { - rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_ROP_ENABLE; - } else { - rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_ROP_ENABLE; - } -} - -static void r200BlendFunc( GLcontext *ctx, GLenum sfactor, GLenum dfactor ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLuint b = rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] & - ~(R200_SRC_BLEND_MASK | R200_DST_BLEND_MASK); - - switch ( ctx->Color.BlendSrcRGB ) { - case GL_ZERO: - b |= R200_SRC_BLEND_GL_ZERO; - break; - case GL_ONE: - b |= R200_SRC_BLEND_GL_ONE; - break; - case GL_DST_COLOR: - b |= R200_SRC_BLEND_GL_DST_COLOR; - break; - case GL_ONE_MINUS_DST_COLOR: - b |= R200_SRC_BLEND_GL_ONE_MINUS_DST_COLOR; - break; - case GL_SRC_COLOR: - b |= R200_SRC_BLEND_GL_SRC_COLOR; - break; - case GL_ONE_MINUS_SRC_COLOR: - b |= R200_SRC_BLEND_GL_ONE_MINUS_SRC_COLOR; - break; - case GL_SRC_ALPHA: - b |= R200_SRC_BLEND_GL_SRC_ALPHA; - break; - case GL_ONE_MINUS_SRC_ALPHA: - b |= R200_SRC_BLEND_GL_ONE_MINUS_SRC_ALPHA; - break; - case GL_DST_ALPHA: - b |= R200_SRC_BLEND_GL_DST_ALPHA; - break; - case GL_ONE_MINUS_DST_ALPHA: - b |= R200_SRC_BLEND_GL_ONE_MINUS_DST_ALPHA; - break; - case GL_SRC_ALPHA_SATURATE: - b |= R200_SRC_BLEND_GL_SRC_ALPHA_SATURATE; - break; - case GL_CONSTANT_COLOR: - b |= R200_SRC_BLEND_GL_CONST_COLOR; - break; - case GL_ONE_MINUS_CONSTANT_COLOR: - b |= R200_SRC_BLEND_GL_ONE_MINUS_CONST_COLOR; - break; - case GL_CONSTANT_ALPHA: - b |= R200_SRC_BLEND_GL_CONST_ALPHA; - break; - case GL_ONE_MINUS_CONSTANT_ALPHA: - b |= R200_SRC_BLEND_GL_ONE_MINUS_CONST_ALPHA; - break; - default: - break; - } - - switch ( ctx->Color.BlendDstRGB ) { - case GL_ZERO: - b |= R200_DST_BLEND_GL_ZERO; - break; - case GL_ONE: - b |= R200_DST_BLEND_GL_ONE; - break; - case GL_SRC_COLOR: - b |= R200_DST_BLEND_GL_SRC_COLOR; - break; - case GL_ONE_MINUS_SRC_COLOR: - b |= R200_DST_BLEND_GL_ONE_MINUS_SRC_COLOR; - break; - case GL_SRC_ALPHA: - b |= R200_DST_BLEND_GL_SRC_ALPHA; - break; - case GL_ONE_MINUS_SRC_ALPHA: - b |= R200_DST_BLEND_GL_ONE_MINUS_SRC_ALPHA; - break; - case GL_DST_COLOR: - b |= R200_DST_BLEND_GL_DST_COLOR; - break; - case GL_ONE_MINUS_DST_COLOR: - b |= R200_DST_BLEND_GL_ONE_MINUS_DST_COLOR; - break; - case GL_DST_ALPHA: - b |= R200_DST_BLEND_GL_DST_ALPHA; - break; - case GL_ONE_MINUS_DST_ALPHA: - b |= R200_DST_BLEND_GL_ONE_MINUS_DST_ALPHA; - break; - case GL_CONSTANT_COLOR: - b |= R200_DST_BLEND_GL_CONST_COLOR; - break; - case GL_ONE_MINUS_CONSTANT_COLOR: - b |= R200_DST_BLEND_GL_ONE_MINUS_CONST_COLOR; - break; - case GL_CONSTANT_ALPHA: - b |= R200_DST_BLEND_GL_CONST_ALPHA; - break; - case GL_ONE_MINUS_CONSTANT_ALPHA: - b |= R200_DST_BLEND_GL_ONE_MINUS_CONST_ALPHA; - break; - default: - break; - } - - R200_STATECHANGE( rmesa, ctx ); - rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCNTL] = b; -} - -static void r200BlendFuncSeparate( GLcontext *ctx, - GLenum sfactorRGB, GLenum dfactorRGB, - GLenum sfactorA, GLenum dfactorA ) -{ - r200BlendFunc( ctx, sfactorRGB, dfactorRGB ); -} - - -/* ============================================================= - * Depth testing - */ - -static void r200DepthFunc( GLcontext *ctx, GLenum func ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - - R200_STATECHANGE( rmesa, ctx ); - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_Z_TEST_MASK; - - switch ( ctx->Depth.Func ) { - case GL_NEVER: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_NEVER; - break; - case GL_LESS: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_LESS; - break; - case GL_EQUAL: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_EQUAL; - break; - case GL_LEQUAL: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_LEQUAL; - break; - case GL_GREATER: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_GREATER; - break; - case GL_NOTEQUAL: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_NEQUAL; - break; - case GL_GEQUAL: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_GEQUAL; - break; - case GL_ALWAYS: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_TEST_ALWAYS; - break; - } -} - - -static void r200DepthMask( GLcontext *ctx, GLboolean flag ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - R200_STATECHANGE( rmesa, ctx ); - - if ( ctx->Depth.Mask ) { - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_WRITE_ENABLE; - } else { - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_Z_WRITE_ENABLE; - } -} - - -/* ============================================================= - * Fog - */ - - -static void r200Fogfv( GLcontext *ctx, GLenum pname, const GLfloat *param ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - union { int i; float f; } c, d; - GLchan col[4]; - GLuint i; - - c.i = rmesa->hw.fog.cmd[FOG_C]; - d.i = rmesa->hw.fog.cmd[FOG_D]; - - switch (pname) { - case GL_FOG_MODE: - if (!ctx->Fog.Enabled) - return; - R200_STATECHANGE(rmesa, tcl); - rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_TCL_FOG_MASK; - switch (ctx->Fog.Mode) { - case GL_LINEAR: - rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_TCL_FOG_LINEAR; - if (ctx->Fog.Start == ctx->Fog.End) { - c.f = 1.0F; - d.f = 1.0F; - } - else { - c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start); - d.f = -1.0/(ctx->Fog.End-ctx->Fog.Start); - } - break; - case GL_EXP: - rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_TCL_FOG_EXP; - c.f = 0.0; - d.f = -ctx->Fog.Density; - break; - case GL_EXP2: - rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_TCL_FOG_EXP2; - c.f = 0.0; - d.f = -(ctx->Fog.Density * ctx->Fog.Density); - break; - default: - return; - } - break; - case GL_FOG_DENSITY: - switch (ctx->Fog.Mode) { - case GL_EXP: - c.f = 0.0; - d.f = -ctx->Fog.Density; - break; - case GL_EXP2: - c.f = 0.0; - d.f = -(ctx->Fog.Density * ctx->Fog.Density); - break; - default: - break; - } - break; - case GL_FOG_START: - case GL_FOG_END: - if (ctx->Fog.Mode == GL_LINEAR) { - if (ctx->Fog.Start == ctx->Fog.End) { - c.f = 1.0F; - d.f = 1.0F; - } else { - c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start); - d.f = -1.0/(ctx->Fog.End-ctx->Fog.Start); - } - } - break; - case GL_FOG_COLOR: - R200_STATECHANGE( rmesa, ctx ); - UNCLAMPED_FLOAT_TO_RGB_CHAN( col, ctx->Fog.Color ); - i = r200PackColor( 4, col[0], col[1], col[2], 0 ); - rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] &= ~R200_FOG_COLOR_MASK; - rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] |= i; - break; - case GL_FOG_COORDINATE_SOURCE_EXT: - /* What to do? - */ - break; - default: - return; - } - - if (c.i != rmesa->hw.fog.cmd[FOG_C] || d.i != rmesa->hw.fog.cmd[FOG_D]) { - R200_STATECHANGE( rmesa, fog ); - rmesa->hw.fog.cmd[FOG_C] = c.i; - rmesa->hw.fog.cmd[FOG_D] = d.i; - } -} - - -/* ============================================================= - * Scissoring - */ - - -static GLboolean intersect_rect( XF86DRIClipRectPtr out, - XF86DRIClipRectPtr a, - XF86DRIClipRectPtr b ) -{ - *out = *a; - if ( b->x1 > out->x1 ) out->x1 = b->x1; - if ( b->y1 > out->y1 ) out->y1 = b->y1; - if ( b->x2 < out->x2 ) out->x2 = b->x2; - if ( b->y2 < out->y2 ) out->y2 = b->y2; - if ( out->x1 >= out->x2 ) return GL_FALSE; - if ( out->y1 >= out->y2 ) return GL_FALSE; - return GL_TRUE; -} - - -void r200RecalcScissorRects( r200ContextPtr rmesa ) -{ - XF86DRIClipRectPtr out; - int i; - - /* Grow cliprect store? - */ - if (rmesa->state.scissor.numAllocedClipRects < rmesa->numClipRects) { - while (rmesa->state.scissor.numAllocedClipRects < rmesa->numClipRects) { - rmesa->state.scissor.numAllocedClipRects += 1; /* zero case */ - rmesa->state.scissor.numAllocedClipRects *= 2; - } - - if (rmesa->state.scissor.pClipRects) - FREE(rmesa->state.scissor.pClipRects); - - rmesa->state.scissor.pClipRects = - MALLOC( rmesa->state.scissor.numAllocedClipRects * - sizeof(XF86DRIClipRectRec) ); - - if ( rmesa->state.scissor.pClipRects == NULL ) { - rmesa->state.scissor.numAllocedClipRects = 0; - return; - } - } - - out = rmesa->state.scissor.pClipRects; - rmesa->state.scissor.numClipRects = 0; - - for ( i = 0 ; i < rmesa->numClipRects ; i++ ) { - if ( intersect_rect( out, - &rmesa->pClipRects[i], - &rmesa->state.scissor.rect ) ) { - rmesa->state.scissor.numClipRects++; - out++; - } - } -} - - -static void r200UpdateScissor( GLcontext *ctx ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - - if ( rmesa->dri.drawable ) { - __DRIdrawablePrivate *dPriv = rmesa->dri.drawable; - - int x = ctx->Scissor.X; - int y = dPriv->h - ctx->Scissor.Y - ctx->Scissor.Height; - int w = ctx->Scissor.X + ctx->Scissor.Width - 1; - int h = dPriv->h - ctx->Scissor.Y - 1; - - rmesa->state.scissor.rect.x1 = x + dPriv->x; - rmesa->state.scissor.rect.y1 = y + dPriv->y; - rmesa->state.scissor.rect.x2 = w + dPriv->x + 1; - rmesa->state.scissor.rect.y2 = h + dPriv->y + 1; - - r200RecalcScissorRects( rmesa ); - } -} - - -static void r200Scissor( GLcontext *ctx, - GLint x, GLint y, GLsizei w, GLsizei h ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - - if ( ctx->Scissor.Enabled ) { - R200_FIREVERTICES( rmesa ); /* don't pipeline cliprect changes */ - r200UpdateScissor( ctx ); - } - -} - - -/* ============================================================= - * Culling - */ - -static void r200CullFace( GLcontext *ctx, GLenum unused ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL]; - GLuint t = rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL]; - - s |= R200_FFACE_SOLID | R200_BFACE_SOLID; - t &= ~(R200_CULL_FRONT | R200_CULL_BACK); - - if ( ctx->Polygon.CullFlag ) { - switch ( ctx->Polygon.CullFaceMode ) { - case GL_FRONT: - s &= ~R200_FFACE_SOLID; - t |= R200_CULL_FRONT; - break; - case GL_BACK: - s &= ~R200_BFACE_SOLID; - t |= R200_CULL_BACK; - break; - case GL_FRONT_AND_BACK: - s &= ~(R200_FFACE_SOLID | R200_BFACE_SOLID); - t |= (R200_CULL_FRONT | R200_CULL_BACK); - break; - } - } - - if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) { - R200_STATECHANGE(rmesa, set ); - rmesa->hw.set.cmd[SET_SE_CNTL] = s; - } - - if ( rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] != t ) { - R200_STATECHANGE(rmesa, tcl ); - rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] = t; - } -} - -static void r200FrontFace( GLcontext *ctx, GLenum mode ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - - R200_STATECHANGE( rmesa, set ); - rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_FFACE_CULL_DIR_MASK; - - R200_STATECHANGE( rmesa, tcl ); - rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_CULL_FRONT_IS_CCW; - - switch ( mode ) { - case GL_CW: - rmesa->hw.set.cmd[SET_SE_CNTL] |= R200_FFACE_CULL_CW; - break; - case GL_CCW: - rmesa->hw.set.cmd[SET_SE_CNTL] |= R200_FFACE_CULL_CCW; - rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= R200_CULL_FRONT_IS_CCW; - break; - } -} - -/* ============================================================= - * Point state - */ -static void r200PointSize( GLcontext *ctx, GLfloat size ) -{ - if (0) fprintf(stderr, "%s: %f\n", __FUNCTION__, size ); -} - -/* ============================================================= - * Line state - */ -static void r200LineWidth( GLcontext *ctx, GLfloat widthf ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - - R200_STATECHANGE( rmesa, lin ); - R200_STATECHANGE( rmesa, set ); - - /* Line width is stored in U6.4 format. - */ - rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] &= ~0xffff; - rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] |= (GLuint)(ctx->Line._Width * 16.0); - - if ( widthf > 1.0 ) { - rmesa->hw.set.cmd[SET_SE_CNTL] |= R200_WIDELINE_ENABLE; - } else { - rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_WIDELINE_ENABLE; - } -} - -static void r200LineStipple( GLcontext *ctx, GLint factor, GLushort pattern ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - - R200_STATECHANGE( rmesa, lin ); - rmesa->hw.lin.cmd[LIN_RE_LINE_PATTERN] = - ((((GLuint)factor & 0xff) << 16) | ((GLuint)pattern)); -} - - -/* ============================================================= - * Masks - */ -static void r200ColorMask( GLcontext *ctx, - GLboolean r, GLboolean g, - GLboolean b, GLboolean a ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLuint mask = r200PackColor( rmesa->r200Screen->cpp, - ctx->Color.ColorMask[RCOMP], - ctx->Color.ColorMask[GCOMP], - ctx->Color.ColorMask[BCOMP], - ctx->Color.ColorMask[ACOMP] ); - - GLuint flag = rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] & ~R200_PLANE_MASK_ENABLE; - - if (!(r && g && b && a)) - flag |= R200_PLANE_MASK_ENABLE; - - if ( rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] != flag ) { - R200_STATECHANGE( rmesa, ctx ); - rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = flag; - } - - if ( rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] != mask ) { - R200_STATECHANGE( rmesa, msk ); - rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] = mask; - } -} - - -/* ============================================================= - * Polygon state - */ - -static void r200PolygonOffset( GLcontext *ctx, - GLfloat factor, GLfloat units ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLfloat constant = units * rmesa->state.depth.scale; - -/* factor *= 2; */ -/* constant *= 2; */ - -/* fprintf(stderr, "%s f:%f u:%f\n", __FUNCTION__, factor, constant); */ - - R200_STATECHANGE( rmesa, zbs ); - rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR] = *(GLuint *)&factor; - rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = *(GLuint *)&constant; -} - -static void r200PolygonStipple( GLcontext *ctx, const GLubyte *mask ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLuint i; - drmRadeonStipple stipple; - - /* Must flip pattern upside down. - */ - for ( i = 0 ; i < 32 ; i++ ) { - rmesa->state.stipple.mask[31 - i] = ((GLuint *) mask)[i]; - } - - /* TODO: push this into cmd mechanism - */ - R200_FIREVERTICES( rmesa ); - LOCK_HARDWARE( rmesa ); - - /* FIXME: Use window x,y offsets into stipple RAM. - */ - stipple.mask = rmesa->state.stipple.mask; - drmCommandWrite( rmesa->dri.fd, DRM_RADEON_STIPPLE, - &stipple, sizeof(drmRadeonStipple) ); - UNLOCK_HARDWARE( rmesa ); -} - -static void r200PolygonMode( GLcontext *ctx, GLenum face, GLenum mode ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLboolean flag = (ctx->_TriangleCaps & DD_TRI_UNFILLED) != 0; - - /* Can't generally do unfilled via tcl, but some good special - * cases work. - */ - TCL_FALLBACK( ctx, R200_TCL_FALLBACK_UNFILLED, flag); - if (rmesa->TclFallback) { - r200ChooseRenderState( ctx ); - r200ChooseVertexState( ctx ); - } -} - - -/* ============================================================= - * Rendering attributes - * - * We really don't want to recalculate all this every time we bind a - * texture. These things shouldn't change all that often, so it makes - * sense to break them out of the core texture state update routines. - */ - -/* Examine lighting and texture state to determine if separate specular - * should be enabled. - */ -static void r200UpdateSpecular( GLcontext *ctx ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - CARD32 p = rmesa->hw.ctx.cmd[CTX_PP_CNTL]; - - R200_STATECHANGE( rmesa, tcl ); - R200_STATECHANGE( rmesa, vtx ); - - rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] &= ~(3<<R200_VTX_COLOR_0_SHIFT); - rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] &= ~(3<<R200_VTX_COLOR_1_SHIFT); - rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] &= ~R200_OUTPUT_COLOR_0; - rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] &= ~R200_OUTPUT_COLOR_1; - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_LIGHTING_ENABLE; - - p &= ~R200_SPECULAR_ENABLE; - - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_DIFFUSE_SPECULAR_COMBINE; - - - if (ctx->Light.Enabled && - ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) { - rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= - ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT) | - (R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT)); - rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_0; - rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_1; - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHTING_ENABLE; - p |= R200_SPECULAR_ENABLE; - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= - ~R200_DIFFUSE_SPECULAR_COMBINE; - } - else if (ctx->Light.Enabled) { - rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= - ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT)); - rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_0; - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHTING_ENABLE; - } else if (ctx->Fog.ColorSumEnabled ) { - rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= - ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT) | - (R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT)); - p |= R200_SPECULAR_ENABLE; - } else { - rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= - ((R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT)); - } - - if (ctx->Fog.Enabled) { - rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= - ((R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT)); - rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_1; - } - - if ( rmesa->hw.ctx.cmd[CTX_PP_CNTL] != p ) { - R200_STATECHANGE( rmesa, ctx ); - rmesa->hw.ctx.cmd[CTX_PP_CNTL] = p; - } - - /* Update vertex/render formats - */ - if (rmesa->TclFallback) { - r200ChooseRenderState( ctx ); - r200ChooseVertexState( ctx ); - } -} - - -/* ============================================================= - * Materials - */ - - -/* Update on colormaterial, material emmissive/ambient, - * lightmodel.globalambient - */ -static void update_global_ambient( GLcontext *ctx ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - float *fcmd = (float *)R200_DB_STATE( glt ); - - /* Need to do more if both emmissive & ambient are PREMULT: - */ - if ((rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1] & - ((3 << R200_FRONT_EMISSIVE_SOURCE_SHIFT) | - (3 << R200_FRONT_AMBIENT_SOURCE_SHIFT))) == 0) - { - COPY_3V( &fcmd[GLT_RED], - ctx->Light.Material[0].Emission); - ACC_SCALE_3V( &fcmd[GLT_RED], - ctx->Light.Model.Ambient, - ctx->Light.Material[0].Ambient); - } - else - { - COPY_3V( &fcmd[GLT_RED], ctx->Light.Model.Ambient ); - } - - R200_DB_STATECHANGE(rmesa, &rmesa->hw.glt); -} - -/* Update on change to - * - light[p].colors - * - light[p].enabled - * - material, - * - colormaterial enabled - * - colormaterial bitmask - */ -static void update_light_colors( GLcontext *ctx, GLuint p ) -{ - struct gl_light *l = &ctx->Light.Light[p]; - -/* fprintf(stderr, "%s\n", __FUNCTION__); */ - - if (l->Enabled) { - r200ContextPtr rmesa = R200_CONTEXT(ctx); - float *fcmd = (float *)R200_DB_STATE( lit[p] ); - GLuint bitmask = ctx->Light.ColorMaterialBitmask; - struct gl_material *mat = &ctx->Light.Material[0]; - - COPY_4V( &fcmd[LIT_AMBIENT_RED], l->Ambient ); - COPY_4V( &fcmd[LIT_DIFFUSE_RED], l->Diffuse ); - COPY_4V( &fcmd[LIT_SPECULAR_RED], l->Specular ); - - if (!ctx->Light.ColorMaterialEnabled) - bitmask = 0; - - if ((bitmask & FRONT_AMBIENT_BIT) == 0) - SELF_SCALE_3V( &fcmd[LIT_AMBIENT_RED], mat->Ambient ); - - if ((bitmask & FRONT_DIFFUSE_BIT) == 0) - SELF_SCALE_3V( &fcmd[LIT_DIFFUSE_RED], mat->Diffuse ); - - if ((bitmask & FRONT_SPECULAR_BIT) == 0) - SELF_SCALE_3V( &fcmd[LIT_SPECULAR_RED], mat->Specular ); - - R200_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] ); - } -} - -/* Also fallback for asym colormaterial mode in twoside lighting... - */ -static void check_twoside_fallback( GLcontext *ctx ) -{ - GLboolean fallback = GL_FALSE; - - if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) { - if (memcmp( &ctx->Light.Material[0], - &ctx->Light.Material[1], - sizeof(struct gl_material)) != 0) - fallback = GL_TRUE; - else if (ctx->Light.ColorMaterialEnabled && - (ctx->Light.ColorMaterialBitmask & BACK_MATERIAL_BITS) != - ((ctx->Light.ColorMaterialBitmask & FRONT_MATERIAL_BITS)<<1)) - fallback = GL_TRUE; - } - - TCL_FALLBACK( ctx, R200_TCL_FALLBACK_LIGHT_TWOSIDE, fallback ); -} - -static void r200ColorMaterial( GLcontext *ctx, GLenum face, GLenum mode ) -{ - if (ctx->Light.ColorMaterialEnabled) { - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLuint light_model_ctl1 = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1]; - GLuint mask = ctx->Light.ColorMaterialBitmask; - - /* Default to PREMULT: - */ - light_model_ctl1 &= ~((0xf << R200_FRONT_EMISSIVE_SOURCE_SHIFT) | - (0xf << R200_FRONT_AMBIENT_SOURCE_SHIFT) | - (0xf << R200_FRONT_DIFFUSE_SOURCE_SHIFT) | - (0xf << R200_FRONT_SPECULAR_SOURCE_SHIFT)); - - if (mask & FRONT_EMISSION_BIT) { - light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << - R200_FRONT_EMISSIVE_SOURCE_SHIFT); - } - - if (mask & FRONT_AMBIENT_BIT) { - light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << - R200_FRONT_AMBIENT_SOURCE_SHIFT); - } - - if (mask & FRONT_DIFFUSE_BIT) { - light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << - R200_FRONT_DIFFUSE_SOURCE_SHIFT); - } - - if (mask & FRONT_SPECULAR_BIT) { - light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 << - R200_FRONT_SPECULAR_SOURCE_SHIFT); - } - - if (light_model_ctl1 != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1]) { - GLuint p; - - R200_STATECHANGE( rmesa, tcl ); - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1] = light_model_ctl1; - - for (p = 0 ; p < MAX_LIGHTS; p++) - update_light_colors( ctx, p ); - update_global_ambient( ctx ); - } - } - - check_twoside_fallback( ctx ); -} - -void r200UpdateMaterial( GLcontext *ctx ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLfloat *fcmd = (GLfloat *)R200_DB_STATE( mtl[0] ); - GLuint p; - GLuint mask = ~0; - - if (ctx->Light.ColorMaterialEnabled) - mask &= ~ctx->Light.ColorMaterialBitmask; - - if (R200_DEBUG & DEBUG_STATE) - fprintf(stderr, "%s\n", __FUNCTION__); - - - if (mask & FRONT_EMISSION_BIT) { - fcmd[MTL_EMMISSIVE_RED] = ctx->Light.Material[0].Emission[0]; - fcmd[MTL_EMMISSIVE_GREEN] = ctx->Light.Material[0].Emission[1]; - fcmd[MTL_EMMISSIVE_BLUE] = ctx->Light.Material[0].Emission[2]; - fcmd[MTL_EMMISSIVE_ALPHA] = ctx->Light.Material[0].Emission[3]; - } - if (mask & FRONT_AMBIENT_BIT) { - fcmd[MTL_AMBIENT_RED] = ctx->Light.Material[0].Ambient[0]; - fcmd[MTL_AMBIENT_GREEN] = ctx->Light.Material[0].Ambient[1]; - fcmd[MTL_AMBIENT_BLUE] = ctx->Light.Material[0].Ambient[2]; - fcmd[MTL_AMBIENT_ALPHA] = ctx->Light.Material[0].Ambient[3]; - } - if (mask & FRONT_DIFFUSE_BIT) { - fcmd[MTL_DIFFUSE_RED] = ctx->Light.Material[0].Diffuse[0]; - fcmd[MTL_DIFFUSE_GREEN] = ctx->Light.Material[0].Diffuse[1]; - fcmd[MTL_DIFFUSE_BLUE] = ctx->Light.Material[0].Diffuse[2]; - fcmd[MTL_DIFFUSE_ALPHA] = ctx->Light.Material[0].Diffuse[3]; - } - if (mask & FRONT_SPECULAR_BIT) { - fcmd[MTL_SPECULAR_RED] = ctx->Light.Material[0].Specular[0]; - fcmd[MTL_SPECULAR_GREEN] = ctx->Light.Material[0].Specular[1]; - fcmd[MTL_SPECULAR_BLUE] = ctx->Light.Material[0].Specular[2]; - fcmd[MTL_SPECULAR_ALPHA] = ctx->Light.Material[0].Specular[3]; - } - if (mask & FRONT_SHININESS_BIT) { - fcmd[MTL_SHININESS] = ctx->Light.Material[0].Shininess; - } - - if (R200_DB_STATECHANGE( rmesa, &rmesa->hw.mtl[0] )) { - for (p = 0 ; p < MAX_LIGHTS; p++) - update_light_colors( ctx, p ); - - check_twoside_fallback( ctx ); - update_global_ambient( ctx ); - } - else if (R200_DEBUG & (DEBUG_PRIMS|DEBUG_STATE)) - fprintf(stderr, "%s: Elided noop material call\n", __FUNCTION__); -} - -/* _NEW_LIGHT - * _NEW_MODELVIEW - * _MESA_NEW_NEED_EYE_COORDS - * - * Uses derived state from mesa: - * _VP_inf_norm - * _h_inf_norm - * _Position - * _NormDirection - * _ModelViewInvScale - * _NeedEyeCoords - * _EyeZDir - * - * which are calculated in light.c and are correct for the current - * lighting space (model or eye), hence dependencies on _NEW_MODELVIEW - * and _MESA_NEW_NEED_EYE_COORDS. - */ -static void update_light( GLcontext *ctx ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - - /* Have to check these, or have an automatic shortcircuit mechanism - * to remove noop statechanges. (Or just do a better job on the - * front end). - */ - { - GLuint tmp = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]; - - if (ctx->_NeedEyeCoords) - tmp &= ~R200_LIGHT_IN_MODELSPACE; - else - tmp |= R200_LIGHT_IN_MODELSPACE; - - if (tmp != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]) - { - R200_STATECHANGE( rmesa, tcl ); - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] = tmp; - } - } - - { - GLfloat *fcmd = (GLfloat *)R200_DB_STATE( eye ); - fcmd[EYE_X] = ctx->_EyeZDir[0]; - fcmd[EYE_Y] = ctx->_EyeZDir[1]; - fcmd[EYE_Z] = - ctx->_EyeZDir[2]; - fcmd[EYE_RESCALE_FACTOR] = ctx->_ModelViewInvScale; - R200_DB_STATECHANGE( rmesa, &rmesa->hw.eye ); - } - - - - if (ctx->Light.Enabled) { - GLint p; - for (p = 0 ; p < MAX_LIGHTS; p++) { - if (ctx->Light.Light[p].Enabled) { - struct gl_light *l = &ctx->Light.Light[p]; - GLfloat *fcmd = (GLfloat *)R200_DB_STATE( lit[p] ); - - if (l->EyePosition[3] == 0.0) { - COPY_3FV( &fcmd[LIT_POSITION_X], l->_VP_inf_norm ); - COPY_3FV( &fcmd[LIT_DIRECTION_X], l->_h_inf_norm ); - fcmd[LIT_POSITION_W] = 0; - fcmd[LIT_DIRECTION_W] = 0; - } else { - COPY_4V( &fcmd[LIT_POSITION_X], l->_Position ); - fcmd[LIT_DIRECTION_X] = -l->_NormDirection[0]; - fcmd[LIT_DIRECTION_Y] = -l->_NormDirection[1]; - fcmd[LIT_DIRECTION_Z] = -l->_NormDirection[2]; - fcmd[LIT_DIRECTION_W] = 0; - } - - R200_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] ); - } - } - } -} - -static void r200Lightfv( GLcontext *ctx, GLenum light, - GLenum pname, const GLfloat *params ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLint p = light - GL_LIGHT0; - struct gl_light *l = &ctx->Light.Light[p]; - GLfloat *fcmd = (GLfloat *)rmesa->hw.lit[p].cmd; - - - switch (pname) { - case GL_AMBIENT: - case GL_DIFFUSE: - case GL_SPECULAR: - update_light_colors( ctx, p ); - break; - - case GL_SPOT_DIRECTION: - /* picked up in update_light */ - break; - - case GL_POSITION: { - /* positions picked up in update_light, but can do flag here */ - GLuint flag = (p&1)? R200_LIGHT_1_IS_LOCAL : R200_LIGHT_0_IS_LOCAL; - GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; - - R200_STATECHANGE(rmesa, tcl); - if (l->EyePosition[3] != 0.0F) - rmesa->hw.tcl.cmd[idx] |= flag; - else - rmesa->hw.tcl.cmd[idx] &= ~flag; - break; - } - - case GL_SPOT_EXPONENT: - R200_STATECHANGE(rmesa, lit[p]); - fcmd[LIT_SPOT_EXPONENT] = params[0]; - break; - - case GL_SPOT_CUTOFF: { - GLuint flag = (p&1) ? R200_LIGHT_1_IS_SPOT : R200_LIGHT_0_IS_SPOT; - GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2; - - R200_STATECHANGE(rmesa, lit[p]); - fcmd[LIT_SPOT_CUTOFF] = l->_CosCutoff; - - R200_STATECHANGE(rmesa, tcl); - if (l->SpotCutoff != 180.0F) - rmesa->hw.tcl.cmd[idx] |= flag; - else - rmesa->hw.tcl.cmd[idx] &= ~flag; - - break; - } - - case GL_CONSTANT_ATTENUATION: - R200_STATECHANGE(rmesa, lit[p]); - fcmd[LIT_ATTEN_CONST] = params[0]; - break; - case GL_LINEAR_ATTENUATION: - R200_STATECHANGE(rmesa, lit[p]); - fcmd[LIT_ATTEN_LINEAR] = params[0]; - break; - case GL_QUADRATIC_ATTENUATION: - R200_STATECHANGE(rmesa, lit[p]); - fcmd[LIT_ATTEN_QUADRATIC] = params[0]; - break; - default: - return; - } - -} - - - - -static void r200LightModelfv( GLcontext *ctx, GLenum pname, - const GLfloat *param ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - - switch (pname) { - case GL_LIGHT_MODEL_AMBIENT: - update_global_ambient( ctx ); - break; - - case GL_LIGHT_MODEL_LOCAL_VIEWER: - R200_STATECHANGE( rmesa, tcl ); - if (ctx->Light.Model.LocalViewer) - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LOCAL_VIEWER; - else - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_LOCAL_VIEWER; - break; - - case GL_LIGHT_MODEL_TWO_SIDE: - R200_STATECHANGE( rmesa, tcl ); - if (ctx->Light.Model.TwoSide) - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHT_TWOSIDE; - else - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_LIGHT_TWOSIDE; - - check_twoside_fallback( ctx ); - - if (rmesa->TclFallback) { - r200ChooseRenderState( ctx ); - r200ChooseVertexState( ctx ); - } - break; - - case GL_LIGHT_MODEL_COLOR_CONTROL: - r200UpdateSpecular(ctx); - break; - - default: - break; - } -} - -static void r200ShadeModel( GLcontext *ctx, GLenum mode ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL]; - - s &= ~(R200_DIFFUSE_SHADE_MASK | - R200_ALPHA_SHADE_MASK | - R200_SPECULAR_SHADE_MASK | - R200_FOG_SHADE_MASK); - - switch ( mode ) { - case GL_FLAT: - s |= (R200_DIFFUSE_SHADE_FLAT | - R200_ALPHA_SHADE_FLAT | - R200_SPECULAR_SHADE_FLAT | - R200_FOG_SHADE_FLAT); - break; - case GL_SMOOTH: - s |= (R200_DIFFUSE_SHADE_GOURAUD | - R200_ALPHA_SHADE_GOURAUD | - R200_SPECULAR_SHADE_GOURAUD | - R200_FOG_SHADE_GOURAUD); - break; - default: - return; - } - - if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) { - R200_STATECHANGE( rmesa, set ); - rmesa->hw.set.cmd[SET_SE_CNTL] = s; - } -} - - -/* ============================================================= - * User clip planes - */ - -static void r200ClipPlane( GLcontext *ctx, GLenum plane, const GLfloat *eq ) -{ - GLint p = (GLint) plane - (GLint) GL_CLIP_PLANE0; - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p]; - - R200_STATECHANGE( rmesa, ucp[p] ); - rmesa->hw.ucp[p].cmd[UCP_X] = ip[0]; - rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1]; - rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2]; - rmesa->hw.ucp[p].cmd[UCP_W] = ip[3]; -} - -static void r200UpdateClipPlanes( GLcontext *ctx ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLuint p; - - for (p = 0; p < ctx->Const.MaxClipPlanes; p++) { - if (ctx->Transform.ClipPlanesEnabled & (1 << p)) { - GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p]; - - R200_STATECHANGE( rmesa, ucp[p] ); - rmesa->hw.ucp[p].cmd[UCP_X] = ip[0]; - rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1]; - rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2]; - rmesa->hw.ucp[p].cmd[UCP_W] = ip[3]; - } - } -} - - -/* ============================================================= - * Stencil - */ - -static void r200StencilFunc( GLcontext *ctx, GLenum func, - GLint ref, GLuint mask ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLuint refmask = ((ctx->Stencil.Ref[0] << R200_STENCIL_REF_SHIFT) | - (ctx->Stencil.ValueMask[0] << R200_STENCIL_MASK_SHIFT)); - - R200_STATECHANGE( rmesa, ctx ); - R200_STATECHANGE( rmesa, msk ); - - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_STENCIL_TEST_MASK; - rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~(R200_STENCIL_REF_MASK| - R200_STENCIL_VALUE_MASK); - - switch ( ctx->Stencil.Function[0] ) { - case GL_NEVER: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_NEVER; - break; - case GL_LESS: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_LESS; - break; - case GL_EQUAL: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_EQUAL; - break; - case GL_LEQUAL: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_LEQUAL; - break; - case GL_GREATER: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_GREATER; - break; - case GL_NOTEQUAL: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_NEQUAL; - break; - case GL_GEQUAL: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_GEQUAL; - break; - case GL_ALWAYS: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_ALWAYS; - break; - } - - rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= refmask; -} - -static void r200StencilMask( GLcontext *ctx, GLuint mask ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - - R200_STATECHANGE( rmesa, msk ); - rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~R200_STENCIL_WRITE_MASK; - rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= - (ctx->Stencil.WriteMask[0] << R200_STENCIL_WRITEMASK_SHIFT); -} - -static void r200StencilOp( GLcontext *ctx, GLenum fail, - GLenum zfail, GLenum zpass ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - - R200_STATECHANGE( rmesa, ctx ); - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~(R200_STENCIL_FAIL_MASK | - R200_STENCIL_ZFAIL_MASK | - R200_STENCIL_ZPASS_MASK); - - switch ( ctx->Stencil.FailFunc[0] ) { - case GL_KEEP: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_KEEP; - break; - case GL_ZERO: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_ZERO; - break; - case GL_REPLACE: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_REPLACE; - break; - case GL_INCR: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INC; - break; - case GL_DECR: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_DEC; - break; - case GL_INCR_WRAP_EXT: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INC_WRAP; - break; - case GL_DECR_WRAP_EXT: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_DEC_WRAP; - break; - case GL_INVERT: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INVERT; - break; - } - - switch ( ctx->Stencil.ZFailFunc[0] ) { - case GL_KEEP: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_KEEP; - break; - case GL_ZERO: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_ZERO; - break; - case GL_REPLACE: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_REPLACE; - break; - case GL_INCR: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INC; - break; - case GL_DECR: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_DEC; - break; - case GL_INCR_WRAP_EXT: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INC_WRAP; - break; - case GL_DECR_WRAP_EXT: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_DEC_WRAP; - break; - case GL_INVERT: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INVERT; - break; - } - - switch ( ctx->Stencil.ZPassFunc[0] ) { - case GL_KEEP: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_KEEP; - break; - case GL_ZERO: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_ZERO; - break; - case GL_REPLACE: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_REPLACE; - break; - case GL_INCR: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INC; - break; - case GL_DECR: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_DEC; - break; - case GL_INCR_WRAP_EXT: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INC_WRAP; - break; - case GL_DECR_WRAP_EXT: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_DEC_WRAP; - break; - case GL_INVERT: - rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INVERT; - break; - } -} - -static void r200ClearStencil( GLcontext *ctx, GLint s ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - - rmesa->state.stencil.clear = - ((GLuint) ctx->Stencil.Clear | - (0xff << R200_STENCIL_MASK_SHIFT) | - (ctx->Stencil.WriteMask[0] << R200_STENCIL_WRITEMASK_SHIFT)); -} - - -/* ============================================================= - * Window position and viewport transformation - */ - -/* - * To correctly position primitives: - */ -#define SUBPIXEL_X 0.125 -#define SUBPIXEL_Y 0.125 - -void r200UpdateWindow( GLcontext *ctx ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - __DRIdrawablePrivate *dPriv = rmesa->dri.drawable; - GLfloat xoffset = (GLfloat)dPriv->x; - GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h; - const GLfloat *v = ctx->Viewport._WindowMap.m; - - GLfloat sx = v[MAT_SX]; - GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X; - GLfloat sy = - v[MAT_SY]; - GLfloat ty = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y; - GLfloat sz = v[MAT_SZ] * rmesa->state.depth.scale; - GLfloat tz = v[MAT_TZ] * rmesa->state.depth.scale; - - R200_FIREVERTICES( rmesa ); - R200_STATECHANGE( rmesa, vpt ); - - rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE] = *(GLuint *)&sx; - rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = *(GLuint *)&tx; - rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE] = *(GLuint *)&sy; - rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = *(GLuint *)&ty; - rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE] = *(GLuint *)&sz; - rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = *(GLuint *)&tz; -} - - - -static void r200Viewport( GLcontext *ctx, GLint x, GLint y, - GLsizei width, GLsizei height ) -{ - /* Don't pipeline viewport changes, conflict with window offset - * setting below. Could apply deltas to rescue pipelined viewport - * values, or keep the originals hanging around. - */ - R200_FIREVERTICES( R200_CONTEXT(ctx) ); - r200UpdateWindow( ctx ); -} - -static void r200DepthRange( GLcontext *ctx, GLclampd nearval, - GLclampd farval ) -{ - r200UpdateWindow( ctx ); -} - -void r200UpdateViewportOffset( GLcontext *ctx ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - __DRIdrawablePrivate *dPriv = rmesa->dri.drawable; - GLfloat xoffset = (GLfloat)dPriv->x; - GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h; - const GLfloat *v = ctx->Viewport._WindowMap.m; - - GLfloat tx = v[MAT_TX] + xoffset; - GLfloat ty = (- v[MAT_TY]) + yoffset; - - if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != *(GLuint *)&tx || - rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != *(GLuint *)&ty ) - { - /* Note: this should also modify whatever data the context reset - * code uses... - */ - rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = *(GLuint *)&tx; - rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = *(GLuint *)&ty; - - /* update polygon stipple x/y screen offset */ - { - GLuint stx, sty; - GLuint m = rmesa->hw.msc.cmd[MSC_RE_MISC]; - - m &= ~(R200_STIPPLE_X_OFFSET_MASK | - R200_STIPPLE_Y_OFFSET_MASK); - - /* add magic offsets, then invert */ - stx = 31 - ((rmesa->dri.drawable->x - 1) & R200_STIPPLE_COORD_MASK); - sty = 31 - ((rmesa->dri.drawable->y + rmesa->dri.drawable->h - 1) - & R200_STIPPLE_COORD_MASK); - - m |= ((stx << R200_STIPPLE_X_OFFSET_SHIFT) | - (sty << R200_STIPPLE_Y_OFFSET_SHIFT)); - - if ( rmesa->hw.msc.cmd[MSC_RE_MISC] != m ) { - R200_STATECHANGE( rmesa, msc ); - rmesa->hw.msc.cmd[MSC_RE_MISC] = m; - } - } - } - - r200UpdateScissor( ctx ); -} - - - -/* ============================================================= - * Miscellaneous - */ - -static void r200ClearColor( GLcontext *ctx, const GLfloat c[4] ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLubyte color[4]; - CLAMPED_FLOAT_TO_UBYTE(color[0], c[0]); - CLAMPED_FLOAT_TO_UBYTE(color[1], c[1]); - CLAMPED_FLOAT_TO_UBYTE(color[2], c[2]); - CLAMPED_FLOAT_TO_UBYTE(color[3], c[3]); - rmesa->state.color.clear = r200PackColor( rmesa->r200Screen->cpp, - color[0], color[1], - color[2], color[3] ); -} - - -static void r200RenderMode( GLcontext *ctx, GLenum mode ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - FALLBACK( rmesa, R200_FALLBACK_RENDER_MODE, (mode != GL_RENDER) ); -} - - -static GLuint r200_rop_tab[] = { - R200_ROP_CLEAR, - R200_ROP_AND, - R200_ROP_AND_REVERSE, - R200_ROP_COPY, - R200_ROP_AND_INVERTED, - R200_ROP_NOOP, - R200_ROP_XOR, - R200_ROP_OR, - R200_ROP_NOR, - R200_ROP_EQUIV, - R200_ROP_INVERT, - R200_ROP_OR_REVERSE, - R200_ROP_COPY_INVERTED, - R200_ROP_OR_INVERTED, - R200_ROP_NAND, - R200_ROP_SET, -}; - -static void r200LogicOpCode( GLcontext *ctx, GLenum opcode ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLuint rop = (GLuint)opcode - GL_CLEAR; - - ASSERT( rop < 16 ); - - R200_STATECHANGE( rmesa, msk ); - rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = r200_rop_tab[rop]; -} - - -void r200SetCliprects( r200ContextPtr rmesa, GLenum mode ) -{ - __DRIdrawablePrivate *dPriv = rmesa->dri.drawable; - - switch ( mode ) { - case GL_FRONT_LEFT: - rmesa->numClipRects = dPriv->numClipRects; - rmesa->pClipRects = (XF86DRIClipRectPtr)dPriv->pClipRects; - break; - case GL_BACK_LEFT: - /* Can't ignore 2d windows if we are page flipping. - */ - if ( dPriv->numBackClipRects == 0 || rmesa->doPageFlip ) { - rmesa->numClipRects = dPriv->numClipRects; - rmesa->pClipRects = (XF86DRIClipRectPtr)dPriv->pClipRects; - } - else { - rmesa->numClipRects = dPriv->numBackClipRects; - rmesa->pClipRects = (XF86DRIClipRectPtr)dPriv->pBackClipRects; - } - break; - default: - fprintf(stderr, "bad mode in r200SetCliprects\n"); - return; - } - - if (rmesa->state.scissor.enabled) - r200RecalcScissorRects( rmesa ); -} - - -static void r200DrawBuffer( GLcontext *ctx, GLenum mode ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - - if (R200_DEBUG & DEBUG_DRI) - fprintf(stderr, "%s %s\n", __FUNCTION__, - _mesa_lookup_enum_by_nr( mode )); - - R200_FIREVERTICES(rmesa); /* don't pipeline cliprect changes */ - - /* - * _DrawDestMask is easier to cope with than <mode>. - */ - switch ( ctx->Color._DrawDestMask ) { - case FRONT_LEFT_BIT: - FALLBACK( rmesa, R200_FALLBACK_DRAW_BUFFER, GL_FALSE ); - r200SetCliprects( rmesa, GL_FRONT_LEFT ); - break; - case BACK_LEFT_BIT: - FALLBACK( rmesa, R200_FALLBACK_DRAW_BUFFER, GL_FALSE ); - r200SetCliprects( rmesa, GL_BACK_LEFT ); - break; - default: - /* GL_NONE or GL_FRONT_AND_BACK or stereo left&right, etc */ - FALLBACK( rmesa, R200_FALLBACK_DRAW_BUFFER, GL_TRUE ); - return; - } - - /* We want to update the s/w rast state too so that r200SetBuffer() - * gets called. - */ - _swrast_DrawBuffer(ctx, mode); - - R200_STATECHANGE( rmesa, ctx ); - rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = (rmesa->state.color.drawOffset & - R200_COLOROFFSET_MASK); - rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = rmesa->state.color.drawPitch; -} - - -static void r200ReadBuffer( GLcontext *ctx, GLenum mode ) -{ - /* nothing, until we implement h/w glRead/CopyPixels or CopyTexImage */ -} - -/* ============================================================= - * State enable/disable - */ - -static void r200Enable( GLcontext *ctx, GLenum cap, GLboolean state ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLuint p, flag; - - if ( R200_DEBUG & DEBUG_STATE ) - fprintf( stderr, "%s( %s = %s )\n", __FUNCTION__, - _mesa_lookup_enum_by_nr( cap ), - state ? "GL_TRUE" : "GL_FALSE" ); - - switch ( cap ) { - /* Fast track this one... - */ - case GL_TEXTURE_1D: - case GL_TEXTURE_2D: - case GL_TEXTURE_3D: - break; - - case GL_ALPHA_TEST: - R200_STATECHANGE( rmesa, ctx ); - if (state) { - rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_ALPHA_TEST_ENABLE; - } else { - rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ALPHA_TEST_ENABLE; - } - break; - - case GL_BLEND: - R200_STATECHANGE( rmesa, ctx ); - if (state) { - rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_ALPHA_BLEND_ENABLE; - } else { - rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_ALPHA_BLEND_ENABLE; - } - if ( ctx->Color.ColorLogicOpEnabled ) { - rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_ROP_ENABLE; - } else { - rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_ROP_ENABLE; - } - break; - - case GL_CLIP_PLANE0: - case GL_CLIP_PLANE1: - case GL_CLIP_PLANE2: - case GL_CLIP_PLANE3: - case GL_CLIP_PLANE4: - case GL_CLIP_PLANE5: - p = cap-GL_CLIP_PLANE0; - R200_STATECHANGE( rmesa, tcl ); - if (state) { - rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (R200_UCP_ENABLE_0<<p); - r200ClipPlane( ctx, cap, NULL ); - } - else { - rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(R200_UCP_ENABLE_0<<p); - } - break; - - case GL_COLOR_MATERIAL: - r200ColorMaterial( ctx, 0, 0 ); - if (!state) - r200UpdateMaterial( ctx ); - break; - - case GL_CULL_FACE: - r200CullFace( ctx, 0 ); - break; - - case GL_DEPTH_TEST: - R200_STATECHANGE(rmesa, ctx ); - if ( state ) { - rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_Z_ENABLE; - } else { - rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_Z_ENABLE; - } - break; - - case GL_DITHER: - R200_STATECHANGE(rmesa, ctx ); - if ( state ) { - rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_DITHER_ENABLE; - } else { - rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_DITHER_ENABLE; - } - break; - - case GL_FOG: - R200_STATECHANGE(rmesa, ctx ); - if ( state ) { - rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_FOG_ENABLE; - r200Fogfv( ctx, GL_FOG_MODE, 0 ); - } else { - rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_FOG_ENABLE; - R200_STATECHANGE(rmesa, tcl); - rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_TCL_FOG_MASK; - } - r200UpdateSpecular( ctx ); /* for PK_SPEC */ - break; - - case GL_LIGHT0: - case GL_LIGHT1: - case GL_LIGHT2: - case GL_LIGHT3: - case GL_LIGHT4: - case GL_LIGHT5: - case GL_LIGHT6: - case GL_LIGHT7: - R200_STATECHANGE(rmesa, tcl); - p = cap - GL_LIGHT0; - if (p&1) - flag = (R200_LIGHT_1_ENABLE | - R200_LIGHT_1_ENABLE_AMBIENT | - R200_LIGHT_1_ENABLE_SPECULAR); - else - flag = (R200_LIGHT_0_ENABLE | - R200_LIGHT_0_ENABLE_AMBIENT | - R200_LIGHT_0_ENABLE_SPECULAR); - - if (state) - rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] |= flag; - else - rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] &= ~flag; - - /* - */ - update_light_colors( ctx, p ); - break; - - case GL_LIGHTING: - r200UpdateSpecular(ctx); - check_twoside_fallback( ctx ); - break; - - case GL_LINE_SMOOTH: - R200_STATECHANGE( rmesa, ctx ); - if ( state ) { - rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_ANTI_ALIAS_LINE; - } else { - rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ANTI_ALIAS_LINE; - } - break; - - case GL_LINE_STIPPLE: - R200_STATECHANGE( rmesa, set ); - if ( state ) { - rmesa->hw.set.cmd[SET_RE_CNTL] |= R200_PATTERN_ENABLE; - } else { - rmesa->hw.set.cmd[SET_RE_CNTL] &= ~R200_PATTERN_ENABLE; - } - break; - - case GL_COLOR_LOGIC_OP: - R200_STATECHANGE( rmesa, ctx ); - if ( state ) { - rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_ROP_ENABLE; - } else { - rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_ROP_ENABLE; - } - break; - - case GL_NORMALIZE: - R200_STATECHANGE( rmesa, tcl ); - if ( state ) { - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_NORMALIZE_NORMALS; - } else { - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_NORMALIZE_NORMALS; - } - break; - - /* Pointsize registers on r200 don't seem to do anything. Maybe - * have to pass pointsizes as vertex parameters? In any case, - * setting pointmin == pointsizemax == 1.0, and doing nothing - * for aa is enough to satisfy conform. - */ - case GL_POINT_SMOOTH: - break; - - /* These don't really do anything, as we don't use the 3vtx - * primitives yet. - */ -#if 0 - case GL_POLYGON_OFFSET_POINT: - R200_STATECHANGE( rmesa, set ); - if ( state ) { - rmesa->hw.set.cmd[SET_SE_CNTL] |= R200_ZBIAS_ENABLE_POINT; - } else { - rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_POINT; - } - break; - - case GL_POLYGON_OFFSET_LINE: - R200_STATECHANGE( rmesa, set ); - if ( state ) { - rmesa->hw.set.cmd[SET_SE_CNTL] |= R200_ZBIAS_ENABLE_LINE; - } else { - rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_LINE; - } - break; -#endif - - case GL_POLYGON_OFFSET_FILL: - R200_STATECHANGE( rmesa, set ); - if ( state ) { - rmesa->hw.set.cmd[SET_SE_CNTL] |= R200_ZBIAS_ENABLE_TRI; - } else { - rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_TRI; - } - break; - - case GL_POLYGON_SMOOTH: - R200_STATECHANGE( rmesa, ctx ); - if ( state ) { - rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_ANTI_ALIAS_POLY; - } else { - rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ANTI_ALIAS_POLY; - } - break; - - case GL_POLYGON_STIPPLE: - R200_STATECHANGE(rmesa, set ); - if ( state ) { - rmesa->hw.set.cmd[SET_RE_CNTL] |= R200_STIPPLE_ENABLE; - } else { - rmesa->hw.set.cmd[SET_RE_CNTL] &= ~R200_STIPPLE_ENABLE; - } - break; - - case GL_RESCALE_NORMAL_EXT: { - GLboolean tmp = ctx->_NeedEyeCoords ? state : !state; - R200_STATECHANGE( rmesa, tcl ); - if ( tmp ) { - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_RESCALE_NORMALS; - } else { - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_RESCALE_NORMALS; - } - break; - } - - case GL_SCISSOR_TEST: - R200_FIREVERTICES( rmesa ); - rmesa->state.scissor.enabled = state; - r200UpdateScissor( ctx ); - break; - - case GL_STENCIL_TEST: - if ( rmesa->state.stencil.hwBuffer ) { - R200_STATECHANGE( rmesa, ctx ); - if ( state ) { - rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_STENCIL_ENABLE; - } else { - rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_STENCIL_ENABLE; - } - } else { - FALLBACK( rmesa, R200_FALLBACK_STENCIL, state ); - } - break; - - case GL_TEXTURE_GEN_Q: - case GL_TEXTURE_GEN_R: - case GL_TEXTURE_GEN_S: - case GL_TEXTURE_GEN_T: - /* Picked up in r200UpdateTextureState. - */ - rmesa->recheck_texgen[ctx->Texture.CurrentUnit] = GL_TRUE; - break; - - case GL_COLOR_SUM_EXT: - r200UpdateSpecular ( ctx ); - break; - - default: - return; - } -} - - -void r200LightingSpaceChange( GLcontext *ctx ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLboolean tmp; - - if (R200_DEBUG & DEBUG_STATE) - fprintf(stderr, "%s %d BEFORE %x\n", __FUNCTION__, ctx->_NeedEyeCoords, - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]); - - if (ctx->_NeedEyeCoords) - tmp = ctx->Transform.RescaleNormals; - else - tmp = !ctx->Transform.RescaleNormals; - - R200_STATECHANGE( rmesa, tcl ); - if ( tmp ) { - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_RESCALE_NORMALS; - } else { - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_RESCALE_NORMALS; - } - - if (R200_DEBUG & DEBUG_STATE) - fprintf(stderr, "%s %d AFTER %x\n", __FUNCTION__, ctx->_NeedEyeCoords, - rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]); -} - -/* ============================================================= - * Deferred state management - matrices, textures, other? - */ - - - - -static void upload_matrix( r200ContextPtr rmesa, GLfloat *src, int idx ) -{ - float *dest = ((float *)R200_DB_STATE( mat[idx] ))+MAT_ELT_0; - int i; - - - for (i = 0 ; i < 4 ; i++) { - *dest++ = src[i]; - *dest++ = src[i+4]; - *dest++ = src[i+8]; - *dest++ = src[i+12]; - } - - R200_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] ); -} - -static void upload_matrix_t( r200ContextPtr rmesa, const GLfloat *src, int idx ) -{ - float *dest = ((float *)R200_DB_STATE( mat[idx] ))+MAT_ELT_0; - memcpy(dest, src, 16*sizeof(float)); - R200_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] ); -} - - -static void update_texturematrix( GLcontext *ctx ) -{ - r200ContextPtr rmesa = R200_CONTEXT( ctx ); - GLuint tpc = rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0]; - GLuint compsel = rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL]; - int unit; - - if (R200_DEBUG & DEBUG_STATE) - fprintf(stderr, "%s before COMPSEL: %x\n", __FUNCTION__, - rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL]); - - rmesa->TexMatEnabled = 0; - rmesa->TexMatCompSel = 0; - - for (unit = 0 ; unit < 2; unit++) { - if (!ctx->Texture.Unit[unit]._ReallyEnabled) - continue; - - if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY) { - rmesa->TexMatEnabled |= (R200_TEXGEN_TEXMAT_0_ENABLE| - R200_TEXMAT_0_ENABLE) << unit; - - rmesa->TexMatCompSel |= R200_OUTPUT_TEX_0 << unit; - - if (rmesa->TexGenEnabled & (R200_TEXMAT_0_ENABLE << unit)) { - /* Need to preconcatenate any active texgen - * obj/eyeplane matrices: - */ - _math_matrix_mul_matrix( &rmesa->tmpmat, - &rmesa->TexGenMatrix[unit], - ctx->TextureMatrixStack[unit].Top ); - upload_matrix( rmesa, rmesa->tmpmat.m, R200_MTX_TEX0+unit ); - } - else { - upload_matrix( rmesa, ctx->TextureMatrixStack[unit].Top->m, - R200_MTX_TEX0+unit ); - } - } - else if (rmesa->TexGenEnabled & (R200_TEXMAT_0_ENABLE << unit)) { - upload_matrix( rmesa, rmesa->TexGenMatrix[unit].m, - R200_MTX_TEX0+unit ); - } - } - - tpc = (rmesa->TexMatEnabled | rmesa->TexGenEnabled); - if (tpc != rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0] || - rmesa->TexGenInputs != rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_1]) { - R200_STATECHANGE(rmesa, tcg); - rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0] = tpc; - rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_1] = rmesa->TexGenInputs; - } - - compsel &= ~R200_OUTPUT_TEX_MASK; - compsel |= rmesa->TexMatCompSel | rmesa->TexGenCompSel; - if (compsel != rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL]) { - R200_STATECHANGE(rmesa, vtx); - rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] = compsel; - } -} - - - -void r200ValidateState( GLcontext *ctx ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - GLuint new_state = rmesa->NewGLState; - - if (new_state & _NEW_TEXTURE) { - r200UpdateTextureState( ctx ); - new_state |= rmesa->NewGLState; /* may add TEXTURE_MATRIX */ - } - - /* Need an event driven matrix update? - */ - if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION)) - upload_matrix( rmesa, ctx->_ModelProjectMatrix.m, R200_MTX_MVP ); - - /* Need these for lighting (shouldn't upload otherwise) - */ - if (new_state & (_NEW_MODELVIEW)) { - upload_matrix( rmesa, ctx->ModelviewMatrixStack.Top->m, R200_MTX_MV ); - upload_matrix_t( rmesa, ctx->ModelviewMatrixStack.Top->inv, R200_MTX_IMV ); - } - - /* Does this need to be triggered on eg. modelview for - * texgen-derived objplane/eyeplane matrices? - */ - if (new_state & (_NEW_TEXTURE|_NEW_TEXTURE_MATRIX)) { - update_texturematrix( ctx ); - } - - if (new_state & (_NEW_LIGHT|_NEW_MODELVIEW|_MESA_NEW_NEED_EYE_COORDS)) { - update_light( ctx ); - } - - /* emit all active clip planes if projection matrix changes. - */ - if (new_state & (_NEW_PROJECTION)) { - if (ctx->Transform.ClipPlanesEnabled) - r200UpdateClipPlanes( ctx ); - } - - - rmesa->NewGLState = 0; -} - - -static void r200InvalidateState( GLcontext *ctx, GLuint new_state ) -{ - _swrast_InvalidateState( ctx, new_state ); - _swsetup_InvalidateState( ctx, new_state ); - _ac_InvalidateState( ctx, new_state ); - _tnl_InvalidateState( ctx, new_state ); - _ae_invalidate_state( ctx, new_state ); - R200_CONTEXT(ctx)->NewGLState |= new_state; - r200VtxfmtInvalidate( ctx ); -} - -static void r200WrapRunPipeline( GLcontext *ctx ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - TNLcontext *tnl = TNL_CONTEXT(ctx); - - if (0) - fprintf(stderr, "%s, newstate: %x\n", __FUNCTION__, rmesa->NewGLState); - - /* Validate state: - */ - if (rmesa->NewGLState) - r200ValidateState( ctx ); - - if (tnl->vb.Material) { - TCL_FALLBACK( ctx, R200_TCL_FALLBACK_MATERIAL, GL_TRUE ); - } - - /* Run the pipeline. - */ - _tnl_run_pipeline( ctx ); - - if (tnl->vb.Material) { - TCL_FALLBACK( ctx, R200_TCL_FALLBACK_MATERIAL, GL_FALSE ); - r200UpdateMaterial( ctx ); /* not needed any more? */ - } -} - - -/* Initialize the driver's state functions. - */ -void r200InitStateFuncs( GLcontext *ctx ) -{ - ctx->Driver.UpdateState = r200InvalidateState; - ctx->Driver.LightingSpaceChange = r200LightingSpaceChange; - - ctx->Driver.DrawBuffer = r200DrawBuffer; - ctx->Driver.ReadBuffer = r200ReadBuffer; - - ctx->Driver.AlphaFunc = r200AlphaFunc; - ctx->Driver.BlendEquation = r200BlendEquation; - ctx->Driver.BlendFunc = r200BlendFunc; - ctx->Driver.BlendFuncSeparate = r200BlendFuncSeparate; - ctx->Driver.ClearColor = r200ClearColor; - ctx->Driver.ClearDepth = NULL; - ctx->Driver.ClearIndex = NULL; - ctx->Driver.ClearStencil = r200ClearStencil; - ctx->Driver.ClipPlane = r200ClipPlane; - ctx->Driver.ColorMask = r200ColorMask; - ctx->Driver.CullFace = r200CullFace; - ctx->Driver.DepthFunc = r200DepthFunc; - ctx->Driver.DepthMask = r200DepthMask; - ctx->Driver.DepthRange = r200DepthRange; - ctx->Driver.Enable = r200Enable; - ctx->Driver.Fogfv = r200Fogfv; - ctx->Driver.FrontFace = r200FrontFace; - ctx->Driver.Hint = NULL; - ctx->Driver.IndexMask = NULL; - ctx->Driver.LightModelfv = r200LightModelfv; - ctx->Driver.Lightfv = r200Lightfv; - ctx->Driver.LineStipple = r200LineStipple; - ctx->Driver.LineWidth = r200LineWidth; - ctx->Driver.LogicOpcode = r200LogicOpCode; - ctx->Driver.PolygonMode = r200PolygonMode; - ctx->Driver.PolygonOffset = r200PolygonOffset; - ctx->Driver.PolygonStipple = r200PolygonStipple; - ctx->Driver.PointSize = r200PointSize; - ctx->Driver.RenderMode = r200RenderMode; - ctx->Driver.Scissor = r200Scissor; - ctx->Driver.ShadeModel = r200ShadeModel; - ctx->Driver.StencilFunc = r200StencilFunc; - ctx->Driver.StencilMask = r200StencilMask; - ctx->Driver.StencilOp = r200StencilOp; - ctx->Driver.Viewport = r200Viewport; - - /* Swrast hooks for imaging extensions: - */ - ctx->Driver.CopyColorTable = _swrast_CopyColorTable; - ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable; - ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; - ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; - - TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange = r200UpdateMaterial; - TNL_CONTEXT(ctx)->Driver.RunPipeline = r200WrapRunPipeline; -} diff --git a/src/mesa/drivers/dri/r200/r200_state.h b/src/mesa/drivers/dri/r200/r200_state.h index fe2a7dc0970..118712d8410 100644 --- a/src/mesa/drivers/dri/r200/r200_state.h +++ b/src/mesa/drivers/dri/r200/r200_state.h @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_state.h,v 1.2 2002/11/05 17:46:08 tsi Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the diff --git a/src/mesa/drivers/dri/r200/r200_state_init.c b/src/mesa/drivers/dri/r200/r200_state_init.c index ba445d5012b..4c9a69f79d2 100644 --- a/src/mesa/drivers/dri/r200/r200_state_init.c +++ b/src/mesa/drivers/dri/r200/r200_state_init.c @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_state_init.c,v 1.4 2003/02/22 06:21:11 dawes Exp $ */ /* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. @@ -130,28 +130,15 @@ static GLboolean check_##NM( GLcontext *ctx, int idx ) \ CHECK( always, GL_TRUE ) +CHECK( never, GL_FALSE ) CHECK( tex_any, ctx->Texture._EnabledUnits ) CHECK( tex, ctx->Texture.Unit[idx]._ReallyEnabled ) CHECK( fog, ctx->Fog.Enabled ) TCL_CHECK( tcl, GL_TRUE ) -TCL_CHECK( tcl_tex_any, ctx->Texture._EnabledUnits ) TCL_CHECK( tcl_tex, ctx->Texture.Unit[idx]._ReallyEnabled ) TCL_CHECK( tcl_lighting, ctx->Light.Enabled ) -TCL_CHECK( tcl_eyespace_or_lighting, ctx->_NeedEyeCoords || ctx->Light.Enabled ) TCL_CHECK( tcl_light, ctx->Light.Enabled && ctx->Light.Light[idx].Enabled ) TCL_CHECK( tcl_ucp, (ctx->Transform.ClipPlanesEnabled & (1 << idx)) ) -/* TCL_CHECK( tcl_eyespace_or_fog, ctx->_NeedEyeCoords || ctx->Fog.Enabled ) */ - - -static GLboolean check_tcl_eyespace_or_fog( GLcontext *ctx, int idx ) -{ - r200ContextPtr rmesa = R200_CONTEXT(ctx); - int res; - (void) idx; - res = !rmesa->TclFallback && (ctx->_NeedEyeCoords || ctx->Fog.Enabled); - fprintf(stderr, "%s: %d\n", __FUNCTION__, res); - return res; -} /* Initialize the context's hardware state. @@ -244,8 +231,15 @@ void r200InitState( r200ContextPtr rmesa ) ALLOC_STATE( tf, tex_any, TF_STATE_SIZE, "TF/tfactor", 0 ); ALLOC_STATE( tex[0], tex_any, TEX_STATE_SIZE, "TEX/tex-0", 0 ); ALLOC_STATE( tex[1], tex_any, TEX_STATE_SIZE, "TEX/tex-1", 1 ); - ALLOC_STATE( cube[0], tex_any, CUBE_STATE_SIZE, "CUBE/tex-0", 0 ); - ALLOC_STATE( cube[1], tex_any, CUBE_STATE_SIZE, "CUBE/tex-1", 1 ); + + if (rmesa->r200Screen->drmSupportsCubeMaps) { + ALLOC_STATE( cube[0], tex_any, CUBE_STATE_SIZE, "CUBE/tex-0", 0 ); + ALLOC_STATE( cube[1], tex_any, CUBE_STATE_SIZE, "CUBE/tex-1", 1 ); + } + else { + ALLOC_STATE( cube[0], never, CUBE_STATE_SIZE, "CUBE/tex-0", 0 ); + ALLOC_STATE( cube[1], never, CUBE_STATE_SIZE, "CUBE/tex-1", 1 ); + } ALLOC_STATE( tcl, tcl, TCL_STATE_SIZE, "TCL/tcl", 0 ); ALLOC_STATE( msl, tcl, MSL_STATE_SIZE, "MSL/matrix-select", 0 ); @@ -656,7 +650,7 @@ void r200InitState( r200ContextPtr rmesa ) ctx->Driver.Lightfv( ctx, p, GL_LINEAR_ATTENUATION, &l->LinearAttenuation ); ctx->Driver.Lightfv( ctx, p, GL_QUADRATIC_ATTENUATION, - &l->QuadraticAttenuation ); + &l->QuadraticAttenuation ); } ctx->Driver.LightModelfv( ctx, GL_LIGHT_MODEL_AMBIENT, diff --git a/src/mesa/drivers/dri/r200/r200_swtcl.c b/src/mesa/drivers/dri/r200/r200_swtcl.c index 5a6586b5dd1..ca5c456889d 100644 --- a/src/mesa/drivers/dri/r200/r200_swtcl.c +++ b/src/mesa/drivers/dri/r200/r200_swtcl.c @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_swtcl.c,v 1.5 2003/05/06 23:52:08 daenzer Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the @@ -396,7 +395,7 @@ static void flush_last_swtcl_prim( r200ContextPtr rmesa ) if (rmesa->dma.current.buf) { struct r200_dma_region *current = &rmesa->dma.current; - GLuint current_offset = (rmesa->r200Screen->agp_buffer_offset + + GLuint current_offset = (rmesa->r200Screen->gart_buffer_offset + current->buf->buf->idx * RADEON_BUFFER_SIZE + current->start); @@ -445,7 +444,7 @@ static __inline void *r200AllocDmaLowVerts( r200ContextPtr rmesa, { - char *head = rmesa->dma.current.address + rmesa->dma.current.ptr; + GLubyte *head = (GLubyte *) (rmesa->dma.current.address + rmesa->dma.current.ptr); rmesa->dma.current.ptr += bytes; rmesa->swtcl.numverts += nverts; return head; @@ -589,7 +588,7 @@ do { \ \ r200EmitVertexAOS( rmesa, \ rmesa->swtcl.vertex_size, \ - (rmesa->r200Screen->agp_buffer_offset + \ + (rmesa->r200Screen->gart_buffer_offset + \ rmesa->swtcl.indexed_verts.buf->buf->idx * \ RADEON_BUFFER_SIZE + \ rmesa->swtcl.indexed_verts.start)); \ diff --git a/src/mesa/drivers/dri/r200/r200_swtcl.h b/src/mesa/drivers/dri/r200/r200_swtcl.h index 9a36fb68fa9..f183b931c45 100644 --- a/src/mesa/drivers/dri/r200/r200_swtcl.h +++ b/src/mesa/drivers/dri/r200/r200_swtcl.h @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_swtcl.h,v 1.3 2003/05/06 23:52:08 daenzer Exp $ */ /* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. diff --git a/src/mesa/drivers/dri/r200/r200_tcl.c b/src/mesa/drivers/dri/r200/r200_tcl.c index 71e3d5256a9..60e281ffaf3 100644 --- a/src/mesa/drivers/dri/r200/r200_tcl.c +++ b/src/mesa/drivers/dri/r200/r200_tcl.c @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_tcl.c,v 1.2 2002/12/16 16:18:55 dawes Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the diff --git a/src/mesa/drivers/dri/r200/r200_tcl.h b/src/mesa/drivers/dri/r200/r200_tcl.h index a2db2e18a6e..0fdf9c22c78 100644 --- a/src/mesa/drivers/dri/r200/r200_tcl.h +++ b/src/mesa/drivers/dri/r200/r200_tcl.h @@ -1,5 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_tcl.h,v 1.2 2002/12/16 16:18:55 dawes Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the diff --git a/src/mesa/drivers/dri/r200/r200_tex.c b/src/mesa/drivers/dri/r200/r200_tex.c index 5f8d06ae62e..f19f877cab5 100644 --- a/src/mesa/drivers/dri/r200/r200_tex.c +++ b/src/mesa/drivers/dri/r200/r200_tex.c @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_tex.c,v 1.2 2002/11/05 17:46:08 tsi Exp $ */ /* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. @@ -296,7 +296,7 @@ r200ChooseTextureFormat( GLcontext *ctx, GLint internalFormat, GLenum format, GLenum type ) { r200ContextPtr rmesa = R200_CONTEXT(ctx); - const GLboolean do32bpt = ( rmesa->r200Screen->cpp == 4 ); + const GLboolean do32bpt = rmesa->default32BitTextures; switch ( internalFormat ) { case 4: @@ -495,7 +495,7 @@ r200ValidateClientStorage( GLcontext *ctx, GLenum target, * relaxed, but would need to store the image pitch somewhere, * as packing details might change before image is uploaded: */ - if (!r200IsAgpMemory( rmesa, pixels, srcHeight * srcRowStride ) || + if (!r200IsGartMemory( rmesa, pixels, srcHeight * srcRowStride ) || (srcRowStride & 63)) return 0; @@ -626,8 +626,8 @@ static void r200TexImage2D( GLcontext *ctx, GLenum target, GLint level, fprintf(stderr, "%s: Using normal storage\n", __FUNCTION__); /* Normal path: copy (to cached memory) and eventually upload - * via another copy to agp memory and then a blit... Could - * eliminate one copy by going straight to (permanent) agp. + * via another copy to GART memory and then a blit... Could + * eliminate one copy by going straight to (permanent) GART. * * Note, this will call r200ChooseTextureFormat. */ @@ -729,8 +729,8 @@ static void r200TexImage3D( GLcontext *ctx, GLenum target, GLint level, fprintf(stderr, "%s: Using normal storage\n", __FUNCTION__); /* Normal path: copy (to cached memory) and eventually upload - * via another copy to agp memory and then a blit... Could - * eliminate one copy by going straight to (permanent) agp. + * via another copy to GART memory and then a blit... Could + * eliminate one copy by going straight to (permanent) GART. * * Note, this will call r200ChooseTextureFormat. */ diff --git a/src/mesa/drivers/dri/r200/r200_tex.h b/src/mesa/drivers/dri/r200/r200_tex.h index 9013de6d795..a4301206ed8 100644 --- a/src/mesa/drivers/dri/r200/r200_tex.h +++ b/src/mesa/drivers/dri/r200/r200_tex.h @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_tex.h,v 1.1 2002/10/30 12:51:53 alanh Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the diff --git a/src/mesa/drivers/dri/r200/r200_texmem.c b/src/mesa/drivers/dri/r200/r200_texmem.c index 34777085ac5..34db1f4421e 100644 --- a/src/mesa/drivers/dri/r200/r200_texmem.c +++ b/src/mesa/drivers/dri/r200/r200_texmem.c @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_texmem.c,v 1.5 2002/12/17 00:32:56 dawes Exp $ */ /************************************************************************** Copyright (C) Tungsten Graphics 2002. All Rights Reserved. @@ -35,6 +35,7 @@ SOFTWARE. * Gareth Hughes <[email protected]> * */ + #include <errno.h> #include "glheader.h" @@ -86,12 +87,12 @@ r200DestroyTexObj( r200ContextPtr rmesa, r200TexObjPtr t ) */ -static void r200UploadAGPClientSubImage( r200ContextPtr rmesa, - r200TexObjPtr t, - struct gl_texture_image *texImage, - GLint hwlevel, - GLint x, GLint y, - GLint width, GLint height ) +static void r200UploadGARTClientSubImage( r200ContextPtr rmesa, + r200TexObjPtr t, + struct gl_texture_image *texImage, + GLint hwlevel, + GLint x, GLint y, + GLint width, GLint height ) { const struct gl_texture_format *texFormat = texImage->TexFormat; GLuint srcPitch, dstPitch; @@ -124,7 +125,7 @@ static void r200UploadAGPClientSubImage( r200ContextPtr rmesa, } t->image[0][hwlevel].data = texImage->Data; - srcOffset = r200AgpOffsetFromVirtual( rmesa, texImage->Data ); + srcOffset = r200GartOffsetFromVirtual( rmesa, texImage->Data ); assert( srcOffset != ~0 ); @@ -181,16 +182,16 @@ static void r200UploadRectSubImage( r200ContextPtr rmesa, height = texImage->Height; dstPitch = t->pp_txpitch + 32; - if (rmesa->prefer_agp_client_texturing && texImage->IsClientData) { - /* In this case, could also use agp texturing. This is + if (rmesa->prefer_gart_client_texturing && texImage->IsClientData) { + /* In this case, could also use GART texturing. This is * currently disabled, but has been tested & works. */ - t->pp_txoffset = r200AgpOffsetFromVirtual( rmesa, texImage->Data ); + t->pp_txoffset = r200GartOffsetFromVirtual( rmesa, texImage->Data ); t->pp_txpitch = texImage->RowStride * texFormat->TexelBytes - 32; if (R200_DEBUG & DEBUG_TEXTURE) fprintf(stderr, - "Using agp texturing for rectangular client texture\n"); + "Using GART texturing for rectangular client texture\n"); /* Release FB memory allocated for this image: */ @@ -202,21 +203,21 @@ static void r200UploadRectSubImage( r200ContextPtr rmesa, } } else if (texImage->IsClientData) { - /* Data already in agp memory, with usable pitch. + /* Data already in GART memory, with usable pitch. */ GLuint srcPitch; srcPitch = texImage->RowStride * texFormat->TexelBytes; r200EmitBlit( rmesa, blit_format, srcPitch, - r200AgpOffsetFromVirtual( rmesa, texImage->Data ), + r200GartOffsetFromVirtual( rmesa, texImage->Data ), dstPitch, t->bufAddr, 0, 0, 0, 0, width, height ); } else { - /* Data not in agp memory, or bad pitch. + /* Data not in GART memory, or bad pitch. */ for (done = 0; done < height ; ) { struct r200_dma_region region; @@ -344,9 +345,9 @@ static void uploadSubImage( r200ContextPtr rmesa, r200TexObjPtr t, } else if (texImage->IsClientData) { if ( R200_DEBUG & DEBUG_TEXTURE ) - fprintf( stderr, "%s: image data is in agp client storage\n", + fprintf( stderr, "%s: image data is in GART client storage\n", __FUNCTION__); - r200UploadAGPClientSubImage( rmesa, t, texImage, hwlevel, + r200UploadGARTClientSubImage( rmesa, t, texImage, hwlevel, x, y, width, height ); return; } diff --git a/src/mesa/drivers/dri/r200/r200_texstate.c b/src/mesa/drivers/dri/r200/r200_texstate.c index e1dc206d927..3d82aac3234 100644 --- a/src/mesa/drivers/dri/r200/r200_texstate.c +++ b/src/mesa/drivers/dri/r200/r200_texstate.c @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_texstate.c,v 1.3 2003/02/15 22:18:47 dawes Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the @@ -106,7 +105,7 @@ static void r200SetTexImages( r200ContextPtr rmesa, const struct gl_texture_image *baseImage = tObj->Image[tObj->BaseLevel]; GLint curOffset; GLint i; - GLint firstLevel=0, lastLevel=0, numLevels; + GLint numLevels; GLint log2Width, log2Height, log2Depth; /* Set the hardware texture format @@ -126,66 +125,15 @@ static void r200SetTexImages( r200ContextPtr rmesa, } - /* Compute which mipmap levels we really want to send to the hardware. - * This depends on the base image size, GL_TEXTURE_MIN_LOD, - * GL_TEXTURE_MAX_LOD, GL_TEXTURE_BASE_LEVEL, and GL_TEXTURE_MAX_LEVEL. - * Yes, this looks overly complicated, but it's all needed. */ - if (R200_DEBUG & DEBUG_TEXTURE) - fprintf(stderr, - "%s: BaseLevel %d MinLod %f MaxLod %f MaxLevel %d\n", - __FUNCTION__, - tObj->BaseLevel, tObj->MinLod, tObj->MaxLod, - tObj->MaxLevel); - - - switch (tObj->Target) { - case GL_TEXTURE_1D: - case GL_TEXTURE_2D: - case GL_TEXTURE_CUBE_MAP: - firstLevel = tObj->BaseLevel + (GLint)(tObj->MinLod + 0.5); - firstLevel = MAX2(firstLevel, tObj->BaseLevel); - lastLevel = tObj->BaseLevel + (GLint)(tObj->MaxLod + 0.5); - lastLevel = MAX2(lastLevel, tObj->BaseLevel); - lastLevel = MIN2(lastLevel, tObj->BaseLevel + baseImage->MaxLog2); - lastLevel = MIN2(lastLevel, tObj->MaxLevel); - lastLevel = MAX2(firstLevel, lastLevel); /* need at least one level */ - log2Width = tObj->Image[firstLevel]->WidthLog2; - log2Height = tObj->Image[firstLevel]->HeightLog2; - log2Depth = 0; - break; - case GL_TEXTURE_3D: - firstLevel = tObj->BaseLevel; - lastLevel = tObj->BaseLevel; - log2Width = tObj->Image[firstLevel]->WidthLog2; - log2Height = tObj->Image[firstLevel]->HeightLog2; - log2Depth = tObj->Image[firstLevel]->DepthLog2; - break; - case GL_TEXTURE_RECTANGLE_NV: - firstLevel = lastLevel = 0; - log2Width = log2Height = 1; /* ? */ - log2Depth = 0; - break; - default: - return; - } - - /* save these values */ - t->base.firstLevel = firstLevel; - t->base.lastLevel = lastLevel; - numLevels = lastLevel - firstLevel + 1; - - if (R200_DEBUG & DEBUG_TEXTURE) - fprintf(stderr, - "%s: firstLevel %d last Level %d w,h: %d,%d log(w,h) %d,%d\n", - __FUNCTION__, firstLevel, lastLevel, - tObj->Image[firstLevel]->Width, - tObj->Image[firstLevel]->Height, - tObj->Image[firstLevel]->WidthLog2, - tObj->Image[firstLevel]->HeightLog2); + driCalculateTextureFirstLastLevel( (driTextureObject *) t ); + log2Width = tObj->Image[t->base.firstLevel]->WidthLog2; + log2Height = tObj->Image[t->base.firstLevel]->HeightLog2; + log2Depth = tObj->Image[t->base.firstLevel]->DepthLog2; + numLevels = t->base.lastLevel - t->base.firstLevel + 1; assert(numLevels <= RADEON_MAX_TEXTURE_LEVELS); @@ -199,7 +147,7 @@ static void r200SetTexImages( r200ContextPtr rmesa, const struct gl_texture_image *texImage; GLuint size; - texImage = tObj->Image[i + firstLevel]; + texImage = tObj->Image[i + t->base.firstLevel]; if ( !texImage ) break; @@ -219,10 +167,12 @@ static void r200SetTexImages( r200ContextPtr rmesa, } assert(size > 0); - if (curOffset & 0x1f) { - /* align to 32-byte offset */ - curOffset = (curOffset + 0x1f) & ~0x1f; - } + + /* Align to 32-byte offset. It is faster to do this unconditionally + * (no branch penalty). + */ + + curOffset = (curOffset + 0x1f) & ~0x1f; t->image[0][i].x = curOffset % BLIT_WIDTH_BYTES; t->image[0][i].y = curOffset / BLIT_WIDTH_BYTES; @@ -305,17 +255,17 @@ static void r200SetTexImages( r200ContextPtr rmesa, (log2Height << R200_FACE_HEIGHT_4_SHIFT)); } - t->pp_txsize = (((tObj->Image[firstLevel]->Width - 1) << 0) | - ((tObj->Image[firstLevel]->Height - 1) << 16)); + t->pp_txsize = (((tObj->Image[t->base.firstLevel]->Width - 1) << 0) | + ((tObj->Image[t->base.firstLevel]->Height - 1) << 16)); /* Only need to round to nearest 32 for textures, but the blitter * requires 64-byte aligned pitches, and we may/may not need the * blitter. NPOT only! */ if (baseImage->IsCompressed) - t->pp_txpitch = (tObj->Image[firstLevel]->Width + 63) & ~(63); + t->pp_txpitch = (tObj->Image[t->base.firstLevel]->Width + 63) & ~(63); else - t->pp_txpitch = ((tObj->Image[firstLevel]->Width * baseImage->TexFormat->TexelBytes) + 63) & ~(63); + t->pp_txpitch = ((tObj->Image[t->base.firstLevel]->Width * baseImage->TexFormat->TexelBytes) + 63) & ~(63); t->pp_txpitch -= 32; t->dirty_state = TEX_ALL; @@ -1561,6 +1511,12 @@ static GLboolean enable_tex_3d( GLcontext *ctx, int unit ) ASSERT(tObj->Target == GL_TEXTURE_3D); + /* R100 & R200 do not support mipmaps for 3D textures. + */ + if ( (tObj->MinFilter != GL_NEAREST) && (tObj->MinFilter != GL_LINEAR) ) { + return GL_FALSE; + } + if ( t->base.dirty_images[0] ) { R200_FIREVERTICES( rmesa ); r200SetTexImages( rmesa, tObj ); @@ -1633,7 +1589,7 @@ static GLboolean enable_tex_rect( GLcontext *ctx, int unit ) R200_FIREVERTICES( rmesa ); r200SetTexImages( rmesa, tObj ); r200UploadTexImages( rmesa, (r200TexObjPtr) tObj->DriverData, 0 ); - if ( !t->base.memBlock && !rmesa->prefer_agp_client_texturing ) + if ( !t->base.memBlock && !rmesa->prefer_gart_client_texturing ) return GL_FALSE; } diff --git a/src/mesa/drivers/dri/r200/r200_vtxfmt.c b/src/mesa/drivers/dri/r200/r200_vtxfmt.c index 824216eb350..2e742d4d04f 100644 --- a/src/mesa/drivers/dri/r200/r200_vtxfmt.c +++ b/src/mesa/drivers/dri/r200/r200_vtxfmt.c @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_vtxfmt.c,v 1.4 2003/05/06 23:52:08 daenzer Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the @@ -975,7 +974,7 @@ static void r200VtxFmtFlushVertices( GLcontext *ctx, GLuint flags ) */ -void r200VtxfmtInit( GLcontext *ctx ) +void r200VtxfmtInit( GLcontext *ctx, GLboolean useCodegen ) { r200ContextPtr rmesa = R200_CONTEXT( ctx ); GLvertexformat *vfmt = &(rmesa->vb.vtxfmt); @@ -1073,7 +1072,7 @@ void r200VtxfmtInit( GLcontext *ctx ) make_empty_list( &rmesa->vb.dfn_cache.MultiTexCoord1fARB ); make_empty_list( &rmesa->vb.dfn_cache.MultiTexCoord1fvARB ); - r200InitCodegen( &rmesa->vb.codegen ); + r200InitCodegen( &rmesa->vb.codegen, useCodegen ); } static void free_funcs( struct dynfn *l ) diff --git a/src/mesa/drivers/dri/r200/r200_vtxfmt.h b/src/mesa/drivers/dri/r200/r200_vtxfmt.h index fde3eca4678..39f0a10e4eb 100644 --- a/src/mesa/drivers/dri/r200/r200_vtxfmt.h +++ b/src/mesa/drivers/dri/r200/r200_vtxfmt.h @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_vtxfmt.h,v 1.1 2002/10/30 12:51:53 alanh Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the @@ -44,7 +43,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. extern void r200VtxfmtUpdate( GLcontext *ctx ); -extern void r200VtxfmtInit( GLcontext *ctx ); +extern void r200VtxfmtInit( GLcontext *ctx, GLboolean useCodegen ); extern void r200VtxfmtInvalidate( GLcontext *ctx ); extern void r200VtxfmtDestroy( GLcontext *ctx ); extern void r200VtxfmtInitChoosers( GLvertexformat *vfmt ); @@ -87,7 +86,7 @@ do { \ /* */ -void r200InitCodegen( struct dfn_generators *gen ); +void r200InitCodegen( struct dfn_generators *gen, GLboolean useCodegen ); void r200InitX86Codegen( struct dfn_generators *gen ); void r200InitSSECodegen( struct dfn_generators *gen ); diff --git a/src/mesa/drivers/dri/r200/r200_vtxfmt_c.c b/src/mesa/drivers/dri/r200/r200_vtxfmt_c.c index bdda60eea09..6f38fffc276 100644 --- a/src/mesa/drivers/dri/r200/r200_vtxfmt_c.c +++ b/src/mesa/drivers/dri/r200/r200_vtxfmt_c.c @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_vtxfmt_c.c,v 1.2 2002/12/16 16:18:56 dawes Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the @@ -865,7 +864,7 @@ static struct dynfn *codegen_noop( GLcontext *ctx, const int *key ) return 0; } -void r200InitCodegen( struct dfn_generators *gen ) +void r200InitCodegen( struct dfn_generators *gen, GLboolean useCodegen ) { gen->Vertex3f = codegen_noop; gen->Vertex3fv = codegen_noop; @@ -894,7 +893,7 @@ void r200InitCodegen( struct dfn_generators *gen ) gen->MultiTexCoord1fARB = codegen_noop; gen->MultiTexCoord1fvARB = codegen_noop; - if (!getenv("R200_NO_CODEGEN")) { + if (useCodegen) { #if defined(USE_X86_ASM) r200InitX86Codegen( gen ); #endif diff --git a/src/mesa/drivers/dri/r200/r200_vtxfmt_sse.c b/src/mesa/drivers/dri/r200/r200_vtxfmt_sse.c index 83eb3e13b78..2245bbcef1b 100644 --- a/src/mesa/drivers/dri/r200/r200_vtxfmt_sse.c +++ b/src/mesa/drivers/dri/r200/r200_vtxfmt_sse.c @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_vtxfmt_sse.c,v 1.1 2002/10/30 12:51:53 alanh Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the diff --git a/src/mesa/drivers/dri/r200/r200_vtxfmt_x86.c b/src/mesa/drivers/dri/r200/r200_vtxfmt_x86.c index a806eca0bb3..c4d8af85e16 100644 --- a/src/mesa/drivers/dri/r200/r200_vtxfmt_x86.c +++ b/src/mesa/drivers/dri/r200/r200_vtxfmt_x86.c @@ -1,6 +1,5 @@ -/* $XFree86$ */ -/************************************************************************** - +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_vtxfmt_x86.c,v 1.2 2002/12/16 16:18:56 dawes Exp $ */ +/* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. The Weather Channel (TM) funded Tungsten Graphics to develop the diff --git a/src/mesa/drivers/dri/r200/r200_vtxtmp_x86.S b/src/mesa/drivers/dri/r200/r200_vtxtmp_x86.S index 4980ce1bb76..56a4144e8e7 100644 --- a/src/mesa/drivers/dri/r200/r200_vtxtmp_x86.S +++ b/src/mesa/drivers/dri/r200/r200_vtxtmp_x86.S @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_vtxtmp_x86.S,v 1.1 2002/10/30 12:51:53 alanh Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_vtxtmp_x86.S,v 1.2 2002/11/07 18:31:59 tsi Exp $ */ /************************************************************************** Copyright 2002 Tungsten Graphics Inc., Cedar Park, Texas. @@ -32,16 +32,6 @@ x: .data .align 4 -GLOBL( _x86_Normal3fv) - movl 4(%esp), %eax /* load 'v' off stack */ - movl (%eax), %ecx /* load v[0] */ - movl 4(%eax), %edx /* load v[1] */ - movl 8(%eax), %eax /* load v[2] */ - movl %ecx, 0 /* store v[0] to current vertex */ - movl %edx, 4 /* store v[1] to current vertex */ - movl %eax, 8 /* store v[2] to current vertex */ - ret -GLOBL ( _x86_Normal3fv_end ) /* vertex 3f vertex size 4 @@ -218,19 +208,70 @@ GLOBL ( _x86_Vertex3fv ) .6: jmp *0 GLOBL ( _x86_Vertex3fv_end ) -/* - Normal 3f -*/ -GLOBL ( _x86_Normal3f ) - movl $0x12345678, %edx + +/** + * Generic handler for 2 float format data. This can be used for + * TexCoord2f and possibly other functions. + */ + +GLOBL ( _x86_Attribute2f ) + movl $0x0, %edx movl 4(%esp), %eax + movl 8(%esp), %ecx movl %eax, (%edx) - movl 8(%esp), %eax - movl %eax, 4(%edx) + movl %ecx, 4(%edx) + ret +GLOBL ( _x86_Attribute2f_end ) + + +/** + * Generic handler for 2 float vector format data. This can be used for + * TexCoord2fv and possibly other functions. + */ + +GLOBL( _x86_Attribute2fv) + movl 4(%esp), %eax /* load 'v' off stack */ + movl (%eax), %ecx /* load v[0] */ + movl 4(%eax), %eax /* load v[1] */ + movl %ecx, 0 /* store v[0] to current vertex */ + movl %eax, 4 /* store v[1] to current vertex */ + ret +GLOBL ( _x86_Attribute2fv_end ) + + +/** + * Generic handler for 3 float format data. This can be used for + * Normal3f, Color3f (when the color target is also float), or + * TexCoord3f. + */ + +GLOBL ( _x86_Attribute3f ) + movl 4(%esp), %ecx + movl 8(%esp), %edx movl 12(%esp), %eax - movl %eax, 8(%edx) + movl %ecx, 0 + movl %edx, 4 + movl %eax, 8 ret -GLOBL ( _x86_Normal3f_end ) +GLOBL ( _x86_Attribute3f_end ) + +/** + * Generic handler for 3 float vector format data. This can be used for + * Normal3f, Color3f (when the color target is also float), or + * TexCoord3f. + */ + +GLOBL( _x86_Attribute3fv) + movl 4(%esp), %eax /* load 'v' off stack */ + movl (%eax), %ecx /* load v[0] */ + movl 4(%eax), %edx /* load v[1] */ + movl 8(%eax), %eax /* load v[2] */ + movl %ecx, 0 /* store v[0] to current vertex */ + movl %edx, 4 /* store v[1] to current vertex */ + movl %eax, 8 /* store v[2] to current vertex */ + ret +GLOBL ( _x86_Attribute3fv_end ) + /* Color 4ubv_ub @@ -290,69 +331,13 @@ GLOBL( _x86_Color4ub_ub ) ret GLOBL( _x86_Color4ub_ub_end ) -/* - Color3fv_3f -*/ -GLOBL( _x86_Color3fv_3f ) - movl 4(%esp), %eax - movl $0, %edx - movl (%eax), %ecx - movl %ecx, (%edx) - movl 4(%eax), %ecx - movl %ecx, 4(%edx) - movl 8(%eax), %ecx - movl %ecx, 8(%edx) - ret -GLOBL( _x86_Color3fv_3f_end ) - -/* - Color3f_3f -*/ -GLOBL( _x86_Color3f_3f ) - movl $0x12345678, %edx - movl 4(%esp), %eax - movl %eax, (%edx) - movl 8(%esp,1), %eax - movl %eax, 4(%edx) - movl 12(%esp), %eax - movl %eax, 8(%edx) - ret -GLOBL( _x86_Color3f_3f_end ) /* - TexCoord2fv + MultiTexCoord2fv st0/st1 */ - -GLOBL( _x86_TexCoord2fv ) - movl 4(%esp), %eax - movl $0x12345678, %edx - movl (%eax), %ecx - movl 4(%eax), %eax - movl %ecx, (%edx) - movl %eax, 4(%edx) - ret - -GLOBL( _x86_TexCoord2fv_end ) -/* - TexCoord2f -*/ -GLOBL( _x86_TexCoord2f ) - movl $0x12345678, %edx +GLOBL( _x86_MultiTexCoord2fv ) movl 4(%esp), %eax movl 8(%esp), %ecx - movl %eax, (%edx) - movl %ecx, 4(%edx) - ret -GLOBL( _x86_TexCoord2f_end ) - -/* - MultiTexCoord2fvARB st0/st1 -*/ -GLOBL( _x86_MultiTexCoord2fvARB ) - - movl 4(%esp), %eax - movl 8(%esp), %ecx - sub $0x84c0, %eax and $1, %eax movl (%ecx), %edx shl $3, %eax @@ -360,15 +345,15 @@ GLOBL( _x86_MultiTexCoord2fvARB ) movl %edx, 0xdeadbeef(%eax) movl %ecx, 0xdeadbeef(%eax) ret -GLOBL( _x86_MultiTexCoord2fvARB_end ) +GLOBL( _x86_MultiTexCoord2fv_end ) + /* - MultiTexCoord2fvARB + MultiTexCoord2fv */ -GLOBL( _x86_MultiTexCoord2fvARB_2 ) +GLOBL( _x86_MultiTexCoord2fv_2 ) movl 4(%esp,1), %eax movl 8(%esp,1), %ecx - sub $0x84c0, %eax and $0x1, %eax movl 0(,%eax,4), %edx movl (%ecx), %eax @@ -376,35 +361,132 @@ GLOBL( _x86_MultiTexCoord2fvARB_2 ) movl 4(%ecx), %eax movl %eax, 4(%edx) ret - -GLOBL( _x86_MultiTexCoord2fvARB_2_end ) +GLOBL( _x86_MultiTexCoord2fv_2_end ) /* - MultiTexCoord2fARB st0/st1 + MultiTexCoord2f st0/st1 */ -GLOBL( _x86_MultiTexCoord2fARB ) +GLOBL( _x86_MultiTexCoord2f ) movl 4(%esp), %eax movl 8(%esp), %edx - sub $0x84c0, %eax movl 12(%esp), %ecx and $1, %eax shl $3, %eax movl %edx, 0xdeadbeef(%eax) movl %ecx, 0xdeadbeef(%eax) ret -GLOBL( _x86_MultiTexCoord2fARB_end ) +GLOBL( _x86_MultiTexCoord2f_end ) /* - MultiTexCoord2fARB + MultiTexCoord2f */ -GLOBL( _x86_MultiTexCoord2fARB_2 ) +GLOBL( _x86_MultiTexCoord2f_2 ) movl 4(%esp), %eax movl 8(%esp), %edx - sub $0x84c0, %eax movl 12(%esp,1), %ecx and $1,%eax movl 0(,%eax,4), %eax movl %edx, (%eax) movl %ecx, 4(%eax) ret -GLOBL( _x86_MultiTexCoord2fARB_2_end ) +GLOBL( _x86_MultiTexCoord2f_2_end ) + +/** + * This can be used as a template for either Color3fv (when the color + * target is also a 3f) or Normal3fv. + */ + +GLOBL( _sse_Attribute3fv ) + movl 4(%esp), %eax + movlps (%eax), %xmm0 + movl 8(%eax), %eax + movlps %xmm0, 0 + movl %eax, 8 + ret +GLOBL( _sse_Attribute3fv_end ) + +/** + * This can be used as a template for either Color3f (when the color + * target is also a 3f) or Normal3f. + */ + +GLOBL( _sse_Attribute3f ) + movlps 4(%esp), %xmm0 + movl 12(%esp), %eax + movlps %xmm0, 0 + movl %eax, 8 + ret +GLOBL( _sse_Attribute3f_end ) + + +/** + * Generic handler for 2 float vector format data. This can be used for + * TexCoord2fv and possibly other functions. + */ + +GLOBL( _sse_Attribute2fv ) + movl 4(%esp), %eax + movlps (%eax), %xmm0 + movlps %xmm0, 0 + ret +GLOBL( _sse_Attribute2fv_end ) + + +/** + * Generic handler for 2 float format data. This can be used for + * TexCoord2f and possibly other functions. + */ + +GLOBL( _sse_Attribute2f ) + movlps 4(%esp), %xmm0 + movlps %xmm0, 0 + ret +GLOBL( _sse_Attribute2f_end ) + +/* + MultiTexCoord2fv st0/st1 +*/ +GLOBL( _sse_MultiTexCoord2fv ) + movl 4(%esp), %eax + movl 8(%esp), %ecx + and $1, %eax + movlps (%ecx), %xmm0 + movlps %xmm0, 0xdeadbeef(,%eax,8) + ret +GLOBL( _sse_MultiTexCoord2fv_end ) + +/* + MultiTexCoord2fv +*/ +GLOBL( _sse_MultiTexCoord2fv_2 ) + movl 4(%esp), %eax + movl 8(%esp), %ecx + and $0x1, %eax + movl 0(,%eax,4), %edx + movlps (%ecx), %xmm0 + movlps %xmm0, (%edx) + ret +GLOBL( _sse_MultiTexCoord2fv_2_end ) + +/* + MultiTexCoord2f st0/st1 +*/ +GLOBL( _sse_MultiTexCoord2f ) + movl 4(%esp), %eax + and $1, %eax + movlps 8(%esp), %xmm0 + movlps %xmm0, 0xdeadbeef(,%eax,8) + ret +GLOBL( _sse_MultiTexCoord2f_end ) + +/* + MultiTexCoord2f +*/ +GLOBL( _sse_MultiTexCoord2f_2 ) + movl 4(%esp), %eax + movlps 8(%esp), %xmm0 + and $1,%eax + movl 0(,%eax,4), %eax + movlps %xmm0, (%eax) + ret +GLOBL( _sse_MultiTexCoord2f_2_end ) diff --git a/src/mesa/drivers/dri/radeon/Makefile.X11 b/src/mesa/drivers/dri/radeon/Makefile.X11 index b73abe8f51b..7660fb0d0db 100644 --- a/src/mesa/drivers/dri/radeon/Makefile.X11 +++ b/src/mesa/drivers/dri/radeon/Makefile.X11 @@ -1,4 +1,4 @@ -# $Id: Makefile.X11,v 1.1 2003/08/22 20:11:45 brianp Exp $ +# $Id: Makefile.X11,v 1.1.2.1 2003/11/21 15:49:32 keithw Exp $ # Mesa 3-D graphics library # Version: 5.0 @@ -49,7 +49,8 @@ DRIVER_SOURCES = radeon_context.c \ ../common/mm.c \ ../common/utils.c \ ../common/texmem.c \ - ../common/vblank.c + ../common/vblank.c \ + ../common/xmlconfig.c SUBSET_DRIVER_SOURCES = \ radeon_subset_bitmap.c \ @@ -132,6 +133,10 @@ $(TARGET): $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile.X11 rm -f $(TOP)/lib/$(TARGET) && \ install $(TARGET) $(TOP)/lib/$(TARGET) +$(TOP)/lib/$(TARGET): $(TARGET) + rm -f $(TOP)/lib/$(TARGET) && \ + install $(TARGET) $(TOP)/lib/$(TARGET) + # Run 'make -f Makefile.X11 dep' to update the dependencies if you change # what's included by any source file. depend: $(C_SOURCES) $(ASM_SOURCES) diff --git a/src/mesa/drivers/dri/radeon/radeon_context.c b/src/mesa/drivers/dri/radeon/radeon_context.c index 7ade6c3951b..02bfb23ca59 100644 --- a/src/mesa/drivers/dri/radeon/radeon_context.c +++ b/src/mesa/drivers/dri/radeon/radeon_context.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_context.c,v 1.7 2003/02/08 21:26:45 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_context.c,v 1.9 2003/09/24 02:43:12 dawes Exp $ */ /************************************************************************** Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and @@ -69,6 +69,25 @@ int RADEON_DEBUG = (0); #endif +/* Radeon configuration + */ +#include "xmlpool.h" + +const char __driConfigOptions[] = +DRI_CONF_BEGIN + DRI_CONF_SECTION_PERFORMANCE + DRI_CONF_TCL_MODE(DRI_CONF_TCL_CODEGEN) + DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS) + DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0) + DRI_CONF_SECTION_END + DRI_CONF_SECTION_QUALITY + DRI_CONF_PREFERRED_BPT(0,"0,16,32") + DRI_CONF_SECTION_END + DRI_CONF_SECTION_DEBUG + DRI_CONF_NO_RAST(false) + DRI_CONF_SECTION_END +DRI_CONF_END; +const GLuint __driNConfigOptions = 5; /* Return the width and height of the given buffer. */ @@ -102,8 +121,7 @@ static const GLubyte *radeonGetString( GLcontext *ctx, GLenum name ) offset = driGetRendererString( buffer, "Radeon", DRIVER_DATE, agp_mode ); - sprintf( & buffer[ offset ], "%s %sTCL", - ( rmesa->dri.drmMinor < 3 ) ? " DRM-COMPAT" : "", + sprintf( & buffer[ offset ], "%sTCL", !(rmesa->TclFallback & RADEON_TCL_FALLBACK_TCL_DISABLE) ? "" : "NO-" ); @@ -229,6 +247,7 @@ radeonCreateContext( const __GLcontextModes *glVisual, radeonContextPtr rmesa; GLcontext *ctx, *shareCtx; int i; + int tcl_mode, fthrottle_mode, preferred_bpt; assert(glVisual); assert(driContextPriv); @@ -258,13 +277,11 @@ radeonCreateContext( const __GLcontextModes *glVisual, rmesa->dri.hwContext = driContextPriv->hHWContext; rmesa->dri.hwLock = &sPriv->pSAREA->lock; rmesa->dri.fd = sPriv->fd; + rmesa->dri.drmMinor = sPriv->drmMinor; - /* If we don't have 1.3, fallback to the 1.1 interfaces. - */ - if (getenv("RADEON_COMPAT") || sPriv->drmMinor < 3 ) - rmesa->dri.drmMinor = 1; - else - rmesa->dri.drmMinor = sPriv->drmMinor; + /* Parse configuration files */ + driParseConfigFiles (&rmesa->optionCache, &screen->optionCache, + screen->driScreen->myNum, "radeon"); rmesa->radeonScreen = screen; rmesa->sarea = (RADEONSAREAPrivPtr)((GLubyte *)sPriv->pSAREA + @@ -291,6 +308,9 @@ radeonCreateContext( const __GLcontextModes *glVisual, driSetTextureSwapCounterLocation( rmesa->texture_heaps[i], & rmesa->c_textureSwaps ); } + preferred_bpt = driQueryOptioni (&rmesa->optionCache, "preferred_bpt"); + rmesa->default32BitTextures = + ( ( preferred_bpt == 0 && screen->cpp == 4 ) || preferred_bpt == 32 ); rmesa->swtcl.RenderIndex = ~0; rmesa->lost_context = 1; @@ -338,7 +358,7 @@ radeonCreateContext( const __GLcontextModes *glVisual, MIN2( ctx->Const.MaxArrayLockSize, RADEON_BUFFER_SIZE / RADEON_MAX_TCL_VERTSIZE ); - rmesa->boxes = (getenv("LIBGL_PERFORMANCE_BOXES") != NULL); + rmesa->boxes = 0; /* Initialize the software rasterizer and helper modules. */ @@ -395,22 +415,24 @@ radeonCreateContext( const __GLcontextModes *glVisual, _mesa_vector4f_alloc( &rmesa->tcl.ObjClean, 0, ctx->Const.MaxArrayLockSize, 32 ); + fthrottle_mode = driQueryOptioni(&rmesa->optionCache, "fthrottle_mode"); rmesa->iw.irq_seq = -1; rmesa->irqsEmitted = 0; - rmesa->do_irqs = (rmesa->radeonScreen->irq && !getenv("RADEON_NO_IRQS")); + rmesa->do_irqs = (rmesa->radeonScreen->irq != 0 && + fthrottle_mode == DRI_CONF_FTHROTTLE_IRQS); - rmesa->do_usleeps = !getenv("RADEON_NO_USLEEPS"); - - rmesa->vblank_flags = (rmesa->do_irqs) - ? driGetDefaultVBlankFlags() : VBLANK_FLAG_NO_IRQ; + rmesa->do_usleeps = (fthrottle_mode == DRI_CONF_FTHROTTLE_USLEEPS); + rmesa->vblank_flags = (rmesa->radeonScreen->irq != 0) + ? driGetDefaultVBlankFlags(&rmesa->optionCache) : VBLANK_FLAG_NO_IRQ; #ifndef _SOLO - rmesa->get_ust = (PFNGLXGETUSTPROC) glXGetProcAddress( "__glXGetUST" ); - if ( rmesa->get_ust == NULL ) -#endif - { + rmesa->get_ust = (PFNGLXGETUSTPROC) glXGetProcAddress( (const GLubyte *) "__glXGetUST" ); + if ( rmesa->get_ust == NULL ) { rmesa->get_ust = get_ust_nop; } +#else + rmesa->get_ust = get_ust_nop; +#endif (*rmesa->get_ust)( & rmesa->swap_ust ); @@ -420,25 +442,20 @@ radeonCreateContext( const __GLcontextModes *glVisual, debug_control ); #endif - if (getenv("RADEON_NO_RAST")) { + tcl_mode = driQueryOptioni(&rmesa->optionCache, "tcl_mode"); + if (driQueryOptionb(&rmesa->optionCache, "no_rast")) { fprintf(stderr, "disabling 3D acceleration\n"); FALLBACK(rmesa, RADEON_FALLBACK_DISABLE, 1); - } - else if (getenv("RADEON_TCL_FORCE_ENABLE")) { - fprintf(stderr, "Enabling TCL support... this will probably crash\n"); - fprintf(stderr, " your card if it isn't capable of TCL!\n"); - rmesa->radeonScreen->chipset |= RADEON_CHIPSET_TCL; - } else if (getenv("RADEON_TCL_FORCE_DISABLE") || - rmesa->dri.drmMinor < 3 || - !(rmesa->radeonScreen->chipset & RADEON_CHIPSET_TCL)) { + } else if (tcl_mode == DRI_CONF_TCL_SW || + !(rmesa->radeonScreen->chipset & RADEON_CHIPSET_TCL)) { rmesa->radeonScreen->chipset &= ~RADEON_CHIPSET_TCL; fprintf(stderr, "disabling TCL support\n"); TCL_FALLBACK(rmesa->glCtx, RADEON_TCL_FALLBACK_TCL_DISABLE, 1); } if (rmesa->radeonScreen->chipset & RADEON_CHIPSET_TCL) { - if (!getenv("RADEON_NO_VTXFMT")) - radeonVtxfmtInit( ctx ); + if (tcl_mode >= DRI_CONF_TCL_VTXFMT) + radeonVtxfmtInit( ctx, tcl_mode >= DRI_CONF_TCL_CODEGEN ); _tnl_need_dlist_norm_lengths( ctx, GL_FALSE ); } @@ -481,9 +498,11 @@ void radeonDestroyContext( __DRIcontextPrivate *driContextPriv ) radeonFlushCmdBuf( rmesa, __FUNCTION__ ); } - if (!rmesa->TclFallback & RADEON_TCL_FALLBACK_TCL_DISABLE) - if (!getenv("RADEON_NO_VTXFMT")) + if (!(rmesa->TclFallback & RADEON_TCL_FALLBACK_TCL_DISABLE)) { + int tcl_mode = driQueryOptioni(&rmesa->optionCache, "tcl_mode"); + if (tcl_mode >= DRI_CONF_TCL_VTXFMT) radeonVtxfmtDestroy( rmesa->glCtx ); + } /* free the Mesa context */ rmesa->glCtx->DriverCtx = NULL; @@ -502,8 +521,7 @@ void radeonDestroyContext( __DRIcontextPrivate *driContextPriv ) */ int i; - /* this assert is not correct, default textures are always on swap list - assert( is_empty_list( & rmesa->swapped ) ); */ + assert( is_empty_list( & rmesa->swapped ) ); for ( i = 0 ; i < rmesa->nr_heaps ; i++ ) { driDestroyTextureHeap( rmesa->texture_heaps[ i ] ); @@ -511,6 +529,9 @@ void radeonDestroyContext( __DRIcontextPrivate *driContextPriv ) } } + /* free the option cache */ + driDestroyOptionCache (&rmesa->optionCache); + FREE( rmesa ); } } @@ -561,11 +582,12 @@ radeonMakeCurrent( __DRIcontextPrivate *driContextPriv, fprintf(stderr, "%s ctx %p\n", __FUNCTION__, newCtx->glCtx); if ( newCtx->dri.drawable != driDrawPriv ) { + driDrawableInitVBlank( driDrawPriv, newCtx->vblank_flags ); newCtx->dri.drawable = driDrawPriv; radeonUpdateWindow( newCtx->glCtx ); radeonUpdateViewportOffset( newCtx->glCtx ); } - + _mesa_make_current2( newCtx->glCtx, (GLframebuffer *) driDrawPriv->driverPrivate, (GLframebuffer *) driReadPriv->driverPrivate ); diff --git a/src/mesa/drivers/dri/radeon/radeon_context.h b/src/mesa/drivers/dri/radeon/radeon_context.h index 113d1de5b20..b0c3c1919e1 100644 --- a/src/mesa/drivers/dri/radeon/radeon_context.h +++ b/src/mesa/drivers/dri/radeon/radeon_context.h @@ -446,7 +446,7 @@ struct radeon_dma_buffer { drmBufPtr buf; }; -#define GET_START(rvb) (rmesa->radeonScreen->agp_buffer_offset + \ +#define GET_START(rvb) (rmesa->radeonScreen->gart_buffer_offset + \ (rvb)->address - rmesa->dma.buf0_address + \ (rvb)->start) @@ -697,6 +697,7 @@ struct radeon_context { unsigned nr_heaps; driTexHeap * texture_heaps[ RADEON_NR_TEX_HEAPS ]; driTextureObject swapped; + GLboolean default32BitTextures; /* Rasterization and vertex state: @@ -770,6 +771,10 @@ struct radeon_context { */ struct radeon_dri_mirror dri; + /* Configuration cache + */ + driOptionCache optionCache; + /* Performance counters */ diff --git a/src/mesa/drivers/dri/radeon/radeon_ioctl.c b/src/mesa/drivers/dri/radeon/radeon_ioctl.c index a388720aba1..4e1f451e70a 100644 --- a/src/mesa/drivers/dri/radeon/radeon_ioctl.c +++ b/src/mesa/drivers/dri/radeon/radeon_ioctl.c @@ -34,8 +34,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * Gareth Hughes <[email protected]> * Keith Whitwell <[email protected]> */ + #include <sched.h> -#include <errno.h> +#include <errno.h> #include "glheader.h" #include "imports.h" @@ -162,7 +163,6 @@ extern void radeonEmitVbufPrim( radeonContextPtr rmesa, drmRadeonCmdHeader *cmd; - assert(rmesa->dri.drmMinor >= 3); assert(!(primitive & RADEON_CP_VC_CNTL_PRIM_WALK_IND)); radeonEmitState( rmesa ); @@ -254,7 +254,6 @@ GLushort *radeonAllocEltsOpenEnded( radeonContextPtr rmesa, if (RADEON_DEBUG & DEBUG_IOCTL) fprintf(stderr, "%s %d\n", __FUNCTION__, min_nr); - assert(rmesa->dri.drmMinor >= 3); assert((primitive & RADEON_CP_VC_CNTL_PRIM_WALK_IND)); radeonEmitState( rmesa ); @@ -317,7 +316,6 @@ void radeonEmitVertexAOS( radeonContextPtr rmesa, rmesa->ioctl.vertex_offset = offset; #else drmRadeonCmdHeader *cmd; - assert(rmesa->dri.drmMinor >= 3); if (RADEON_DEBUG & (DEBUG_PRIMS|DEBUG_IOCTL)) fprintf(stderr, "%s: vertex_size 0x%x offset 0x%x \n", @@ -356,7 +354,6 @@ void radeonEmitAOS( radeonContextPtr rmesa, if (RADEON_DEBUG & DEBUG_IOCTL) fprintf(stderr, "%s\n", __FUNCTION__); - assert(rmesa->dri.drmMinor >= 3); cmd = (drmRadeonCmdHeader *)radeonAllocCmdBuf( rmesa, sz * sizeof(int), __FUNCTION__ ); @@ -531,8 +528,6 @@ void radeonFlushCmdBuf( radeonContextPtr rmesa, const char *caller ) int ret; - assert (rmesa->dri.drmMinor >= 3); - LOCK_HARDWARE( rmesa ); ret = radeonFlushCmdBufLocked( rmesa, caller ); @@ -691,9 +686,6 @@ void radeonAllocDmaRegion( radeonContextPtr rmesa, rmesa->dma.current.ptr += bytes; /* bug - if alignment > 7 */ rmesa->dma.current.start = rmesa->dma.current.ptr = (rmesa->dma.current.ptr + 0x7) & ~0x7; - - if ( rmesa->dri.drmMinor < 3 ) - radeonRefillCurrentDmaRegion( rmesa ); } void radeonAllocDmaRegionVerts( radeonContextPtr rmesa, @@ -719,7 +711,7 @@ static CARD32 radeonGetLastFrame (radeonContextPtr rmesa) drmRadeonGetParam gp; gp.param = RADEON_PARAM_LAST_FRAME; - gp.value = &frame; + gp.value = (int *)&frame; ret = drmCommandWriteRead( rmesa->dri.fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp) ); } @@ -1012,7 +1004,7 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask, GLboolean all, drmRadeonGetParam gp; gp.param = RADEON_PARAM_LAST_CLEAR; - gp.value = &clear; + gp.value = (int *)&clear; ret = drmCommandWriteRead( rmesa->dri.fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp) ); } else @@ -1154,13 +1146,11 @@ void radeonFlush( GLcontext *ctx ) if (rmesa->dma.flush) rmesa->dma.flush( rmesa ); - if (rmesa->dri.drmMinor >= 3) { - if (!is_empty_list(&rmesa->hw.dirty)) - radeonEmitState( rmesa ); + if (!is_empty_list(&rmesa->hw.dirty)) + radeonEmitState( rmesa ); - if (rmesa->store.cmd_used) - radeonFlushCmdBuf( rmesa, __FUNCTION__ ); - } + if (rmesa->store.cmd_used) + radeonFlushCmdBuf( rmesa, __FUNCTION__ ); } /* Make sure all commands have been sent to the hardware and have diff --git a/src/mesa/drivers/dri/radeon/radeon_lock.c b/src/mesa/drivers/dri/radeon/radeon_lock.c index 96a4f9d1123..daf001e048a 100644 --- a/src/mesa/drivers/dri/radeon/radeon_lock.c +++ b/src/mesa/drivers/dri/radeon/radeon_lock.c @@ -53,8 +53,6 @@ radeonUpdatePageFlipping( radeonContextPtr rmesa ) { int use_back; - if (rmesa->dri.drmMinor < 3) - return; rmesa->doPageFlip = rmesa->sarea->pfAllowPageFlip; diff --git a/src/mesa/drivers/dri/radeon/radeon_maos.h b/src/mesa/drivers/dri/radeon/radeon_maos.h index 7e2bd643d34..8c8aa15c59f 100644 --- a/src/mesa/drivers/dri/radeon/radeon_maos.h +++ b/src/mesa/drivers/dri/radeon/radeon_maos.h @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_maos.h,v 1.1 2002/10/30 12:51:55 alanh Exp $ */ /************************************************************************** Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and diff --git a/src/mesa/drivers/dri/radeon/radeon_maos_arrays.c b/src/mesa/drivers/dri/radeon/radeon_maos_arrays.c index cec05a89d7e..fc55b89b030 100644 --- a/src/mesa/drivers/dri/radeon/radeon_maos_arrays.c +++ b/src/mesa/drivers/dri/radeon/radeon_maos_arrays.c @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_maos_arrays.c,v 1.1 2002/10/30 12:51:55 alanh Exp $ */ /************************************************************************** Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and @@ -409,7 +409,7 @@ static void emit_tex_vector( GLcontext *ctx, -/* Emit any changed arrays to new agp memory, re-emit a packet to +/* Emit any changed arrays to new GART memory, re-emit a packet to * update the arrays. */ void radeonEmitArrays( GLcontext *ctx, GLuint inputs ) diff --git a/src/mesa/drivers/dri/radeon/radeon_maos_verts.c b/src/mesa/drivers/dri/radeon/radeon_maos_verts.c index 09e8a355798..5e63e6e880f 100644 --- a/src/mesa/drivers/dri/radeon/radeon_maos_verts.c +++ b/src/mesa/drivers/dri/radeon/radeon_maos_verts.c @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_maos_verts.c,v 1.1 2002/10/30 12:51:55 alanh Exp $ */ /************************************************************************** Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and diff --git a/src/mesa/drivers/dri/radeon/radeon_sanity.c b/src/mesa/drivers/dri/radeon/radeon_sanity.c index e3b37bf3de9..3bc15bdcb47 100644 --- a/src/mesa/drivers/dri/radeon/radeon_sanity.c +++ b/src/mesa/drivers/dri/radeon/radeon_sanity.c @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_sanity.c,v 1.1 2002/10/30 12:51:55 alanh Exp $ */ /************************************************************************** Copyright 2002 ATI Technologies Inc., Ontario, Canada, and @@ -32,7 +32,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. * Keith Whitwell <[email protected]> * */ -#include <errno.h> +#include <errno.h> #include "glheader.h" diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.c b/src/mesa/drivers/dri/radeon/radeon_screen.c index ec8ed42d649..8f2042af13f 100644 --- a/src/mesa/drivers/dri/radeon/radeon_screen.c +++ b/src/mesa/drivers/dri/radeon/radeon_screen.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_screen.c,v 1.6 2002/12/16 16:18:58 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_screen.c,v 1.7 2003/03/26 20:43:51 tsi Exp $ */ /************************************************************************** Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and @@ -48,7 +48,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #ifndef _SOLO #include "glxextensions.h" -#endif +#endif #if 1 /* Including xf86PciInfo.h introduces a bunch of errors... @@ -89,32 +89,26 @@ radeonScreenPtr radeonCreateScreen( __DRIscreenPrivate *sPriv ) return NULL; } - if ( sPriv->drmMinor < 3 || - getenv("RADEON_COMPAT")) { - fprintf( stderr, "Radeon DRI driver:\n\t" - "Compatibility mode for DRM driver version %d.%d.%d\n\t" - "TCL will be disabled, expect reduced performance\n\t" - "(prefer DRM radeon.o 1.3.x or newer)\n\t", - sPriv->drmMajor, sPriv->drmMinor, sPriv->drmPatch ); - } - + /* parse information in __driConfigOptions */ + driParseOptionInfo (&screen->optionCache); /* This is first since which regions we map depends on whether or * not we are using a PCI card. */ screen->IsPCI = dri_priv->IsPCI; - if (sPriv->drmMinor >= 3) { + { int ret; drmRadeonGetParam gp; - gp.param = RADEON_PARAM_AGP_BUFFER_OFFSET; - gp.value = &screen->agp_buffer_offset; + gp.param = RADEON_PARAM_GART_BUFFER_OFFSET; + gp.value = &screen->gart_buffer_offset; ret = drmCommandWriteRead( sPriv->fd, DRM_RADEON_GETPARAM, &gp, sizeof(gp)); if (ret) { - fprintf(stderr, "drmRadeonGetParam (RADEON_PARAM_AGP_BUFFER_OFFSET): %d\n", ret); + FREE( screen ); + fprintf(stderr, "drmRadeonGetParam (RADEON_PARAM_GART_BUFFER_OFFSET): %d\n", ret); return NULL; } @@ -166,20 +160,26 @@ radeonScreenPtr radeonCreateScreen( __DRIscreenPrivate *sPriv ) return NULL; } - if ( !screen->IsPCI ) { - screen->agpTextures.handle = dri_priv->agpTexHandle; - screen->agpTextures.size = dri_priv->agpTexMapSize; + if ( dri_priv->gartTexHandle && dri_priv->gartTexMapSize ) { + unsigned char *RADEONMMIO = screen->mmio.map; + + screen->gartTextures.handle = dri_priv->gartTexHandle; + screen->gartTextures.size = dri_priv->gartTexMapSize; if ( drmMap( sPriv->fd, - screen->agpTextures.handle, - screen->agpTextures.size, - (drmAddressPtr)&screen->agpTextures.map ) ) { + screen->gartTextures.handle, + screen->gartTextures.size, + (drmAddressPtr)&screen->gartTextures.map ) ) { drmUnmapBufs( screen->buffers ); drmUnmap( screen->status.map, screen->status.size ); drmUnmap( screen->mmio.map, screen->mmio.size ); FREE( screen ); - __driUtilMessage("%s: IsPCI failed\n", __FUNCTION__); + __driUtilMessage("%s: drmMap failed for GART texture area\n", __FUNCTION__); return NULL; } + + screen->gart_texture_offset = dri_priv->gartTexOffset + ( screen->IsPCI + ? INREG( RADEON_AIC_LO_ADDR ) + : ( ( INREG( RADEON_MC_AGP_LOCATION ) & 0x0ffffU ) << 16 ) ); } screen->chipset = 0; @@ -215,21 +215,36 @@ radeonScreenPtr radeonCreateScreen( __DRIscreenPrivate *sPriv ) screen->logTexGranularity[RADEON_CARD_HEAP] = dri_priv->log2TexGran; - if ( screen->IsPCI - || getenv( "RADEON_AGPTEXTURING_FORCE_DISABLE" ) ) { + if ( !screen->gartTextures.map + || getenv( "RADEON_GARTTEXTURING_FORCE_DISABLE" ) ) { screen->numTexHeaps = RADEON_NR_TEX_HEAPS - 1; - screen->texOffset[RADEON_AGP_HEAP] = 0; - screen->texSize[RADEON_AGP_HEAP] = 0; - screen->logTexGranularity[RADEON_AGP_HEAP] = 0; + screen->texOffset[RADEON_GART_HEAP] = 0; + screen->texSize[RADEON_GART_HEAP] = 0; + screen->logTexGranularity[RADEON_GART_HEAP] = 0; } else { screen->numTexHeaps = RADEON_NR_TEX_HEAPS; - screen->texOffset[RADEON_AGP_HEAP] = - dri_priv->agpTexOffset + RADEON_AGP_TEX_OFFSET; - screen->texSize[RADEON_AGP_HEAP] = dri_priv->agpTexMapSize; - screen->logTexGranularity[RADEON_AGP_HEAP] = - dri_priv->log2AGPTexGran; + screen->texOffset[RADEON_GART_HEAP] = screen->gart_texture_offset; + screen->texSize[RADEON_GART_HEAP] = dri_priv->gartTexMapSize; + screen->logTexGranularity[RADEON_GART_HEAP] = + dri_priv->log2GARTTexGran; } +#ifndef _SOLO + if ( driCompareGLXAPIVersion( 20030813 ) >= 0 ) { + PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension = + (PFNGLXSCRENABLEEXTENSIONPROC) glXGetProcAddress( (const GLubyte *) "__glXScrEnableExtension" ); + void * const psc = sPriv->psc->screenConfigs; + + if ( glx_enable_extension != NULL ) { + if ( screen->irq != 0 ) { + (*glx_enable_extension)( psc, "GLX_SGI_swap_control" ); + (*glx_enable_extension)( psc, "GLX_SGI_video_sync" ); + (*glx_enable_extension)( psc, "GLX_MESA_swap_control" ); + } + (*glx_enable_extension)( psc, "GLX_MESA_swap_frame_usage" ); + } + } +#endif screen->driScreen = sPriv; screen->sarea_priv_offset = dri_priv->sarea_priv_offset; return screen; @@ -244,14 +259,16 @@ void radeonDestroyScreen( __DRIscreenPrivate *sPriv ) if (!screen) return; - if ( !screen->IsPCI ) { - drmUnmap( screen->agpTextures.map, - screen->agpTextures.size ); + if ( screen->gartTextures.map ) { + drmUnmap( screen->gartTextures.map, screen->gartTextures.size ); } drmUnmapBufs( screen->buffers ); drmUnmap( screen->status.map, screen->status.size ); drmUnmap( screen->mmio.map, screen->mmio.size ); + /* free all option information */ + driDestroyOptionInfo (&screen->optionCache); + FREE( screen ); sPriv->private = NULL; } @@ -350,7 +367,7 @@ static struct __DriverAPIRec radeonAPI = { * The __driCreateScreen name is the symbol that libGL.so fetches. * Return: pointer to a __DRIscreenPrivate. */ -#ifndef _SOLO +#ifndef _SOLO void *__driCreateScreen(Display *dpy, int scrn, __DRIscreen *psc, int numConfigs, __GLXvisualConfig *config) { @@ -368,10 +385,13 @@ void *__driCreateScreen(struct DRIDriverRec *driver, } #endif - #ifndef _SOLO -/* This function is called by libGL.so as soon as libGL.so is loaded. +/** + * This function is called by libGL.so as soon as libGL.so is loaded. * This is where we'd register new extension functions with the dispatcher. + * + * \todo This interface has been deprecated, so we should probably remove + * this function before the next XFree86 release. */ void __driRegisterExtensions( void ) @@ -381,19 +401,18 @@ __driRegisterExtensions( void ) if ( driCompareGLXAPIVersion( 20030317 ) >= 0 ) { glx_enable_extension = (PFNGLXENABLEEXTENSIONPROC) - glXGetProcAddress( "__glXEnableExtension" ); + glXGetProcAddress( (const GLubyte *) "__glXEnableExtension" ); if ( glx_enable_extension != NULL ) { - glx_enable_extension( "GLX_SGI_swap_control", GL_FALSE ); - glx_enable_extension( "GLX_SGI_video_sync", GL_FALSE ); - glx_enable_extension( "GLX_MESA_swap_control", GL_FALSE ); - glx_enable_extension( "GLX_MESA_swap_frame_usage", GL_FALSE ); + (*glx_enable_extension)( "GLX_SGI_swap_control", GL_FALSE ); + (*glx_enable_extension)( "GLX_SGI_video_sync", GL_FALSE ); + (*glx_enable_extension)( "GLX_MESA_swap_control", GL_FALSE ); + (*glx_enable_extension)( "GLX_MESA_swap_frame_usage", GL_FALSE ); } } } #endif - /** * Get information about previous buffer swaps. */ diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.h b/src/mesa/drivers/dri/radeon/radeon_screen.h index 2c69d8657ae..133c3633c1b 100644 --- a/src/mesa/drivers/dri/radeon/radeon_screen.h +++ b/src/mesa/drivers/dri/radeon/radeon_screen.h @@ -48,6 +48,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "radeon_dri.h" #include "radeon_reg.h" #include "radeon_sarea.h" +#include "xmlconfig.h" typedef struct { @@ -83,7 +84,7 @@ typedef struct { radeonRegionRec mmio; radeonRegionRec status; - radeonRegionRec agpTextures; + radeonRegionRec gartTextures; drmBufMapPtr buffers; @@ -91,7 +92,11 @@ typedef struct { __DRIscreenPrivate *driScreen; unsigned int sarea_priv_offset; - unsigned int agp_buffer_offset; /* offset in card memory space */ + unsigned int gart_buffer_offset; /* offset in card memory space */ + unsigned int gart_texture_offset; /* offset in card memory space */ + + /* Configuration cache with default values for all contexts */ + driOptionCache optionCache; } radeonScreenRec, *radeonScreenPtr; extern radeonScreenPtr radeonCreateScreen( __DRIscreenPrivate *sPriv ); diff --git a/src/mesa/drivers/dri/radeon/radeon_state_init.c b/src/mesa/drivers/dri/radeon/radeon_state_init.c index 971ea699ea2..0b2a1089b8c 100644 --- a/src/mesa/drivers/dri/radeon/radeon_state_init.c +++ b/src/mesa/drivers/dri/radeon/radeon_state_init.c @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_state_init.c,v 1.3 2003/02/22 06:21:11 dawes Exp $ */ /* * Copyright 2000, 2001 VA Linux Systems Inc., Fremont, California. * diff --git a/src/mesa/drivers/dri/radeon/radeon_swtcl.c b/src/mesa/drivers/dri/radeon/radeon_swtcl.c index 48e57c8285a..157a863e328 100644 --- a/src/mesa/drivers/dri/radeon/radeon_swtcl.c +++ b/src/mesa/drivers/dri/radeon/radeon_swtcl.c @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_swtcl.c,v 1.6 2003/05/06 23:52:08 daenzer Exp $ */ /************************************************************************** Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and @@ -67,7 +67,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define RADEON_MAX_SETUP 0x40 static void flush_last_swtcl_prim( radeonContextPtr rmesa ); -static void flush_last_swtcl_prim_compat( radeonContextPtr rmesa ); static struct { void (*emit)( GLcontext *, GLuint, GLuint, void *, GLuint ); @@ -282,7 +281,6 @@ static void radeonRenderStart( GLcontext *ctx ) } if (rmesa->dma.flush != 0 && - rmesa->dma.flush != flush_last_swtcl_prim_compat && rmesa->dma.flush != flush_last_swtcl_prim) rmesa->dma.flush( rmesa ); } @@ -381,7 +379,7 @@ static void flush_last_swtcl_prim( radeonContextPtr rmesa ) if (rmesa->dma.current.buf) { struct radeon_dma_region *current = &rmesa->dma.current; - GLuint current_offset = (rmesa->radeonScreen->agp_buffer_offset + + GLuint current_offset = (rmesa->radeonScreen->gart_buffer_offset + current->buf->buf->idx * RADEON_BUFFER_SIZE + current->start); @@ -408,46 +406,6 @@ static void flush_last_swtcl_prim( radeonContextPtr rmesa ) } -static void flush_last_swtcl_prim_compat( radeonContextPtr rmesa ) -{ - struct radeon_dma_region *current = &rmesa->dma.current; - - if (RADEON_DEBUG & DEBUG_IOCTL) - fprintf(stderr, "%s buf %p start %d ptr %d\n", - __FUNCTION__, - current->buf, - current->start, - current->ptr); - - assert (!(rmesa->swtcl.hw_primitive & RADEON_CP_VC_CNTL_PRIM_WALK_IND)); - assert (current->start + - rmesa->swtcl.numverts * rmesa->swtcl.vertex_size * 4 == - current->ptr); - assert (current->start == 0); - - rmesa->dma.flush = 0; - - if (current->ptr && current->buf) { - assert (current->buf->refcount == 1); - - radeonCompatEmitPrimitive( rmesa, - rmesa->swtcl.vertex_format, - rmesa->swtcl.hw_primitive, - rmesa->swtcl.numverts); - - /* The buffer has been released: - */ - FREE(current->buf); - current->buf = 0; - current->start = 0; - current->ptr = current->end; - - } - - rmesa->swtcl.numverts = 0; -} - - /* Alloc space in the current dma region. */ static __inline void *radeonAllocDmaLowVerts( radeonContextPtr rmesa, @@ -460,22 +418,18 @@ static __inline void *radeonAllocDmaLowVerts( radeonContextPtr rmesa, if (!rmesa->dma.flush) { rmesa->glCtx->Driver.NeedFlush |= FLUSH_STORED_VERTICES; - if (rmesa->dri.drmMinor == 1) - rmesa->dma.flush = flush_last_swtcl_prim_compat; - else - rmesa->dma.flush = flush_last_swtcl_prim; + rmesa->dma.flush = flush_last_swtcl_prim; } assert( vsize == rmesa->swtcl.vertex_size * 4 ); - assert( rmesa->dma.flush == flush_last_swtcl_prim || - rmesa->dma.flush == flush_last_swtcl_prim_compat); + assert( rmesa->dma.flush == flush_last_swtcl_prim ); assert (rmesa->dma.current.start + rmesa->swtcl.numverts * rmesa->swtcl.vertex_size * 4 == rmesa->dma.current.ptr); { - char *head = rmesa->dma.current.address + rmesa->dma.current.ptr; + GLubyte *head = (GLubyte *)(rmesa->dma.current.address + rmesa->dma.current.ptr); rmesa->dma.current.ptr += bytes; rmesa->swtcl.numverts += nverts; return head; @@ -624,7 +578,7 @@ do { \ \ radeonEmitVertexAOS( rmesa, \ rmesa->swtcl.vertex_size, \ - (rmesa->radeonScreen->agp_buffer_offset + \ + (rmesa->radeonScreen->gart_buffer_offset + \ rmesa->swtcl.indexed_verts.buf->buf->idx * \ RADEON_BUFFER_SIZE + \ rmesa->swtcl.indexed_verts.start)); \ @@ -683,15 +637,6 @@ static GLboolean radeon_run_render( GLcontext *ctx, ctx->Line.StippleFlag) /* GH: THIS IS A HACK!!! */ return GL_TRUE; - if (rmesa->dri.drmMinor < 3) { - /* drm 1.1 doesn't support vertex primitives starting in the - * middle of a buffer. It doesn't support sane indexed vertices - * either. drm 1.2 fixes both of these problems, but we don't have a - * compatibility layer to that version yet. - */ - return GL_TRUE; - } - tnl->Driver.Render.Start( ctx ); if (VB->Elts) { @@ -956,7 +901,6 @@ static void radeonResetLineStipple( GLcontext *ctx ); #define RADEON_TWOSIDE_BIT 0x01 #define RADEON_UNFILLED_BIT 0x02 -#define RADEON_OFFSET_BIT 0x04 /* drmMinor == 1 */ #define RADEON_MAX_TRIFUNC 0x08 @@ -969,7 +913,7 @@ static struct { #define DO_FALLBACK 0 -#define DO_OFFSET (IND & RADEON_OFFSET_BIT) +#define DO_OFFSET 0 #define DO_UNFILLED (IND & RADEON_UNFILLED_BIT) #define DO_TWOSIDE (IND & RADEON_TWOSIDE_BIT) #define DO_FLAT 0 @@ -1055,22 +999,6 @@ static struct { #define TAG(x) x##_twoside_unfilled #include "tnl_dd/t_dd_tritmp.h" -#define IND (RADEON_OFFSET_BIT) -#define TAG(x) x##_offset -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (RADEON_TWOSIDE_BIT|RADEON_OFFSET_BIT) -#define TAG(x) x##_twoside_offset -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (RADEON_UNFILLED_BIT|RADEON_OFFSET_BIT) -#define TAG(x) x##_unfilled_offset -#include "tnl_dd/t_dd_tritmp.h" - -#define IND (RADEON_TWOSIDE_BIT|RADEON_UNFILLED_BIT|RADEON_OFFSET_BIT) -#define TAG(x) x##_twoside_unfilled_offset -#include "tnl_dd/t_dd_tritmp.h" - static void init_rast_tab( void ) { @@ -1078,10 +1006,6 @@ static void init_rast_tab( void ) init_twoside(); init_unfilled(); init_twoside_unfilled(); - init_offset(); - init_twoside_offset(); - init_unfilled_offset(); - init_twoside_unfilled_offset(); } /**********************************************************************/ @@ -1140,8 +1064,6 @@ void radeonChooseRenderState( GLcontext *ctx ) if (flags & DD_TRI_LIGHT_TWOSIDE) index |= RADEON_TWOSIDE_BIT; if (flags & DD_TRI_UNFILLED) index |= RADEON_UNFILLED_BIT; - if ((flags & DD_TRI_OFFSET) && - rmesa->dri.drmMinor == 1) index |= RADEON_OFFSET_BIT; if (index != rmesa->swtcl.RenderIndex) { tnl->Driver.Render.Points = rast_tab[index].points; @@ -1304,7 +1226,7 @@ void radeonInitSwtcl( GLcontext *ctx ) tnl->Driver.Render.ResetLineStipple = radeonResetLineStipple; tnl->Driver.Render.BuildVertices = radeonBuildVertices; - rmesa->swtcl.verts = ALIGN_MALLOC( size * 16 * 4, 32 ); + rmesa->swtcl.verts = (GLubyte *)ALIGN_MALLOC( size * 16 * 4, 32 ); rmesa->swtcl.RenderIndex = ~0; rmesa->swtcl.render_primitive = GL_TRIANGLES; rmesa->swtcl.hw_primitive = 0; diff --git a/src/mesa/drivers/dri/radeon/radeon_tcl.h b/src/mesa/drivers/dri/radeon/radeon_tcl.h index 1e97d32148a..881264a2676 100644 --- a/src/mesa/drivers/dri/radeon/radeon_tcl.h +++ b/src/mesa/drivers/dri/radeon/radeon_tcl.h @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_tcl.h,v 1.2 2003/02/08 21:26:45 dawes Exp $ */ /************************************************************************** Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and diff --git a/src/mesa/drivers/dri/radeon/radeon_texmem.c b/src/mesa/drivers/dri/radeon/radeon_texmem.c index 3adc2a951c6..284efb225ac 100644 --- a/src/mesa/drivers/dri/radeon/radeon_texmem.c +++ b/src/mesa/drivers/dri/radeon/radeon_texmem.c @@ -35,7 +35,7 @@ SOFTWARE. * Gareth Hughes <[email protected]> * */ -#include <errno.h> +#include <errno.h> #include "glheader.h" #include "imports.h" @@ -112,8 +112,8 @@ static void radeonUploadRectSubImage( radeonContextPtr rmesa, height = texImage->Height; dstPitch = t->pp_txpitch + 32; - { /* FIXME: prefer AGP-texturing if possible */ - /* Data not in agp memory, or bad pitch. + { /* FIXME: prefer GART-texturing if possible */ + /* Data not in GART memory, or bad pitch. */ for (done = 0; done < height ; ) { struct radeon_dma_region region; diff --git a/src/mesa/drivers/dri/radeon/radeon_texstate.c b/src/mesa/drivers/dri/radeon/radeon_texstate.c index 6dccd311800..0bece3e8b9b 100644 --- a/src/mesa/drivers/dri/radeon/radeon_texstate.c +++ b/src/mesa/drivers/dri/radeon/radeon_texstate.c @@ -107,7 +107,7 @@ static void radeonSetTexImages( radeonContextPtr rmesa, const struct gl_texture_image *baseImage = tObj->Image[tObj->BaseLevel]; GLint curOffset; GLint i; - GLint firstLevel=0, lastLevel=0, numLevels; + GLint numLevels; GLint log2Width, log2Height, log2Depth; /* Set the hardware texture format @@ -127,40 +127,15 @@ static void radeonSetTexImages( radeonContextPtr rmesa, } - /* Compute which mipmap levels we really want to send to the hardware. - * This depends on the base image size, GL_TEXTURE_MIN_LOD, - * GL_TEXTURE_MAX_LOD, GL_TEXTURE_BASE_LEVEL, and GL_TEXTURE_MAX_LEVEL. - * Yes, this looks overly complicated, but it's all needed. */ - switch (tObj->Target) { - case GL_TEXTURE_1D: - case GL_TEXTURE_2D: - firstLevel = tObj->BaseLevel + (GLint)(tObj->MinLod + 0.5); - firstLevel = MAX2(firstLevel, tObj->BaseLevel); - lastLevel = tObj->BaseLevel + (GLint)(tObj->MaxLod + 0.5); - lastLevel = MAX2(lastLevel, tObj->BaseLevel); - lastLevel = MIN2(lastLevel, tObj->BaseLevel + baseImage->MaxLog2); - lastLevel = MIN2(lastLevel, tObj->MaxLevel); - lastLevel = MAX2(firstLevel, lastLevel); /* need at least one level */ - log2Width = tObj->Image[firstLevel]->WidthLog2; - log2Height = tObj->Image[firstLevel]->HeightLog2; - log2Depth = 0; - break; - case GL_TEXTURE_RECTANGLE_NV: - firstLevel = lastLevel = 0; - log2Width = log2Height = 1; /* ? */ - log2Depth = 0; - break; - default: - return; - } - /* save these values */ - t->base.firstLevel = firstLevel; - t->base.lastLevel = lastLevel; + driCalculateTextureFirstLastLevel( (driTextureObject *) t ); + log2Width = tObj->Image[t->base.firstLevel]->WidthLog2; + log2Height = tObj->Image[t->base.firstLevel]->HeightLog2; + log2Depth = tObj->Image[t->base.firstLevel]->DepthLog2; - numLevels = lastLevel - firstLevel + 1; + numLevels = t->base.lastLevel - t->base.firstLevel + 1; assert(numLevels <= RADEON_MAX_TEXTURE_LEVELS); @@ -174,7 +149,7 @@ static void radeonSetTexImages( radeonContextPtr rmesa, const struct gl_texture_image *texImage; GLuint size; - texImage = tObj->Image[i + firstLevel]; + texImage = tObj->Image[i + t->base.firstLevel]; if ( !texImage ) break; @@ -194,10 +169,12 @@ static void radeonSetTexImages( radeonContextPtr rmesa, } assert(size > 0); - if (curOffset & 0x1f) { - /* align to 32-byte offset */ - curOffset = (curOffset + 0x1f) & ~0x1f; - } + + /* Align to 32-byte offset. It is faster to do this unconditionally + * (no branch penalty). + */ + + curOffset = (curOffset + 0x1f) & ~0x1f; t->image[0][i].x = curOffset % BLIT_WIDTH_BYTES; t->image[0][i].y = curOffset / BLIT_WIDTH_BYTES; @@ -237,17 +214,17 @@ static void radeonSetTexImages( radeonContextPtr rmesa, t->pp_txformat |= ((log2Width << RADEON_TXFORMAT_WIDTH_SHIFT) | (log2Height << RADEON_TXFORMAT_HEIGHT_SHIFT)); - t->pp_txsize = (((tObj->Image[firstLevel]->Width - 1) << 0) | - ((tObj->Image[firstLevel]->Height - 1) << 16)); + t->pp_txsize = (((tObj->Image[t->base.firstLevel]->Width - 1) << 0) | + ((tObj->Image[t->base.firstLevel]->Height - 1) << 16)); /* Only need to round to nearest 32 for textures, but the blitter * requires 64-byte aligned pitches, and we may/may not need the * blitter. NPOT only! */ if (baseImage->IsCompressed) - t->pp_txpitch = (tObj->Image[firstLevel]->Width + 63) & ~(63); + t->pp_txpitch = (tObj->Image[t->base.firstLevel]->Width + 63) & ~(63); else - t->pp_txpitch = ((tObj->Image[firstLevel]->Width * baseImage->TexFormat->TexelBytes) + 63) & ~(63); + t->pp_txpitch = ((tObj->Image[t->base.firstLevel]->Width * baseImage->TexFormat->TexelBytes) + 63) & ~(63); t->pp_txpitch -= 32; t->dirty_state = TEX_ALL; @@ -1500,7 +1477,7 @@ static GLboolean enable_tex_rect( GLcontext *ctx, int unit ) RADEON_FIREVERTICES( rmesa ); radeonSetTexImages( rmesa, tObj ); radeonUploadTexImages( rmesa, (radeonTexObjPtr) tObj->DriverData, 0 ); - if ( !t->base.memBlock /* && !rmesa->prefer_agp_client_texturing FIXME */ ) { + if ( !t->base.memBlock /* && !rmesa->prefer_gart_client_texturing FIXME */ ) { fprintf(stderr, "%s: upload failed\n", __FUNCTION__); return GL_FALSE; } diff --git a/src/mesa/drivers/dri/radeon/radeon_vtxfmt.c b/src/mesa/drivers/dri/radeon/radeon_vtxfmt.c index e8c4e4e221d..4e27324807f 100644 --- a/src/mesa/drivers/dri/radeon/radeon_vtxfmt.c +++ b/src/mesa/drivers/dri/radeon/radeon_vtxfmt.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt.c,v 1.5 2002/12/16 16:18:59 dawes Exp $ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt.c,v 1.6 2003/05/06 23:52:08 daenzer Exp $ */ /************************************************************************** Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and @@ -937,7 +937,7 @@ static void radeonVtxfmtFlushVertices( GLcontext *ctx, GLuint flags ) */ -void radeonVtxfmtInit( GLcontext *ctx ) +void radeonVtxfmtInit( GLcontext *ctx, GLboolean useCodegen ) { radeonContextPtr rmesa = RADEON_CONTEXT( ctx ); GLvertexformat *vfmt = &(rmesa->vb.vtxfmt); @@ -980,6 +980,7 @@ void radeonVtxfmtInit( GLcontext *ctx ) /* Active but unsupported -- fallback if we receive these: */ vfmt->CallList = radeon_fallback_CallList; + vfmt->CallLists = radeon_fallback_CallLists; vfmt->EvalCoord1f = radeon_fallback_EvalCoord1f; vfmt->EvalCoord1fv = radeon_fallback_EvalCoord1fv; vfmt->EvalCoord2f = radeon_fallback_EvalCoord2f; @@ -1034,7 +1035,7 @@ void radeonVtxfmtInit( GLcontext *ctx ) make_empty_list( &rmesa->vb.dfn_cache.MultiTexCoord1fARB ); make_empty_list( &rmesa->vb.dfn_cache.MultiTexCoord1fvARB ); - radeonInitCodegen( &rmesa->vb.codegen ); + radeonInitCodegen( &rmesa->vb.codegen, useCodegen ); } static void free_funcs( struct dynfn *l ) diff --git a/src/mesa/drivers/dri/radeon/radeon_vtxfmt.h b/src/mesa/drivers/dri/radeon/radeon_vtxfmt.h index 9792fcbb788..78033908238 100644 --- a/src/mesa/drivers/dri/radeon/radeon_vtxfmt.h +++ b/src/mesa/drivers/dri/radeon/radeon_vtxfmt.h @@ -42,7 +42,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. extern void radeonVtxfmtUpdate( GLcontext *ctx ); -extern void radeonVtxfmtInit( GLcontext *ctx ); +extern void radeonVtxfmtInit( GLcontext *ctx, GLboolean useCodegen ); extern void radeonVtxfmtInvalidate( GLcontext *ctx ); extern void radeonVtxfmtDestroy( GLcontext *ctx ); extern void radeonVtxfmtInitChoosers( GLvertexformat *vfmt ); @@ -84,7 +84,7 @@ do { \ /* */ -void radeonInitCodegen( struct dfn_generators *gen ); +void radeonInitCodegen( struct dfn_generators *gen, GLboolean useCodegen ); void radeonInitX86Codegen( struct dfn_generators *gen ); void radeonInitSSECodegen( struct dfn_generators *gen ); diff --git a/src/mesa/drivers/dri/radeon/radeon_vtxfmt_c.c b/src/mesa/drivers/dri/radeon/radeon_vtxfmt_c.c index 0d5c2bc6d91..0bdb9a8bbd6 100644 --- a/src/mesa/drivers/dri/radeon/radeon_vtxfmt_c.c +++ b/src/mesa/drivers/dri/radeon/radeon_vtxfmt_c.c @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt_c.c,v 1.2 2002/12/16 16:18:59 dawes Exp $ */ /************************************************************************** Copyright 2002 ATI Technologies Inc., Ontario, Canada, and @@ -867,7 +867,7 @@ static struct dynfn *codegen_noop( GLcontext *ctx, int key ) return 0; } -void radeonInitCodegen( struct dfn_generators *gen ) +void radeonInitCodegen( struct dfn_generators *gen, GLboolean useCodegen ) { gen->Vertex3f = codegen_noop; gen->Vertex3fv = codegen_noop; @@ -896,7 +896,7 @@ void radeonInitCodegen( struct dfn_generators *gen ) gen->MultiTexCoord1fARB = codegen_noop; gen->MultiTexCoord1fvARB = codegen_noop; - if (!getenv("RADEON_NO_CODEGEN")) { + if (useCodegen) { #if defined(USE_X86_ASM) radeonInitX86Codegen( gen ); #endif diff --git a/src/mesa/drivers/dri/radeon/radeon_vtxfmt_sse.c b/src/mesa/drivers/dri/radeon/radeon_vtxfmt_sse.c index 0f2c82bd878..71e74381a5a 100644 --- a/src/mesa/drivers/dri/radeon/radeon_vtxfmt_sse.c +++ b/src/mesa/drivers/dri/radeon/radeon_vtxfmt_sse.c @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt_sse.c,v 1.1 2002/10/30 12:51:58 alanh Exp $ */ /************************************************************************** Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and diff --git a/src/mesa/drivers/dri/radeon/radeon_vtxfmt_x86.c b/src/mesa/drivers/dri/radeon/radeon_vtxfmt_x86.c index 92941ca5f80..59b0db0a5f9 100644 --- a/src/mesa/drivers/dri/radeon/radeon_vtxfmt_x86.c +++ b/src/mesa/drivers/dri/radeon/radeon_vtxfmt_x86.c @@ -1,4 +1,4 @@ -/* $XFree86$ */ +/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_vtxfmt_x86.c,v 1.2 2002/12/21 17:02:16 dawes Exp $ */ /************************************************************************** Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and diff --git a/src/mesa/drivers/dri/radeon/server/radeon.h b/src/mesa/drivers/dri/radeon/server/radeon.h index 4606a0b71e6..808289b140f 100644 --- a/src/mesa/drivers/dri/radeon/server/radeon.h +++ b/src/mesa/drivers/dri/radeon/server/radeon.h @@ -108,11 +108,11 @@ typedef struct { * \name AGP */ /*@{*/ - drmSize agpSize; /**< \brief AGP map size */ - drmHandle agpMemHandle; /**< \brief AGP map handle */ - unsigned long agpOffset; /**< \brief AGP offset */ - int agpMode; /**< \brief AGP mode */ - int agpFastWrite; + drmSize gartSize; /**< \brief AGP map size */ + drmHandle gartMemHandle; /**< \brief AGP map handle */ + unsigned long gartOffset; /**< \brief AGP offset */ + int gartMode; /**< \brief AGP mode */ + int gartFastWrite; /*@}*/ /** @@ -144,11 +144,11 @@ typedef struct { * \name CP AGP Texture data */ /*@{*/ - unsigned long agpTexStart; /**< \brief Offset into AGP space */ - drmHandle agpTexHandle; /**< \brief Handle from drmAddMap() */ - drmSize agpTexMapSize; /**< \brief Size of map */ - int agpTexSize; /**< \brief Size of AGP tex space (in MB) */ - int log2AGPTexGran; + unsigned long gartTexStart; /**< \brief Offset into AGP space */ + drmHandle gartTexHandle; /**< \brief Handle from drmAddMap() */ + drmSize gartTexMapSize; /**< \brief Size of map */ + int gartTexSize; /**< \brief Size of AGP tex space (in MB) */ + int log2GARTTexGran; /*@}*/ int drmMinor; /**< \brief DRM device minor number */ diff --git a/src/mesa/drivers/dri/radeon/server/radeon_common.h b/src/mesa/drivers/dri/radeon/server/radeon_common.h index 0792b5c2e0e..365ecfb9a17 100644 --- a/src/mesa/drivers/dri/radeon/server/radeon_common.h +++ b/src/mesa/drivers/dri/radeon/server/radeon_common.h @@ -31,7 +31,7 @@ * Converted to common header format: * Jens Owen <[email protected]> * - * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86drmRadeon.h,v 1.6 2001/04/16 15:02:13 tsi Exp $ + * $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_common.h,v 1.2 2003/04/07 01:22:09 martin Exp $ * */ @@ -70,6 +70,7 @@ #define DRM_RADEON_INIT_HEAP 0x15 #define DRM_RADEON_IRQ_EMIT 0x16 #define DRM_RADEON_IRQ_WAIT 0x17 +#define DRM_RADEON_CP_RESUME 0x18 #define DRM_RADEON_MAX_DRM_COMMAND_INDEX 0x39 @@ -94,7 +95,7 @@ typedef struct { unsigned long sarea_priv_offset; int is_pci; int cp_mode; - int agp_size; + int gart_size; int ring_size; int usec_timeout; @@ -109,7 +110,7 @@ typedef struct { unsigned long ring_offset; unsigned long ring_rptr_offset; unsigned long buffers_offset; - unsigned long agp_textures_offset; + unsigned long gart_textures_offset; } drmRadeonInit; typedef struct { @@ -404,22 +405,22 @@ typedef struct drm_radeon_getparam { void *value; } drmRadeonGetParam; -#define RADEON_PARAM_AGP_BUFFER_OFFSET 1 -#define RADEON_PARAM_LAST_FRAME 2 -#define RADEON_PARAM_LAST_DISPATCH 3 -#define RADEON_PARAM_LAST_CLEAR 4 -#define RADEON_PARAM_IRQ_NR 5 -#define RADEON_PARAM_AGP_BASE 6 +#define RADEON_PARAM_GART_BUFFER_OFFSET 1 +#define RADEON_PARAM_LAST_FRAME 2 +#define RADEON_PARAM_LAST_DISPATCH 3 +#define RADEON_PARAM_LAST_CLEAR 4 +#define RADEON_PARAM_IRQ_NR 5 +#define RADEON_PARAM_GART_BASE 6 -#define RADEON_MEM_REGION_AGP 1 -#define RADEON_MEM_REGION_FB 2 +#define RADEON_MEM_REGION_GART 1 +#define RADEON_MEM_REGION_FB 2 typedef struct drm_radeon_mem_alloc { int region; int alignment; int size; - int *region_offset; /* offset from start of fb or agp */ + int *region_offset; /* offset from start of fb or GART */ } drmRadeonMemAlloc; typedef struct drm_radeon_mem_free { diff --git a/src/mesa/drivers/dri/radeon/server/radeon_dri.c b/src/mesa/drivers/dri/radeon/server/radeon_dri.c index 4271aa7da23..a37561457bc 100644 --- a/src/mesa/drivers/dri/radeon/server/radeon_dri.c +++ b/src/mesa/drivers/dri/radeon/server/radeon_dri.c @@ -318,7 +318,7 @@ static int RADEONDRIAgpInit( const DRIDriverContext *ctx, RADEONInfoPtr info) int s, l; if (drmAgpAcquire(ctx->drmFD) < 0) { - fprintf(stderr, "[agp] AGP not available\n"); + fprintf(stderr, "[gart] AGP not available\n"); return 0; } @@ -334,40 +334,40 @@ static int RADEONDRIAgpInit( const DRIDriverContext *ctx, RADEONInfoPtr info) /* Disable fast write entirely - too many lockups. */ mode &= ~RADEON_AGP_MODE_MASK; - switch (info->agpMode) { + switch (info->gartMode) { case 4: mode |= RADEON_AGP_4X_MODE; case 2: mode |= RADEON_AGP_2X_MODE; case 1: default: mode |= RADEON_AGP_1X_MODE; } if (drmAgpEnable(ctx->drmFD, mode) < 0) { - fprintf(stderr, "[agp] AGP not enabled\n"); + fprintf(stderr, "[gart] AGP not enabled\n"); drmAgpRelease(ctx->drmFD); return 0; } - info->agpOffset = 0; + info->gartOffset = 0; - if ((ret = drmAgpAlloc(ctx->drmFD, info->agpSize*1024*1024, 0, NULL, - &info->agpMemHandle)) < 0) { - fprintf(stderr, "[agp] Out of memory (%d)\n", ret); + if ((ret = drmAgpAlloc(ctx->drmFD, info->gartSize*1024*1024, 0, NULL, + &info->gartMemHandle)) < 0) { + fprintf(stderr, "[gart] Out of memory (%d)\n", ret); drmAgpRelease(ctx->drmFD); return 0; } fprintf(stderr, - "[agp] %d kB allocated with handle 0x%08x\n", - info->agpSize*1024, (unsigned)info->agpMemHandle); + "[gart] %d kB allocated with handle 0x%08x\n", + info->gartSize*1024, (unsigned)info->gartMemHandle); if (drmAgpBind(ctx->drmFD, - info->agpMemHandle, info->agpOffset) < 0) { - fprintf(stderr, "[agp] Could not bind\n"); - drmAgpFree(ctx->drmFD, info->agpMemHandle); + info->gartMemHandle, info->gartOffset) < 0) { + fprintf(stderr, "[gart] Could not bind\n"); + drmAgpFree(ctx->drmFD, info->gartMemHandle); drmAgpRelease(ctx->drmFD); return 0; } /* Initialize the CP ring buffer data */ - info->ringStart = info->agpOffset; + info->ringStart = info->gartOffset; info->ringMapSize = info->ringSize*1024*1024 + DRM_PAGE_SIZE; info->ringReadOffset = info->ringStart + info->ringMapSize; @@ -378,51 +378,51 @@ static int RADEONDRIAgpInit( const DRIDriverContext *ctx, RADEONInfoPtr info) info->bufMapSize = info->bufSize*1024*1024; /* Reserve the rest for AGP textures */ - info->agpTexStart = info->bufStart + info->bufMapSize; - s = (info->agpSize*1024*1024 - info->agpTexStart); + info->gartTexStart = info->bufStart + info->bufMapSize; + s = (info->gartSize*1024*1024 - info->gartTexStart); l = RADEONMinBits((s-1) / RADEON_NR_TEX_REGIONS); if (l < RADEON_LOG_TEX_GRANULARITY) l = RADEON_LOG_TEX_GRANULARITY; - info->agpTexMapSize = (s >> l) << l; - info->log2AGPTexGran = l; + info->gartTexMapSize = (s >> l) << l; + info->log2GARTTexGran = l; if (drmAddMap(ctx->drmFD, info->ringStart, info->ringMapSize, DRM_AGP, DRM_READ_ONLY, &info->ringHandle) < 0) { - fprintf(stderr, "[agp] Could not add ring mapping\n"); + fprintf(stderr, "[gart] Could not add ring mapping\n"); return 0; } - fprintf(stderr, "[agp] ring handle = 0x%08lx\n", info->ringHandle); + fprintf(stderr, "[gart] ring handle = 0x%08lx\n", info->ringHandle); if (drmAddMap(ctx->drmFD, info->ringReadOffset, info->ringReadMapSize, DRM_AGP, DRM_READ_ONLY, &info->ringReadPtrHandle) < 0) { fprintf(stderr, - "[agp] Could not add ring read ptr mapping\n"); + "[gart] Could not add ring read ptr mapping\n"); return 0; } fprintf(stderr, - "[agp] ring read ptr handle = 0x%08lx\n", + "[gart] ring read ptr handle = 0x%08lx\n", info->ringReadPtrHandle); if (drmAddMap(ctx->drmFD, info->bufStart, info->bufMapSize, DRM_AGP, 0, &info->bufHandle) < 0) { fprintf(stderr, - "[agp] Could not add vertex/indirect buffers mapping\n"); + "[gart] Could not add vertex/indirect buffers mapping\n"); return 0; } fprintf(stderr, - "[agp] vertex/indirect buffers handle = 0x%08lx\n", + "[gart] vertex/indirect buffers handle = 0x%08lx\n", info->bufHandle); - if (drmAddMap(ctx->drmFD, info->agpTexStart, info->agpTexMapSize, - DRM_AGP, 0, &info->agpTexHandle) < 0) { + if (drmAddMap(ctx->drmFD, info->gartTexStart, info->gartTexMapSize, + DRM_AGP, 0, &info->gartTexHandle) < 0) { fprintf(stderr, - "[agp] Could not add AGP texture map mapping\n"); + "[gart] Could not add AGP texture map mapping\n"); return 0; } fprintf(stderr, - "[agp] AGP texture map handle = 0x%08lx\n", - info->agpTexHandle); + "[gart] AGP texture map handle = 0x%08lx\n", + info->gartTexHandle); /* Initialize Radeon's AGP registers */ /* Ring buffer is at AGP offset 0 */ @@ -463,7 +463,7 @@ static int RADEONDRIKernelInit( const DRIDriverContext *ctx, drmInfo.sarea_priv_offset = sizeof(XF86DRISAREARec); drmInfo.is_pci = 0; drmInfo.cp_mode = RADEON_DEFAULT_CP_BM_MODE; - drmInfo.agp_size = info->agpSize*1024*1024; + drmInfo.gart_size = info->gartSize*1024*1024; drmInfo.ring_size = info->ringSize*1024*1024; drmInfo.usec_timeout = 1000; drmInfo.fb_bpp = ctx->bpp; @@ -479,7 +479,7 @@ static int RADEONDRIKernelInit( const DRIDriverContext *ctx, drmInfo.ring_offset = info->ringHandle; drmInfo.ring_rptr_offset = info->ringReadPtrHandle; drmInfo.buffers_offset = info->bufHandle; - drmInfo.agp_textures_offset = info->agpTexHandle; + drmInfo.gart_textures_offset = info->gartTexHandle; ret = drmCommandWrite(ctx->drmFD, DRM_RADEON_CP_INIT, &drmInfo, sizeof(drmRadeonInit)); @@ -502,19 +502,19 @@ static void RADEONDRIAgpHeapInit(const DRIDriverContext *ctx, { drmRadeonMemInitHeap drmHeap; - /* Start up the simple memory manager for agp space */ - drmHeap.region = RADEON_MEM_REGION_AGP; + /* Start up the simple memory manager for gart space */ + drmHeap.region = RADEON_MEM_REGION_GART; drmHeap.start = 0; - drmHeap.size = info->agpTexMapSize; + drmHeap.size = info->gartTexMapSize; if (drmCommandWrite(ctx->drmFD, DRM_RADEON_INIT_HEAP, &drmHeap, sizeof(drmHeap))) { fprintf(stderr, - "[drm] Failed to initialized agp heap manager\n"); + "[drm] Failed to initialized gart heap manager\n"); } else { fprintf(stderr, - "[drm] Initialized kernel agp heap manager, %d\n", - info->agpTexMapSize); + "[drm] Initialized kernel gart heap manager, %d\n", + info->gartTexMapSize); } } @@ -640,13 +640,13 @@ static int RADEONMemoryInit( const DRIDriverContext *ctx, RADEONInfoPtr info ) info->frontPitch = ctx->shared.virtualWidth; fprintf(stderr, - "Using %d MB AGP aperture\n", info->agpSize); + "Using %d MB AGP aperture\n", info->gartSize); fprintf(stderr, "Using %d MB for the ring buffer\n", info->ringSize); fprintf(stderr, "Using %d MB for vertex/indirect buffers\n", info->bufSize); fprintf(stderr, - "Using %d MB for AGP textures\n", info->agpTexSize); + "Using %d MB for AGP textures\n", info->gartTexSize); /* Front, back and depth buffers - everything else texture?? */ @@ -733,7 +733,7 @@ static int RADEONMemoryInit( const DRIDriverContext *ctx, RADEONInfoPtr info ) * Setups a RADEONDRIRec structure to be passed to radeon_dri.so for its * initialization. */ -static int RADEONScreenInit( const DRIDriverContext *ctx, RADEONInfoPtr info ) +static int RADEONScreenInit( DRIDriverContext *ctx, RADEONInfoPtr info ) { RADEONDRIPtr pRADEONDRI; int err; @@ -883,7 +883,7 @@ static int RADEONScreenInit( const DRIDriverContext *ctx, RADEONInfoPtr info ) /* Initialize IRQ */ RADEONDRIIrqInit(ctx, info); - /* Initialize kernel agp memory manager */ + /* Initialize kernel gart memory manager */ RADEONDRIAgpHeapInit(ctx, info); /* Initialize the SAREA private data structure */ @@ -919,7 +919,7 @@ static int RADEONScreenInit( const DRIDriverContext *ctx, RADEONInfoPtr info ) pRADEONDRI->depth = ctx->bpp; /* XXX: depth */ pRADEONDRI->bpp = ctx->bpp; pRADEONDRI->IsPCI = 0; - pRADEONDRI->AGPMode = info->agpMode; + pRADEONDRI->AGPMode = info->gartMode; pRADEONDRI->frontOffset = info->frontOffset; pRADEONDRI->frontPitch = info->frontPitch; pRADEONDRI->backOffset = info->backOffset; @@ -933,10 +933,10 @@ static int RADEONScreenInit( const DRIDriverContext *ctx, RADEONInfoPtr info ) pRADEONDRI->registerSize = info->registerSize; pRADEONDRI->statusHandle = info->ringReadPtrHandle; pRADEONDRI->statusSize = info->ringReadMapSize; - pRADEONDRI->agpTexHandle = info->agpTexHandle; - pRADEONDRI->agpTexMapSize = info->agpTexMapSize; - pRADEONDRI->log2AGPTexGran = info->log2AGPTexGran; - pRADEONDRI->agpTexOffset = info->agpTexStart; + pRADEONDRI->gartTexHandle = info->gartTexHandle; + pRADEONDRI->gartTexMapSize = info->gartTexMapSize; + pRADEONDRI->log2GARTTexGran = info->log2GARTTexGran; + pRADEONDRI->gartTexOffset = info->gartTexStart; pRADEONDRI->sarea_priv_offset = sizeof(XF86DRISAREARec); /* Don't release the lock now - let the VT switch handler do it. */ @@ -1139,10 +1139,10 @@ static int radeonInitFBDev( DRIDriverContext *ctx ) ctx->driverPrivate = (void *)info; - info->agpFastWrite = RADEON_DEFAULT_AGP_FAST_WRITE; - info->agpMode = RADEON_DEFAULT_AGP_MODE; - info->agpSize = RADEON_DEFAULT_AGP_SIZE; - info->agpTexSize = RADEON_DEFAULT_AGP_TEX_SIZE; + info->gartFastWrite = RADEON_DEFAULT_AGP_FAST_WRITE; + info->gartMode = RADEON_DEFAULT_AGP_MODE; + info->gartSize = RADEON_DEFAULT_AGP_SIZE; + info->gartTexSize = RADEON_DEFAULT_AGP_TEX_SIZE; info->bufSize = RADEON_DEFAULT_BUFFER_SIZE; info->ringSize = RADEON_DEFAULT_RING_SIZE; diff --git a/src/mesa/drivers/dri/radeon/server/radeon_dri.h b/src/mesa/drivers/dri/radeon/server/radeon_dri.h index fce21227cb9..fc96deb1024 100644 --- a/src/mesa/drivers/dri/radeon/server/radeon_dri.h +++ b/src/mesa/drivers/dri/radeon/server/radeon_dri.h @@ -102,10 +102,10 @@ typedef struct { * \name CP AGP Texture data */ /*@{*/ - drmHandle agpTexHandle; /**< \brief AGP texture area map handle */ - drmSize agpTexMapSize; /**< \brief AGP texture area map size */ - int log2AGPTexGran; /**< \brief AGP texture granularity in log base 2 */ - int agpTexOffset; /**< \brief AGP texture area offset in AGP space */ + drmHandle gartTexHandle; /**< \brief AGP texture area map handle */ + drmSize gartTexMapSize; /**< \brief AGP texture area map size */ + int log2GARTTexGran; /**< \brief AGP texture granularity in log base 2 */ + int gartTexOffset; /**< \brief AGP texture area offset in AGP space */ /*@}*/ unsigned int sarea_priv_offset; /**< \brief offset of the private SAREA data*/ diff --git a/src/mesa/drivers/dri/radeon/server/radeon_reg.h b/src/mesa/drivers/dri/radeon/server/radeon_reg.h index 5570a439458..4bd4d14e783 100644 --- a/src/mesa/drivers/dri/radeon/server/radeon_reg.h +++ b/src/mesa/drivers/dri/radeon/server/radeon_reg.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h,v 1.25 2003/02/07 18:08:59 martin Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h,v 1.30 2003/10/07 22:47:12 martin Exp $ */ /* * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and * VA Linux Systems Inc., Fremont, California. @@ -66,6 +66,8 @@ # define RADEON_AGP_APER_SIZE_4MB (0x3f << 0) # define RADEON_AGP_APER_SIZE_MASK (0x3f << 0) #define RADEON_AGP_COMMAND 0x0f60 /* PCI */ +#define RADEON_AGP_COMMAND_PCI_CONFIG 0x0060 /* offset in PCI config*/ +# define RADEON_AGP_ENABLE (1<<8) #define RADEON_AGP_PLL_CNTL 0x000b /* PLL */ #define RADEON_AGP_STATUS 0x0f5c /* PCI */ # define RADEON_AGP_1X_MODE 0x01 @@ -232,6 +234,28 @@ # define RADEON_CONSTANT_COLOR_ZERO 0x00000000 #define RADEON_CRC_CMDFIFO_ADDR 0x0740 #define RADEON_CRC_CMDFIFO_DOUT 0x0744 +#define RADEON_GRPH_BUFFER_CNTL 0x02f0 +# define RADEON_GRPH_START_REQ_MASK (0x7f) +# define RADEON_GRPH_START_REQ_SHIFT 0 +# define RADEON_GRPH_STOP_REQ_MASK (0x7f<<8) +# define RADEON_GRPH_STOP_REQ_SHIFT 8 +# define RADEON_GRPH_CRITICAL_POINT_MASK (0x7f<<16) +# define RADEON_GRPH_CRITICAL_POINT_SHIFT 16 +# define RADEON_GRPH_CRITICAL_CNTL (1<<28) +# define RADEON_GRPH_BUFFER_SIZE (1<<29) +# define RADEON_GRPH_CRITICAL_AT_SOF (1<<30) +# define RADEON_GRPH_STOP_CNTL (1<<31) +#define RADEON_GRPH2_BUFFER_CNTL 0x03f0 +# define RADEON_GRPH2_START_REQ_MASK (0x7f) +# define RADEON_GRPH2_START_REQ_SHIFT 0 +# define RADEON_GRPH2_STOP_REQ_MASK (0x7f<<8) +# define RADEON_GRPH2_STOP_REQ_SHIFT 8 +# define RADEON_GRPH2_CRITICAL_POINT_MASK (0x7f<<16) +# define RADEON_GRPH2_CRITICAL_POINT_SHIFT 16 +# define RADEON_GRPH2_CRITICAL_CNTL (1<<28) +# define RADEON_GRPH2_BUFFER_SIZE (1<<29) +# define RADEON_GRPH2_CRITICAL_AT_SOF (1<<30) +# define RADEON_GRPH2_STOP_CNTL (1<<31) #define RADEON_CRTC_CRNT_FRAME 0x0214 #define RADEON_CRTC_EXT_CNTL 0x0054 # define RADEON_CRTC_VGA_XOVERSCAN (1 << 0) @@ -272,6 +296,9 @@ # define RADEON_CRTC2_CSYNC_EN (1 << 27) # define RADEON_CRTC2_HSYNC_DIS (1 << 28) # define RADEON_CRTC2_VSYNC_DIS (1 << 29) +#define RADEON_CRTC_MORE_CNTL 0x27c +# define RADEON_CRTC_H_CUTOFF_ACTIVE_EN (1<<4) +# define RADEON_CRTC_V_CUTOFF_ACTIVE_EN (1<<5) #define RADEON_CRTC_GUI_TRIG_VLINE 0x0218 #define RADEON_CRTC_H_SYNC_STRT_WID 0x0204 # define RADEON_CRTC_H_SYNC_STRT_PIX (0x07 << 0) @@ -356,7 +383,10 @@ #define RADEON_DAC_CNTL 0x0058 # define RADEON_DAC_RANGE_CNTL (3 << 0) +# define RADEON_DAC_RANGE_CNTL_MASK 0x03 # define RADEON_DAC_BLANKING (1 << 2) +# define RADEON_DAC_CMP_EN (1 << 3) +# define RADEON_DAC_CMP_OUTPUT (1 << 7) # define RADEON_DAC_8BIT_EN (1 << 8) # define RADEON_DAC_VGA_ADR_EN (1 << 13) # define RADEON_DAC_PDWN (1 << 15) @@ -365,6 +395,12 @@ # define RADEON_DAC2_DAC_CLK_SEL (1 << 0) # define RADEON_DAC2_DAC2_CLK_SEL (1 << 1) # define RADEON_DAC2_PALETTE_ACC_CTL (1 << 5) +#define RADEON_DAC_EXT_CNTL 0x0280 +# define RADEON_DAC_FORCE_BLANK_OFF_EN (1 << 4) +# define RADEON_DAC_FORCE_DATA_EN (1 << 5) +# define RADEON_DAC_FORCE_DATA_SEL_MASK (3 << 6) +# define RADEON_DAC_FORCE_DATA_MASK 0x0003ff00 +# define RADEON_DAC_FORCE_DATA_SHIFT 8 #define RADEON_TV_DAC_CNTL 0x088c # define RADEON_TV_DAC_STD_MASK 0x0300 # define RADEON_TV_DAC_RDACPD (1 << 24) @@ -374,7 +410,9 @@ # define RADEON_CRT2_DISP1_SEL (1 << 5) #define RADEON_DISP_OUTPUT_CNTL 0x0d64 # define RADEON_DISP_DAC_SOURCE_MASK 0x03 +# define RADEON_DISP_DAC2_SOURCE_MASK 0x0c # define RADEON_DISP_DAC_SOURCE_CRTC2 0x01 +# define RADEON_DISP_DAC2_SOURCE_CRTC2 0x04 #define RADEON_DAC_CRC_SIG 0x02cc #define RADEON_DAC_DATA 0x03c9 /* VGA */ #define RADEON_DAC_MASK 0x03c6 /* VGA */ @@ -392,6 +430,23 @@ #define RADEON_DEVICE_ID 0x0f02 /* PCI */ #define RADEON_DISP_MISC_CNTL 0x0d00 # define RADEON_SOFT_RESET_GRPH_PP (1 << 0) +#define RADEON_DISP_MERGE_CNTL 0x0d60 +# define RADEON_DISP_ALPHA_MODE_MASK 0x03 +# define RADEON_DISP_ALPHA_MODE_KEY 0 +# define RADEON_DISP_ALPHA_MODE_PER_PIXEL 1 +# define RADEON_DISP_ALPHA_MODE_GLOBAL 2 +# define RADEON_DISP_RGB_OFFSET_EN (1<<8) +# define RADEON_DISP_GRPH_ALPHA_MASK (0xff << 16) +# define RADEON_DISP_OV0_ALPHA_MASK (0xff << 24) +# define RADEON_DISP_LIN_TRANS_BYPASS (0x01 << 9) +#define RADEON_DISP2_MERGE_CNTL 0x0d68 +# define RADEON_DISP2_RGB_OFFSET_EN (1<<8) +#define RADEON_DISP_LIN_TRANS_GRPH_A 0x0d80 +#define RADEON_DISP_LIN_TRANS_GRPH_B 0x0d84 +#define RADEON_DISP_LIN_TRANS_GRPH_C 0x0d88 +#define RADEON_DISP_LIN_TRANS_GRPH_D 0x0d8c +#define RADEON_DISP_LIN_TRANS_GRPH_E 0x0d90 +#define RADEON_DISP_LIN_TRANS_GRPH_F 0x0d98 #define RADEON_DP_BRUSH_BKGD_CLR 0x1478 #define RADEON_DP_BRUSH_FRGD_CLR 0x147c #define RADEON_DP_CNTL 0x16c0 @@ -582,7 +637,10 @@ # define RADEON_FP2_BLANK_EN (1 << 1) # define RADEON_FP2_ON (1 << 2) # define RADEON_FP2_PANEL_FORMAT (1 << 3) -# define RADEON_FP2_SEL_CRTC2 (1 << 13) +# define RADEON_FP2_SOURCE_SEL_MASK (3 << 10) +# define RADEON_FP2_SOURCE_SEL_CRTC2 (1 << 10) +# define RADEON_FP2_SRC_SEL_MASK (3 << 13) +# define RADEON_FP2_SRC_SEL_CRTC2 (1 << 13) # define RADEON_FP2_FP_POL (1 << 16) # define RADEON_FP2_LP_POL (1 << 17) # define RADEON_FP2_SCK_POL (1 << 18) @@ -590,6 +648,8 @@ # define RADEON_FP2_PAD_FLOP_EN (1 << 22) # define RADEON_FP2_CRC_EN (1 << 23) # define RADEON_FP2_CRC_READ_EN (1 << 24) +# define RADEON_FP2_DV0_EN (1 << 25) +# define RADEON_FP2_DV0_RATE_SEL_SDR (1 << 26) #define RADEON_FP_H_SYNC_STRT_WID 0x02c4 #define RADEON_FP_H2_SYNC_STRT_WID 0x03c4 #define RADEON_FP_HORZ_STRETCH 0x028c @@ -697,6 +757,10 @@ #define RADEON_MAX_LATENCY 0x0f3f /* PCI */ #define RADEON_MC_AGP_LOCATION 0x014c #define RADEON_MC_FB_LOCATION 0x0148 +#define RADEON_DISPLAY_BASE_ADDR 0x23c +#define RADEON_DISPLAY2_BASE_ADDR 0x33c +#define RADEON_OV0_BASE_ADDR 0x43c +#define RADEON_NB_TOM 0x15c #define RADEON_MCLK_CNTL 0x0012 /* PLL */ # define RADEON_FORCEON_MCLKA (1 << 16) # define RADEON_FORCEON_MCLKB (1 << 17) @@ -711,6 +775,12 @@ #define RADEON_MEM_ADDR_CONFIG 0x0148 #define RADEON_MEM_BASE 0x0f10 /* PCI */ #define RADEON_MEM_CNTL 0x0140 +# define RADEON_MEM_NUM_CHANNELS_MASK 0x01 +# define RADEON_MEM_USE_B_CH_ONLY (1<<1) +# define RV100_HALF_MODE (1<<3) +# define R300_MEM_NUM_CHANNELS_MASK 0x03 +# define R300_MEM_USE_CD_CH_ONLY (1<<2) +#define RADEON_MEM_TIMING_CNTL 0x0144 /* EXT_MEM_CNTL */ #define RADEON_MEM_INIT_LAT_TIMER 0x0154 #define RADEON_MEM_INTF_CNTL 0x014c #define RADEON_MEM_SDRAM_MODE_REG 0x0158 @@ -723,7 +793,13 @@ #define RADEON_MPLL_CNTL 0x000e /* PLL */ #define RADEON_MPP_TB_CONFIG 0x01c0 /* ? */ #define RADEON_MPP_GP_CONFIG 0x01c8 /* ? */ - +#define R300_MC_IND_INDEX 0x01f8 +# define R300_MC_IND_ADDR_MASK 0x3f +#define R300_MC_IND_DATA 0x01fc +#define R300_MC_READ_CNTL_AB 0x017c +# define R300_MEM_RBS_POSITION_A_MASK 0x03 +#define R300_MC_READ_CNTL_CD_mcind 0x24 +# define R300_MEM_RBS_POSITION_C_MASK 0x03 #define RADEON_N_VIF_COUNT 0x0248 @@ -879,7 +955,7 @@ # define RADEON_P2PLL_REF_DIV_MASK 0x03ff # define RADEON_P2PLL_ATOMIC_UPDATE_R (1 << 15) /* same as _W */ # define RADEON_P2PLL_ATOMIC_UPDATE_W (1 << 15) /* same as _R */ -# define R300_PPLL_REF_DIV_ACC_MASK (0x3ff < 18) +# define R300_PPLL_REF_DIV_ACC_MASK (0x3ff << 18) # define R300_PPLL_REF_DIV_ACC_SHIFT 18 #define RADEON_PALETTE_DATA 0x00b4 #define RADEON_PALETTE_30_DATA 0x00b8 @@ -891,6 +967,11 @@ # define RADEON_PIX2CLK_SRC_SEL_PSCANCLK 0x01 # define RADEON_PIX2CLK_SRC_SEL_BYTECLK 0x02 # define RADEON_PIX2CLK_SRC_SEL_P2PLLCLK 0x03 +# define RADEON_PIX2CLK_ALWAYS_ONb (1<<6) +# define RADEON_PIX2CLK_DAC_ALWAYS_ONb (1<<7) +# define RADEON_PIXCLK_TV_SRC_SEL (1 << 8) +# define RADEON_PIXCLK_LVDS_ALWAYS_ONb (1 << 14) +# define RADEON_PIXCLK_TMDS_ALWAYS_ONb (1 << 15) #define RADEON_PLANE_3D_MASK_C 0x1d44 #define RADEON_PLL_TEST_CNTL 0x0013 /* PLL */ #define RADEON_PMI_CAP_ID 0x0f5c /* PCI */ @@ -1013,6 +1094,9 @@ #define RADEON_TEST_DEBUG_MUX 0x0124 #define RADEON_TEST_DEBUG_OUT 0x012c #define RADEON_TMDS_PLL_CNTL 0x02a8 +#define RADEON_TMDS_TRANSMITTER_CNTL 0x02a4 +# define RADEON_TMDS_TRANSMITTER_PLLEN 1 +# define RADEON_TMDS_TRANSMITTER_PLLRST 2 #define RADEON_TRAIL_BRES_DEC 0x1614 #define RADEON_TRAIL_BRES_ERR 0x160c #define RADEON_TRAIL_BRES_INC 0x1610 @@ -1025,6 +1109,9 @@ # define RADEON_VCLK_SRC_SEL_PSCANCLK 0x01 # define RADEON_VCLK_SRC_SEL_BYTECLK 0x02 # define RADEON_VCLK_SRC_SEL_PPLLCLK 0x03 +# define RADEON_PIXCLK_ALWAYS_ONb (1<<6) +# define RADEON_PIXCLK_DAC_ALWAYS_ONb (1<<7) + #define RADEON_VENDOR_ID 0x0f00 /* PCI */ #define RADEON_VGA_DDA_CONFIG 0x02e8 #define RADEON_VGA_DDA_ON_OFF 0x02ec @@ -1878,12 +1965,11 @@ #define RADEON_AIC_CNTL 0x01d0 # define RADEON_PCIGART_TRANSLATE_EN (1 << 0) +#define RADEON_AIC_LO_ADDR 0x01dc /* Constants */ -#define RADEON_AGP_TEX_OFFSET 0x02000000 - #define RADEON_LAST_FRAME_REG RADEON_GUI_SCRATCH_REG0 #define RADEON_LAST_CLEAR_REG RADEON_GUI_SCRATCH_REG2 @@ -2012,4 +2098,16 @@ #define RADEON_SS_HORZ_GUARD_DISCARD_ADJ_ADDR 51 #define RADEON_SS_SHININESS 60 +#define RADEON_TV_MASTER_CNTL 0x0800 +# define RADEON_TVCLK_ALWAYS_ONb (1 << 30) +#define RADEON_TV_DAC_CNTL 0x088c +# define RADEON_TV_DAC_CMPOUT (1 << 5) +#define RADEON_TV_PRE_DAC_MUX_CNTL 0x0888 +# define RADEON_Y_RED_EN (1 << 0) +# define RADEON_C_GRN_EN (1 << 1) +# define RADEON_CMP_BLU_EN (1 << 2) +# define RADEON_RED_MX_FORCE_DAC_DATA (6 << 4) +# define RADEON_GRN_MX_FORCE_DAC_DATA (6 << 8) +# define RADEON_BLU_MX_FORCE_DAC_DATA (6 << 12) +# define RADEON_TV_FORCE_DAC_DATA_SHIFT 16 #endif diff --git a/src/mesa/drivers/dri/radeon/server/radeon_sarea.h b/src/mesa/drivers/dri/radeon/server/radeon_sarea.h index 81e4325d7a1..95db1f37ac9 100644 --- a/src/mesa/drivers/dri/radeon/server/radeon_sarea.h +++ b/src/mesa/drivers/dri/radeon/server/radeon_sarea.h @@ -1,11 +1,4 @@ -/** - * \file server/radeon_sarea.h - * \brief SAREA definition. - * - * \author Kevin E. Martin <[email protected]> - * \author Gareth Hughes <[email protected]> - */ - +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_sarea.h,v 1.5 2002/10/30 12:52:14 alanh Exp $ */ /* * Copyright 2000 ATI Technologies Inc., Markham, Ontario, * VA Linux Systems Inc., Fremont, California. @@ -34,7 +27,12 @@ * DEALINGS IN THE SOFTWARE. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_sarea.h,v 1.4 2002/04/24 16:20:41 martin Exp $ */ +/* + * Authors: + * Kevin E. Martin <[email protected]> + * Gareth Hughes <[email protected]> + * + */ #ifndef _RADEON_SAREA_H_ #define _RADEON_SAREA_H_ @@ -94,11 +92,11 @@ /* Keep these small for testing */ #define RADEON_NR_SAREA_CLIPRECTS 12 -/* There are 2 heaps (local/AGP). Each region within a heap is a +/* There are 2 heaps (local/GART). Each region within a heap is a * minimum of 64k, and there are at most 64 of them per heap. */ #define RADEON_CARD_HEAP 0 -#define RADEON_AGP_HEAP 1 +#define RADEON_GART_HEAP 1 #define RADEON_NR_TEX_HEAPS 2 #define RADEON_NR_TEX_REGIONS 64 #define RADEON_LOG_TEX_GRANULARITY 16 @@ -115,10 +113,6 @@ #endif /* __RADEON_SAREA_DEFINES__ */ - -/** - * \brief Color register format. - */ typedef struct { unsigned int red; unsigned int green; @@ -126,15 +120,8 @@ typedef struct { unsigned int alpha; } radeon_color_regs_t; - -/** - * \brief Context registers. - */ typedef struct { - /** - * \name Context state - */ - /*@{*/ + /* Context state */ unsigned int pp_misc; unsigned int pp_fog_color; unsigned int re_solid_color; @@ -149,76 +136,44 @@ typedef struct { unsigned int re_width_height; unsigned int rb3d_colorpitch; unsigned int se_cntl; - /*@}*/ - /** - * \name Vertex format state - */ - /*@{*/ + /* Vertex format state */ unsigned int se_coord_fmt; - /*@}*/ - /** - * \name Line state - */ - /*@{*/ + /* Line state */ unsigned int re_line_pattern; unsigned int re_line_state; unsigned int se_line_width; - /*@}*/ - /** - * \name Bumpmap state - */ - /*@{*/ + /* Bumpmap state */ unsigned int pp_lum_matrix; unsigned int pp_rot_matrix_0; unsigned int pp_rot_matrix_1; - /*@}*/ - /** - * \name Mask state - */ - /*@{*/ + /* Mask state */ unsigned int rb3d_stencilrefmask; unsigned int rb3d_ropcntl; unsigned int rb3d_planemask; - /*@}*/ - /** - * \name Viewport state - */ - /*@{*/ + /* Viewport state */ unsigned int se_vport_xscale; unsigned int se_vport_xoffset; unsigned int se_vport_yscale; unsigned int se_vport_yoffset; unsigned int se_vport_zscale; unsigned int se_vport_zoffset; - /*@}*/ - /** - * \name Setup state - */ - /*@{*/ + /* Setup state */ unsigned int se_cntl_status; - /*@}*/ - /** - * \name Misc state - */ - /*@{*/ + /* Misc state */ unsigned int re_top_left; unsigned int re_misc; - /*@}*/ } radeon_context_regs_t; - -/** - * \brief Setup registers for each texture unit - */ +/* Setup registers for each texture unit */ typedef struct { unsigned int pp_txfilter; unsigned int pp_txformat; @@ -229,82 +184,48 @@ typedef struct { unsigned int pp_border_color; } radeon_texture_regs_t; -/** - * \brief Maintain an LRU of contiguous regions of texture space. - * - * If you think you own a region of texture memory, and it has an age different - * to the one you set, then you are mistaken and it has been stolen by another - * client. If global RADEONSAREAPriv::texAge hasn't changed, there is no need to walk the list. - * - * These regions can be used as a proxy for the fine-grained texture - * information of other clients - by maintaining them in the same LRU which is - * used to age their own textures, clients have an approximate LRU for the - * whole of global texture space, and can make informed decisions as to which - * areas to kick out. There is no need to choose whether to kick out your own - * texture or someone else's - simply eject them all in LRU order. - * - * \sa RADEONSAREAPriv::texList. - */ -typedef struct { - unsigned char next; /**< \brief indices to form a circular LRU */ - unsigned char prev; /**< \brief indices to form a circular LRU */ - unsigned char in_use; /**< \brief owned by a client, or free? */ - int age; /**< \brief tracked by clients to update local LRU's */ -} radeon_tex_region_t; - - -/** - * \brief Private SAREA definition - * - * The channel for communication of state information to the kernel - * on firing a vertex buffer. - */ typedef struct { - radeon_context_regs_t ContextState; /** \brief Context registers */ + /* The channel for communication of state information to the kernel + * on firing a vertex buffer. + */ + radeon_context_regs_t ContextState; radeon_texture_regs_t TexState[RADEON_MAX_TEXTURE_UNITS]; - /**< \brief Texture registers */ - unsigned int dirty; - unsigned int vertsize; /**< \brief vertex size */ - unsigned int vc_format; /**< \brief vertex format */ + unsigned int dirty; + unsigned int vertsize; + unsigned int vc_format; - /** - * \name Cliprects - * - * The current cliprects, or a subset thereof. - */ - /*@{*/ - XF86DRIClipRectRec boxes[RADEON_NR_SAREA_CLIPRECTS]; - /**< \brief cliprects */ - unsigned int nbox; /**< \brief number of cliprects */ - /*@}*/ - - /** - * \name Counters - * - * Counters for throttling rendering of clients. - */ - /*@{*/ - unsigned int last_frame; /**< \brief last emmited frame */ + /* The current cliprects, or a subset thereof */ + XF86DRIClipRectRec boxes[RADEON_NR_SAREA_CLIPRECTS]; + unsigned int nbox; + + /* Counters for throttling of rendering clients */ + unsigned int last_frame; unsigned int last_dispatch; - unsigned int last_clear; /**< \brief last emmited clear */ - /*@}*/ + unsigned int last_clear; - /** - * \name LRU - */ - /*@{*/ - /** \brief Texture regions. - * Last element is sentinal + /* Maintain an LRU of contiguous regions of texture space. If you + * think you own a region of texture memory, and it has an age + * different to the one you set, then you are mistaken and it has + * been stolen by another client. If global texAge hasn't changed, + * there is no need to walk the list. + * + * These regions can be used as a proxy for the fine-grained texture + * information of other clients - by maintaining them in the same + * lru which is used to age their own textures, clients have an + * approximate lru for the whole of global texture space, and can + * make informed decisions as to which areas to kick out. There is + * no need to choose whether to kick out your own texture or someone + * else's - simply eject them all in LRU order. */ + /* Last elt is sentinal */ drmTextureRegion texList[RADEON_NR_TEX_HEAPS][RADEON_NR_TEX_REGIONS+1]; - /** \brief last time texture was uploaded */ + /* last time texture was uploaded */ unsigned int texAge[RADEON_NR_TEX_HEAPS]; - /*@}*/ - int ctxOwner; /**< \brief last context to upload state */ - int pfAllowPageFlip; /**< \brief set by the 2d driver, read by the client */ - int pfCurrentPage; /**< \brief set by kernel, read by others */ - int crtc2_base; /**< \brief for pageflipping with CloneMode */ + int ctxOwner; /* last context to upload state */ + int pfAllowPageFlip; /* set by the 2d driver, read by the client */ + int pfCurrentPage; /* set by kernel, read by others */ + int crtc2_base; /* for pageflipping with CloneMode */ } RADEONSAREAPriv, *RADEONSAREAPrivPtr; #endif diff --git a/src/mesa/drivers/dri/sis/Makefile.X11 b/src/mesa/drivers/dri/sis/Makefile.X11 index 529bd637c23..186bd2025b2 100644 --- a/src/mesa/drivers/dri/sis/Makefile.X11 +++ b/src/mesa/drivers/dri/sis/Makefile.X11 @@ -1,4 +1,4 @@ -# $Id: Makefile.X11,v 1.1 2003/09/30 11:13:32 alanh Exp $ +# $Id: Makefile.X11,v 1.1.2.1 2003/11/21 15:49:33 keithw Exp $ # Mesa 3-D graphics library # Version: 5.0 @@ -98,6 +98,10 @@ sis_dri.so: $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile.X11 rm -f $(TOP)/lib/sis_dri.so && \ install sis_dri.so $(TOP)/lib/sis_dri.so +$(TOP)/lib/sis_dri.so: sis_dri.so + rm -f $(TOP)/lib/sis_dri.so && \ + install sis_dri.so $(TOP)/lib/sis_dri.so + # Run 'make -f Makefile.X11 dep' to update the dependencies if you change # what's included by any source file. depend: $(C_SOURCES) $(ASM_SOURCES) diff --git a/src/mesa/drivers/ggi/display/fbdev_mode.c b/src/mesa/drivers/ggi/display/fbdev_mode.c index 8aa8d91ef13..6fb952d55c6 100644 --- a/src/mesa/drivers/ggi/display/fbdev_mode.c +++ b/src/mesa/drivers/ggi/display/fbdev_mode.c @@ -1,5 +1,4 @@ -/* $Id: fbdev_mode.c,v 1.5 2000/10/28 10:02:44 jtaylor Exp $ -****************************************************************************** +/****************************************************************************** display-fbdev-mesa diff --git a/src/mesa/drivers/ggi/display/fbdev_visual.c b/src/mesa/drivers/ggi/display/fbdev_visual.c index a861d815a6d..0176614ffba 100644 --- a/src/mesa/drivers/ggi/display/fbdev_visual.c +++ b/src/mesa/drivers/ggi/display/fbdev_visual.c @@ -1,5 +1,4 @@ -/* $Id: fbdev_visual.c,v 1.6 2000/06/11 20:11:55 jtaylor Exp $ -****************************************************************************** +/****************************************************************************** display-fbdev-mesa: visual handling diff --git a/src/mesa/drivers/glide/fx.rc b/src/mesa/drivers/glide/fx.rc new file mode 100644 index 00000000000..5d00629b826 --- /dev/null +++ b/src/mesa/drivers/glide/fx.rc @@ -0,0 +1,39 @@ +#include <windows.h> + +#define PRODNAME "Mesa 5.1" +#define CONTACTSTR "http://www.mesa3d.org" +#define HWSTR "3dfx Voodoo^2, Voodoo Banshee, Velocity 100/200, Voodoo3, Voodoo4, Voodoo5" +#define COPYRIGHTSTR "Copyright \251 Brian E. Paul" + +#define VERSIONSTR "5.1.0.1" +#define MANVERSION 5 +#define MANREVISION 1 +#define BUILD_NUMBER 1 + +VS_VERSION_INFO VERSIONINFO + FILEVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER + PRODUCTVERSION MANVERSION, MANREVISION, 0, BUILD_NUMBER + FILEFLAGSMASK 0x0030003FL + + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DRV + FILESUBTYPE VFT2_DRV_INSTALLABLE +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "FileDescription", PRODNAME + VALUE "FileVersion", VERSIONSTR + VALUE "LegalCopyright", COPYRIGHTSTR + VALUE "ProductName", PRODNAME + VALUE "Graphics Subsystem", HWSTR + VALUE "Contact", CONTACTSTR + END + END + BLOCK "VarFileInfo" + BEGIN + /* the following line should be extended for localized versions */ + VALUE "Translation", 0x409, 1252 + END +END diff --git a/src/mesa/drivers/glide/fxapi.c b/src/mesa/drivers/glide/fxapi.c index 89b4a38a620..57d5034557f 100644 --- a/src/mesa/drivers/glide/fxapi.c +++ b/src/mesa/drivers/glide/fxapi.c @@ -1,5 +1,3 @@ -/* $Id: fxapi.c,v 1.38 2003/10/02 17:36:44 brianp Exp $ */ - /* * Mesa 3-D graphics library * Version: 4.0 @@ -216,7 +214,7 @@ fxMesaCreateBestContext(GLuint win, GLint width, GLint height, return NULL; } - return fxMesaCreateContext(win, res, GR_REFRESH_60Hz/*ZZZ: GR_REFRESH_75Hz*/, attribList); + return fxMesaCreateContext(win, res, GR_REFRESH_60Hz, attribList); } @@ -233,7 +231,7 @@ fxMesaCreateContext(GLuint win, int i; const char *str; - int numChips, sliaa, fsaa; + int sliaa, numSLI, samplesPerChip, tmuRam, fbRam; struct SstCard_St *voodoo; struct tdfx_glide *Glide; @@ -245,16 +243,11 @@ fxMesaCreateContext(GLuint win, GrPixelFormat_t pixFmt; GLboolean useBGR; - GLboolean verbose = GL_FALSE; if (TDFX_DEBUG & VERBOSE_DRIVER) { fprintf(stderr, "%s(...)\n", __FUNCTION__); } - if (getenv("MESA_FX_INFO")) { - verbose = GL_TRUE; - } - /* Okay, first process the user flags */ aux = GL_FALSE; doubleBuffer = GL_FALSE; @@ -313,7 +306,6 @@ fxMesaCreateContext(GLuint win, and disables the splash screen due to y-origin swapping. Note: We only want the former. */ voodoo = &glbHWConfig.SSTs[glbCurrentBoard]; - numChips = voodoo->numChips; fxMesa = (fxMesaContext)CALLOC_STRUCT(tfxMesaContext); if (!fxMesa) { @@ -321,49 +313,166 @@ fxMesaCreateContext(GLuint win, goto errorhandler; } + if (getenv("MESA_FX_INFO")) { + fxMesa->verbose = GL_TRUE; + } + fxMesa->type = voodoo->type; + fxMesa->HavePalExt = voodoo->HavePalExt; fxMesa->HavePixExt = voodoo->HavePixExt; fxMesa->HaveTexFmt = voodoo->HaveTexFmt; fxMesa->HaveCmbExt = voodoo->HaveCmbExt; fxMesa->HaveMirExt = voodoo->HaveMirExt; + fxMesa->HaveTexUma = voodoo->HaveTexUma; fxMesa->HaveTexus2 = voodoo->HaveTexus2; fxMesa->Glide = glbHWConfig.Glide; Glide = &fxMesa->Glide; - sprintf(fxMesa->rendererString, "Mesa %s v0.51 %s %dMB FB, %dMB TM, %d TMU, %s", - grGetString(GR_RENDERER), - grGetString(GR_HARDWARE), - voodoo->fbRam, - (voodoo->tmuConfig[GR_TMU0].tmuRam + ((voodoo->nTexelfx > 1) ? voodoo->tmuConfig[GR_TMU1].tmuRam : 0)), - voodoo->nTexelfx, - (numChips > 1) ? "SLI" : "NOSLI"); - switch (fxMesa->colDepth = colDepth) { - case 15: - redBits = 5; - greenBits = 5; - blueBits = 5; - alphaBits = 1; - pixFmt = GR_PIXFMT_ARGB_1555; - break; - case 16: - redBits = 5; - greenBits = 6; - blueBits = 5; - alphaBits = depthSize ? 0 : 8; - pixFmt = GR_PIXFMT_RGB_565; + /* + * Pixel tables are used during pixel read-back + * Either initialize them for RGB or BGR order; + * However, 32bit capable cards have the right order. + * As a consequence, 32bit read-back is not swizzled! + * Also determine if we need vertex snapping. + */ + /* number of SLI units and AA Samples per chip */ + sliaa = 0; + switch (voodoo->type) { + case GR_SSTTYPE_VOODOO: + case GR_SSTTYPE_Banshee: + useBGR = GL_TRUE; + fxMesa->snapVertices = GL_TRUE; break; - case 32: - redBits = 8; - greenBits = 8; - blueBits = 8; - alphaBits = 8; - pixFmt = GR_PIXFMT_ARGB_8888; + case GR_SSTTYPE_Voodoo2: + useBGR = GL_TRUE; + fxMesa->snapVertices = GL_FALSE; break; + case GR_SSTTYPE_Voodoo4: + case GR_SSTTYPE_Voodoo5: + if ((str = Glide->grGetRegistryOrEnvironmentStringExt("SSTH3_SLI_AA_CONFIGURATION")) != NULL) { + sliaa = atoi(str); + } + case GR_SSTTYPE_Voodoo3: default: - str = "pixelFormat"; - goto errorhandler; + useBGR = GL_FALSE; + fxMesa->snapVertices = GL_FALSE; + break; + } + /* ZZZ TO DO: Add the old SLI/AA settings for Napalm. */ + switch(voodoo->numChips) { + case 4: /* 4 chips */ + switch(sliaa) { + case 8: /* 8 Sample AA */ + numSLI = 1; + samplesPerChip = 2; + break; + case 7: /* 4 Sample AA */ + numSLI = 1; + samplesPerChip = 1; + break; + case 6: /* 2 Sample AA */ + numSLI = 2; + samplesPerChip = 1; + break; + default: + numSLI = 4; + samplesPerChip = 1; + } + break; + case 2: /* 2 chips */ + switch(sliaa) { + case 4: /* 4 Sample AA */ + numSLI = 1; + samplesPerChip = 2; + break; + case 3: /* 2 Sample AA */ + numSLI = 1; + samplesPerChip = 1; + break; + default: + numSLI = 2; + samplesPerChip = 1; + } + break; + default: /* 1 chip */ + switch(sliaa) { + case 1: /* 2 Sample AA */ + numSLI = 1; + samplesPerChip = 2; + break; + default: + numSLI = 1; + samplesPerChip = 1; + } + } + + fxMesa->fsaa = samplesPerChip * voodoo->numChips / numSLI; /* 1:noFSAA, 2:2xFSAA, 4:4xFSAA, 8:8xFSAA */ + + switch (fxMesa->colDepth = colDepth) { + case 15: + redBits = 5; + greenBits = 5; + blueBits = 5; + alphaBits = 1; + switch(fxMesa->fsaa) { + case 8: + pixFmt = GR_PIXFMT_AA_8_ARGB_1555; + break; + case 4: + pixFmt = GR_PIXFMT_AA_4_ARGB_1555; + break; + case 2: + pixFmt = GR_PIXFMT_AA_2_ARGB_1555; + break; + default: + pixFmt = GR_PIXFMT_ARGB_1555; + } + break; + case 16: + redBits = 5; + greenBits = 6; + blueBits = 5; + alphaBits = depthSize ? 0 : 8; + switch(fxMesa->fsaa) { + case 8: + pixFmt = GR_PIXFMT_AA_8_RGB_565; + break; + case 4: + pixFmt = GR_PIXFMT_AA_4_RGB_565; + break; + case 2: + pixFmt = GR_PIXFMT_AA_2_RGB_565; + break; + default: + pixFmt = GR_PIXFMT_RGB_565; + } + break; + case 32: + redBits = 8; + greenBits = 8; + blueBits = 8; + alphaBits = 8; + switch(fxMesa->fsaa) { + case 8: + pixFmt = GR_PIXFMT_AA_8_ARGB_8888; + break; + case 4: + pixFmt = GR_PIXFMT_AA_4_ARGB_8888; + break; + case 2: + pixFmt = GR_PIXFMT_AA_2_ARGB_8888; + break; + default: + pixFmt = GR_PIXFMT_ARGB_8888; + } + break; + default: + str = "pixelFormat"; + goto errorhandler; } + /* ZZZ TODO: check if there is enough fbRam */ + /* Tips: * 1. we don't bother setting/checking AUX for stencil, because we'll decide * later whether we have HW stencil, based on depth buffer (thus AUX is @@ -391,7 +500,6 @@ fxMesaCreateContext(GLuint win, fxMesa->haveZBuffer = depthSize > 0; fxMesa->haveDoubleBuffer = doubleBuffer; fxMesa->haveGlobalPaletteTexture = GL_FALSE; - fxMesa->verbose = verbose; fxMesa->board = glbCurrentBoard; fxMesa->haveTwoTMUs = (voodoo->nTexelfx > 1); @@ -419,60 +527,6 @@ fxMesaCreateContext(GLuint win, fxMesa->swapInterval = 0; } - if ((str = Glide->grGetRegistryOrEnvironmentStringExt("SSTH3_SLI_AA_CONFIGURATION"))) { - sliaa = atoi(str); - } else { - sliaa = 0; - } - switch (colDepth) { - case 15: - if ((numChips == 4) && (sliaa == 8)) { - pixFmt = GR_PIXFMT_AA_8_ARGB_1555; - fsaa = 8; - } else if (((numChips == 4) && (sliaa == 7)) || ((numChips == 2) && (sliaa == 4))) { - pixFmt = GR_PIXFMT_AA_4_ARGB_1555; - fsaa = 4; - } else if (((numChips == 4) && (sliaa == 6)) || ((numChips == 2) && (sliaa == 3)) || ((numChips == 1) && (sliaa == 1))) { - pixFmt = GR_PIXFMT_AA_2_ARGB_1555; - fsaa = 2; - } else { - fsaa = 0; - } - break; - case 16: - if ((numChips == 4) && (sliaa == 8)) { - pixFmt = GR_PIXFMT_AA_8_RGB_565; - fsaa = 8; - } else if (((numChips == 4) && (sliaa == 7)) || ((numChips == 2) && (sliaa == 4))) { - pixFmt = GR_PIXFMT_AA_4_RGB_565; - fsaa = 4; - } else if (((numChips == 4) && (sliaa == 6)) || ((numChips == 2) && (sliaa == 3)) || ((numChips == 1) && (sliaa == 1))) { - pixFmt = GR_PIXFMT_AA_2_RGB_565; - fsaa = 2; - } else { - fsaa = 0; - } - break; - case 32: - if ((numChips == 4) && (sliaa == 8)) { - pixFmt = GR_PIXFMT_AA_8_ARGB_8888; - fsaa = 8; - } else if (((numChips == 4) && (sliaa == 7)) || ((numChips == 2) && (sliaa == 4))) { - pixFmt = GR_PIXFMT_AA_4_ARGB_8888; - fsaa = 4; - } else if (((numChips == 4) && (sliaa == 6)) || ((numChips == 2) && (sliaa == 3)) || ((numChips == 1) && (sliaa == 1))) { - pixFmt = GR_PIXFMT_AA_2_ARGB_8888; - fsaa = 2; - } else { - fsaa = 0; - } - break; - default: /* NOTREACHED */ - str = "pixelFormat"; - goto errorhandler; - } - fxMesa->fsaa = fsaa; - BEGIN_BOARD_LOCK(); if (fxMesa->HavePixExt) { fxMesa->glideContext = Glide->grSstWinOpenExt((FxU32)win, res, ref, @@ -492,46 +546,44 @@ fxMesaCreateContext(GLuint win, goto errorhandler; } - /* - * Pixel tables are used during pixel read-back - * Either initialize them for RGB or BGR order; - * However, 32bit capable cards have the right order. - * As a consequence, 32bit read-back is not swizzled! - * Also determine if we need vertex snapping. - */ - switch (voodoo->type) { - case GR_SSTTYPE_VOODOO: - case GR_SSTTYPE_Banshee: - useBGR = GL_TRUE; - fxMesa->snapVertices = GL_TRUE; - break; - case GR_SSTTYPE_Voodoo2: - useBGR = GL_TRUE; - fxMesa->snapVertices = GL_FALSE; - break; - case GR_SSTTYPE_Voodoo3: - case GR_SSTTYPE_Voodoo4: - case GR_SSTTYPE_Voodoo5: - default: - useBGR = GL_FALSE; - fxMesa->snapVertices = GL_FALSE; - break; - } + /* Not that it matters, but tmuRam and fbRam change after grSstWinOpen. */ + tmuRam = voodoo->tmuConfig[GR_TMU0].tmuRam; + fbRam = voodoo->fbRam; + BEGIN_BOARD_LOCK(); + { + FxI32 result; + grGet(GR_MEMORY_TMU, 4, &result); + tmuRam = result / (1024 * 1024); + grGet(GR_MEMORY_FB, 4, &result); + fbRam = result / (1024 * 1024); + } + END_BOARD_LOCK(); + + sprintf(fxMesa->rendererString, "Mesa %s v0.51 %s %dMB FB, %dMB TM, %d TMU, %s", + grGetString(GR_RENDERER), + grGetString(GR_HARDWARE), + fbRam, + tmuRam * voodoo->nTexelfx, + voodoo->nTexelfx, + (voodoo->numChips > 1) ? "SLI" : "NOSLI"); - fxInitPixelTables(fxMesa, useBGR); + fxMesa->bgrOrder = useBGR; - fxMesa->width = FX_grSstScreenWidth(); - fxMesa->height = FX_grSstScreenHeight(); + /* screen */ + fxMesa->screen_width = FX_grSstScreenWidth(); + fxMesa->screen_height = FX_grSstScreenHeight(); + + /* window inside screen */ + fxMesa->width = fxMesa->screen_width; + fxMesa->height = fxMesa->screen_height; + /* scissor inside window */ fxMesa->clipMinX = 0; fxMesa->clipMaxX = fxMesa->width; fxMesa->clipMinY = 0; fxMesa->clipMaxY = fxMesa->height; - fxMesa->screen_width = fxMesa->width; - fxMesa->screen_height = fxMesa->height; - - if (verbose) { + if (fxMesa->verbose) { char buf[80]; strcpy(buf, grGetString(GR_VERSION)); @@ -544,7 +596,7 @@ fxMesaCreateContext(GLuint win, fprintf(stderr, "Voodoo pixel order = %s, vertex snapping = %d\n", useBGR ? "BGR" : "RGB", fxMesa->snapVertices); - fprintf(stderr, "Voodoo screen: %dx%d.%d\n", + fprintf(stderr, "Voodoo screen: %dx%d:%d\n", fxMesa->screen_width, fxMesa->screen_height, colDepth); } diff --git a/src/mesa/drivers/glide/fxdd.c b/src/mesa/drivers/glide/fxdd.c index 386fa5b120c..557c0038647 100644 --- a/src/mesa/drivers/glide/fxdd.c +++ b/src/mesa/drivers/glide/fxdd.c @@ -1,9 +1,3 @@ -/* Hack alert: - * fxDDReadPixels888 does not convert 8A8R8G8B into 5R5G5B - */ - -/* $Id: fxdd.c,v 1.100.2.1 2003/11/21 13:40:21 keithw Exp $ */ - /* * Mesa 3-D graphics library * Version: 5.1 @@ -55,6 +49,7 @@ #include "texstore.h" #include "teximage.h" #include "swrast/swrast.h" +#include "swrast/s_context.h" #include "swrast_setup/swrast_setup.h" #include "tnl/tnl.h" #include "tnl/t_context.h" @@ -63,13 +58,6 @@ -/* These lookup table are used to extract RGB values in [0,255] from - * 16-bit pixel values. - */ -GLubyte FX_PixelToR[0x10000]; -GLubyte FX_PixelToG[0x10000]; -GLubyte FX_PixelToB[0x10000]; - /* lookup table for scaling 4 bit colors up to 8 bits */ GLuint FX_rgb_scale_4[16] = { 0, 17, 34, 51, 68, 85, 102, 119, @@ -98,35 +86,17 @@ GLuint FX_rgb_scale_6[64] = { /* - * Initialize the FX_PixelTo{RGB} arrays. - * Input: bgrOrder - if TRUE, pixels are in BGR order, else RGB order. + * Disable color by masking out R, G, B, A */ -void -fxInitPixelTables(fxMesaContext fxMesa, GLboolean bgrOrder) +static void fxDisableColor (fxMesaContext fxMesa) { - GLuint pixel; - - fxMesa->bgrOrder = bgrOrder; - for (pixel = 0; pixel <= 0xffff; pixel++) { - GLuint r, g, b; - if (bgrOrder) { - r = (pixel & 0x001F) << 3; - g = (pixel & 0x07E0) >> 3; - b = (pixel & 0xF800) >> 8; - } - else { - r = (pixel & 0xF800) >> 8; - g = (pixel & 0x07E0) >> 3; - b = (pixel & 0x001F) << 3; - } - /* fill in low-order bits with proper rounding */ - r = (GLuint)(((double)r * 255. / 0xF8) + 0.5); - g = (GLuint)(((double)g * 255. / 0xFC) + 0.5); - b = (GLuint)(((double)b * 255. / 0xF8) + 0.5); - FX_PixelToR[pixel] = r; - FX_PixelToG[pixel] = g; - FX_PixelToB[pixel] = b; - } + if (fxMesa->colDepth != 16) { + /* 32bpp mode or 15bpp mode */ + fxMesa->Glide.grColorMaskExt(FXFALSE, FXFALSE, FXFALSE, FXFALSE); + } else { + /* 16 bpp mode */ + grColorMask(FXFALSE, FXFALSE); + } } @@ -185,30 +155,42 @@ static void fxDDClear( GLcontext *ctx, const FxU32 clearD = (FxU32) (((1 << ctx->Visual.depthBits) - 1) * ctx->Depth.Clear); const FxU8 clearS = (FxU8) (ctx->Stencil.Clear & 0xff); + /* [dBorca] Hack alert: + * if we set Mesa for 32bit depth, we'll get + * clearD == 0 + * due to 32bit integer overflow! + */ + if ( TDFX_DEBUG & MESA_VERBOSE ) { fprintf( stderr, "%s( %d, %d, %d, %d )\n", __FUNCTION__, (int) x, (int) y, (int) width, (int) height ); } -/*jejeje*/ /* Need this check to respond to glScissor and clipping updates */ + /* should also take care of FX_NEW_COLOR_MASK, FX_NEW_STENCIL, depth? */ if (fxMesa->new_state & FX_NEW_SCISSOR) { - extern void fxSetupScissor(GLcontext * ctx); fxSetupScissor(ctx); + fxMesa->new_state &= ~FX_NEW_SCISSOR; } /* we can't clear accum buffers */ mask &= ~(DD_ACCUM_BIT); + /* + * As per GL spec, stencil masking should be obeyed when clearing + */ if (mask & DD_STENCIL_BIT) { if (!fxMesa->haveHwStencil || fxMesa->unitsState.stencilWriteMask != 0xff) { /* Napalm seems to have trouble with stencil write masks != 0xff */ /* do stencil clear in software */ - mask &= ~(DD_STENCIL_BIT); softwareMask |= DD_STENCIL_BIT; + mask &= ~(DD_STENCIL_BIT); } } + /* + * As per GL spec, color masking should be obeyed when clearing + */ if (ctx->Visual.greenBits != 8 && ctx->Visual.greenBits != 5) { /* can only do color masking if running in 24/32bpp on Napalm */ if (ctx->Color.ColorMask[RCOMP] != ctx->Color.ColorMask[GCOMP] || @@ -252,7 +234,7 @@ static void fxDDClear( GLcontext *ctx, switch (mask & ~DD_STENCIL_BIT) { case DD_BACK_LEFT_BIT | DD_DEPTH_BIT: /* back buffer & depth */ - fxColorMask(fxMesa, GL_TRUE); /* work around Voodoo3 bug */ + /* FX_grColorMaskv_NoLock(ctx, true4); */ /* work around Voodoo3 bug */ grDepthMask(FXTRUE); grRenderBuffer(GR_BUFFER_BACKBUFFER); if (stencil_size > 0) { @@ -264,7 +246,7 @@ static void fxDDClear( GLcontext *ctx, grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (!ctx->Depth.Mask || !ctx->Depth.Test) { + if (!fxMesa->unitsState.depthTestEnabled) { grDepthMask(FXFALSE); } break; @@ -276,7 +258,7 @@ static void fxDDClear( GLcontext *ctx, /* clear depth */ grDepthMask(FXTRUE); grRenderBuffer(GR_BUFFER_BACKBUFFER); - fxColorMask(fxMesa, GL_FALSE); + fxDisableColor(fxMesa); if (stencil_size > 0) fxMesa->Glide.grBufferClearExt(fxMesa->clearC, fxMesa->clearA, @@ -286,7 +268,7 @@ static void fxDDClear( GLcontext *ctx, fxMesa->clearA, clearD); /* clear front */ - fxColorMask(fxMesa, GL_TRUE); + fxSetupColorMask(ctx); grRenderBuffer(GR_BUFFER_FRONTBUFFER); if (stencil_size > 0) fxMesa->Glide.grBufferClearExt(fxMesa->clearC, @@ -296,7 +278,7 @@ static void fxDDClear( GLcontext *ctx, grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (!ctx->Depth.Mask || !ctx->Depth.Test) { + if (!fxMesa->unitsState.depthTestEnabled) { grDepthMask(FXFALSE); } break; @@ -312,7 +294,7 @@ static void fxDDClear( GLcontext *ctx, grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (ctx->Depth.Mask && ctx->Depth.Test) { + if (fxMesa->unitsState.depthTestEnabled) { grDepthMask(FXTRUE); } break; @@ -328,7 +310,7 @@ static void fxDDClear( GLcontext *ctx, grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (ctx->Depth.Mask && ctx->Depth.Test) { + if (fxMesa->unitsState.depthTestEnabled) { grDepthMask(FXTRUE); } break; @@ -353,7 +335,7 @@ static void fxDDClear( GLcontext *ctx, grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (ctx->Depth.Mask && ctx->Depth.Test) { + if (fxMesa->unitsState.depthTestEnabled) { grDepthMask(FXTRUE); } break; @@ -380,14 +362,14 @@ static void fxDDClear( GLcontext *ctx, grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (!ctx->Depth.Mask || !ctx->Depth.Mask) { + if (!fxMesa->unitsState.depthTestEnabled) { grDepthMask(FXFALSE); } break; case DD_DEPTH_BIT: /* just the depth buffer */ grRenderBuffer(GR_BUFFER_BACKBUFFER); - fxColorMask(fxMesa, GL_FALSE); + fxDisableColor(fxMesa); grDepthMask(FXTRUE); if (stencil_size > 0) fxMesa->Glide.grBufferClearExt(fxMesa->clearC, @@ -397,11 +379,13 @@ static void fxDDClear( GLcontext *ctx, grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - fxColorMask(fxMesa, GL_TRUE); - if (ctx->Color._DrawDestMask & FRONT_LEFT_BIT) + fxSetupColorMask(ctx); + if (ctx->Color._DrawDestMask & FRONT_LEFT_BIT) { grRenderBuffer(GR_BUFFER_FRONTBUFFER); - if (!ctx->Depth.Test || !ctx->Depth.Mask) + } + if (!fxMesa->unitsState.depthTestEnabled) { grDepthMask(FXFALSE); + } break; default: /* clear no color buffers or depth buffer but might clear stencil */ @@ -409,16 +393,17 @@ static void fxDDClear( GLcontext *ctx, /* XXX need this RenderBuffer call to work around Glide bug */ grRenderBuffer(GR_BUFFER_BACKBUFFER); grDepthMask(FXFALSE); - fxColorMask(fxMesa, GL_FALSE); + fxDisableColor(fxMesa); fxMesa->Glide.grBufferClearExt(fxMesa->clearC, fxMesa->clearA, clearD, clearS); - if (ctx->Depth.Mask && ctx->Depth.Test) { + if (fxMesa->unitsState.depthTestEnabled) { grDepthMask(FXTRUE); } - fxColorMask(fxMesa, GL_TRUE); - if (ctx->Color._DrawDestMask & FRONT_LEFT_BIT) + fxSetupColorMask(ctx); + if (ctx->Color._DrawDestMask & FRONT_LEFT_BIT) { grRenderBuffer(GR_BUFFER_FRONTBUFFER); + } } } } @@ -456,7 +441,7 @@ fxDDSetDrawBuffer(GLcontext * ctx, GLenum mode) grRenderBuffer(fxMesa->currentFB); } else if (mode == GL_NONE) { - fxColorMask(fxMesa, GL_FALSE); + fxDisableColor(fxMesa); } else { /* we'll need a software fallback */ @@ -468,44 +453,48 @@ fxDDSetDrawBuffer(GLcontext * ctx, GLenum mode) } - - - static void -fxDDDrawBitmap(GLcontext * ctx, GLint px, GLint py, - GLsizei width, GLsizei height, - const struct gl_pixelstore_attrib *unpack, - const GLubyte * bitmap) +fxDDDrawBitmap2 (GLcontext *ctx, GLint px, GLint py, + GLsizei width, GLsizei height, + const struct gl_pixelstore_attrib *unpack, + const GLubyte *bitmap) { fxMesaContext fxMesa = FX_CONTEXT(ctx); + SWcontext *swrast = SWRAST_CONTEXT(ctx); GrLfbInfo_t info; + GrLfbWriteMode_t mode; FxU16 color; const struct gl_pixelstore_attrib *finalUnpack; struct gl_pixelstore_attrib scissoredUnpack; /* check if there's any raster operations enabled which we can't handle */ - if (ctx->Color.AlphaEnabled || - ctx->Color.BlendEnabled || - ctx->Depth.Test || - ctx->Fog.Enabled || - ctx->Color.ColorLogicOpEnabled || - ctx->Stencil.Enabled || - ctx->Scissor.Enabled || - (ctx->DrawBuffer->UseSoftwareAlphaBuffers && - ctx->Color.ColorMask[ACOMP]) || - (ctx->Color._DrawDestMask != FRONT_LEFT_BIT && - ctx->Color._DrawDestMask != BACK_LEFT_BIT)) { + if ((swrast->_RasterMask & (ALPHATEST_BIT | + /*BLEND_BIT |*/ /* blending ok, through pixpipe */ + DEPTH_BIT | /* could be done with RGB:DEPTH */ + FOG_BIT | /* could be done with RGB:DEPTH */ + LOGIC_OP_BIT | + /*CLIP_BIT |*/ /* clipping ok, below */ + STENCIL_BIT | + /*MASKING_BIT |*/ /* masking ok, test follows */ + ALPHABUF_BIT | /* nope! see 565 span kludge */ + MULTI_DRAW_BIT | + OCCLUSION_BIT | /* nope! at least not yet */ + TEXTURE_BIT | + FRAGPROG_BIT)) + || + ((swrast->_RasterMask & MASKING_BIT) /*&& (ctx->Visual.greenBits != 8)*/ && (ctx->Visual.greenBits != 5)) + ) { _swrast_Bitmap(ctx, px, py, width, height, unpack, bitmap); return; } + /* make sure the pixelpipe is configured correctly */ + fxSetupFXUnits(ctx); if (ctx->Scissor.Enabled) { /* This is a bit tricky, but by carefully adjusting the px, py, * width, height, skipPixels and skipRows values we can do * scissoring without special code in the rendering loop. - * - * KW: This code is never reached, see the test above. */ /* we'll construct a new pixelstore struct */ @@ -544,26 +533,25 @@ fxDDDrawBitmap(GLcontext * ctx, GLint px, GLint py, /* compute pixel value */ { - GLint r = (GLint) (ctx->Current.RasterColor[0] * 255.0f); - GLint g = (GLint) (ctx->Current.RasterColor[1] * 255.0f); - GLint b = (GLint) (ctx->Current.RasterColor[2] * 255.0f); - /*GLint a = (GLint)(ctx->Current.RasterColor[3]*255.0f); */ - if (fxMesa->bgrOrder) - color = (FxU16) - (((FxU16) 0xf8 & b) << (11 - 3)) | - (((FxU16) 0xfc & g) << (5 - 3 + 1)) | (((FxU16) 0xf8 & r) >> 3); - else - color = (FxU16) - (((FxU16) 0xf8 & r) << (11 - 3)) | - (((FxU16) 0xfc & g) << (5 - 3 + 1)) | (((FxU16) 0xf8 & b) >> 3); + GLint r = (GLint) (ctx->Current.RasterColor[RCOMP] * 255.0f); + GLint g = (GLint) (ctx->Current.RasterColor[GCOMP] * 255.0f); + GLint b = (GLint) (ctx->Current.RasterColor[BCOMP] * 255.0f); + GLint a = (GLint) (ctx->Current.RasterColor[ACOMP] * 255.0f); + if (fxMesa->colDepth == 15) { + color = TDFXPACKCOLOR1555(b, g, r, a); + mode = GR_LFBWRITEMODE_1555; + } else { + color = fxMesa->bgrOrder ? TDFXPACKCOLOR565(r, g, b) : TDFXPACKCOLOR565(b, g, r); + mode = GR_LFBWRITEMODE_565; + } } info.size = sizeof(info); if (!grLfbLock(GR_LFB_WRITE_ONLY, fxMesa->currentFB, - GR_LFBWRITEMODE_565, - GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) { - fprintf(stderr, "%s: ERROR: locking the linear frame buffer\n", __FUNCTION__); + mode, + GR_ORIGIN_UPPER_LEFT, FXTRUE, &info)) { + _swrast_Bitmap(ctx, px, py, width, height, unpack, bitmap); return; } @@ -632,14 +620,174 @@ fxDDDrawBitmap(GLcontext * ctx, GLint px, GLint py, grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB); } +static void +fxDDDrawBitmap4 (GLcontext *ctx, GLint px, GLint py, + GLsizei width, GLsizei height, + const struct gl_pixelstore_attrib *unpack, + const GLubyte *bitmap) +{ + fxMesaContext fxMesa = FX_CONTEXT(ctx); + SWcontext *swrast = SWRAST_CONTEXT(ctx); + GrLfbInfo_t info; + FxU32 color; + const struct gl_pixelstore_attrib *finalUnpack; + struct gl_pixelstore_attrib scissoredUnpack; + + /* check if there's any raster operations enabled which we can't handle */ + if ((swrast->_RasterMask & (ALPHATEST_BIT | + /*BLEND_BIT |*/ /* blending ok, through pixpipe */ + DEPTH_BIT | /* could be done with RGB:DEPTH */ + FOG_BIT | /* could be done with RGB:DEPTH */ + LOGIC_OP_BIT | + /*CLIP_BIT |*/ /* clipping ok, below */ + STENCIL_BIT | + /*MASKING_BIT |*/ /* masking ok, we're in 32bpp */ + /*ALPHABUF_BIT |*//* alpha ok, we're in 32bpp */ + MULTI_DRAW_BIT | + OCCLUSION_BIT | /* nope! at least not yet */ + TEXTURE_BIT | + FRAGPROG_BIT)) + ) { + _swrast_Bitmap(ctx, px, py, width, height, unpack, bitmap); + return; + } + + /* make sure the pixelpipe is configured correctly */ + fxSetupFXUnits(ctx); + + if (ctx->Scissor.Enabled) { + /* This is a bit tricky, but by carefully adjusting the px, py, + * width, height, skipPixels and skipRows values we can do + * scissoring without special code in the rendering loop. + */ + + /* we'll construct a new pixelstore struct */ + finalUnpack = &scissoredUnpack; + scissoredUnpack = *unpack; + if (scissoredUnpack.RowLength == 0) + scissoredUnpack.RowLength = width; + + /* clip left */ + if (px < ctx->Scissor.X) { + scissoredUnpack.SkipPixels += (ctx->Scissor.X - px); + width -= (ctx->Scissor.X - px); + px = ctx->Scissor.X; + } + /* clip right */ + if (px + width >= ctx->Scissor.X + ctx->Scissor.Width) { + width -= (px + width - (ctx->Scissor.X + ctx->Scissor.Width)); + } + /* clip bottom */ + if (py < ctx->Scissor.Y) { + scissoredUnpack.SkipRows += (ctx->Scissor.Y - py); + height -= (ctx->Scissor.Y - py); + py = ctx->Scissor.Y; + } + /* clip top */ + if (py + height >= ctx->Scissor.Y + ctx->Scissor.Height) { + height -= (py + height - (ctx->Scissor.Y + ctx->Scissor.Height)); + } + + if (width <= 0 || height <= 0) + return; + } + else { + finalUnpack = unpack; + } + + /* compute pixel value */ + { + GLint r = (GLint) (ctx->Current.RasterColor[RCOMP] * 255.0f); + GLint g = (GLint) (ctx->Current.RasterColor[GCOMP] * 255.0f); + GLint b = (GLint) (ctx->Current.RasterColor[BCOMP] * 255.0f); + GLint a = (GLint) (ctx->Current.RasterColor[ACOMP] * 255.0f); + color = TDFXPACKCOLOR8888(b, g, r, a); + } + + info.size = sizeof(info); + if (!grLfbLock(GR_LFB_WRITE_ONLY, + fxMesa->currentFB, + GR_LFBWRITEMODE_8888, + GR_ORIGIN_UPPER_LEFT, FXTRUE, &info)) { + _swrast_Bitmap(ctx, px, py, width, height, unpack, bitmap); + return; + } + + { + const GLint winX = 0; + const GLint winY = fxMesa->height - 1; + /* The dest stride depends on the hardware and whether we're drawing + * to the front or back buffer. This compile-time test seems to do + * the job for now. + */ + const GLint dstStride = info.strideInBytes / 4; /* stride in GLuints */ + + GLint row; + /* compute dest address of bottom-left pixel in bitmap */ + GLuint *dst = (GLuint *) info.lfbPtr + + (winY - py) * dstStride + (winX + px); + + for (row = 0; row < height; row++) { + const GLubyte *src = + (const GLubyte *) _mesa_image_address(finalUnpack, + bitmap, width, height, + GL_COLOR_INDEX, GL_BITMAP, + 0, row, 0); + if (finalUnpack->LsbFirst) { + /* least significan bit first */ + GLubyte mask = 1U << (finalUnpack->SkipPixels & 0x7); + GLint col; + for (col = 0; col < width; col++) { + if (*src & mask) { + dst[col] = color; + } + if (mask == 128U) { + src++; + mask = 1U; + } + else { + mask = mask << 1; + } + } + if (mask != 1) + src++; + } + else { + /* most significan bit first */ + GLubyte mask = 128U >> (finalUnpack->SkipPixels & 0x7); + GLint col; + for (col = 0; col < width; col++) { + if (*src & mask) { + dst[col] = color; + } + if (mask == 1U) { + src++; + mask = 128U; + } + else { + mask = mask >> 1; + } + } + if (mask != 128) + src++; + } + dst -= dstStride; + } + } + + grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB); +} + static void -fxDDReadPixels(GLcontext * ctx, GLint x, GLint y, - GLsizei width, GLsizei height, - GLenum format, GLenum type, - const struct gl_pixelstore_attrib *packing, GLvoid * dstImage) +fxDDReadPixels565 (GLcontext * ctx, + GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + const struct gl_pixelstore_attrib *packing, + GLvoid *dstImage) { - if (ctx->_ImageTransferState) { + if (ctx->_ImageTransferState/* & (IMAGE_SCALE_BIAS_BIT|IMAGE_MAP_COLOR_BIT)*/) { _swrast_ReadPixels(ctx, x, y, width, height, format, type, packing, dstImage); return; @@ -673,20 +821,18 @@ fxDDReadPixels(GLcontext * ctx, GLint x, GLint y, GLubyte *d = dst; for (col = 0; col < halfWidth; col++) { const GLuint pixel = ((const GLuint *) src)[col]; - const GLint pixel0 = pixel & 0xffff; - const GLint pixel1 = pixel >> 16; - *d++ = FX_PixelToR[pixel0]; - *d++ = FX_PixelToG[pixel0]; - *d++ = FX_PixelToB[pixel0]; - *d++ = FX_PixelToR[pixel1]; - *d++ = FX_PixelToG[pixel1]; - *d++ = FX_PixelToB[pixel1]; + *d++ = FX_rgb_scale_5[(pixel >> 11) & 0x1f]; + *d++ = FX_rgb_scale_6[(pixel >> 5) & 0x3f]; + *d++ = FX_rgb_scale_5[ pixel & 0x1f]; + *d++ = FX_rgb_scale_5[(pixel >> 27) & 0x1f]; + *d++ = FX_rgb_scale_6[(pixel >> 21) & 0x3f]; + *d++ = FX_rgb_scale_5[(pixel >> 16) & 0x1f]; } if (extraPixel) { GLushort pixel = src[width - 1]; - *d++ = FX_PixelToR[pixel]; - *d++ = FX_PixelToG[pixel]; - *d++ = FX_PixelToB[pixel]; + *d++ = FX_rgb_scale_5[(pixel >> 11) & 0x1f]; + *d++ = FX_rgb_scale_6[(pixel >> 5) & 0x3f]; + *d++ = FX_rgb_scale_5[ pixel & 0x1f]; } dst += dstStride; src -= srcStride; @@ -701,22 +847,20 @@ fxDDReadPixels(GLcontext * ctx, GLint x, GLint y, GLubyte *d = dst; for (col = 0; col < halfWidth; col++) { const GLuint pixel = ((const GLuint *) src)[col]; - const GLint pixel0 = pixel & 0xffff; - const GLint pixel1 = pixel >> 16; - *d++ = FX_PixelToR[pixel0]; - *d++ = FX_PixelToG[pixel0]; - *d++ = FX_PixelToB[pixel0]; + *d++ = FX_rgb_scale_5[(pixel >> 11) & 0x1f]; + *d++ = FX_rgb_scale_6[(pixel >> 5) & 0x3f]; + *d++ = FX_rgb_scale_5[ pixel & 0x1f]; *d++ = 255; - *d++ = FX_PixelToR[pixel1]; - *d++ = FX_PixelToG[pixel1]; - *d++ = FX_PixelToB[pixel1]; + *d++ = FX_rgb_scale_5[(pixel >> 27) & 0x1f]; + *d++ = FX_rgb_scale_6[(pixel >> 21) & 0x3f]; + *d++ = FX_rgb_scale_5[(pixel >> 16) & 0x1f]; *d++ = 255; } if (extraPixel) { const GLushort pixel = src[width - 1]; - *d++ = FX_PixelToR[pixel]; - *d++ = FX_PixelToG[pixel]; - *d++ = FX_PixelToB[pixel]; + *d++ = FX_rgb_scale_5[(pixel >> 11) & 0x1f]; + *d++ = FX_rgb_scale_6[(pixel >> 5) & 0x3f]; + *d++ = FX_rgb_scale_5[ pixel & 0x1f]; *d++ = 255; } dst += dstStride; @@ -747,14 +891,15 @@ fxDDReadPixels(GLcontext * ctx, GLint x, GLint y, } } -static void fxDDReadPixels555 (GLcontext * ctx, - GLint x, GLint y, - GLsizei width, GLsizei height, - GLenum format, GLenum type, - const struct gl_pixelstore_attrib *packing, - GLvoid *dstImage) +static void +fxDDReadPixels555 (GLcontext * ctx, + GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + const struct gl_pixelstore_attrib *packing, + GLvoid *dstImage) { - if (ctx->_ImageTransferState) { + if (ctx->_ImageTransferState/* & (IMAGE_SCALE_BIAS_BIT|IMAGE_MAP_COLOR_BIT)*/) { _swrast_ReadPixels(ctx, x, y, width, height, format, type, packing, dstImage); return; @@ -788,18 +933,18 @@ static void fxDDReadPixels555 (GLcontext * ctx, GLubyte *d = dst; for (col = 0; col < halfWidth; col++) { const GLuint pixel = ((const GLuint *) src)[col]; - *d++ = FX_rgb_scale_5[ pixel & 0x1f]; - *d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f]; *d++ = FX_rgb_scale_5[(pixel >> 10) & 0x1f]; - *d++ = FX_rgb_scale_5[(pixel >> 16) & 0x1f]; - *d++ = FX_rgb_scale_5[(pixel >> 21) & 0x1f]; + *d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f]; + *d++ = FX_rgb_scale_5[ pixel & 0x1f]; *d++ = FX_rgb_scale_5[(pixel >> 26) & 0x1f]; + *d++ = FX_rgb_scale_5[(pixel >> 21) & 0x1f]; + *d++ = FX_rgb_scale_5[(pixel >> 16) & 0x1f]; } if (extraPixel) { GLushort pixel = src[width - 1]; - *d++ = FX_rgb_scale_5[ pixel & 0x1f]; - *d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f]; *d++ = FX_rgb_scale_5[(pixel >> 10) & 0x1f]; + *d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f]; + *d++ = FX_rgb_scale_5[ pixel & 0x1f]; } dst += dstStride; src -= srcStride; @@ -814,20 +959,20 @@ static void fxDDReadPixels555 (GLcontext * ctx, GLubyte *d = dst; for (col = 0; col < halfWidth; col++) { const GLuint pixel = ((const GLuint *) src)[col]; - *d++ = FX_rgb_scale_5[ pixel & 0x1f]; - *d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f]; *d++ = FX_rgb_scale_5[(pixel >> 10) & 0x1f]; + *d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f]; + *d++ = FX_rgb_scale_5[ pixel & 0x1f]; *d++ = (pixel & 0x8000) ? 255 : 0; - *d++ = FX_rgb_scale_5[(pixel >> 16) & 0x1f]; - *d++ = FX_rgb_scale_5[(pixel >> 21) & 0x1f]; *d++ = FX_rgb_scale_5[(pixel >> 26) & 0x1f]; + *d++ = FX_rgb_scale_5[(pixel >> 21) & 0x1f]; + *d++ = FX_rgb_scale_5[(pixel >> 16) & 0x1f]; *d++ = (pixel & 0x80000000) ? 255 : 0; } if (extraPixel) { const GLushort pixel = src[width - 1]; - *d++ = FX_rgb_scale_5[ pixel & 0x1f]; - *d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f]; *d++ = FX_rgb_scale_5[(pixel >> 10) & 0x1f]; + *d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f]; + *d++ = FX_rgb_scale_5[ pixel & 0x1f]; *d++ = (pixel & 0x8000) ? 255 : 0; } dst += dstStride; @@ -858,14 +1003,15 @@ static void fxDDReadPixels555 (GLcontext * ctx, } } -static void fxDDReadPixels888 (GLcontext * ctx, - GLint x, GLint y, - GLsizei width, GLsizei height, - GLenum format, GLenum type, - const struct gl_pixelstore_attrib *packing, - GLvoid *dstImage) +static void +fxDDReadPixels8888 (GLcontext * ctx, + GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + const struct gl_pixelstore_attrib *packing, + GLvoid *dstImage) { - if (ctx->_ImageTransferState) { + if (ctx->_ImageTransferState/* & (IMAGE_SCALE_BIAS_BIT|IMAGE_MAP_COLOR_BIT)*/) { _swrast_ReadPixels(ctx, x, y, width, height, format, type, packing, dstImage); return; @@ -906,17 +1052,35 @@ static void fxDDReadPixels888 (GLcontext * ctx, } } else if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) { - /* directly memcpy 8A8R8G8B pixels into client's buffer */ - const GLint widthInBytes = width * 4; - GLint row; + /* 8A8R8G8B pixels into client's buffer */ + GLint row, col; for (row = 0; row < height; row++) { - MEMCPY(dst, src, widthInBytes); + GLubyte *d = dst; + for (col = 0; col < width; col++) { + const GLuint pixel = ((const GLuint *) src)[col]; + *d++ = pixel >> 16; + *d++ = pixel >> 8; + *d++ = pixel; + *d++ = pixel >> 24; + } dst += dstStride; src -= srcStride; } } else if (format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5) { - /* convert 8A8R8G8B into 5R5G5B */ + /* convert 8A8R8G8B into 5R6G5B */ + GLint row, col; + for (row = 0; row < height; row++) { + GLushort *d = (GLushort *)dst; + for (col = 0; col < width; col++) { + const GLuint pixel = ((const GLuint *) src)[col]; + *d++ = (((pixel >> 16) & 0xf8) << 8) | + (((pixel >> 8) & 0xfc) << 3) | + ((pixel & 0xf8) >> 3); + } + dst += dstStride; + src -= srcStride; + } } else { grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB); @@ -933,6 +1097,105 @@ static void fxDDReadPixels888 (GLcontext * ctx, } +/* [dBorca] Hack alert: + * not finished!!! + * revise fallback tests and fix scissor; implement new formats + * also write its siblings: 565 and 1555 + */ +void +fxDDDrawPixels8888 (GLcontext * ctx, GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + const struct gl_pixelstore_attrib *unpack, + const GLvoid * pixels) +{ + fxMesaContext fxMesa = FX_CONTEXT(ctx); + GrLfbInfo_t info; + + if (ctx->Pixel.ZoomX != 1.0F || + ctx->Pixel.ZoomY != 1.0F || + (ctx->_ImageTransferState & (IMAGE_SCALE_BIAS_BIT| + IMAGE_MAP_COLOR_BIT)) || + ctx->Color.AlphaEnabled || + ctx->Depth.Test || + ctx->Fog.Enabled || + ctx->Scissor.Enabled || + ctx->Stencil.Enabled || + !ctx->Color.ColorMask[0] || + !ctx->Color.ColorMask[1] || + !ctx->Color.ColorMask[2] || + !ctx->Color.ColorMask[3] || + ctx->Color.ColorLogicOpEnabled || + ctx->Texture._EnabledUnits || + ctx->Depth.OcclusionTest || + fxMesa->fallback) + { + _swrast_DrawPixels( ctx, x, y, width, height, format, type, + unpack, pixels ); + return; + } + + /* lock early to make sure cliprects are right */ + BEGIN_BOARD_LOCK(); + + /* make sure the pixelpipe is configured correctly */ + fxSetupFXUnits(ctx); + + /* look for clipmasks, giveup if region obscured */ +#if 0 + if (ctx->Color.DrawBuffer == GL_FRONT) { + if (!inClipRects_Region(fxMesa, scrX, scrY, width, height)) { + END_BOARD_LOCK(fxMesa); + _swrast_DrawPixels(ctx, x, y, width, height, format, type, unpack, pixels); + return; + } + } +#endif + + info.size = sizeof(info); + if (!grLfbLock(GR_LFB_WRITE_ONLY, + fxMesa->currentFB, + GR_LFBWRITEMODE_8888, + GR_ORIGIN_UPPER_LEFT, FXTRUE, &info)) { + _swrast_DrawPixels(ctx, x, y, width, height, format, type, unpack, pixels); + return; + } + + { + const GLint winX = 0; + const GLint winY = fxMesa->height - 1; + + const GLint dstStride = info.strideInBytes / 4; /* stride in GLuints */ + GLuint *dst = (GLuint *) info.lfbPtr + (winY - y) * dstStride + (winX + x); + const GLubyte *src = (GLubyte *)_mesa_image_address(unpack, pixels, + width, height, format, + type, 0, 0, 0); + const GLint srcStride = _mesa_image_row_stride(unpack, width, format, type); + + if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) { + /* directly memcpy 8A8R8G8B pixels to screen */ + const GLint widthInBytes = width * 4; + GLint row; + for (row = 0; row < height; row++) { + MEMCPY(dst, src, widthInBytes); + dst -= dstStride; + src += srcStride; + } + } + else { + grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB); + END_BOARD_LOCK(); + _swrast_DrawPixels(ctx, x, y, width, height, format, type, unpack, pixels); + return; + } + + } + + grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB); + END_BOARD_LOCK(); +} + + static void fxDDFinish(GLcontext * ctx) { @@ -955,6 +1218,25 @@ fxDDGetString(GLcontext * ctx, GLenum name) switch (name) { case GL_RENDERER: return (GLubyte *)fxMesa->rendererString; +#if 0 /* hack to advertise vanilla extension names */ + case GL_EXTENSIONS: + if (ctx->Extensions.String == NULL) { + GLubyte *ext = _mesa_make_extension_string(ctx); + if (ext != NULL) { + ctx->Extensions.String = _mesa_malloc(strlen((char *)ext) + 256); + if (ctx->Extensions.String != NULL) { + strcpy((char *)ctx->Extensions.String, (char *)ext); +#if 0 /* put any additional extension names here */ + strcat((char *)ctx->Extensions.String, " 3DFX_set_global_palette"); +#endif + _mesa_free(ext); + } else { + ctx->Extensions.String = ext; + } + } + } + return ctx->Extensions.String; +#endif default: return NULL; } @@ -1007,6 +1289,7 @@ fxDDInitFxMesaContext(fxMesaContext fxMesa) fxMesa->unitsState.blendDstFuncRGB = GR_BLEND_ZERO; fxMesa->unitsState.blendSrcFuncAlpha = GR_BLEND_ONE; fxMesa->unitsState.blendDstFuncAlpha = GR_BLEND_ZERO; + fxMesa->unitsState.blendEq = GR_BLEND_OP_ADD; fxMesa->unitsState.depthTestEnabled = GL_FALSE; fxMesa->unitsState.depthMask = GL_TRUE; @@ -1015,16 +1298,17 @@ fxDDInitFxMesaContext(fxMesaContext fxMesa) fxMesa->unitsState.stencilWriteMask = 0xff; - fxColorMask(fxMesa, GL_TRUE); - if (fxMesa->haveDoubleBuffer) { - fxMesa->currentFB = GR_BUFFER_BACKBUFFER; - grRenderBuffer(GR_BUFFER_BACKBUFFER); - } - else { - fxMesa->currentFB = GR_BUFFER_FRONTBUFFER; - grRenderBuffer(GR_BUFFER_FRONTBUFFER); + if (fxMesa->colDepth != 16) { + /* 32bpp mode or 15bpp mode */ + fxMesa->Glide.grColorMaskExt(FXTRUE, FXTRUE, FXTRUE, fxMesa->haveHwAlpha); + } else { + /* 16 bpp mode */ + grColorMask(FXTRUE, fxMesa->haveHwAlpha); } + fxMesa->currentFB = fxMesa->haveDoubleBuffer ? GR_BUFFER_BACKBUFFER : GR_BUFFER_FRONTBUFFER; + grRenderBuffer(fxMesa->currentFB); + fxMesa->state = MALLOC(FX_grGetInteger(GR_GLIDE_STATE_SIZE)); fxMesa->fogTable = (GrFog_t *) MALLOC(FX_grGetInteger(GR_FOG_TABLE_ENTRIES) * sizeof(GrFog_t)); @@ -1040,7 +1324,9 @@ fxDDInitFxMesaContext(fxMesaContext fxMesa) if (fxMesa->haveZBuffer) grDepthBufferMode(GR_DEPTHBUFFER_ZBUFFER); - grLfbWriteColorFormat(GR_COLORFORMAT_ABGR); + if (!fxMesa->bgrOrder) { + grLfbWriteColorFormat(GR_COLORFORMAT_ABGR); + } fxMesa->textureAlign = FX_grGetInteger(GR_TEXTURE_ALIGN); /* [koolsmoky] */ @@ -1090,6 +1376,13 @@ fxDDInitFxMesaContext(fxMesaContext fxMesa) fxDDInitExtensions(ctx); +#if 0 + /* [dBorca] Hack alert: + * do we want dither? It just looks bad... + */ + grEnable(GR_ALLOW_MIPMAP_DITHER); + grTexNccTable(GR_NCCTABLE_NCC0); /* set this once... no multipass */ +#endif grGlideGetState((GrState *) fxMesa->state); return 1; @@ -1121,11 +1414,11 @@ fxDDInitExtensions(GLcontext * ctx) { fxMesaContext fxMesa = FX_CONTEXT(ctx); - /*_mesa_add_extension(ctx, GL_TRUE, "3DFX_set_global_palette", 0);*/ _mesa_enable_extension(ctx, "GL_EXT_point_parameters"); _mesa_enable_extension(ctx, "GL_EXT_paletted_texture"); _mesa_enable_extension(ctx, "GL_EXT_texture_lod_bias"); _mesa_enable_extension(ctx, "GL_EXT_shared_texture_palette"); + _mesa_enable_extension(ctx, "GL_EXT_blend_func_separate"); if (fxMesa->haveTwoTMUs) { _mesa_enable_extension(ctx, "GL_EXT_texture_env_add"); @@ -1136,18 +1429,44 @@ fxDDInitExtensions(GLcontext * ctx) _mesa_enable_extension( ctx, "GL_EXT_stencil_wrap" ); } -#if 0 /* not ready yet */ - /* banshee/avenger should enable this for NCC */ - _mesa_enable_extension( ctx, "GL_ARB_texture_compression" ); -#endif - if (0/*IS_NAPALM*/) { - /* tex_compress: not ready yet */ - _mesa_enable_extension( ctx, "GL_3DFX_texture_compression_FXT1" ); - _mesa_enable_extension( ctx, "GL_EXT_texture_compression_s3tc" ); - /*_mesa_enable_extension( ctx, "GL_S3_s3tc" );*/ - - /* env_combine: not ready yet */ - /*_mesa_enable_extension( ctx, "GL_EXT_texture_env_combine" );*/ + /* [dBorca] Hack alert: + * True texture compression can be done only on Napalm. + * We will advertise, however, generic texture compression + * on all Voodoo cards; the Mesa logic allows us to eventually + * fallback to uncompressed. This will fix those dumb applications + * which refuse to run w/o texture compression! We actually _can_ + * do texture compression for pre-Napalm cores, through NCC. But + * NCC poses many issues: + * 1) NCC w/o DITHER_ERR has poor quality and NCC w/ DITHER_ERR is + * damn slow! + * 2) NCC compression cannot be used with multitexturing, because + * the decompression tables are not per TMU anymore (bear in mind + * that earlier Voodoos could handle 2 NCC tables for each TMU -- + * just look for POINTCAST_PALETTE). As a last resort, we could + * fake NCC multitexturing through multipass rendering, but... + * ohwell, it's not worth the effort... + * This stand true for multitexturing palletized textures. + * 3) since NCC is not an OpenGL standard (as opposed to FXT1), we + * would need to plug deeper into the core... First, we would need to + * bind NCC to GL_COMPRESSED_RGB[A]. Then, we would need to trick + * Mesa into reporting our texture as compressed. Last, we would need + * to stash the NCC decompression table into the mipmap data and adjust + * CompressedSize accordingly! + */ + _mesa_enable_extension(ctx, "GL_ARB_texture_compression"); + + if (fxMesa->type >= GR_SSTTYPE_Voodoo4) { + _mesa_enable_extension(ctx, "GL_3DFX_texture_compression_FXT1"); + _mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc"); + _mesa_enable_extension(ctx, "GL_S3_s3tc"); + } + + if (fxMesa->HaveCmbExt) { + _mesa_enable_extension(ctx, "GL_EXT_texture_env_combine"); + } + + if (fxMesa->HavePixExt) { + _mesa_enable_extension(ctx, "GL_EXT_blend_subtract"); } if (fxMesa->HaveMirExt) { @@ -1181,8 +1500,17 @@ fx_check_IsInHardware(GLcontext * ctx) return FX_FALLBACK_DRAW_BUFFER; } - if (ctx->Color.BlendEnabled && (ctx->Color.BlendEquation != GL_FUNC_ADD_EXT)) { - return FX_FALLBACK_BLEND; + if (ctx->Color.BlendEnabled) { + if (ctx->Color.BlendEquation != GL_FUNC_ADD_EXT) { + if (fxMesa->HavePixExt) { + if ((ctx->Color.BlendEquation != GL_FUNC_SUBTRACT_EXT) && + (ctx->Color.BlendEquation != GL_FUNC_REVERSE_SUBTRACT_EXT)) { + return FX_FALLBACK_BLEND; + } + } else { + return FX_FALLBACK_BLEND; + } + } } if (ctx->Color.ColorLogicOpEnabled && (ctx->Color.LogicOp != GL_COPY)) { @@ -1212,6 +1540,7 @@ fx_check_IsInHardware(GLcontext * ctx) return FX_FALLBACK_TEXTURE_1D_3D; if (ctx->Texture.Unit[0]._ReallyEnabled & TEXTURE_2D_BIT) { + if (fxMesa->type < GR_SSTTYPE_Voodoo2) if (ctx->Texture.Unit[0].EnvMode == GL_BLEND && (ctx->Texture.Unit[1]._ReallyEnabled & TEXTURE_2D_BIT || ctx->Texture.Unit[0].EnvColor[0] != 0 || @@ -1225,6 +1554,7 @@ fx_check_IsInHardware(GLcontext * ctx) } if (ctx->Texture.Unit[1]._ReallyEnabled & TEXTURE_2D_BIT) { + if (fxMesa->type < GR_SSTTYPE_Voodoo2) if (ctx->Texture.Unit[1].EnvMode == GL_BLEND) return FX_FALLBACK_TEXTURE_ENV; if (ctx->Texture.Unit[1]._Current->Image[0]->Border > 0) @@ -1264,6 +1594,7 @@ fx_check_IsInHardware(GLcontext * ctx) return FX_FALLBACK_TEXTURE_MULTI; } + if (fxMesa->type < GR_SSTTYPE_Voodoo2) if ((ctx->Texture.Unit[0]._ReallyEnabled & TEXTURE_2D_BIT) && (ctx->Texture.Unit[0].EnvMode == GL_BLEND)) { return FX_FALLBACK_TEXTURE_ENV; @@ -1314,18 +1645,21 @@ fxSetupDDPointers(GLcontext * ctx) ctx->Driver.DrawBuffer = fxDDSetDrawBuffer; ctx->Driver.GetBufferSize = fxDDBufferSize; ctx->Driver.Accum = _swrast_Accum; - ctx->Driver.Bitmap = fxDDDrawBitmap; ctx->Driver.CopyPixels = _swrast_CopyPixels; ctx->Driver.DrawPixels = _swrast_DrawPixels; switch (fxMesa->colDepth) { case 15: ctx->Driver.ReadPixels = fxDDReadPixels555; + ctx->Driver.Bitmap = fxDDDrawBitmap2; break; case 16: - ctx->Driver.ReadPixels = fxDDReadPixels; + ctx->Driver.ReadPixels = fxDDReadPixels565; + ctx->Driver.Bitmap = fxDDDrawBitmap2; break; case 32: - ctx->Driver.ReadPixels = fxDDReadPixels888; + ctx->Driver.DrawPixels = fxDDDrawPixels8888; + ctx->Driver.ReadPixels = fxDDReadPixels8888; + ctx->Driver.Bitmap = fxDDDrawBitmap4; break; } ctx->Driver.ResizeBuffers = _swrast_alloc_buffers; @@ -1339,11 +1673,13 @@ fxSetupDDPointers(GLcontext * ctx) ctx->Driver.TexSubImage2D = fxDDTexSubImage2D; ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d; ctx->Driver.CompressedTexImage1D = _mesa_store_compressed_teximage1d; - ctx->Driver.CompressedTexImage2D = _mesa_store_compressed_teximage2d; + ctx->Driver.CompressedTexImage2D = fxDDCompressedTexImage2D; ctx->Driver.CompressedTexImage3D = _mesa_store_compressed_teximage3d; ctx->Driver.CompressedTexSubImage1D = _mesa_store_compressed_texsubimage1d; - ctx->Driver.CompressedTexSubImage2D = _mesa_store_compressed_texsubimage2d; + ctx->Driver.CompressedTexSubImage2D = fxDDCompressedTexSubImage2D; ctx->Driver.CompressedTexSubImage3D = _mesa_store_compressed_texsubimage3d; + ctx->Driver.IsCompressedFormat = fxDDIsCompressedFormat; + ctx->Driver.CompressedTextureSize = fxDDCompressedTextureSize; ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d; ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d; ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d; @@ -1358,9 +1694,12 @@ fxSetupDDPointers(GLcontext * ctx) ctx->Driver.TexParameter = fxDDTexParam; ctx->Driver.BindTexture = fxDDTexBind; ctx->Driver.DeleteTexture = fxDDTexDel; + ctx->Driver.IsTextureResident = fxDDIsTextureResident; ctx->Driver.UpdateTexturePalette = fxDDTexPalette; ctx->Driver.AlphaFunc = fxDDAlphaFunc; ctx->Driver.BlendFunc = fxDDBlendFunc; + ctx->Driver.BlendFuncSeparate = fxDDBlendFuncSeparate; + ctx->Driver.BlendEquation = fxDDBlendEquation; ctx->Driver.DepthFunc = fxDDDepthFunc; ctx->Driver.DepthMask = fxDDDepthMask; ctx->Driver.ColorMask = fxDDColorMask; diff --git a/src/mesa/drivers/glide/fxddspan.c b/src/mesa/drivers/glide/fxddspan.c index 460126e86b1..158e34e08e1 100644 --- a/src/mesa/drivers/glide/fxddspan.c +++ b/src/mesa/drivers/glide/fxddspan.c @@ -1,12 +1,3 @@ -/* Hack alert: - * The performance hit is disastruous for SPAN functions. - * Should we use SpanRenderStart / SpanRenderFinish in `swrast.h' - * for locking / unlocking the LFB? - * Optimize and check endianess for `read_R8G8B8_pixels' - */ - -/* $Id: fxddspan.c,v 1.25 2003/10/02 17:36:44 brianp Exp $ */ - /* * Mesa 3-D graphics library * Version: 4.0 @@ -54,548 +45,415 @@ #include "fxglidew.h" #include "swrast/swrast.h" -#ifdef _MSC_VER -#ifdef _WIN32 -#pragma warning( disable : 4090 4022 ) -/* 4101 : "different 'const' qualifier" - * 4022 : "pointer mistmatch for actual parameter 'n' - */ -#endif -#endif - - - -#define writeRegionClipped(fxm,dst_buffer,dst_x,dst_y,src_format,src_width,src_height,src_stride,src_data) \ - FX_grLfbWriteRegion(dst_buffer,dst_x,dst_y,src_format,src_width,src_height,src_stride,src_data) - +/************************************************************************/ +/***** Span functions *****/ +/************************************************************************/ -/* KW: Rearranged the args in the call to grLfbWriteRegion(). +#define DBG 0 + + +#define LOCAL_VARS \ + GLuint pitch = info.strideInBytes; \ + GLuint height = fxMesa->height; \ + char *buf = (char *)((char *)info.lfbPtr + 0 /* x, y offset */); \ + GLuint p; \ + (void) buf; (void) p; + +#define CLIPPIXEL( _x, _y ) ( _x >= minx && _x < maxx && \ + _y >= miny && _y < maxy ) + +#define CLIPSPAN( _x, _y, _n, _x1, _n1, _i ) \ + if ( _y < miny || _y >= maxy ) { \ + _n1 = 0, _x1 = x; \ + } else { \ + _n1 = _n; \ + _x1 = _x; \ + if ( _x1 < minx ) _i += (minx-_x1), n1 -= (minx-_x1), _x1 = minx;\ + if ( _x1 + _n1 >= maxx ) n1 -= (_x1 + n1 - maxx); \ + } + +#define Y_FLIP(_y) (height - _y - 1) + +#define HW_WRITE_LOCK() \ + fxMesaContext fxMesa = FX_CONTEXT(ctx); \ + GrLfbInfo_t info; \ + info.size = sizeof(GrLfbInfo_t); \ + if ( grLfbLock( GR_LFB_WRITE_ONLY, \ + fxMesa->currentFB, LFB_MODE, \ + GR_ORIGIN_UPPER_LEFT, FXFALSE, &info ) ) { + +#define HW_WRITE_UNLOCK() \ + grLfbUnlock( GR_LFB_WRITE_ONLY, fxMesa->currentFB ); \ + } + +#define HW_READ_LOCK() \ + fxMesaContext fxMesa = FX_CONTEXT(ctx); \ + GrLfbInfo_t info; \ + info.size = sizeof(GrLfbInfo_t); \ + if ( grLfbLock( GR_LFB_READ_ONLY, fxMesa->currentFB, \ + LFB_MODE, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info ) ) { + +#define HW_READ_UNLOCK() \ + grLfbUnlock( GR_LFB_READ_ONLY, fxMesa->currentFB ); \ + } + +#define HW_WRITE_CLIPLOOP() \ + do { \ + int _nc = 1; /* numcliprects */ \ + /* [dBorca] Hack alert: */ \ + /* remember, we need to flip the scissor, too */ \ + /* is it better to do it inside fxDDScissor? */ \ + while (_nc--) { \ + const int minx = fxMesa->clipMinX; \ + const int maxy = Y_FLIP(fxMesa->clipMinY); \ + const int maxx = fxMesa->clipMaxX; \ + const int miny = Y_FLIP(fxMesa->clipMaxY); + +#define HW_READ_CLIPLOOP() \ + do { \ + int _nc = 1; /* numcliprects */ \ + /* [dBorca] Hack alert: */ \ + /* remember, we need to flip the scissor, too */ \ + /* is it better to do it inside fxDDScissor? */ \ + while (_nc--) { \ + const int minx = fxMesa->clipMinX; \ + const int maxy = Y_FLIP(fxMesa->clipMinY); \ + const int maxx = fxMesa->clipMaxX; \ + const int miny = Y_FLIP(fxMesa->clipMaxY); + +#define HW_ENDCLIPLOOP() \ + } \ + } while (0) + + +/* 16 bit, ARGB1555 color spanline and pixel functions */ + +#undef LFB_MODE +#define LFB_MODE GR_LFBWRITEMODE_1555 + +#undef BYTESPERPIXEL +#define BYTESPERPIXEL 2 + +#undef INIT_MONO_PIXEL +#define INIT_MONO_PIXEL(p, color) \ + p = TDFXPACKCOLOR1555( color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP] ) + +#define WRITE_RGBA( _x, _y, r, g, b, a ) \ + *(GLushort *)(buf + _x*BYTESPERPIXEL + _y*pitch) = \ + TDFXPACKCOLOR1555( r, g, b, a ) + +#define WRITE_PIXEL( _x, _y, p ) \ + *(GLushort *)(buf + _x*BYTESPERPIXEL + _y*pitch) = p + +#define READ_RGBA( rgba, _x, _y ) \ + do { \ + GLushort p = *(GLushort *)(buf + _x*BYTESPERPIXEL + _y*pitch); \ + rgba[0] = FX_rgb_scale_5[(p >> 10) & 0x1F]; \ + rgba[1] = FX_rgb_scale_5[(p >> 5) & 0x1F]; \ + rgba[2] = FX_rgb_scale_5[ p & 0x1F]; \ + rgba[3] = (p & 0x8000) ? 255 : 0; \ + } while (0) + +#define TAG(x) tdfx##x##_ARGB1555 +#include "../dri/common/spantmp.h" + + +/* 16 bit, RGB565 color spanline and pixel functions */ +/* [dBorca] Hack alert: + * This is wrong. The alpha value is lost, even when we provide + * HW alpha (565 w/o depth buffering). To really update alpha buffer, + * we would need to do the 565 writings via 8888 colorformat and rely + * on the Voodoo to perform color scaling. In which case our 565 span + * would look nicer! But this violates FSAA rules... */ -#define LFB_WRITE_SPAN_MESA(dst_buffer, \ - dst_x, \ - dst_y, \ - src_width, \ - src_stride, \ - src_data) \ - writeRegionClipped(fxMesa, dst_buffer, \ - dst_x, \ - dst_y, \ - GR_LFB_SRC_FMT_8888, \ - src_width, \ - 1, \ - src_stride, \ - src_data) \ +#undef LFB_MODE +#define LFB_MODE GR_LFBWRITEMODE_565 -/************************************************************************/ -/***** Span functions *****/ -/************************************************************************/ +#undef BYTESPERPIXEL +#define BYTESPERPIXEL 2 +#undef INIT_MONO_PIXEL +#define INIT_MONO_PIXEL(p, color) \ + p = TDFXPACKCOLOR565( color[RCOMP], color[GCOMP], color[BCOMP] ) -static void -fxDDWriteRGBASpan(const GLcontext * ctx, - GLuint n, GLint x, GLint y, - const GLubyte rgba[][4], const GLubyte mask[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLuint i; - GLint bottom = fxMesa->height - 1; +#define WRITE_RGBA( _x, _y, r, g, b, a ) \ + *(GLushort *)(buf + _x*BYTESPERPIXEL + _y*pitch) = \ + TDFXPACKCOLOR565( r, g, b ) - if (TDFX_DEBUG & VERBOSE_DRIVER) { - fprintf(stderr, "%s(...)\n", __FUNCTION__); - } +#define WRITE_PIXEL( _x, _y, p ) \ + *(GLushort *)(buf + _x*BYTESPERPIXEL + _y*pitch) = p - if (mask) { - int span = 0; - - for (i = 0; i < n; i++) { - if (mask[i]) { - ++span; - } - else { - if (span > 0) { - LFB_WRITE_SPAN_MESA(fxMesa->currentFB, x + i - span, - bottom - y, - /* GR_LFB_SRC_FMT_8888, */ span, /*1, */ 0, - (void *) rgba[i - span]); - span = 0; - } - } - } - - if (span > 0) - LFB_WRITE_SPAN_MESA(fxMesa->currentFB, x + n - span, bottom - y, - /* GR_LFB_SRC_FMT_8888, */ span, /*1, */ 0, - (void *) rgba[n - span]); - } - else - LFB_WRITE_SPAN_MESA(fxMesa->currentFB, x, bottom - y, /* GR_LFB_SRC_FMT_8888, */ - n, /* 1, */ 0, (void *) rgba); -} +#define READ_RGBA( rgba, _x, _y ) \ + do { \ + GLushort p = *(GLushort *)(buf + _x*BYTESPERPIXEL + _y*pitch); \ + rgba[0] = FX_rgb_scale_5[(p >> 11) & 0x1F]; \ + rgba[1] = FX_rgb_scale_6[(p >> 5) & 0x3F]; \ + rgba[2] = FX_rgb_scale_5[ p & 0x1F]; \ + rgba[3] = 0xff; \ + } while (0) +#define TAG(x) tdfx##x##_RGB565 +#include "../dri/common/spantmp.h" -static void -fxDDWriteRGBSpan(const GLcontext * ctx, - GLuint n, GLint x, GLint y, - const GLubyte rgb[][3], const GLubyte mask[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLuint i; - GLint bottom = fxMesa->height - 1; - GLubyte rgba[MAX_WIDTH][4]; - if (TDFX_DEBUG & VERBOSE_DRIVER) { - fprintf(stderr, "%s(...)\n", __FUNCTION__); - } +/* 32 bit, ARGB8888 color spanline and pixel functions */ - if (mask) { - int span = 0; - - for (i = 0; i < n; i++) { - if (mask[i]) { - rgba[span][RCOMP] = rgb[i][0]; - rgba[span][GCOMP] = rgb[i][1]; - rgba[span][BCOMP] = rgb[i][2]; - rgba[span][ACOMP] = 255; - ++span; - } - else { - if (span > 0) { - LFB_WRITE_SPAN_MESA(fxMesa->currentFB, x + i - span, - bottom - y, - /*GR_LFB_SRC_FMT_8888, */ span, /* 1, */ 0, - (void *) rgba); - span = 0; - } - } - } - - if (span > 0) - LFB_WRITE_SPAN_MESA(fxMesa->currentFB, x + n - span, bottom - y, - /*GR_LFB_SRC_FMT_8888, */ span, /* 1, */ 0, - (void *) rgba); - } - else { - for (i = 0; i < n; i++) { - rgba[i][RCOMP] = rgb[i][0]; - rgba[i][GCOMP] = rgb[i][1]; - rgba[i][BCOMP] = rgb[i][2]; - rgba[i][ACOMP] = 255; - } - - LFB_WRITE_SPAN_MESA(fxMesa->currentFB, x, bottom - y, /* GR_LFB_SRC_FMT_8888, */ - n, /* 1, */ 0, (void *) rgba); - } -} +#undef LFB_MODE +#define LFB_MODE GR_LFBWRITEMODE_8888 +#undef BYTESPERPIXEL +#define BYTESPERPIXEL 4 -static void -fxDDWriteMonoRGBASpan(const GLcontext * ctx, - GLuint n, GLint x, GLint y, - const GLchan color[4], const GLubyte mask[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLuint i; - GLint bottom = fxMesa->height - 1; - GLuint data[MAX_WIDTH]; - GrColor_t gColor = FXCOLOR4(color); +#undef INIT_MONO_PIXEL +#define INIT_MONO_PIXEL(p, color) \ + p = TDFXPACKCOLOR8888( color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP] ) - if (TDFX_DEBUG & VERBOSE_DRIVER) { - fprintf(stderr, "%s(...)\n", __FUNCTION__); - } +#define WRITE_RGBA( _x, _y, r, g, b, a ) \ + *(GLuint *)(buf + _x*BYTESPERPIXEL + _y*pitch) = \ + TDFXPACKCOLOR8888( r, g, b, a ) - if (mask) { - int span = 0; - - for (i = 0; i < n; i++) { - if (mask[i]) { - data[span] = (GLuint) gColor; - ++span; - } - else { - if (span > 0) { - writeRegionClipped(fxMesa, fxMesa->currentFB, x + i - span, - bottom - y, GR_LFB_SRC_FMT_8888, span, 1, 0, - (void *) data); - span = 0; - } - } - } - - if (span > 0) - writeRegionClipped(fxMesa, fxMesa->currentFB, x + n - span, - bottom - y, GR_LFB_SRC_FMT_8888, span, 1, 0, - (void *) data); - } - else { - for (i = 0; i < n; i++) { - data[i] = (GLuint) gColor; - } +#define WRITE_PIXEL( _x, _y, p ) \ + *(GLuint *)(buf + _x*BYTESPERPIXEL + _y*pitch) = p - writeRegionClipped(fxMesa, fxMesa->currentFB, x, bottom - y, - GR_LFB_SRC_FMT_8888, n, 1, 0, (void *) data); - } -} +#define READ_RGBA( rgba, _x, _y ) \ + do { \ + GLuint p = *(GLuint *)(buf + _x*BYTESPERPIXEL + _y*pitch); \ + rgba[0] = (p >> 16) & 0xff; \ + rgba[1] = (p >> 8) & 0xff; \ + rgba[2] = (p >> 0) & 0xff; \ + rgba[3] = (p >> 24) & 0xff; \ + } while (0) +#define TAG(x) tdfx##x##_ARGB8888 +#include "../dri/common/spantmp.h" -#if 0 -static void -fxDDReadRGBASpan(const GLcontext * ctx, - GLuint n, GLint x, GLint y, GLubyte rgba[][4]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLushort data[MAX_WIDTH]; - GLuint i; - GLint bottom = fxMesa->height - 1; - if (TDFX_DEBUG & VERBOSE_DRIVER) { - fprintf(stderr, "%s(...)\n", __FUNCTION__); - } +/************************************************************************/ +/***** Depth functions *****/ +/************************************************************************/ - assert(n < MAX_WIDTH); +#define DBG 0 - FX_grLfbReadRegion(fxMesa->currentFB, x, bottom - y, n, 1, 0, data); +#undef HW_WRITE_LOCK +#undef HW_WRITE_UNLOCK +#undef HW_READ_LOCK +#undef HW_READ_UNLOCK - for (i = 0; i < n; i++) { - GLushort pixel = data[i]; - rgba[i][RCOMP] = FX_PixelToR[pixel]; - rgba[i][GCOMP] = FX_PixelToG[pixel]; - rgba[i][BCOMP] = FX_PixelToB[pixel]; - rgba[i][ACOMP] = 255; - } -} -#endif +#define HW_CLIPLOOP HW_WRITE_CLIPLOOP +#define LOCAL_DEPTH_VARS \ + GLuint pitch = info.strideInBytes; \ + GLuint height = fxMesa->height; \ + char *buf = (char *)((char *)info.lfbPtr + 0 /* x, y offset */); \ + (void) buf; -/* - * Read a span of 16-bit RGB pixels. Note, we don't worry about cliprects - * since OpenGL says obscured pixels have undefined values. - */ -static void -read_R5G6B5_span(const GLcontext * ctx, - GLuint n, GLint x, GLint y, GLubyte rgba[][4]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbInfo_t info; - BEGIN_BOARD_LOCK(); - if (grLfbLock(GR_LFB_READ_ONLY, - fxMesa->currentFB, - GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) { - const GLint winX = 0; - const GLint winY = fxMesa->height - 1; - const GLint srcStride = info.strideInBytes / 2; /* stride in GLushorts */ - const GLushort *data16 = (const GLushort *) info.lfbPtr - + (winY - y) * srcStride + (winX + x); - const GLuint *data32 = (const GLuint *) data16; - GLuint i, j; - GLuint extraPixel = (n & 1); - n -= extraPixel; - for (i = j = 0; i < n; i += 2, j++) { - GLuint pixel = data32[j]; - GLuint pixel0 = pixel & 0xffff; - GLuint pixel1 = pixel >> 16; - rgba[i][RCOMP] = FX_PixelToR[pixel0]; - rgba[i][GCOMP] = FX_PixelToG[pixel0]; - rgba[i][BCOMP] = FX_PixelToB[pixel0]; - rgba[i][ACOMP] = 255; - rgba[i + 1][RCOMP] = FX_PixelToR[pixel1]; - rgba[i + 1][GCOMP] = FX_PixelToG[pixel1]; - rgba[i + 1][BCOMP] = FX_PixelToB[pixel1]; - rgba[i + 1][ACOMP] = 255; - } - if (extraPixel) { - GLushort pixel = data16[n]; - rgba[n][RCOMP] = FX_PixelToR[pixel]; - rgba[n][GCOMP] = FX_PixelToG[pixel]; - rgba[n][BCOMP] = FX_PixelToB[pixel]; - rgba[n][ACOMP] = 255; - } - - grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB); - } - END_BOARD_LOCK(); -} +#define HW_WRITE_LOCK() \ + fxMesaContext fxMesa = FX_CONTEXT(ctx); \ + GrLfbInfo_t info; \ + info.size = sizeof(GrLfbInfo_t); \ + if ( grLfbLock( GR_LFB_WRITE_ONLY, \ + GR_BUFFER_AUXBUFFER, LFB_MODE, \ + GR_ORIGIN_UPPER_LEFT, FXFALSE, &info ) ) { -/* - * Read a span of 15-bit RGB pixels. Note, we don't worry about cliprects - * since OpenGL says obscured pixels have undefined values. - */ -static void read_R5G5B5_span (const GLcontext * ctx, - GLuint n, - GLint x, GLint y, - GLubyte rgba[][4]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbInfo_t info; - BEGIN_BOARD_LOCK(); - if (grLfbLock(GR_LFB_READ_ONLY, - fxMesa->currentFB, - GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) { - const GLint winX = 0; - const GLint winY = fxMesa->height - 1; - const GLint srcStride = info.strideInBytes / 2; /* stride in GLushorts */ - const GLushort *data16 = (const GLushort *) info.lfbPtr - + (winY - y) * srcStride + (winX + x); - const GLuint *data32 = (const GLuint *) data16; - GLuint i, j; - GLuint extraPixel = (n & 1); - n -= extraPixel; - for (i = j = 0; i < n; i += 2, j++) { - GLuint pixel = data32[j]; - rgba[i][RCOMP] = FX_rgb_scale_5[ pixel & 0x1f]; - rgba[i][GCOMP] = FX_rgb_scale_5[(pixel >> 5) & 0x1f]; - rgba[i][BCOMP] = FX_rgb_scale_5[(pixel >> 10) & 0x1f]; - rgba[i][ACOMP] = (pixel & 0x8000) ? 255 : 0; - rgba[i + 1][RCOMP] = FX_rgb_scale_5[(pixel >> 16) & 0x1f]; - rgba[i + 1][GCOMP] = FX_rgb_scale_5[(pixel >> 21) & 0x1f]; - rgba[i + 1][BCOMP] = FX_rgb_scale_5[(pixel >> 26) & 0x1f]; - rgba[i + 1][ACOMP] = (pixel & 0x80000000) ? 255 : 0; - } - if (extraPixel) { - GLushort pixel = data16[n]; - rgba[n][RCOMP] = FX_rgb_scale_5[ pixel & 0x1f]; - rgba[n][GCOMP] = FX_rgb_scale_5[(pixel >> 5) & 0x1f]; - rgba[n][BCOMP] = FX_rgb_scale_5[(pixel >> 10) & 0x1f]; - rgba[n][ACOMP] = (pixel & 0x8000) ? 255 : 0; - } - - grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB); - } - END_BOARD_LOCK(); -} +#define HW_WRITE_UNLOCK() \ + grLfbUnlock( GR_LFB_WRITE_ONLY, GR_BUFFER_AUXBUFFER); \ + } -/* - * Read a span of 32-bit RGB pixels. Note, we don't worry about cliprects - * since OpenGL says obscured pixels have undefined values. - */ -static void read_R8G8B8_span (const GLcontext * ctx, - GLuint n, - GLint x, GLint y, - GLubyte rgba[][4]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - BEGIN_BOARD_LOCK(); - grLfbReadRegion(fxMesa->currentFB, x, fxMesa->height - 1 - y, n, 1, n * 4, rgba); - END_BOARD_LOCK(); -} +#define HW_READ_LOCK() \ + fxMesaContext fxMesa = FX_CONTEXT(ctx); \ + GrLfbInfo_t info; \ + info.size = sizeof(GrLfbInfo_t); \ + if ( grLfbLock( GR_LFB_READ_ONLY, GR_BUFFER_AUXBUFFER, \ + LFB_MODE, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info ) ) { +#define HW_READ_UNLOCK() \ + grLfbUnlock( GR_LFB_READ_ONLY, GR_BUFFER_AUXBUFFER); \ + } -/************************************************************************/ -/***** Pixel functions *****/ -/************************************************************************/ -static void -fxDDWriteRGBAPixels(const GLcontext * ctx, - GLuint n, const GLint x[], const GLint y[], - CONST GLubyte rgba[][4], const GLubyte mask[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLuint i; - GLint bottom = fxMesa->height - 1; +/* 16 bit, depth spanline and pixel functions */ - if (TDFX_DEBUG & VERBOSE_DRIVER) { - fprintf(stderr, "%s(...)\n", __FUNCTION__); - } +#undef LFB_MODE +#define LFB_MODE GR_LFBWRITEMODE_ZA16 - for (i = 0; i < n; i++) - if (mask[i]) - LFB_WRITE_SPAN_MESA(fxMesa->currentFB, x[i], bottom - y[i], - 1, 1, (void *) rgba[i]); -} +#undef BYTESPERPIXEL +#define BYTESPERPIXEL 2 -static void -fxDDWriteMonoRGBAPixels(const GLcontext * ctx, - GLuint n, const GLint x[], const GLint y[], - const GLchan color[4], const GLubyte mask[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLuint i; - GLint bottom = fxMesa->height - 1; - GrColor_t gColor = FXCOLOR4(color); +#define WRITE_DEPTH( _x, _y, d ) \ + *(GLushort *)(buf + _x*BYTESPERPIXEL + _y*pitch) = d - if (TDFX_DEBUG & VERBOSE_DRIVER) { - fprintf(stderr, "%s(...)\n", __FUNCTION__); - } +#define READ_DEPTH( d, _x, _y ) \ + d = *(GLushort *)(buf + _x*BYTESPERPIXEL + _y*pitch) - for (i = 0; i < n; i++) - if (mask[i]) - writeRegionClipped(fxMesa, fxMesa->currentFB, x[i], bottom - y[i], - GR_LFB_SRC_FMT_8888, 1, 1, 0, (void *) &gColor); -} +#define TAG(x) tdfx##x##_Z16 +#include "../dri/common/depthtmp.h" -static void -read_R5G6B5_pixels(const GLcontext * ctx, - GLuint n, const GLint x[], const GLint y[], - GLubyte rgba[][4], const GLubyte mask[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbInfo_t info; - BEGIN_BOARD_LOCK(); - if (grLfbLock(GR_LFB_READ_ONLY, - fxMesa->currentFB, - GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) { - const GLint srcStride = info.strideInBytes / 2; /* stride in GLushorts */ - const GLint winX = 0; - const GLint winY = fxMesa->height - 1; - GLuint i; - for (i = 0; i < n; i++) { - if (mask[i]) { - const GLushort *data16 = (const GLushort *) info.lfbPtr - + (winY - y[i]) * srcStride + (winX + x[i]); - const GLushort pixel = *data16; - rgba[i][RCOMP] = FX_PixelToR[pixel]; - rgba[i][GCOMP] = FX_PixelToG[pixel]; - rgba[i][BCOMP] = FX_PixelToB[pixel]; - rgba[i][ACOMP] = 255; - } - } - grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB); - } - END_BOARD_LOCK(); -} +/* 24 bit, depth spanline and pixel functions (for use w/ stencil) */ +/* [dBorca] Hack alert: + * This is evil. The incoming Mesa's 24bit depth value + * is shifted left 8 bits, to obtain a full 32bit value, + * which will be thrown into the framebuffer. We rely on + * the fact that Voodoo hardware transforms a 32bit value + * into 24bit value automatically and, MOST IMPORTANT, won't + * alter the upper 8bits of the value already existing in the + * framebuffer (where stencil resides). + */ +#undef LFB_MODE +#define LFB_MODE GR_LFBWRITEMODE_Z32 -static void read_R5G5B5_pixels (const GLcontext * ctx, - GLuint n, - const GLint x[], const GLint y[], - GLubyte rgba[][4], - const GLubyte mask[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbInfo_t info; - BEGIN_BOARD_LOCK(); - if (grLfbLock(GR_LFB_READ_ONLY, - fxMesa->currentFB, - GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) { - const GLint srcStride = info.strideInBytes / 2; /* stride in GLushorts */ - const GLint winX = 0; - const GLint winY = fxMesa->height - 1; - GLuint i; - for (i = 0; i < n; i++) { - if (mask[i]) { - const GLushort *data16 = (const GLushort *) info.lfbPtr - + (winY - y[i]) * srcStride + (winX + x[i]); - const GLushort pixel = *data16; - rgba[i][RCOMP] = FX_rgb_scale_5[ pixel & 0x1f]; - rgba[i][GCOMP] = FX_rgb_scale_5[(pixel >> 5) & 0x1f]; - rgba[i][BCOMP] = FX_rgb_scale_5[(pixel >> 10) & 0x1f]; - rgba[i][ACOMP] = (pixel & 0x8000) ? 255 : 0; - } - } - grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB); - } - END_BOARD_LOCK(); -} +#undef BYTESPERPIXEL +#define BYTESPERPIXEL 4 +#define WRITE_DEPTH( _x, _y, d ) \ + *(GLuint *)(buf + _x*BYTESPERPIXEL + _y*pitch) = d << 8 -static void -read_R8G8B8_pixels(const GLcontext * ctx, - GLuint n, const GLint x[], const GLint y[], - GLubyte rgba[][4], const GLubyte mask[]) -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GrLfbInfo_t info; - BEGIN_BOARD_LOCK(); - if (grLfbLock(GR_LFB_READ_ONLY, - fxMesa->currentFB, - GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) { - const GLint srcStride = info.strideInBytes / 4; /* stride in GLuints */ - const GLint winX = 0; - const GLint winY = fxMesa->height - 1; - GLuint i; - for (i = 0; i < n; i++) { - if (mask[i]) { - const GLuint *data32 = (const GLuint *) info.lfbPtr - + (winY - y[i]) * srcStride + (winX + x[i]); - const GLuint pixel = *data32; - *(GLuint *)&rgba[i][0] = pixel; - } - } - grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB); - } - END_BOARD_LOCK(); -} +#define READ_DEPTH( d, _x, _y ) \ + d = (*(GLuint *)(buf + _x*BYTESPERPIXEL + _y*pitch)) & 0xffffff + +#define TAG(x) tdfx##x##_Z24 +#include "../dri/common/depthtmp.h" +/* 32 bit, depth spanline and pixel functions (for use w/o stencil) */ +/* [dBorca] Hack alert: + * This is more evil. We make Mesa run in 32bit depth, but + * tha Voodoo HW can only handle 24bit depth. Well, exploiting + * the pixel pipeline, we can achieve 24:8 format for greater + * precision... + * If anyone tells me how to really store 32bit values into the + * depth buffer, I'll write the *_Z32 routines. Howver, bear in + * mind that means running without stencil! + */ /************************************************************************/ -/***** Depth functions *****/ +/***** Span functions (optimized) *****/ /************************************************************************/ -void -fxDDWriteDepthSpan(GLcontext * ctx, - GLuint n, GLint x, GLint y, const GLdepth depth[], - const GLubyte mask[]) +/* + * Read a span of 15-bit RGB pixels. Note, we don't worry about cliprects + * since OpenGL says obscured pixels have undefined values. + */ +static void fxReadRGBASpan_ARGB1555 (const GLcontext * ctx, + GLuint n, + GLint x, GLint y, + GLubyte rgba[][4]) { - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLint bottom = fxMesa->height - 1; - - if (TDFX_DEBUG & VERBOSE_DRIVER) { - fprintf(stderr, "%s(...)\n", __FUNCTION__); - } - - - if (mask) { - GLint i; - for (i = 0; i < n; i++) { - if (mask[i]) { - GLshort d = depth[i]; - writeRegionClipped(fxMesa, GR_BUFFER_AUXBUFFER, x + i, bottom - y, - GR_LFB_SRC_FMT_ZA16, 1, 1, 0, (void *) &d); - } - } - } - else { - GLushort depth16[MAX_WIDTH]; - GLint i; - for (i = 0; i < n; i++) { - depth16[i] = depth[i]; - } - writeRegionClipped(fxMesa, GR_BUFFER_AUXBUFFER, x, bottom - y, - GR_LFB_SRC_FMT_ZA16, n, 1, 0, (void *) depth16); - } + fxMesaContext fxMesa = FX_CONTEXT(ctx); + GrLfbInfo_t info; + info.size = sizeof(GrLfbInfo_t); + if (grLfbLock(GR_LFB_READ_ONLY, fxMesa->currentFB, + GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) { + const GLint winX = 0; + const GLint winY = fxMesa->height - 1; + const GLushort *data16 = (const GLushort *)((const GLubyte *)info.lfbPtr + + (winY - y) * info.strideInBytes + + (winX + x) * 2); + const GLuint *data32 = (const GLuint *) data16; + GLuint i, j; + GLuint extraPixel = (n & 1); + n -= extraPixel; + + for (i = j = 0; i < n; i += 2, j++) { + GLuint pixel = data32[j]; + rgba[i][0] = FX_rgb_scale_5[(pixel >> 10) & 0x1F]; + rgba[i][1] = FX_rgb_scale_5[(pixel >> 5) & 0x1F]; + rgba[i][2] = FX_rgb_scale_5[ pixel & 0x1F]; + rgba[i][3] = (pixel & 0x8000) ? 255 : 0; + rgba[i+1][0] = FX_rgb_scale_5[(pixel >> 26) & 0x1F]; + rgba[i+1][1] = FX_rgb_scale_5[(pixel >> 21) & 0x1F]; + rgba[i+1][2] = FX_rgb_scale_5[(pixel >> 16) & 0x1F]; + rgba[i+1][3] = (pixel & 0x80000000) ? 255 : 0; + } + if (extraPixel) { + GLushort pixel = data16[n]; + rgba[n][0] = FX_rgb_scale_5[(pixel >> 10) & 0x1F]; + rgba[n][1] = FX_rgb_scale_5[(pixel >> 5) & 0x1F]; + rgba[n][2] = FX_rgb_scale_5[ pixel & 0x1F]; + rgba[n][3] = (pixel & 0x8000) ? 255 : 0; + } + + grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB); + } } - -void -fxDDWriteDepth32Span(GLcontext * ctx, - GLuint n, GLint x, GLint y, const GLdepth depth[], - const GLubyte mask[]) +/* + * Read a span of 16-bit RGB pixels. Note, we don't worry about cliprects + * since OpenGL says obscured pixels have undefined values. + */ +static void fxReadRGBASpan_RGB565 (const GLcontext * ctx, + GLuint n, + GLint x, GLint y, + GLubyte rgba[][4]) { - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLint bottom = fxMesa->height - 1; - GLint i; - - if (TDFX_DEBUG & VERBOSE_DRIVER) { - fprintf(stderr, "%s(...)\n", __FUNCTION__); - } - + fxMesaContext fxMesa = FX_CONTEXT(ctx); + GrLfbInfo_t info; + info.size = sizeof(GrLfbInfo_t); + if (grLfbLock(GR_LFB_READ_ONLY, fxMesa->currentFB, + GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) { + const GLint winX = 0; + const GLint winY = fxMesa->height - 1; + const GLushort *data16 = (const GLushort *)((const GLubyte *)info.lfbPtr + + (winY - y) * info.strideInBytes + + (winX + x) * 2); + const GLuint *data32 = (const GLuint *) data16; + GLuint i, j; + GLuint extraPixel = (n & 1); + n -= extraPixel; + + for (i = j = 0; i < n; i += 2, j++) { + GLuint pixel = data32[j]; + rgba[i][0] = FX_rgb_scale_5[(pixel >> 11) & 0x1F]; + rgba[i][1] = FX_rgb_scale_6[(pixel >> 5) & 0x3F]; + rgba[i][2] = FX_rgb_scale_5[ pixel & 0x1F]; + rgba[i][3] = 255; + rgba[i+1][0] = FX_rgb_scale_5[(pixel >> 27) & 0x1F]; + rgba[i+1][1] = FX_rgb_scale_6[(pixel >> 21) & 0x3F]; + rgba[i+1][2] = FX_rgb_scale_5[(pixel >> 16) & 0x1F]; + rgba[i+1][3] = 255; + } + if (extraPixel) { + GLushort pixel = data16[n]; + rgba[n][0] = FX_rgb_scale_5[(pixel >> 11) & 0x1F]; + rgba[n][1] = FX_rgb_scale_6[(pixel >> 5) & 0x3F]; + rgba[n][2] = FX_rgb_scale_5[ pixel & 0x1F]; + rgba[n][3] = 255; + } + + grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB); + } +} - if (mask) { - for (i = 0; i < n; i++) { - if (mask[i]) { - GLuint d = depth[i] << 8; - writeRegionClipped(fxMesa, GR_BUFFER_AUXBUFFER, x + i, bottom - y, - GR_LFBWRITEMODE_Z32, 1, 1, 0, (void *) &d); - } - } - } - else { - GLuint depth32[MAX_WIDTH]; - for (i = 0; i < n; i++) { - depth32[i] = depth[i] << 8; - } - writeRegionClipped(fxMesa, GR_BUFFER_AUXBUFFER, x, bottom - y, - GR_LFBWRITEMODE_Z32, n, 1, 0, (void *) depth32); - } +/* + * Read a span of 32-bit RGB pixels. Note, we don't worry about cliprects + * since OpenGL says obscured pixels have undefined values. + */ +static void fxReadRGBASpan_ARGB8888 (const GLcontext * ctx, + GLuint n, + GLint x, GLint y, + GLubyte rgba[][4]) +{ + fxMesaContext fxMesa = FX_CONTEXT(ctx); + GLuint i; + grLfbReadRegion(fxMesa->currentFB, x, fxMesa->height - 1 - y, n, 1, n * 4, rgba); + for (i = 0; i < n; i++) { + GLubyte c = rgba[i][0]; + rgba[i][0] = rgba[i][2]; + rgba[i][2] = c; + } } +/************************************************************************/ +/***** Depth functions (optimized) *****/ +/************************************************************************/ + void -fxDDReadDepthSpan(GLcontext * ctx, - GLuint n, GLint x, GLint y, GLdepth depth[]) +fxReadDepthSpan_Z16(GLcontext * ctx, + GLuint n, GLint x, GLint y, GLdepth depth[]) { fxMesaContext fxMesa = FX_CONTEXT(ctx); GLint bottom = fxMesa->height - 1; @@ -614,116 +472,81 @@ fxDDReadDepthSpan(GLcontext * ctx, void -fxDDReadDepth32Span(GLcontext * ctx, - GLuint n, GLint x, GLint y, GLdepth depth[]) +fxReadDepthSpan_Z24(GLcontext * ctx, + GLuint n, GLint x, GLint y, GLdepth depth[]) { fxMesaContext fxMesa = FX_CONTEXT(ctx); GLint bottom = fxMesa->height - 1; + GLuint i; if (TDFX_DEBUG & VERBOSE_DRIVER) { fprintf(stderr, "%s(...)\n", __FUNCTION__); } grLfbReadRegion(GR_BUFFER_AUXBUFFER, x, bottom - y, n, 1, 0, depth); + for (i = 0; i < n; i++) { + depth[i] &= 0xffffff; + } } +/************************************************************************/ +/***** Stencil functions (optimized) *****/ +/************************************************************************/ -void -fxDDWriteDepthPixels(GLcontext * ctx, - GLuint n, const GLint x[], const GLint y[], - const GLdepth depth[], const GLubyte mask[]) +void fxWriteStencilSpan (GLcontext *ctx, GLuint n, GLint x, GLint y, + const GLstencil stencil[], const GLubyte mask[]) { - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLint bottom = fxMesa->height - 1; - GLuint i; - - if (TDFX_DEBUG & VERBOSE_DRIVER) { - fprintf(stderr, "%s(...)\n", __FUNCTION__); - } - - for (i = 0; i < n; i++) { - if (mask[i]) { - int xpos = x[i]; - int ypos = bottom - y[i]; - GLushort d = depth[i]; - writeRegionClipped(fxMesa, GR_BUFFER_AUXBUFFER, xpos, ypos, - GR_LFB_SRC_FMT_ZA16, 1, 1, 0, (void *) &d); - } - } + /* + * XXX todo + */ } - void -fxDDWriteDepth32Pixels(GLcontext * ctx, - GLuint n, const GLint x[], const GLint y[], - const GLdepth depth[], const GLubyte mask[]) +fxReadStencilSpan(GLcontext * ctx, + GLuint n, GLint x, GLint y, GLstencil stencil[]) { fxMesaContext fxMesa = FX_CONTEXT(ctx); GLint bottom = fxMesa->height - 1; + GLuint zs32[MAX_WIDTH]; GLuint i; if (TDFX_DEBUG & VERBOSE_DRIVER) { fprintf(stderr, "%s(...)\n", __FUNCTION__); } + grLfbReadRegion(GR_BUFFER_AUXBUFFER, x, bottom - y, n, 1, 0, zs32); for (i = 0; i < n; i++) { - if (mask[i]) { - int xpos = x[i]; - int ypos = bottom - y[i]; - GLuint d = depth[i] << 8; - writeRegionClipped(fxMesa, GR_BUFFER_AUXBUFFER, xpos, ypos, - GR_LFBWRITEMODE_Z32, 1, 1, 0, (void *) &d); - } + stencil[i] = zs32[i] >> 24; } } - -void -fxDDReadDepthPixels(GLcontext * ctx, GLuint n, - const GLint x[], const GLint y[], GLdepth depth[]) +void fxWriteStencilPixels (GLcontext *ctx, GLuint n, + const GLint x[], const GLint y[], + const GLstencil stencil[], + const GLubyte mask[]) { - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLint bottom = fxMesa->height - 1; - GLuint i; - - if (TDFX_DEBUG & VERBOSE_DRIVER) { - fprintf(stderr, "%s(...)\n", __FUNCTION__); - } - - for (i = 0; i < n; i++) { - int xpos = x[i]; - int ypos = bottom - y[i]; - GLushort d; - grLfbReadRegion(GR_BUFFER_AUXBUFFER, xpos, ypos, 1, 1, 0, &d); - depth[i] = d; - } + /* + * XXX todo + */ } - -void -fxDDReadDepth32Pixels(GLcontext * ctx, GLuint n, - const GLint x[], const GLint y[], GLdepth depth[]) +void fxReadStencilPixels (GLcontext *ctx, GLuint n, + const GLint x[], const GLint y[], + GLstencil stencil[]) { - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLint bottom = fxMesa->height - 1; - GLuint i; - - if (TDFX_DEBUG & VERBOSE_DRIVER) { - fprintf(stderr, "%s(...)\n", __FUNCTION__); - } - - for (i = 0; i < n; i++) { - int xpos = x[i]; - int ypos = bottom - y[i]; - grLfbReadRegion(GR_BUFFER_AUXBUFFER, xpos, ypos, 1, 1, 0, &depth[i]); - } + /* + * XXX todo + */ } -/* Set the buffer used for reading */ -/* XXX support for separate read/draw buffers hasn't been tested */ +/* + * This function is called to specify which buffer to read and write + * for software rasterization (swrast) fallbacks. This doesn't necessarily + * correspond to glDrawBuffer() or glReadBuffer() calls. + */ static void fxDDSetBuffer(GLcontext * ctx, GLframebuffer * buffer, GLuint bufferBit) { @@ -753,45 +576,73 @@ void fxSetupDDSpanPointers(GLcontext * ctx) { struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference( ctx ); + fxMesaContext fxMesa = FX_CONTEXT(ctx); swdd->SetBuffer = fxDDSetBuffer; - swdd->WriteRGBASpan = fxDDWriteRGBASpan; - swdd->WriteRGBSpan = fxDDWriteRGBSpan; - swdd->WriteMonoRGBASpan = fxDDWriteMonoRGBASpan; - swdd->WriteRGBAPixels = fxDDWriteRGBAPixels; - swdd->WriteMonoRGBAPixels = fxDDWriteMonoRGBAPixels; - - /* swdd->ReadRGBASpan =fxDDReadRGBASpan; */ - { - fxMesaContext fxMesa = FX_CONTEXT(ctx); switch (fxMesa->colDepth) { case 15: - swdd->ReadRGBASpan = read_R5G5B5_span; - swdd->ReadRGBAPixels = read_R5G5B5_pixels; - swdd->WriteDepthSpan = fxDDWriteDepthSpan; - swdd->WriteDepthPixels = fxDDWriteDepthPixels; - swdd->ReadDepthSpan = fxDDReadDepthSpan; - swdd->ReadDepthPixels = fxDDReadDepthPixels; + swdd->WriteRGBASpan = tdfxWriteRGBASpan_ARGB1555; + swdd->WriteRGBSpan = tdfxWriteRGBSpan_ARGB1555; + swdd->WriteRGBAPixels = tdfxWriteRGBAPixels_ARGB1555; + swdd->WriteMonoRGBASpan = tdfxWriteMonoRGBASpan_ARGB1555; + swdd->WriteMonoRGBAPixels = tdfxWriteMonoRGBAPixels_ARGB1555; + swdd->ReadRGBASpan = /*td*/fxReadRGBASpan_ARGB1555; + swdd->ReadRGBAPixels = tdfxReadRGBAPixels_ARGB1555; + + swdd->WriteDepthSpan = tdfxWriteDepthSpan_Z16; + swdd->WriteDepthPixels = tdfxWriteDepthPixels_Z16; + swdd->ReadDepthSpan = /*td*/fxReadDepthSpan_Z16; + swdd->ReadDepthPixels = tdfxReadDepthPixels_Z16; break; case 16: - swdd->ReadRGBASpan = read_R5G6B5_span; - swdd->ReadRGBAPixels = read_R5G6B5_pixels; - swdd->WriteDepthSpan = fxDDWriteDepthSpan; - swdd->WriteDepthPixels = fxDDWriteDepthPixels; - swdd->ReadDepthSpan = fxDDReadDepthSpan; - swdd->ReadDepthPixels = fxDDReadDepthPixels; + swdd->WriteRGBASpan = tdfxWriteRGBASpan_RGB565; + swdd->WriteRGBSpan = tdfxWriteRGBSpan_RGB565; + swdd->WriteRGBAPixels = tdfxWriteRGBAPixels_RGB565; + swdd->WriteMonoRGBASpan = tdfxWriteMonoRGBASpan_RGB565; + swdd->WriteMonoRGBAPixels = tdfxWriteMonoRGBAPixels_RGB565; + swdd->ReadRGBASpan = /*td*/fxReadRGBASpan_RGB565; + swdd->ReadRGBAPixels = tdfxReadRGBAPixels_RGB565; + + swdd->WriteDepthSpan = tdfxWriteDepthSpan_Z16; + swdd->WriteDepthPixels = tdfxWriteDepthPixels_Z16; + swdd->ReadDepthSpan = /*td*/fxReadDepthSpan_Z16; + swdd->ReadDepthPixels = tdfxReadDepthPixels_Z16; break; case 32: - swdd->ReadRGBASpan = read_R8G8B8_span; - swdd->ReadRGBAPixels = read_R8G8B8_pixels; - swdd->WriteDepthSpan = fxDDWriteDepth32Span; - swdd->WriteDepthPixels = fxDDWriteDepth32Pixels; - swdd->ReadDepthSpan = fxDDReadDepth32Span; - swdd->ReadDepthPixels = fxDDReadDepth32Pixels; + swdd->WriteRGBASpan = tdfxWriteRGBASpan_ARGB8888; + swdd->WriteRGBSpan = tdfxWriteRGBSpan_ARGB8888; + swdd->WriteRGBAPixels = tdfxWriteRGBAPixels_ARGB8888; + swdd->WriteMonoRGBASpan = tdfxWriteMonoRGBASpan_ARGB8888; + swdd->WriteMonoRGBAPixels = tdfxWriteMonoRGBAPixels_ARGB8888; + swdd->ReadRGBASpan = /*td*/fxReadRGBASpan_ARGB8888; + swdd->ReadRGBAPixels = tdfxReadRGBAPixels_ARGB8888; + + swdd->WriteDepthSpan = tdfxWriteDepthSpan_Z24; + swdd->WriteDepthPixels = tdfxWriteDepthPixels_Z24; + swdd->ReadDepthSpan = /*td*/fxReadDepthSpan_Z24; + swdd->ReadDepthPixels = tdfxReadDepthPixels_Z24; break; } - } + + if (fxMesa->haveHwStencil) { + swdd->WriteStencilSpan = fxWriteStencilSpan; + swdd->ReadStencilSpan = fxReadStencilSpan; + swdd->WriteStencilPixels = fxWriteStencilPixels; + swdd->ReadStencilPixels = fxReadStencilPixels; + } +#if 0 + swdd->WriteCI8Span = NULL; + swdd->WriteCI32Span = NULL; + swdd->WriteMonoCISpan = NULL; + swdd->WriteCI32Pixels = NULL; + swdd->WriteMonoCIPixels = NULL; + swdd->ReadCI32Span = NULL; + swdd->ReadCI32Pixels = NULL; + + swdd->SpanRenderStart = tdfxSpanRenderStart; /* BEGIN_BOARD_LOCK */ + swdd->SpanRenderFinish = tdfxSpanRenderFinish; /* END_BOARD_LOCK */ +#endif } diff --git a/src/mesa/drivers/glide/fxddtex.c b/src/mesa/drivers/glide/fxddtex.c index 38a268922ae..da1e73d029c 100644 --- a/src/mesa/drivers/glide/fxddtex.c +++ b/src/mesa/drivers/glide/fxddtex.c @@ -1,5 +1,3 @@ -/* $Id: fxddtex.c,v 1.48 2003/10/02 17:36:44 brianp Exp $ */ - /* * Mesa 3-D graphics library * Version: 4.0 @@ -41,6 +39,7 @@ #if defined(FX) #include "fxdrv.h" +#include "enums.h" #include "image.h" #include "teximage.h" #include "texformat.h" @@ -192,8 +191,10 @@ fxDDTexParam(GLcontext * ctx, GLenum target, struct gl_texture_object *tObj, tfxTexInfo *ti; if (TDFX_DEBUG & VERBOSE_DRIVER) { - fprintf(stderr, "%s(%d, %x, %x, %x)\n", __FUNCTION__, - tObj->Name, (GLuint) tObj->DriverData, pname, param); + fprintf(stderr, "fxDDTexParam(%d, %x, %s, %s)\n", + tObj->Name, (GLuint) tObj->DriverData, + _mesa_lookup_enum_by_nr(pname), + _mesa_lookup_enum_by_nr(param)); } if (target != GL_TEXTURE_2D) @@ -279,6 +280,7 @@ fxDDTexParam(GLcontext * ctx, GLenum target, struct gl_texture_object *tObj, case GL_MIRRORED_REPEAT: ti->sClamp = GR_TEXTURECLAMP_MIRROR_EXT; break; + case GL_CLAMP_TO_EDGE: /* CLAMP discarding border */ case GL_CLAMP: ti->sClamp = GR_TEXTURECLAMP_CLAMP; break; @@ -296,6 +298,7 @@ fxDDTexParam(GLcontext * ctx, GLenum target, struct gl_texture_object *tObj, case GL_MIRRORED_REPEAT: ti->tClamp = GR_TEXTURECLAMP_MIRROR_EXT; break; + case GL_CLAMP_TO_EDGE: /* CLAMP discarding border */ case GL_CLAMP: ti->tClamp = GR_TEXTURECLAMP_CLAMP; break; @@ -349,13 +352,23 @@ fxDDTexDel(GLcontext * ctx, struct gl_texture_object *tObj) tObj->DriverData = NULL; } +/* + * Return true if texture is resident, false otherwise. + */ +GLboolean +fxDDIsTextureResident(GLcontext *ctx, struct gl_texture_object *tObj) +{ + tfxTexInfo *ti = fxTMGetTexInfo(tObj); + return (ti && ti->isInTM); +} + /* * Convert a gl_color_table texture palette to Glide's format. */ -static void -convertPalette(FxU32 data[256], const struct gl_color_table *table) +static GrTexTable_t +convertPalette(const fxMesaContext fxMesa, FxU32 data[256], const struct gl_color_table *table) { const GLubyte *tableUB = (const GLubyte *) table->Table; GLint width = table->Size; @@ -373,7 +386,7 @@ convertPalette(FxU32 data[256], const struct gl_color_table *table) a = tableUB[i]; data[i] = (a << 24) | (r << 16) | (g << 8) | b; } - break; + return fxMesa->HavePalExt ? GR_TEXTABLE_PALETTE_6666_EXT : GR_TEXTABLE_PALETTE; case GL_LUMINANCE: for (i = 0; i < width; i++) { r = tableUB[i]; @@ -382,21 +395,22 @@ convertPalette(FxU32 data[256], const struct gl_color_table *table) a = 255; data[i] = (a << 24) | (r << 16) | (g << 8) | b; } - break; + return GR_TEXTABLE_PALETTE; case GL_ALPHA: for (i = 0; i < width; i++) { r = g = b = 255; a = tableUB[i]; data[i] = (a << 24) | (r << 16) | (g << 8) | b; } - break; + return fxMesa->HavePalExt ? GR_TEXTABLE_PALETTE_6666_EXT : GR_TEXTABLE_PALETTE; case GL_LUMINANCE_ALPHA: for (i = 0; i < width; i++) { r = g = b = tableUB[i * 2 + 0]; a = tableUB[i * 2 + 1]; data[i] = (a << 24) | (r << 16) | (g << 8) | b; } - break; + return fxMesa->HavePalExt ? GR_TEXTABLE_PALETTE_6666_EXT : GR_TEXTABLE_PALETTE; + default: case GL_RGB: for (i = 0; i < width; i++) { r = tableUB[i * 3 + 0]; @@ -405,7 +419,7 @@ convertPalette(FxU32 data[256], const struct gl_color_table *table) a = 255; data[i] = (a << 24) | (r << 16) | (g << 8) | b; } - break; + return GR_TEXTABLE_PALETTE; case GL_RGBA: for (i = 0; i < width; i++) { r = tableUB[i * 4 + 0]; @@ -414,7 +428,7 @@ convertPalette(FxU32 data[256], const struct gl_color_table *table) a = tableUB[i * 4 + 3]; data[i] = (a << 24) | (r << 16) | (g << 8) | b; } - break; + return fxMesa->HavePalExt ? GR_TEXTABLE_PALETTE_6666_EXT : GR_TEXTABLE_PALETTE; } } @@ -434,7 +448,7 @@ fxDDTexPalette(GLcontext * ctx, struct gl_texture_object *tObj) if (!tObj->DriverData) tObj->DriverData = fxAllocTexObjData(fxMesa); ti = fxTMGetTexInfo(tObj); - convertPalette(ti->palette.data, &tObj->Palette); + ti->paltype = convertPalette(fxMesa, ti->palette.data, &tObj->Palette); fxTexInvalidate(ctx, tObj); } else { @@ -442,7 +456,7 @@ fxDDTexPalette(GLcontext * ctx, struct gl_texture_object *tObj) if (TDFX_DEBUG & VERBOSE_DRIVER) { fprintf(stderr, "%s(global)\n", __FUNCTION__); } - convertPalette(fxMesa->glbPalette.data, &ctx->Texture.Palette); + fxMesa->glbPalType = convertPalette(fxMesa, fxMesa->glbPalette.data, &ctx->Texture.Palette); fxMesa->new_state |= FX_NEW_TEXTURING; } } @@ -460,7 +474,7 @@ fxDDTexUseGlbPalette(GLcontext * ctx, GLboolean state) if (state) { fxMesa->haveGlobalPaletteTexture = 1; - grTexDownloadTable(GR_TEXTABLE_PALETTE, &(fxMesa->glbPalette)); + grTexDownloadTable(fxMesa->glbPalType, &(fxMesa->glbPalette)); } else { fxMesa->haveGlobalPaletteTexture = 0; @@ -501,27 +515,20 @@ logbase2(int n) } +/* fxTexGetInfo + * w, h - source texture width and height + * lodlevel - Glide lod level token for the larger texture dimension + * ar - Glide aspect ratio token + * sscale - S scale factor used during triangle setup + * tscale - T scale factor used during triangle setup + * wscale - OpenGL -> Glide image width scale factor + * hscale - OpenGL -> Glide image height scale factor + */ int fxTexGetInfo(int w, int h, GrLOD_t * lodlevel, GrAspectRatio_t * ar, float *sscale, float *tscale, int *wscale, int *hscale) { - /* [koolsmoky] */ - static GrLOD_t lod[12] = { - GR_LOD_LOG2_1, - GR_LOD_LOG2_2, - GR_LOD_LOG2_4, - GR_LOD_LOG2_8, - GR_LOD_LOG2_16, - GR_LOD_LOG2_32, - GR_LOD_LOG2_64, - GR_LOD_LOG2_128, - GR_LOD_LOG2_256, - GR_LOD_LOG2_512, - GR_LOD_LOG2_1024, - GR_LOD_LOG2_2048 - }; - int logw, logh, ws, hs; GrLOD_t l; GrAspectRatio_t aspectratio; @@ -530,76 +537,56 @@ fxTexGetInfo(int w, int h, GrLOD_t * lodlevel, GrAspectRatio_t * ar, logw = logbase2(w); logh = logbase2(h); - switch (logw - logh) { + l = MAX2(logw, logh); + aspectratio = logw - logh; + ws = hs = 1; + + /* hardware only allows a maximum aspect ratio of 8x1, so handle + * |aspectratio| > 3 by scaling the image and using an 8x1 aspect + * ratio + */ + switch (aspectratio) { case 0: - aspectratio = GR_ASPECT_LOG2_1x1; - l = lod[logw]; - s = t = 256.0f; - ws = hs = 1; + s = 256.0f; + t = 256.0f; break; case 1: - aspectratio = GR_ASPECT_LOG2_2x1; - l = lod[logw]; s = 256.0f; t = 128.0f; - ws = 1; - hs = 1; break; case 2: - aspectratio = GR_ASPECT_LOG2_4x1; - l = lod[logw]; s = 256.0f; t = 64.0f; - ws = 1; - hs = 1; break; case 3: - aspectratio = GR_ASPECT_LOG2_8x1; - l = lod[logw]; s = 256.0f; t = 32.0f; - ws = 1; - hs = 1; break; case -1: - aspectratio = GR_ASPECT_LOG2_1x2; - l = lod[logh]; s = 128.0f; t = 256.0f; - ws = 1; - hs = 1; break; case -2: - aspectratio = GR_ASPECT_LOG2_1x4; - l = lod[logh]; s = 64.0f; t = 256.0f; - ws = 1; - hs = 1; break; case -3: - aspectratio = GR_ASPECT_LOG2_1x8; - l = lod[logh]; s = 32.0f; t = 256.0f; - ws = 1; - hs = 1; break; default: - if ((logw - logh) > 3) { - aspectratio = GR_ASPECT_LOG2_8x1; - l = lod[logw]; + if (aspectratio > 3) { s = 256.0f; t = 32.0f; ws = 1; - hs = 1 << (logw - logh - 3); - } else /*if ((logw - logh) < -3)*/ { - aspectratio = GR_ASPECT_LOG2_1x8; - l = lod[logh]; + hs = 1 << (aspectratio - 3); + aspectratio = GR_ASPECT_LOG2_8x1; + } else /*if (aspectratio < -3)*/ { s = 32.0f; t = 256.0f; - ws = 1 << (logh - logw - 3); + ws = 1 << (-aspectratio - 3); hs = 1; + aspectratio = GR_ASPECT_LOG2_1x8; } } @@ -625,125 +612,6 @@ fxTexGetInfo(int w, int h, GrLOD_t * lodlevel, GrAspectRatio_t * ar, return 1; } -/* - * Given an OpenGL internal texture format, return the corresponding - * Glide internal texture format and base texture format. - */ -void -fxTexGetFormat(GLcontext *ctx, GLenum glformat, GrTextureFormat_t * tfmt, GLint * ifmt) /* [koolsmoky] */ -{ - fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLboolean allow32bpt = fxMesa->HaveTexFmt; - - switch (glformat) { - case 1: - case GL_LUMINANCE: - case GL_LUMINANCE4: - case GL_LUMINANCE8: - case GL_LUMINANCE12: - case GL_LUMINANCE16: - if (tfmt) - (*tfmt) = GR_TEXFMT_INTENSITY_8; - if (ifmt) - (*ifmt) = GL_LUMINANCE; - break; - case 2: - case GL_LUMINANCE_ALPHA: - case GL_LUMINANCE4_ALPHA4: - case GL_LUMINANCE6_ALPHA2: - case GL_LUMINANCE8_ALPHA8: - case GL_LUMINANCE12_ALPHA4: - case GL_LUMINANCE12_ALPHA12: - case GL_LUMINANCE16_ALPHA16: - if (tfmt) - (*tfmt) = GR_TEXFMT_ALPHA_INTENSITY_88; - if (ifmt) - (*ifmt) = GL_LUMINANCE_ALPHA; - break; - case GL_INTENSITY: - case GL_INTENSITY4: - case GL_INTENSITY8: - case GL_INTENSITY12: - case GL_INTENSITY16: - if (tfmt) - (*tfmt) = GR_TEXFMT_ALPHA_8; - if (ifmt) - (*ifmt) = GL_INTENSITY; - break; - case GL_ALPHA: - case GL_ALPHA4: - case GL_ALPHA8: - case GL_ALPHA12: - case GL_ALPHA16: - if (tfmt) - (*tfmt) = GR_TEXFMT_ALPHA_8; - if (ifmt) - (*ifmt) = GL_ALPHA; - break; - case GL_R3_G3_B2: - case GL_RGB4: - case GL_RGB5: - if (tfmt) - (*tfmt) = GR_TEXFMT_RGB_565; - if (ifmt) - (*ifmt) = GL_RGB; - break; - case 3: - case GL_RGB: - case GL_RGB8: - case GL_RGB10: - case GL_RGB12: - case GL_RGB16: - if (tfmt) - (*tfmt) = allow32bpt ? GR_TEXFMT_ARGB_8888 : GR_TEXFMT_RGB_565; - if (ifmt) - (*ifmt) = GL_RGB; - break; - case GL_RGBA2: - case GL_RGBA4: - if (tfmt) - (*tfmt) = GR_TEXFMT_ARGB_4444; - if (ifmt) - (*ifmt) = GL_RGBA; - break; - case 4: - case GL_RGBA: - case GL_RGBA8: - case GL_RGB10_A2: - case GL_RGBA12: - case GL_RGBA16: - if (tfmt) - (*tfmt) = allow32bpt ? GR_TEXFMT_ARGB_8888 : GR_TEXFMT_ARGB_4444; - if (ifmt) - (*ifmt) = GL_RGBA; - break; - case GL_RGB5_A1: - if (tfmt) - (*tfmt) = GR_TEXFMT_ARGB_1555; - if (ifmt) - (*ifmt) = GL_RGBA; - break; - case GL_COLOR_INDEX: - case GL_COLOR_INDEX1_EXT: - case GL_COLOR_INDEX2_EXT: - case GL_COLOR_INDEX4_EXT: - case GL_COLOR_INDEX8_EXT: - case GL_COLOR_INDEX12_EXT: - case GL_COLOR_INDEX16_EXT: - if (tfmt) - (*tfmt) = GR_TEXFMT_P_8; - if (ifmt) - (*ifmt) = GL_RGBA; /* XXX why is this RGBA? */ - break; - default: - fprintf(stderr, "%s: ERROR: unsupported internalFormat (0x%x)\n", - __FUNCTION__, glformat); - fxCloseHardware(); - exit(-1); - break; - } -} - static GLboolean fxIsTexSupported(GLenum target, GLint internalFormat, const struct gl_texture_image *image) @@ -820,8 +688,6 @@ fetch_alpha8(const struct gl_texture_image *texImage, i = i * mml->wScale; j = j * mml->hScale; - i = i * mml->width / texImage->Width; - j = j * mml->height / texImage->Height; texel = ((GLubyte *) texImage->Data) + j * mml->width + i; rgba[RCOMP] = 255; @@ -841,8 +707,6 @@ fetch_index8(const struct gl_texture_image *texImage, i = i * mml->wScale; j = j * mml->hScale; - i = i * mml->width / texImage->Width; - j = j * mml->height / texImage->Height; texel = ((GLubyte *) texImage->Data) + j * mml->width + i; *indexOut = *texel; @@ -961,6 +825,133 @@ PrintTexture(int w, int h, int c, const GLubyte * data) } +GLboolean fxDDIsCompressedFormat ( GLcontext *ctx, GLenum internalFormat ) +{ + if ((internalFormat == GL_COMPRESSED_RGB_FXT1_3DFX) || + (internalFormat == GL_COMPRESSED_RGBA_FXT1_3DFX) || + (internalFormat == GL_COMPRESSED_RGB_S3TC_DXT1_EXT) || + (internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) || + (internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT) || + (internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT) || + (internalFormat == GL_RGB_S3TC) || + (internalFormat == GL_RGB4_S3TC) || + (internalFormat == GL_RGBA_S3TC) || + (internalFormat == GL_RGBA4_S3TC)) { + return GL_TRUE; + } + +/* [dBorca] + * we are handling differently the above formats from the generic + * GL_COMPRESSED_RGB[A]. For this, we will always have to separately + * check for the ones below! + */ + +#if FX_TC_NCC || FX_TC_NAPALM + if ((internalFormat == GL_COMPRESSED_RGB) || (internalFormat == GL_COMPRESSED_RGBA)) { + return GL_TRUE; + } +#endif + + return GL_FALSE; +} + + +GLuint fxDDCompressedTextureSize (GLcontext *ctx, + GLsizei width, GLsizei height, GLsizei depth, + GLenum format) +{ + GLuint size; + int wScale, hScale; + + ASSERT(depth == 1); + + /* Determine width and height scale factors for texture. + * Remember, Glide is limited to 8:1 aspect ratios. + */ + fxTexGetInfo(width, height, + NULL, /* lod level */ + NULL, /* aspect ratio */ + NULL, NULL, /* sscale, tscale */ + &wScale, &hScale); + + width *= wScale; + height *= hScale; + + switch (format) { + case GL_COMPRESSED_RGB_FXT1_3DFX: + case GL_COMPRESSED_RGBA_FXT1_3DFX: + /* round up width to next multiple of 8, height to next multiple of 4 */ + width = (width + 7) & ~7; + height = (height + 3) & ~3; + /* 16 bytes per 8x4 tile of RGB[A] texels */ + size = width * height / 2; + /* Textures smaller than 8x4 will effectively be made into 8x4 and + * take 16 bytes. + */ + if (size < 16) + size = 16; + return size; + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: + case GL_RGB_S3TC: + case GL_RGB4_S3TC: + /* round up width, height to next multiple of 4 */ + width = (width + 3) & ~3; + height = (height + 3) & ~3; + /* 8 bytes per 4x4 tile of RGB[A] texels */ + size = width * height / 2; + /* Textures smaller than 4x4 will effectively be made into 4x4 and + * take 8 bytes. + */ + if (size < 8) + size = 8; + return size; + case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: + case GL_RGBA_S3TC: + case GL_RGBA4_S3TC: + /* round up width, height to next multiple of 4 */ + width = (width + 3) & ~3; + height = (height + 3) & ~3; + /* 16 bytes per 4x4 tile of RGBA texels */ + size = width * height; /* simple! */ + /* Textures smaller than 4x4 will effectively be made into 4x4 and + * take 16 bytes. + */ + if (size < 16) + size = 16; + return size; + case GL_COMPRESSED_RGB: +#if FX_TC_NAPALM + { + fxMesaContext fxMesa = FX_CONTEXT(ctx); + if (fxMesa->type >= GR_SSTTYPE_Voodoo4) { + return fxDDCompressedTextureSize(ctx, width, height, 1, GL_COMPRESSED_RGB_FXT1_3DFX); + } + } +#endif +#if FX_TC_NCC + return (width * height * 8 >> 3) + 12 * 4; +#endif + case GL_COMPRESSED_RGBA: +#if FX_TC_NAPALM + { + fxMesaContext fxMesa = FX_CONTEXT(ctx); + if (fxMesa->type >= GR_SSTTYPE_Voodoo4) { + return fxDDCompressedTextureSize(ctx, width, height, 1, GL_COMPRESSED_RGBA_FXT1_3DFX); + } + } +#endif +#if FX_TC_NCC + return (width * height * 16 >> 3) + 12 * 4; +#endif + default: + _mesa_problem(ctx, "bad texformat in fxDDCompressedTextureSize"); + return 0; + } +} + + const struct gl_texture_format * fxDDChooseTextureFormat( GLcontext *ctx, GLint internalFormat, GLenum srcFormat, GLenum srcType ) @@ -968,6 +959,21 @@ fxDDChooseTextureFormat( GLcontext *ctx, GLint internalFormat, fxMesaContext fxMesa = FX_CONTEXT(ctx); GLboolean allow32bpt = fxMesa->HaveTexFmt; + /* [dBorca] Hack alert: + * There is something wrong with this!!! Take an example: + * 1) start HW rendering + * 2) create a texture like this: + * glTexImage2D(GL_TEXTURE_2D, 0, 3, 16, 16, 0, + * GL_RGB, GL_UNSIGNED_BYTE, floorTexture); + * glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + * 3) we get here with internalFormat==3 and return either + * _mesa_texformat_rgb565 or _mesa_texformat_argb8888 + * 4) at some point, we encounter total rasterization fallback + * 5) displaying a polygon with the above textures yield garbage on areas + * where pixel is larger than a texel, because our already set texel + * function doesn't match the real _mesa_texformat_argb888 + */ + if (TDFX_DEBUG & VERBOSE_TEXTURE) { fprintf(stderr, "fxDDChooseTextureFormat(...)\n"); } @@ -1056,20 +1062,24 @@ fxDDChooseTextureFormat( GLcontext *ctx, GLint internalFormat, : &_mesa_texformat_argb4444; case GL_RGB5_A1: return &_mesa_texformat_argb1555; -#if 0 /* GL_EXT_texture_compression_s3tc */ case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: + case GL_RGB_S3TC: + case GL_RGB4_S3TC: return &_mesa_texformat_rgb_dxt1; case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return &_mesa_texformat_rgba_dxt1; case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: + case GL_RGBA_S3TC: + case GL_RGBA4_S3TC: return &_mesa_texformat_rgba_dxt3; case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: return &_mesa_texformat_rgba_dxt5; - /*case GL_COMPRESSED_RGB_FXT1_3DFX: - case GL_COMPRESSED_RGBA_FXT1_3DFX: - return blah;*/ -#endif + /* GL_3DFX_texture_compression_FXT1 */ + case GL_COMPRESSED_RGB_FXT1_3DFX: + return &_mesa_texformat_rgb_fxt1; + case GL_COMPRESSED_RGBA_FXT1_3DFX: + return &_mesa_texformat_rgba_fxt1; default: _mesa_problem(NULL, "unexpected format in fxDDChooseTextureFormat"); return NULL; @@ -1097,11 +1107,11 @@ fxGlideFormat(GLint mesaFormat) return GR_TEXFMT_ARGB_4444; case MESA_FORMAT_ARGB1555: return GR_TEXFMT_ARGB_1555; -#if 1 /* [koolsmoky] getting ready for 32bpp textures */ case MESA_FORMAT_ARGB8888: return GR_TEXFMT_ARGB_8888; -#endif -#if 0 + case MESA_FORMAT_RGB_FXT1: + case MESA_FORMAT_RGBA_FXT1: + return GR_TEXFMT_ARGB_CMP_FXT1; case MESA_FORMAT_RGB_DXT1: case MESA_FORMAT_RGBA_DXT1: return GR_TEXFMT_ARGB_CMP_DXT1; @@ -1109,11 +1119,6 @@ fxGlideFormat(GLint mesaFormat) return GR_TEXFMT_ARGB_CMP_DXT3; case MESA_FORMAT_RGBA_DXT5: return GR_TEXFMT_ARGB_CMP_DXT5; - /*case MESA_FORMAT_ARGB_CMP_FXT1: - return GR_TEXFMT_ARGB_CMP_FXT1; - case MESA_FORMAT_RGB_CMP_FXT1: - return GL_COMPRESSED_RGBA_FXT1_3DFX;*/ -#endif default: _mesa_problem(NULL, "Unexpected format in fxGlideFormat"); return 0; @@ -1126,32 +1131,30 @@ fxFetchFunction(GLint mesaFormat) { switch (mesaFormat) { case MESA_FORMAT_I8: - return fetch_intensity8; + return &fetch_intensity8; case MESA_FORMAT_A8: - return fetch_alpha8; + return &fetch_alpha8; case MESA_FORMAT_L8: - return fetch_luminance8; + return &fetch_luminance8; case MESA_FORMAT_CI8: - return fetch_index8; + return &fetch_index8; case MESA_FORMAT_AL88: - return fetch_luminance8_alpha8; + return &fetch_luminance8_alpha8; case MESA_FORMAT_RGB565: - return fetch_r5g6b5; + return &fetch_r5g6b5; case MESA_FORMAT_ARGB4444: - return fetch_r4g4b4a4; + return &fetch_r4g4b4a4; case MESA_FORMAT_ARGB1555: - return fetch_r5g5b5a1; -#if 1 /* [koolsmoky] getting ready for 32bpp textures */ + return &fetch_r5g5b5a1; case MESA_FORMAT_ARGB8888: - return fetch_a8r8g8b8; -#endif -#if 0 + return &fetch_a8r8g8b8; + case MESA_FORMAT_RGB_FXT1: + case MESA_FORMAT_RGBA_FXT1: case MESA_FORMAT_RGB_DXT1: case MESA_FORMAT_RGBA_DXT1: case MESA_FORMAT_RGBA_DXT3: case MESA_FORMAT_RGBA_DXT5: - return fetch_r4g4b4a4; -#endif + return &fetch_r4g4b4a4; default: _mesa_problem(NULL, "Unexpected format in fxFetchFunction"); return NULL; @@ -1171,6 +1174,9 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level, tfxMipMapLevel *mml; GLint texelBytes; + GLvoid *_final_texImage_Data; + const struct gl_texture_format *_final_texImage_TexFormat; + if (TDFX_DEBUG & VERBOSE_TEXTURE) { fprintf(stderr, "fxDDTexImage2D: id=%d int 0x%x format 0x%x type 0x%x %dx%d\n", texObj->Name, texImage->IntFormat, format, type, @@ -1215,6 +1221,51 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level, texelBytes = texImage->TexFormat->TexelBytes; /*if (!fxMesa->HaveTexFmt) assert(texelBytes == 1 || texelBytes == 2);*/ + mml->glideFormat = fxGlideFormat(texImage->TexFormat->MesaFormat); + /* dirty trick: will thrash CopyTex[Sub]Image */ +#if FX_TC_NCC || FX_TC_NAPALM + if (internalFormat == GL_COMPRESSED_RGB) { +#if FX_TC_NCC + mml->glideFormat = GR_TEXFMT_YIQ_422; +#endif +#if FX_TC_NAPALM + if (fxMesa->type >= GR_SSTTYPE_Voodoo4) { + mml->glideFormat = GR_TEXFMT_ARGB_CMP_FXT1; + } +#endif + } else if (internalFormat == GL_COMPRESSED_RGBA) { +#if FX_TC_NCC + mml->glideFormat = GR_TEXFMT_AYIQ_8422; +#endif +#if FX_TC_NAPALM + if (fxMesa->type >= GR_SSTTYPE_Voodoo4) { + mml->glideFormat = GR_TEXFMT_ARGB_CMP_FXT1; + } +#endif + } +#endif + + /* allocate mipmap buffer */ + assert(!texImage->Data); + if (texImage->IsCompressed) { + texImage->Data = MESA_PBUFFER_ALLOC(texImage->CompressedSize); + texelBytes = 4; + _final_texImage_TexFormat = &_mesa_texformat_argb8888; + _final_texImage_Data = MALLOC(mml->width * mml->height * 4); + if (!_final_texImage_Data) { + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); + return; + } + } else { + texImage->Data = MESA_PBUFFER_ALLOC(mml->width * mml->height * texelBytes); + _final_texImage_TexFormat = texImage->TexFormat; + _final_texImage_Data = texImage->Data; + } + if (!texImage->Data) { + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); + return; + } + if (mml->wScale != 1 || mml->hScale != 1) { /* rescale image to overcome 1:8 aspect limitation */ GLvoid *tempImage; @@ -1225,51 +1276,57 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level, } /* unpack image, apply transfer ops and store in tempImage */ _mesa_transfer_teximage(ctx, 2, texImage->Format, - texImage->TexFormat, + _final_texImage_TexFormat, tempImage, width, height, 1, 0, 0, 0, width * texelBytes, 0, /* dstImageStride */ format, type, pixels, packing); - assert(!texImage->Data); - texImage->Data = MESA_PBUFFER_ALLOC(mml->width * mml->height * texelBytes); - if (!texImage->Data) { - _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); - FREE(tempImage); - return; - } _mesa_rescale_teximage2d(texelBytes, mml->width * texelBytes, /* dst stride */ width, height, mml->width, mml->height, - tempImage /*src*/, texImage->Data /*dst*/ ); + tempImage /*src*/, _final_texImage_Data /*dst*/ ); FREE(tempImage); } else { /* no rescaling needed */ - assert(!texImage->Data); - texImage->Data = MESA_PBUFFER_ALLOC(mml->width * mml->height * texelBytes); - if (!texImage->Data) { - _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); - return; - } /* unpack image, apply transfer ops and store in texImage->Data */ _mesa_transfer_teximage(ctx, 2, texImage->Format, - texImage->TexFormat, texImage->Data, + _final_texImage_TexFormat, _final_texImage_Data, width, height, 1, 0, 0, 0, texImage->Width * texelBytes, 0, /* dstImageStride */ format, type, pixels, packing); } - mml->glideFormat = fxGlideFormat(texImage->TexFormat->MesaFormat); + /* now compress */ + if (texImage->IsCompressed) { +#if FX_TC_NCC + if ((mml->glideFormat == GR_TEXFMT_AYIQ_8422) || + (mml->glideFormat == GR_TEXFMT_YIQ_422)) { + TxMip txMip, pxMip; + txMip.width = mml->width; + txMip.height = mml->height; + txMip.depth = 1; + txMip.data[0] = _final_texImage_Data; + pxMip.data[0] = texImage->Data; + fxMesa->Glide.txMipQuantize(&pxMip, &txMip, mml->glideFormat, TX_DITHER_ERR, TX_COMPRESSION_STATISTICAL); + fxMesa->Glide.txPalToNcc((GuNccTable *)(&(ti->palette)), pxMip.pal); + MEMCPY((char *)texImage->Data + texImage->CompressedSize - 12 * 4, &(ti->palette.data[16]), 12 * 4); + } else +#endif + fxMesa->Glide.txImgQuantize(texImage->Data, _final_texImage_Data, mml->width, mml->height, mml->glideFormat, TX_DITHER_NONE); + FREE(_final_texImage_Data); + } + ti->info.format = mml->glideFormat; texImage->FetchTexel = fxFetchFunction(texImage->TexFormat->MesaFormat); /* [dBorca] * Hack alert: unsure... */ - if (!(fxMesa->new_state & FX_NEW_TEXTURING) && ti->validated && ti->isInTM) { + if (0 && ti->validated && ti->isInTM) { /*fprintf(stderr, "reloadmipmaplevels\n"); */ fxTMReloadMipMapLevel(fxMesa, texObj, level); } @@ -1294,6 +1351,10 @@ fxDDTexSubImage2D(GLcontext * ctx, GLenum target, GLint level, tfxMipMapLevel *mml; GLint texelBytes; + /* [dBorca] Hack alert: + * fix the goddamn texture compression here + */ + if (TDFX_DEBUG & VERBOSE_TEXTURE) { fprintf(stderr, "fxDDTexSubImage2D: id=%d\n", texObj->Name); } @@ -1363,7 +1424,180 @@ fxDDTexSubImage2D(GLcontext * ctx, GLenum target, GLint level, /* [dBorca] * Hack alert: unsure... */ - if (!(fxMesa->new_state & FX_NEW_TEXTURING) && ti->validated && ti->isInTM) + if (0 && ti->validated && ti->isInTM) + fxTMReloadMipMapLevel(fxMesa, texObj, level); + else + fxTexInvalidate(ctx, texObj); +} + + +void +fxDDCompressedTexImage2D (GLcontext *ctx, GLenum target, + GLint level, GLint internalFormat, + GLsizei width, GLsizei height, GLint border, + GLsizei imageSize, const GLvoid *data, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage) +{ + fxMesaContext fxMesa = FX_CONTEXT(ctx); + tfxTexInfo *ti; + tfxMipMapLevel *mml; + + if (TDFX_DEBUG & VERBOSE_TEXTURE) { + fprintf(stderr, "fxDDCompressedTexImage2D: id=%d int 0x%x %dx%d\n", + texObj->Name, internalFormat, + width, height); + } + + assert(texImage->IsCompressed); + + if (!fxIsTexSupported(target, internalFormat, texImage)) { + _mesa_problem(NULL, "fx Driver: unsupported texture in fxDDCompressedTexImg()\n"); + return; + } + + if (!texObj->DriverData) { + texObj->DriverData = fxAllocTexObjData(fxMesa); + if (!texObj->DriverData) { + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D"); + return; + } + } + ti = fxTMGetTexInfo(texObj); + + if (!texImage->DriverData) { + texImage->DriverData = CALLOC(sizeof(tfxMipMapLevel)); + if (!texImage->DriverData) { + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); + return; + } + } + mml = FX_MIPMAP_DATA(texImage); + + fxTexGetInfo(width, height, NULL, NULL, NULL, NULL, + &mml->wScale, &mml->hScale); + + mml->width = width * mml->wScale; + mml->height = height * mml->hScale; + + + /* choose the texture format */ + assert(ctx->Driver.ChooseTextureFormat); + texImage->TexFormat = (*ctx->Driver.ChooseTextureFormat)(ctx, + internalFormat, -1/*format*/, -1/*type*/); + assert(texImage->TexFormat); + + /* Determine the appropriate Glide texel format, + * given the user's internal texture format hint. + */ + mml->glideFormat = fxGlideFormat(texImage->TexFormat->MesaFormat); +#if FX_TC_NCC || FX_TC_NAPALM + if (internalFormat == GL_COMPRESSED_RGB) { +#if FX_TC_NCC + mml->glideFormat = GR_TEXFMT_YIQ_422; +#endif +#if FX_TC_NAPALM + if (fxMesa->type >= GR_SSTTYPE_Voodoo4) { + mml->glideFormat = GR_TEXFMT_ARGB_CMP_FXT1; + } +#endif + } else if (internalFormat == GL_COMPRESSED_RGBA) { +#if FX_TC_NCC + mml->glideFormat = GR_TEXFMT_AYIQ_8422; +#endif +#if FX_TC_NAPALM + if (fxMesa->type >= GR_SSTTYPE_Voodoo4) { + mml->glideFormat = GR_TEXFMT_ARGB_CMP_FXT1; + } +#endif + } +#endif + + /* allocate new storage for texture image, if needed */ + if (!texImage->Data) { + texImage->Data = MESA_PBUFFER_ALLOC(imageSize); + if (!texImage->Data) { + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); + return; + } + } + + /* save the texture data */ + MEMCPY(texImage->Data, data, imageSize); +#if FX_TC_NCC + if ((mml->glideFormat == GR_TEXFMT_AYIQ_8422) || + (mml->glideFormat == GR_TEXFMT_YIQ_422)) { + MEMCPY(&(ti->palette.data[16]), (char *)data + imageSize - 12 * 4, 12 * 4); + } +#endif + + ti->info.format = mml->glideFormat; + texImage->FetchTexel = fxFetchFunction(texImage->TexFormat->MesaFormat); + + /* [dBorca] Hack alert: + * what about different size/texel? other anomalies? SW rescaling? + */ + + /* [dBorca] + * Hack alert: unsure... + */ + if (0 && ti->validated && ti->isInTM) { + /*fprintf(stderr, "reloadmipmaplevels\n"); */ + fxTMReloadMipMapLevel(fxMesa, texObj, level); + } + else { + /*fprintf(stderr, "invalidate2\n"); */ + fxTexInvalidate(ctx, texObj); + } +} + + +void +fxDDCompressedTexSubImage2D( GLcontext *ctx, GLenum target, + GLint level, GLint xoffset, + GLint yoffset, GLsizei width, + GLint height, GLenum format, + GLsizei imageSize, const GLvoid *data, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage ) +{ + fxMesaContext fxMesa = FX_CONTEXT(ctx); + tfxTexInfo *ti; + tfxMipMapLevel *mml; + + if (TDFX_DEBUG & VERBOSE_TEXTURE) { + fprintf(stderr, "fxDDCompressedTexSubImage2D: id=%d\n", texObj->Name); + } + + ti = fxTMGetTexInfo(texObj); + assert(ti); + mml = FX_MIPMAP_DATA(texImage); + assert(mml); + + /* + * We punt if we are not replacing the entire image. This + * is allowed by the spec. + * + * [dBorca] Hack alert: + * ohwell, we should NOT! Look into _mesa_store_compressed_texsubimage2d + * on how to calculate the sub-image. + */ + if ((xoffset != 0) && (yoffset != 0) + && (width != texImage->Width) + && (height != texImage->Height)) { + _mesa_error(ctx, GL_INVALID_VALUE, "glCompressedTexSubImage2D(CHICKEN)"); + return; + } + + /* [dBorca] Hack alert: + * what about different size/texel? other anomalies? SW rescaling? + */ + MEMCPY(texImage->Data, data, imageSize); + + /* [dBorca] + * Hack alert: unsure... + */ + if (0 && ti->validated && ti->isInTM) fxTMReloadMipMapLevel(fxMesa, texObj, level); else fxTexInvalidate(ctx, texObj); diff --git a/src/mesa/drivers/glide/fxdrv.h b/src/mesa/drivers/glide/fxdrv.h index b404d52fa62..c109f22f1e8 100644 --- a/src/mesa/drivers/glide/fxdrv.h +++ b/src/mesa/drivers/glide/fxdrv.h @@ -1,5 +1,3 @@ -/* $Id: fxdrv.h,v 1.59 2003/10/02 17:36:44 brianp Exp $ */ - /* * Mesa 3-D graphics library * Version: 4.0 @@ -86,6 +84,14 @@ ( (unsigned int)(c[0])) ) #endif +#define TDFXPACKCOLOR1555( r, g, b, a ) \ + ((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) | \ + ((a) ? 0x8000 : 0)) +#define TDFXPACKCOLOR565( r, g, b ) \ + ((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3)) +#define TDFXPACKCOLOR8888( r, g, b, a ) \ + (((a) << 24) | ((r) << 16) | ((g) << 8) | (b)) + /* fastpath flags first @@ -147,6 +153,90 @@ #define FX_UM_ALPHA_CONSTANT 0x08000000 +/* for Voodoo3/Banshee's grColorCombine() and grAlphaCombine() */ +struct tdfx_combine { + GrCombineFunction_t Function; /* Combine function */ + GrCombineFactor_t Factor; /* Combine scale factor */ + GrCombineLocal_t Local; /* Local combine source */ + GrCombineOther_t Other; /* Other combine source */ + FxBool Invert; /* Combine result inversion flag */ +}; + +/* for Voodoo3's grTexCombine() */ +struct tdfx_texcombine { + GrCombineFunction_t FunctionRGB; + GrCombineFactor_t FactorRGB; + GrCombineFunction_t FunctionAlpha; + GrCombineFactor_t FactorAlpha; + FxBool InvertRGB; + FxBool InvertAlpha; +}; + + +/* for Voodoo5's grColorCombineExt() */ +struct tdfx_combine_color_ext { + GrCCUColor_t SourceA; + GrCombineMode_t ModeA; + GrCCUColor_t SourceB; + GrCombineMode_t ModeB; + GrCCUColor_t SourceC; + FxBool InvertC; + GrCCUColor_t SourceD; + FxBool InvertD; + FxU32 Shift; + FxBool Invert; +}; + +/* for Voodoo5's grAlphaCombineExt() */ +struct tdfx_combine_alpha_ext { + GrACUColor_t SourceA; + GrCombineMode_t ModeA; + GrACUColor_t SourceB; + GrCombineMode_t ModeB; + GrACUColor_t SourceC; + FxBool InvertC; + GrACUColor_t SourceD; + FxBool InvertD; + FxU32 Shift; + FxBool Invert; +}; + +/* for Voodoo5's grTexColorCombineExt() */ +struct tdfx_color_texenv { + GrTCCUColor_t SourceA; + GrCombineMode_t ModeA; + GrTCCUColor_t SourceB; + GrCombineMode_t ModeB; + GrTCCUColor_t SourceC; + FxBool InvertC; + GrTCCUColor_t SourceD; + FxBool InvertD; + FxU32 Shift; + FxBool Invert; +}; + +/* for Voodoo5's grTexAlphaCombineExt() */ +struct tdfx_alpha_texenv { + GrTACUColor_t SourceA; + GrCombineMode_t ModeA; + GrTACUColor_t SourceB; + GrCombineMode_t ModeB; + GrTACUColor_t SourceC; + FxBool InvertC; + GrTCCUColor_t SourceD; + FxBool InvertD; + FxU32 Shift; + FxBool Invert; +}; + +/* Voodoo5's texture combine environment */ +struct tdfx_texcombine_ext { + struct tdfx_alpha_texenv Alpha; + struct tdfx_color_texenv Color; + GrColor_t EnvColor; +}; + + /* Memory range from startAddr to endAddr-1 */ @@ -196,6 +286,7 @@ typedef struct tfxTexInfo_t GLfloat sScale, tScale; + GrTexTable_t paltype; GuTexPalette palette; GLboolean fixedPalette; @@ -229,6 +320,7 @@ typedef struct GrAlphaBlendFnc_t blendDstFuncRGB; GrAlphaBlendFnc_t blendSrcFuncAlpha; GrAlphaBlendFnc_t blendDstFuncAlpha; + GrAlphaBlendOp_t blendEq; /* Depth test */ @@ -317,13 +409,6 @@ tfxUnitsState; _NEW_COLOR) \ -/* These lookup table are used to extract RGB values in [0,255] from - * 16-bit pixel values. - */ -extern GLubyte FX_PixelToR[0x10000]; -extern GLubyte FX_PixelToG[0x10000]; -extern GLubyte FX_PixelToB[0x10000]; - /* lookup table for scaling y bit colors up to 8 bits */ extern GLuint FX_rgb_scale_4[16]; extern GLuint FX_rgb_scale_5[32]; @@ -335,6 +420,7 @@ typedef void (*fx_point_func) (fxMesaContext, GrVertex *); struct tfxMesaContext { + GrTexTable_t glbPalType; GuTexPalette glbPalette; GLcontext *glCtx; /* the core Mesa context */ @@ -443,10 +529,12 @@ struct tfxMesaContext * from `glbHWConfig' when creating a new context... */ GrSstType type; + FxBool HavePalExt; /* PALETTE6666 */ FxBool HavePixExt; /* PIXEXT */ FxBool HaveTexFmt; /* TEXFMT */ FxBool HaveCmbExt; /* COMBINE */ FxBool HaveMirExt; /* TEXMIRROR */ + FxBool HaveTexUma; /* TEXUMA */ FxBool HaveTexus2; /* Texus 2 - FXT1 */ struct tdfx_glide Glide; char rendererString[100]; @@ -485,6 +573,10 @@ extern void fxPrintTextureData(tfxTexInfo * ti); extern const struct gl_texture_format * fxDDChooseTextureFormat( GLcontext *ctx, GLint internalFormat, GLenum srcFormat, GLenum srcType ); +extern GLboolean fxDDIsCompressedFormat (GLcontext *ctx, GLenum internalFormat); +extern GLuint fxDDCompressedTextureSize (GLcontext *ctx, + GLsizei width, GLsizei height, GLsizei depth, + GLenum format); extern void fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level, GLint internalFormat, GLint width, GLint height, GLint border, GLenum format, GLenum type, @@ -492,7 +584,6 @@ extern void fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level, const struct gl_pixelstore_attrib *packing, struct gl_texture_object *texObj, struct gl_texture_image *texImage); - extern void fxDDTexSubImage2D(GLcontext * ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, @@ -501,17 +592,33 @@ extern void fxDDTexSubImage2D(GLcontext * ctx, GLenum target, GLint level, const struct gl_pixelstore_attrib *packing, struct gl_texture_object *texObj, struct gl_texture_image *texImage); +extern void fxDDCompressedTexImage2D(GLcontext *ctx, GLenum target, + GLint level, GLint internalFormat, + GLsizei width, GLsizei height, GLint border, + GLsizei imageSize, const GLvoid *data, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage); +extern void fxDDCompressedTexSubImage2D(GLcontext *ctx, GLenum target, + GLint level, GLint xoffset, + GLint yoffset, GLsizei width, + GLint height, GLenum format, + GLsizei imageSize, const GLvoid *data, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage); extern void fxDDTexEnv(GLcontext *, GLenum, GLenum, const GLfloat *); extern void fxDDTexParam(GLcontext *, GLenum, struct gl_texture_object *, GLenum, const GLfloat *); extern void fxDDTexBind(GLcontext *, GLenum, struct gl_texture_object *); extern void fxDDTexDel(GLcontext *, struct gl_texture_object *); +extern GLboolean fxDDIsTextureResident(GLcontext *, struct gl_texture_object *); extern void fxDDTexPalette(GLcontext *, struct gl_texture_object *); extern void fxDDTexUseGlbPalette(GLcontext *, GLboolean); extern void fxDDEnable(GLcontext *, GLenum, GLboolean); extern void fxDDAlphaFunc(GLcontext *, GLenum, GLfloat); extern void fxDDBlendFunc(GLcontext *, GLenum, GLenum); +extern void fxDDBlendFuncSeparate(GLcontext *, GLenum, GLenum, GLenum, GLenum); +extern void fxDDBlendEquation(GLcontext *, GLenum); extern void fxDDDepthMask(GLcontext *, GLboolean); extern void fxDDDepthFunc(GLcontext *, GLenum); extern void fxDDStencilFunc (GLcontext *ctx, GLenum func, GLint ref, GLuint mask); @@ -532,6 +639,7 @@ extern void fxTMReloadMipMapLevel(fxMesaContext, struct gl_texture_object *, extern void fxTMReloadSubMipMapLevel(fxMesaContext, struct gl_texture_object *, GLint, GLint, GLint); +extern int fxTMCheckStartAddr (fxMesaContext fxMesa, GLint tmu, tfxTexInfo *ti); extern void fxTexGetFormat(GLcontext *, GLenum, GrTextureFormat_t *, GLint *); /* [koolsmoky] */ @@ -570,16 +678,19 @@ extern int fxDDInitFxMesaContext(fxMesaContext fxMesa); extern void fxDDDestroyFxMesaContext(fxMesaContext fxMesa); -void fxColorMask (fxMesaContext fxMesa, GLboolean enable); - - extern void fxSetScissorValues(GLcontext * ctx); extern void fxTMMoveInTM_NoLock(fxMesaContext fxMesa, struct gl_texture_object *tObj, GLint where); -extern void fxInitPixelTables(fxMesaContext fxMesa, GLboolean bgrOrder); extern void fxCheckIsInHardware(GLcontext *ctx); +/* fxsetup: + * semi-private functions + */ +void fxSetupCull (GLcontext * ctx); +void fxSetupScissor (GLcontext * ctx); +void fxSetupColorMask (GLcontext * ctx); + /* Flags for software fallback cases */ #define FX_FALLBACK_TEXTURE_1D_3D 0x0001 #define FX_FALLBACK_DRAW_BUFFER 0x0002 @@ -595,4 +706,11 @@ extern void fxCheckIsInHardware(GLcontext *ctx); extern GLuint fx_check_IsInHardware(GLcontext *ctx); +/* run-time debugging */ +#if FX_DEBUG +extern int TDFX_DEBUG; +#else +#define TDFX_DEBUG 0 +#endif + #endif diff --git a/src/mesa/drivers/glide/fxg.c b/src/mesa/drivers/glide/fxg.c index 3d00e080b17..9f241851000 100644 --- a/src/mesa/drivers/glide/fxg.c +++ b/src/mesa/drivers/glide/fxg.c @@ -31,6 +31,8 @@ */ +#ifdef FX + #include <stdio.h> #include <stdarg.h> #include <assert.h> @@ -38,17 +40,23 @@ #define DEBUG_TRAP_internal #include "fxg.h" +/* texus.h */ +FX_ENTRY void FX_CALL txImgQuantize (char *dst, char *src, int w, int h, FxU32 format, FxU32 dither); +FX_ENTRY void FX_CALL txMipQuantize (TxMip *pxMip, TxMip *txMip, int fmt, FxU32 d, FxU32 comp); +FX_ENTRY void FX_CALL txPalToNcc (GuNccTable *ncc_table, const FxU32 *pal); +/* texus.h */ + /****************************************************************************\ * logging * \****************************************************************************/ #if DEBUG_TRAP -#define TRAP_LOG trap_printf +#define TRAP_LOG trp_printf #ifdef __GNUC__ __attribute__ ((format(printf, 1, 2))) #endif /* __GNUC__ */ -int trap_printf (const char *format, ...) +int trp_printf (const char *format, ...) { va_list arg; int n; @@ -232,8 +240,10 @@ const char *TRP_BLEND (GrAlphaBlendFnc_t func) TRAP_CASE_STRING(GR_BLEND_ONE_MINUS_SRC_COLOR); /*TRAP_CASE_STRING(GR_BLEND_ONE_MINUS_DST_COLOR); ==GR_BLEND_ONE_MINUS_SRC_COLOR*/ TRAP_CASE_STRING(GR_BLEND_ONE_MINUS_DST_ALPHA); - TRAP_CASE_STRING(GR_BLEND_RESERVED_8); - TRAP_CASE_STRING(GR_BLEND_RESERVED_9); + TRAP_CASE_STRING(GR_BLEND_SAME_COLOR_EXT); + /*TRAP_CASE_STRING(GR_BLEND_RESERVED_8); ==GR_BLEND_SAME_COLOR_EXT*/ + TRAP_CASE_STRING(GR_BLEND_ONE_MINUS_SAME_COLOR_EXT); + /*TRAP_CASE_STRING(GR_BLEND_RESERVED_9); ==GR_BLEND_ONE_MINUS_SAME_COLOR_EXT*/ TRAP_CASE_STRING(GR_BLEND_RESERVED_A); TRAP_CASE_STRING(GR_BLEND_RESERVED_B); TRAP_CASE_STRING(GR_BLEND_RESERVED_C); @@ -731,8 +741,6 @@ const char *TRP_BLENDOP (GrAlphaBlendOp_t op) TRAP_CASE_STRING(GR_BLEND_OP_ADD); TRAP_CASE_STRING(GR_BLEND_OP_SUB); TRAP_CASE_STRING(GR_BLEND_OP_REVSUB); - TRAP_CASE_STRING(GR_BLEND_SAME_COLOR_EXT); - TRAP_CASE_STRING(GR_BLEND_ONE_MINUS_SAME_COLOR_EXT); TRAP_NODEFAULT; } } @@ -783,6 +791,25 @@ const char *TRP_TMU (GrChipID_t tmu) } } +const char *TRP_TXDITHER (FxU32 dither) +{ + switch (dither) { + TRAP_CASE_STRING(TX_DITHER_NONE); + TRAP_CASE_STRING(TX_DITHER_4x4); + TRAP_CASE_STRING(TX_DITHER_ERR); + TRAP_NODEFAULT; + } +} + +const char *TRP_TXCOMPRESS (FxU32 compress) +{ + switch (compress) { + TRAP_CASE_STRING(TX_COMPRESSION_STATISTICAL); + TRAP_CASE_STRING(TX_COMPRESSION_HEURISTIC); + TRAP_NODEFAULT; + } +} + /****************************************************************************\ @@ -799,6 +826,11 @@ void (FX_CALL *real_grChromaRangeExt) (GrColor_t color, GrColor_t range, GrChrom void (FX_CALL *real_grTexChromaModeExt) (GrChipID_t tmu, GrChromakeyMode_t mode); void (FX_CALL *real_grTexChromaRangeExt) (GrChipID_t tmu, GrColor_t min, GrColor_t max, GrTexChromakeyMode_t mode); +/* pointcast */ +void (FX_CALL *real_grTexDownloadTableExt) (GrChipID_t tmu, GrTexTable_t type, void *data); +void (FX_CALL *real_grTexDownloadTablePartialExt) (GrChipID_t tmu, GrTexTable_t type, void *data, int start, int end); +void (FX_CALL *real_grTexNCCTableExt) (GrChipID_t tmu, GrNCCTable_t table); + /* tbext */ void (FX_CALL *real_grTextureBufferExt) (GrChipID_t tmu, FxU32 startAddress, GrLOD_t thisLOD, GrLOD_t largeLOD, GrAspectRatio_t aspectRatio, GrTextureFormat_t format, FxU32 odd_even_mask); void (FX_CALL *real_grTextureAuxBufferExt) (GrChipID_t tmu, FxU32 startAddress, GrLOD_t thisLOD, GrLOD_t largeLOD, GrAspectRatio_t aspectRatio, GrTextureFormat_t format, FxU32 odd_even_mask); @@ -1857,6 +1889,41 @@ void FX_CALL trap_grTexChromaRangeExt (GrChipID_t tmu, #undef FN_NAME } + /* pointcast */ +void FX_CALL trap_grTexDownloadTableExt (GrChipID_t tmu, + GrTexTable_t type, + void *data) +{ +#define FN_NAME "grTexDownloadTableExt" + TRAP_LOG("%s(%s, %s, %p)\n", FN_NAME, TRP_TMU(tmu), TRP_TABLE(type), data); + assert(real_grTexDownloadTableExt); + (*real_grTexDownloadTableExt)(tmu, type, data); +#undef FN_NAME +} + +void FX_CALL trap_grTexDownloadTablePartialExt (GrChipID_t tmu, + GrTexTable_t type, + void *data, + int start, + int end) +{ +#define FN_NAME "grTexDownloadTablePartialExt" + TRAP_LOG("%s(%s, %s, %p, %d, %d)\n", FN_NAME, TRP_TMU(tmu), TRP_TABLE(type), data, start, end); + assert(real_grTexDownloadTablePartialExt); + (*real_grTexDownloadTablePartialExt)(tmu, type, data, start, end); +#undef FN_NAME +} + +void FX_CALL trap_grTexNCCTableExt (GrChipID_t tmu, + GrNCCTable_t table) +{ +#define FN_NAME "grTexNCCTableExt" + TRAP_LOG("%s(%s, %s)\n", FN_NAME, TRP_TMU(tmu), TRP_NCC(table)); + assert(real_grTexNCCTableExt); + (*real_grTexNCCTableExt)(tmu, table); +#undef FN_NAME +} + /* tbext */ void FX_CALL trap_grTextureBufferExt (GrChipID_t tmu, FxU32 startAddress, @@ -2087,19 +2154,87 @@ void FX_CALL trap_grTBufferWriteMaskExt (FxU32 tmask) (*real_grTBufferWriteMaskExt)(tmask); #undef FN_NAME } + +/* +** texus functions +*/ +void FX_CALL trap_txImgQuantize (char *dst, + char *src, + int w, + int h, + FxU32 format, + FxU32 dither) +{ +#define FN_NAME "txImgQuantize" + TRAP_LOG("%s(%p, %p, %d, %d, %s, %s)\n", FN_NAME, dst, src, w, h, TRP_TEXFMT(format), TRP_TXDITHER(dither)); + txImgQuantize(dst, src, w, h, format, dither); +#undef FN_NAME +} + +void FX_CALL trap_txMipQuantize (TxMip *pxMip, + TxMip *txMip, + int fmt, + FxU32 d, + FxU32 comp) +{ +#define FN_NAME "txMipQuantize" + TRAP_LOG("%s(%p, %p, %s, %s, %s)\n", FN_NAME, (void *)pxMip, (void *)txMip, TRP_TEXFMT(fmt), TRP_TXDITHER(d), TRP_TXCOMPRESS(comp)); + txMipQuantize(pxMip, txMip, fmt, d, comp); +#undef FN_NAME +} + +void FX_CALL trap_txPalToNcc (GuNccTable *ncc_table, + const FxU32 *pal) +{ +#define FN_NAME "txPalToNcc" + TRAP_LOG("%s(%p, %p)\n", FN_NAME, (void *)ncc_table, (void *)pal); + txPalToNcc(ncc_table, pal); +#undef FN_NAME +} #endif /****************************************************************************\ +* housekeeping (fake pointers) +\****************************************************************************/ +void FX_CALL fake_grTexDownloadTableExt (GrChipID_t tmu, + GrTexTable_t type, + void *data) +{ + grTexDownloadTable(type, data); +} + +void FX_CALL fake_grTexDownloadTablePartialExt (GrChipID_t tmu, + GrTexTable_t type, + void *data, + int start, + int end) +{ + grTexDownloadTablePartial(type, data, start, end); +} + +void FX_CALL fake_grTexNCCTableExt (GrChipID_t tmu, + GrNCCTable_t table) +{ + grTexNCCTable(table); +} + + + +/****************************************************************************\ * interface \****************************************************************************/ void tdfx_hook_glide (struct tdfx_glide *Glide) { #if DEBUG_TRAP -#define GET_EXT_ADDR(name) *(GrProc *)&real_##name = grGetProcAddress(#name), Glide->name = trap_##name +#define GET_EXT_ADDR(name) *(GrProc *)&real_##name = grGetProcAddress(#name), Glide->name = trap_##name +#define GET_EXT_FAKE(name) GET_EXT_ADDR(name); if (real_##name == NULL) real_##name = fake_##name +#define GET_TXS_ADDR(name) Glide->name = trap_##name #else /* DEBUG_TRAP */ -#define GET_EXT_ADDR(name) *(GrProc *)&Glide->name = grGetProcAddress(#name) +#define GET_EXT_ADDR(name) *(GrProc *)&Glide->name = grGetProcAddress(#name) +#define GET_EXT_FAKE(name) GET_EXT_ADDR(name); if (Glide->name == NULL) Glide->name = fake_##name +#define GET_TXS_ADDR(name) Glide->name = name #endif /* DEBUG_TRAP */ /* @@ -2111,6 +2246,10 @@ void tdfx_hook_glide (struct tdfx_glide *Glide) GET_EXT_ADDR(grChromaRangeExt); GET_EXT_ADDR(grTexChromaModeExt); GET_EXT_ADDR(grTexChromaRangeExt); + /* pointcast */ + GET_EXT_FAKE(grTexDownloadTableExt); + GET_EXT_FAKE(grTexDownloadTablePartialExt); + GET_EXT_FAKE(grTexNCCTableExt); /* tbext */ GET_EXT_ADDR(grTextureBufferExt); GET_EXT_ADDR(grTextureAuxBufferExt); @@ -2131,5 +2270,14 @@ void tdfx_hook_glide (struct tdfx_glide *Glide) GET_EXT_ADDR(grAlphaBlendFunctionExt); GET_EXT_ADDR(grTBufferWriteMaskExt); + /* + ** texus + */ + GET_TXS_ADDR(txImgQuantize); + GET_TXS_ADDR(txMipQuantize); + GET_TXS_ADDR(txPalToNcc); + #undef GET_EXT_ADDR } + +#endif /* FX */ diff --git a/src/mesa/drivers/glide/fxg.h b/src/mesa/drivers/glide/fxg.h index 234e52aee8c..2841bab16cb 100644 --- a/src/mesa/drivers/glide/fxg.h +++ b/src/mesa/drivers/glide/fxg.h @@ -307,6 +307,30 @@ void FX_CALL trap_guFogGenerateLinear (GrFog_t *fogtable, float nearZ, float far #endif /* DEBUG_TRAP_internal */ #endif /* DEBUG_TRAP */ + + +/* <texus.h> */ +#define TX_MAX_LEVEL 16 +typedef struct _TxMip { + int format; + int width; + int height; + int depth; + int size; + void *data[TX_MAX_LEVEL]; + FxU32 pal[256]; +} TxMip; +typedef void (*TxErrorCallbackFnc_t) (const char *string, FxBool fatal); +#define TX_DITHER_NONE 0x00000000 +#define TX_DITHER_4x4 0x00000001 +#define TX_DITHER_ERR 0x00000002 + +#define TX_COMPRESSION_STATISTICAL 0x00000000 +#define TX_COMPRESSION_HEURISTIC 0x00000010 +/* <texus.h> */ + + + struct tdfx_glide { /* ** glide extensions @@ -318,6 +342,11 @@ struct tdfx_glide { void (FX_CALL *grTexChromaModeExt) (GrChipID_t tmu, GrChromakeyMode_t mode); void (FX_CALL *grTexChromaRangeExt) (GrChipID_t tmu, GrColor_t min, GrColor_t max, GrTexChromakeyMode_t mode); + /* pointcast */ + void (FX_CALL *grTexDownloadTableExt) (GrChipID_t tmu, GrTexTable_t type, void *data); + void (FX_CALL *grTexDownloadTablePartialExt) (GrChipID_t tmu, GrTexTable_t type, void *data, int start, int end); + void (FX_CALL *grTexNCCTableExt) (GrChipID_t tmu, GrNCCTable_t table); + /* tbext */ void (FX_CALL *grTextureBufferExt) (GrChipID_t tmu, FxU32 startAddress, GrLOD_t thisLOD, GrLOD_t largeLOD, GrAspectRatio_t aspectRatio, GrTextureFormat_t format, FxU32 odd_even_mask); void (FX_CALL *grTextureAuxBufferExt) (GrChipID_t tmu, FxU32 startAddress, GrLOD_t thisLOD, GrLOD_t largeLOD, GrAspectRatio_t aspectRatio, GrTextureFormat_t format, FxU32 odd_even_mask); @@ -342,9 +371,9 @@ struct tdfx_glide { /* ** Texus2 functions */ - void (*txImgQuantize) (void *xxx_unknown_arguments); - void (*txImgDequantizeFXT1) (void *txMip, void *pxMip); - void (*txErrorSetCallback) (void *fnc); + void (FX_CALL *txImgQuantize) (char *dst, char *src, int w, int h, FxU32 format, FxU32 dither); + void (FX_CALL *txMipQuantize) (TxMip *pxMip, TxMip *txMip, int fmt, FxU32 d, FxU32 comp); + void (FX_CALL *txPalToNcc) (GuNccTable *ncc_table, const FxU32 *pal); }; void tdfx_hook_glide (struct tdfx_glide *Glide); diff --git a/src/mesa/drivers/glide/fxglidew.c b/src/mesa/drivers/glide/fxglidew.c index 6e89f00ed83..76df0286937 100644 --- a/src/mesa/drivers/glide/fxglidew.c +++ b/src/mesa/drivers/glide/fxglidew.c @@ -1,5 +1,3 @@ -/* $Id: fxglidew.c,v 1.22 2003/10/02 17:36:44 brianp Exp $ */ - /* * Mesa 3-D graphics library * Version: 4.0 @@ -196,7 +194,9 @@ FX_grSstQueryHardware(GrHwConfiguration * config) grSstSelect(i); extension = grGetString(GR_HARDWARE); - if (strstr(extension, "Voodoo Banshee")) { + if (strstr(extension, "Voodoo2")) { + config->SSTs[i].type = GR_SSTTYPE_Voodoo2; + } else if (strstr(extension, "Voodoo Banshee")) { config->SSTs[i].type = GR_SSTTYPE_Banshee; } else if (strstr(extension, "Voodoo3")) { config->SSTs[i].type = GR_SSTTYPE_Voodoo3; @@ -204,12 +204,12 @@ FX_grSstQueryHardware(GrHwConfiguration * config) config->SSTs[i].type = GR_SSTTYPE_Voodoo4; } else if (strstr(extension, "Voodoo5")) { config->SSTs[i].type = GR_SSTTYPE_Voodoo5; - } else { /* Voodoo1,2,rush */ - /* ZZZ TO DO */ + } else { /* Voodoo1,rush */ + /* ZZZ TO DO: Need to distinguish whether we have V1 or Rush. */ config->SSTs[i].type = GR_SSTTYPE_VOODOO; } - grGet(GR_MEMORY_FB, 4, &result); + grGet(GR_MEMORY_FB, 4, &result); /* ZZZ: differs after grSstWinOpen */ config->SSTs[i].fbRam = result / (1024 * 1024); grGet(GR_NUM_TMU, 4, &result); @@ -219,25 +219,25 @@ FX_grSstQueryHardware(GrHwConfiguration * config) config->SSTs[i].fbiRev = result; for (j = 0; j < config->SSTs[i].nTexelfx; j++) { - grGet(GR_MEMORY_TMU, 4, &result); + grGet(GR_MEMORY_TMU, 4, &result); /* ZZZ: differs after grSstWinOpen */ config->SSTs[i].tmuConfig[j].tmuRam = result / (1024 * 1024); grGet(GR_REVISION_TMU, 4, &result); config->SSTs[i].tmuConfig[j].tmuRev = result; } extension = grGetString(GR_EXTENSION); + config->SSTs[i].HavePalExt = (strstr(extension, " PALETTE6666 ") != NULL); config->SSTs[i].HavePixExt = (strstr(extension, " PIXEXT ") != NULL); config->SSTs[i].HaveTexFmt = (strstr(extension, " TEXFMT ") != NULL); config->SSTs[i].HaveCmbExt = (strstr(extension, " COMBINE ") != NULL); config->SSTs[i].HaveMirExt = (strstr(extension, " TEXMIRROR ") != NULL); + config->SSTs[i].HaveTexUma = (strstr(extension, " TEXUMA ") != NULL); config->SSTs[i].HaveTexus2 = GL_FALSE; - /* need to get the number of SLI units for napalm */ + /* number of Voodoo chips */ grGet(GR_NUM_FB, 4, (void *) &numFB); config->SSTs[i].numChips = numFB; - /* this can only be useful for Voodoo2: - * sliDetect = ((config->SSTs[i].type == GR_SSTTYPE_Voodoo2) && (numFB > 1)); - */ + } tdfx_hook_glide(&config->Glide); diff --git a/src/mesa/drivers/glide/fxglidew.h b/src/mesa/drivers/glide/fxglidew.h index f6177e4ff58..31a8fa3b02e 100644 --- a/src/mesa/drivers/glide/fxglidew.h +++ b/src/mesa/drivers/glide/fxglidew.h @@ -1,5 +1,3 @@ -/* $Id: fxglidew.h,v 1.16 2003/10/02 17:36:44 brianp Exp $ */ - /* * Mesa 3-D graphics library * Version: 4.0 @@ -71,13 +69,15 @@ typedef struct { int fbRam; /* 1, 2, or 4 MB */ int fbiRev; /* Rev of Pixelfx chip */ int nTexelfx; /* How many texelFX chips are there? */ - int numChips; /* Number of Voodoo chips [koolsmoky] */ + int numChips; /* Number of Voodoo chips */ GrTMUConfig_t tmuConfig[GLIDE_NUM_TMU]; /* Configuration of the Texelfx chips */ /* Glide3 extensions */ + FxBool HavePalExt; /* PALETTE6666 */ FxBool HavePixExt; /* PIXEXT */ FxBool HaveTexFmt; /* TEXFMT */ FxBool HaveCmbExt; /* COMBINE */ FxBool HaveMirExt; /* TEXMIRROR */ + FxBool HaveTexUma; /* TEXUMA */ FxBool HaveTexus2; /* Texus 2 - FXT1 */ } SSTs[MAX_NUM_SST]; /* configuration for each board */ @@ -216,12 +216,4 @@ extern FxBool FX_grSstControl(FxU32 code); -#if FX_DEBUG -extern int TDFX_DEBUG; -#else -#define TDFX_DEBUG 0 -#endif - - - #endif /* __FX_GLIDE_WARPER__ */ diff --git a/src/mesa/drivers/glide/fxopengl.def b/src/mesa/drivers/glide/fxopengl.def index 9d0d3eb5012..897905b4b40 100644 --- a/src/mesa/drivers/glide/fxopengl.def +++ b/src/mesa/drivers/glide/fxopengl.def @@ -1,3 +1,5 @@ +LIBRARY OpenGL32 +DESCRIPTION "Mesa 5.1" EXPORTS glAccum glActiveStencilFaceEXT diff --git a/src/mesa/drivers/glide/fxsetup.c b/src/mesa/drivers/glide/fxsetup.c index 9ebc603ae7a..22c34cecaf3 100644 --- a/src/mesa/drivers/glide/fxsetup.c +++ b/src/mesa/drivers/glide/fxsetup.c @@ -1,5 +1,3 @@ -/* $Id: fxsetup.c,v 1.40 2003/10/02 17:36:44 brianp Exp $ */ - /* * Mesa 3-D graphics library * Version: 4.0 @@ -79,19 +77,13 @@ fxTexValidate(GLcontext * ctx, struct gl_texture_object *tObj) else FX_smallLodLog2(ti->info) = FX_largeLodLog2(ti->info); -/*jejeje*/ -ti->baseLevelInternalFormat = tObj->Image[minl]->Format; -#if 0 - fxTexGetFormat(ctx, tObj->Image[minl]->TexFormat->BaseFormat, &(ti->info.format), - &(ti->baseLevelInternalFormat)); /* [koolsmoky] */ -#endif + ti->baseLevelInternalFormat = tObj->Image[minl]->Format; switch (tObj->WrapS) { case GL_MIRRORED_REPEAT: ti->sClamp = GR_TEXTURECLAMP_MIRROR_EXT; break; - case GL_CLAMP_TO_EDGE: - /* What's this really mean compared to GL_CLAMP? */ + case GL_CLAMP_TO_EDGE: /* CLAMP discarding border */ case GL_CLAMP: ti->sClamp = GR_TEXTURECLAMP_CLAMP; break; @@ -105,8 +97,7 @@ ti->baseLevelInternalFormat = tObj->Image[minl]->Format; case GL_MIRRORED_REPEAT: ti->tClamp = GR_TEXTURECLAMP_MIRROR_EXT; break; - case GL_CLAMP_TO_EDGE: - /* What's this really mean compared to GL_CLAMP? */ + case GL_CLAMP_TO_EDGE: /* CLAMP discarding border */ case GL_CLAMP: ti->tClamp = GR_TEXTURECLAMP_CLAMP; break; @@ -301,6 +292,10 @@ fxSetupSingleTMU_NoLock(fxMesaContext fxMesa, struct gl_texture_object *tObj) fprintf(stderr, "%s(%p (%d))\n", __FUNCTION__, (void *)tObj, tObj->Name); } +#if 1 /* [dBorca] Good... bad... I'm the guy with the gun! */ + ti->lastTimeUsed = fxMesa->texBindNumber; +#endif + /* Make sure we're not loaded incorrectly */ if (ti->isInTM) { if (ti->LODblend) { @@ -318,13 +313,8 @@ fxSetupSingleTMU_NoLock(fxMesaContext fxMesa, struct gl_texture_object *tObj) if (ti->LODblend) fxTMMoveInTM_NoLock(fxMesa, tObj, FX_TMU_SPLIT); else { - /* XXX putting textures into the second memory bank when the - * first bank is full is not working at this time. - */ - if (/*[dBorca]: fixme*/0 && fxMesa->haveTwoTMUs) { - if (fxMesa->freeTexMem[FX_TMU0] > - grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH, - &(ti->info))) { + if (fxMesa->haveTwoTMUs) { + if (fxTMCheckStartAddr(fxMesa, FX_TMU0, ti)) { fxTMMoveInTM_NoLock(fxMesa, tObj, FX_TMU0); } else { @@ -337,13 +327,23 @@ fxSetupSingleTMU_NoLock(fxMesaContext fxMesa, struct gl_texture_object *tObj) } if (ti->LODblend && ti->whichTMU == FX_TMU_SPLIT) { + /* broadcast */ if ((ti->info.format == GR_TEXFMT_P_8) && (!fxMesa->haveGlobalPaletteTexture)) { if (TDFX_DEBUG & VERBOSE_DRIVER) { fprintf(stderr, "%s: uploading texture palette\n", __FUNCTION__); } - grTexDownloadTable(GR_TEXTABLE_PALETTE, &(ti->palette)); + grTexDownloadTable(ti->paltype, &(ti->palette)); } +#if FX_TC_NCC + if ((ti->info.format == GR_TEXFMT_AYIQ_8422) || + (ti->info.format == GR_TEXFMT_YIQ_422)) { + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s: uploading NCC table\n", __FUNCTION__); + } + grTexDownloadTable(GR_TEXTABLE_NCC0, &(ti->palette)); + } +#endif grTexClampMode(GR_TMU0, ti->sClamp, ti->tClamp); grTexClampMode(GR_TMU1, ti->sClamp, ti->tClamp); @@ -363,13 +363,23 @@ fxSetupSingleTMU_NoLock(fxMesaContext fxMesa, struct gl_texture_object *tObj) else tmu = ti->whichTMU; + /* pointcast */ if ((ti->info.format == GR_TEXFMT_P_8) && (!fxMesa->haveGlobalPaletteTexture)) { if (TDFX_DEBUG & VERBOSE_DRIVER) { fprintf(stderr, "%s: uploading texture palette\n", __FUNCTION__); } - grTexDownloadTable(GR_TEXTABLE_PALETTE, &(ti->palette)); + fxMesa->Glide.grTexDownloadTableExt(tmu, ti->paltype, &(ti->palette)); + } +#if FX_TC_NCC + if ((ti->info.format == GR_TEXFMT_AYIQ_8422) || + (ti->info.format == GR_TEXFMT_YIQ_422)) { + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s: uploading NCC table\n", __FUNCTION__); + } + fxMesa->Glide.grTexDownloadTableExt(tmu, GR_TEXTABLE_NCC0, &(ti->palette)); } +#endif /* KW: The alternative is to do the download to the other tmu. If * we get to this point, I think it means we are thrashing the @@ -390,66 +400,86 @@ fxSetupSingleTMU_NoLock(fxMesaContext fxMesa, struct gl_texture_object *tObj) static void fxSelectSingleTMUSrc_NoLock(fxMesaContext fxMesa, GLint tmu, FxBool LODblend) { + struct tdfx_texcombine tex0, tex1; + if (TDFX_DEBUG & VERBOSE_DRIVER) { fprintf(stderr, "%s(%d, %d)\n", __FUNCTION__, tmu, LODblend); } + tex0.InvertRGB = FXFALSE; + tex0.InvertAlpha = FXFALSE; + tex1.InvertRGB = FXFALSE; + tex1.InvertAlpha = FXFALSE; + if (LODblend) { - grTexCombine(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - GR_COMBINE_FUNCTION_BLEND, - GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION, - FXFALSE, FXFALSE); - - if (fxMesa->haveTwoTMUs) - grTexCombine(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE); + tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND; + tex0.FactorRGB = GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION; + tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND; + tex0.FactorAlpha = GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION; + + tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorRGB = GR_COMBINE_FACTOR_NONE; + tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE; + fxMesa->tmuSrc = FX_TMU_SPLIT; } else { if (tmu != FX_TMU1) { - grTexCombine(GR_TMU0, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE); - if (fxMesa->haveTwoTMUs) { - grTexCombine(GR_TMU1, - GR_COMBINE_FUNCTION_ZERO, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, - GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE); - } + tex0.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL; + tex0.FactorRGB = GR_COMBINE_FACTOR_NONE; + tex0.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL; + tex0.FactorAlpha = GR_COMBINE_FACTOR_NONE; + + tex1.FunctionRGB = GR_COMBINE_FUNCTION_ZERO; + tex1.FactorRGB = GR_COMBINE_FACTOR_NONE; + tex1.FunctionAlpha = GR_COMBINE_FUNCTION_ZERO; + tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE; + fxMesa->tmuSrc = FX_TMU0; } else { - grTexCombine(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE); - - /* GR_COMBINE_FUNCTION_SCALE_OTHER doesn't work ?!? */ - - grTexCombine(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_BLEND, - GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE); + tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorRGB = GR_COMBINE_FACTOR_NONE; + tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE; + + /* [dBorca] Hack alert: + * don't use GR_COMBINE_FUNCTION_SCALE_OTHER + * such that Glide recognizes TMU0 in passthrough mode + */ + tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND; + tex0.FactorRGB = GR_COMBINE_FACTOR_ONE; + tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND; + tex0.FactorAlpha = GR_COMBINE_FACTOR_ONE; fxMesa->tmuSrc = FX_TMU1; } } + + grTexCombine(GR_TMU0, + tex0.FunctionRGB, + tex0.FactorRGB, + tex0.FunctionAlpha, + tex0.FactorAlpha, + tex0.InvertRGB, + tex0.InvertAlpha); + if (fxMesa->haveTwoTMUs) { + grTexCombine(GR_TMU1, + tex1.FunctionRGB, + tex1.FactorRGB, + tex1.FunctionAlpha, + tex1.FactorAlpha, + tex1.InvertRGB, + tex1.InvertAlpha); + } } static void fxSetupTextureSingleTMU_NoLock(GLcontext * ctx, GLuint textureset) { fxMesaContext fxMesa = FX_CONTEXT(ctx); + struct tdfx_combine alphaComb, colorComb; GrCombineLocal_t localc, locala; GLuint unitsmode; GLint ifmt; @@ -503,59 +533,154 @@ fxSetupTextureSingleTMU_NoLock(GLcontext * ctx, GLuint textureset) fprintf(stderr, "%s: envmode is %s\n", __FUNCTION__, _mesa_lookup_enum_by_nr(ctx->Texture.Unit[textureset].EnvMode)); + alphaComb.Local = locala; + alphaComb.Invert = FXFALSE; + colorComb.Local = localc; + colorComb.Invert = FXFALSE; + switch (ctx->Texture.Unit[textureset].EnvMode) { case GL_DECAL: - grAlphaCombine(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - locala, GR_COMBINE_OTHER_NONE, FXFALSE); + alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL; + alphaComb.Factor = GR_COMBINE_FACTOR_NONE; + alphaComb.Other = GR_COMBINE_OTHER_NONE; - grColorCombine(GR_COMBINE_FUNCTION_BLEND, - GR_COMBINE_FACTOR_TEXTURE_ALPHA, - localc, GR_COMBINE_OTHER_TEXTURE, FXFALSE); + colorComb.Function = GR_COMBINE_FUNCTION_BLEND; + colorComb.Factor = GR_COMBINE_FACTOR_TEXTURE_ALPHA; + colorComb.Other = GR_COMBINE_OTHER_TEXTURE; break; case GL_MODULATE: - grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - locala, GR_COMBINE_OTHER_TEXTURE, FXFALSE); - - if (ifmt == GL_ALPHA) - grColorCombine(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - localc, GR_COMBINE_OTHER_NONE, FXFALSE); - else - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - localc, GR_COMBINE_OTHER_TEXTURE, FXFALSE); + alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER; + alphaComb.Factor = GR_COMBINE_FACTOR_LOCAL; + alphaComb.Other = GR_COMBINE_OTHER_TEXTURE; + + if (ifmt == GL_ALPHA) { + colorComb.Function = GR_COMBINE_FUNCTION_LOCAL; + colorComb.Factor = GR_COMBINE_FACTOR_NONE; + colorComb.Other = GR_COMBINE_OTHER_NONE; + } else { + colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER; + colorComb.Factor = GR_COMBINE_FACTOR_LOCAL; + colorComb.Other = GR_COMBINE_OTHER_TEXTURE; + } break; case GL_BLEND: - if (TDFX_DEBUG & VERBOSE_DRIVER) - fprintf(stderr, "%s: GL_BLEND not yet supported\n", __FUNCTION__); + if (ifmt == GL_LUMINANCE || ifmt == GL_RGB) { + /* Av = Af */ + alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL; + alphaComb.Factor = GR_COMBINE_FACTOR_NONE; + alphaComb.Other = GR_COMBINE_OTHER_NONE; + } + else if (ifmt == GL_INTENSITY) { + /* Av = Af * (1 - It) + Ac * It */ + alphaComb.Function = GR_COMBINE_FUNCTION_BLEND; + alphaComb.Factor = GR_COMBINE_FACTOR_TEXTURE_ALPHA; + alphaComb.Other = GR_COMBINE_OTHER_CONSTANT; + } + else { + /* Av = Af * At */ + alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER; + alphaComb.Factor = GR_COMBINE_FACTOR_LOCAL; + alphaComb.Other = GR_COMBINE_OTHER_TEXTURE; + } + + if (ifmt == GL_ALPHA) { + colorComb.Function = GR_COMBINE_FUNCTION_LOCAL; + colorComb.Factor = GR_COMBINE_FACTOR_NONE; + colorComb.Other = GR_COMBINE_OTHER_NONE; + } else { + /* [dBorca] Hack alert: + * only Voodoo^2 can GL_BLEND (GR_COMBINE_FACTOR_TEXTURE_RGB) + */ + if (fxMesa->type >= GR_SSTTYPE_Voodoo2) { + colorComb.Function = GR_COMBINE_FUNCTION_BLEND; + colorComb.Factor = GR_COMBINE_FACTOR_TEXTURE_RGB; + colorComb.Other = GR_COMBINE_OTHER_CONSTANT; + } else { + _mesa_problem(NULL, "can't GL_BLEND with SST1"); + return; + } + } + + grConstantColorValue( + ((GLuint)((ctx->Texture.Unit[textureset].EnvColor[0] * 255.0f)) ) | + ((GLuint)((ctx->Texture.Unit[textureset].EnvColor[1] * 255.0f)) << 8) | + ((GLuint)((ctx->Texture.Unit[textureset].EnvColor[2] * 255.0f)) << 16) | + ((GLuint)((ctx->Texture.Unit[textureset].EnvColor[3] * 255.0f)) << 24)); break; case GL_REPLACE: - if ((ifmt == GL_RGB) || (ifmt == GL_LUMINANCE)) - grAlphaCombine(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - locala, GR_COMBINE_OTHER_NONE, FXFALSE); - else - grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - locala, GR_COMBINE_OTHER_TEXTURE, FXFALSE); - - if (ifmt == GL_ALPHA) - grColorCombine(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - localc, GR_COMBINE_OTHER_NONE, FXFALSE); - else - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - localc, GR_COMBINE_OTHER_TEXTURE, FXFALSE); + if ((ifmt == GL_RGB) || (ifmt == GL_LUMINANCE)) { + alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL; + alphaComb.Factor = GR_COMBINE_FACTOR_NONE; + alphaComb.Other = GR_COMBINE_OTHER_NONE; + } else { + alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER; + alphaComb.Factor = GR_COMBINE_FACTOR_ONE; + alphaComb.Other = GR_COMBINE_OTHER_TEXTURE; + } + + if (ifmt == GL_ALPHA) { + colorComb.Function = GR_COMBINE_FUNCTION_LOCAL; + colorComb.Factor = GR_COMBINE_FACTOR_NONE; + colorComb.Other = GR_COMBINE_OTHER_NONE; + } else { + colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER; + colorComb.Factor = GR_COMBINE_FACTOR_ONE; + colorComb.Other = GR_COMBINE_OTHER_TEXTURE; + } + break; + case GL_ADD: + if (ifmt == GL_ALPHA || + ifmt == GL_LUMINANCE_ALPHA || + ifmt == GL_RGBA) { + /* product of texel and fragment alpha */ + alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER; + alphaComb.Factor = GR_COMBINE_FACTOR_LOCAL; + alphaComb.Other = GR_COMBINE_OTHER_TEXTURE; + } + else if (ifmt == GL_LUMINANCE || ifmt == GL_RGB) { + /* fragment alpha is unchanged */ + alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL; + alphaComb.Factor = GR_COMBINE_FACTOR_NONE; + alphaComb.Other = GR_COMBINE_OTHER_NONE; + } + else { + /* sum of texel and fragment alpha */ + alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, + alphaComb.Factor = GR_COMBINE_FACTOR_ONE; + alphaComb.Other = GR_COMBINE_OTHER_TEXTURE; + } + + if (ifmt == GL_ALPHA) { + /* rgb unchanged */ + colorComb.Function = GR_COMBINE_FUNCTION_LOCAL; + colorComb.Factor = GR_COMBINE_FACTOR_NONE; + colorComb.Other = GR_COMBINE_OTHER_NONE; + } + else { + /* sum of texel and fragment rgb */ + colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, + colorComb.Factor = GR_COMBINE_FACTOR_ONE; + colorComb.Other = GR_COMBINE_OTHER_TEXTURE; + } break; default: - if (TDFX_DEBUG & VERBOSE_DRIVER) + if (TDFX_DEBUG & VERBOSE_DRIVER) { fprintf(stderr, "%s: %x Texture.EnvMode not yet supported\n", __FUNCTION__, ctx->Texture.Unit[textureset].EnvMode); - break; + } + return; } + + grAlphaCombine(alphaComb.Function, + alphaComb.Factor, + alphaComb.Local, + alphaComb.Other, + alphaComb.Invert); + grColorCombine(colorComb.Function, + colorComb.Factor, + colorComb.Local, + colorComb.Other, + colorComb.Invert); } #if 00 @@ -678,18 +803,42 @@ fxSetupDoubleTMU_NoLock(fxMesaContext fxMesa, } } + /* [dBorca] Hack alert: + * we put these in reverse order, so that if we can't + * do _REAL_ pointcast, the TMU0 table gets broadcasted + */ if (!fxMesa->haveGlobalPaletteTexture) { - /* [dBorca] - * all TMUs share the same table. - * The next test shouldn't be TMU specific... - */ + /* pointcast */ + if (ti1->info.format == GR_TEXFMT_P_8) { + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s: uploading texture palette for TMU1\n", __FUNCTION__); + } + fxMesa->Glide.grTexDownloadTableExt(ti1->whichTMU, ti1->paltype, &(ti1->palette)); + } if (ti0->info.format == GR_TEXFMT_P_8) { if (TDFX_DEBUG & VERBOSE_DRIVER) { - fprintf(stderr, "%s: uploading texture palette TMU0\n", __FUNCTION__); + fprintf(stderr, "%s: uploading texture palette for TMU0\n", __FUNCTION__); } - grTexDownloadTable(GR_TEXTABLE_PALETTE, &(ti0->palette)); + fxMesa->Glide.grTexDownloadTableExt(ti0->whichTMU, ti0->paltype, &(ti0->palette)); + } + } +#if FX_TC_NCC + /* pointcast */ + if ((ti1->info.format == GR_TEXFMT_AYIQ_8422) || + (ti1->info.format == GR_TEXFMT_YIQ_422)) { + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s: uploading NCC0 table for TMU1\n", __FUNCTION__); } + fxMesa->Glide.grTexDownloadTableExt(ti1->whichTMU, GR_TEXTABLE_NCC0, &(ti1->palette)); } + if ((ti0->info.format == GR_TEXFMT_AYIQ_8422) || + (ti0->info.format == GR_TEXFMT_YIQ_422)) { + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s: uploading NCC0 table for TMU0\n", __FUNCTION__); + } + fxMesa->Glide.grTexDownloadTableExt(ti0->whichTMU, GR_TEXTABLE_NCC0, &(ti0->palette)); + } +#endif grTexSource(tmu0, ti0->tm[tmu0]->startAddr, GR_MIPMAPLEVELMASK_BOTH, &(ti0->info)); @@ -715,6 +864,8 @@ static void fxSetupTextureDoubleTMU_NoLock(GLcontext * ctx) { fxMesaContext fxMesa = FX_CONTEXT(ctx); + struct tdfx_combine alphaComb, colorComb; + struct tdfx_texcombine tex0, tex1; GrCombineLocal_t localc, locala; tfxTexInfo *ti0, *ti1; struct gl_texture_object *tObj0 = ctx->Texture.Unit[0].Current2D; @@ -769,6 +920,16 @@ fxSetupTextureDoubleTMU_NoLock(GLcontext * ctx) tmu1 = 0; } fxMesa->tmuSrc = FX_TMU_BOTH; + + tex0.InvertRGB = FXFALSE; + tex0.InvertAlpha = FXFALSE; + tex1.InvertRGB = FXFALSE; + tex1.InvertAlpha = FXFALSE; + alphaComb.Local = locala; + alphaComb.Invert = FXFALSE; + colorComb.Local = localc; + colorComb.Invert = FXFALSE; + switch (envmode) { case (FX_UM_E0_MODULATE | FX_UM_E1_MODULATE): { @@ -777,120 +938,111 @@ fxSetupTextureDoubleTMU_NoLock(GLcontext * ctx) isalpha[tmu0] = (ti0->baseLevelInternalFormat == GL_ALPHA); isalpha[tmu1] = (ti1->baseLevelInternalFormat == GL_ALPHA); - if (isalpha[FX_TMU1]) - grTexCombine(GR_TMU1, - GR_COMBINE_FUNCTION_ZERO, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, FXTRUE, FXFALSE); - else - grTexCombine(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE); - - if (isalpha[FX_TMU0]) - grTexCombine(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, FXFALSE, FXFALSE); - else - grTexCombine(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, FXFALSE, FXFALSE); - - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - localc, GR_COMBINE_OTHER_TEXTURE, FXFALSE); - - grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - locala, GR_COMBINE_OTHER_TEXTURE, FXFALSE); + if (isalpha[FX_TMU1]) { + tex1.FunctionRGB = GR_COMBINE_FUNCTION_ZERO; + tex1.FactorRGB = GR_COMBINE_FACTOR_NONE; + tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE; + tex1.InvertRGB = FXTRUE; + } else { + tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorRGB = GR_COMBINE_FACTOR_NONE; + tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE; + } + + if (isalpha[FX_TMU0]) { + tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER; + tex0.FactorRGB = GR_COMBINE_FACTOR_ONE; + tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER; + tex0.FactorAlpha = GR_COMBINE_FACTOR_LOCAL; + } else { + tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER; + tex0.FactorRGB = GR_COMBINE_FACTOR_LOCAL; + tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER; + tex0.FactorAlpha = GR_COMBINE_FACTOR_LOCAL; + } + + colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER; + colorComb.Factor = GR_COMBINE_FACTOR_LOCAL; + colorComb.Other = GR_COMBINE_OTHER_TEXTURE; + + alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER; + alphaComb.Factor = GR_COMBINE_FACTOR_LOCAL; + alphaComb.Other = GR_COMBINE_OTHER_TEXTURE; break; } case (FX_UM_E0_REPLACE | FX_UM_E1_BLEND): /* Only for GLQuake */ if (tmu1 == FX_TMU1) { - grTexCombine(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, FXTRUE, FXFALSE); - - grTexCombine(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, FXFALSE, FXFALSE); + tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorRGB = GR_COMBINE_FACTOR_NONE; + tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE; + tex1.InvertRGB = FXTRUE; + + tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER; + tex0.FactorRGB = GR_COMBINE_FACTOR_LOCAL; + tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER; + tex0.FactorAlpha = GR_COMBINE_FACTOR_LOCAL; } else { - grTexCombine(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE); - - grTexCombine(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_ONE_MINUS_LOCAL, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_ONE_MINUS_LOCAL, - FXFALSE, FXFALSE); + tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorRGB = GR_COMBINE_FACTOR_NONE; + tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE; + + tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER; + tex0.FactorRGB = GR_COMBINE_FACTOR_ONE_MINUS_LOCAL; + tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER; + tex0.FactorAlpha = GR_COMBINE_FACTOR_ONE_MINUS_LOCAL; } - grAlphaCombine(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - locala, GR_COMBINE_OTHER_NONE, FXFALSE); + alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL; + alphaComb.Factor = GR_COMBINE_FACTOR_NONE; + alphaComb.Other = GR_COMBINE_OTHER_NONE; - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - localc, GR_COMBINE_OTHER_TEXTURE, FXFALSE); + colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER; + colorComb.Factor = GR_COMBINE_FACTOR_ONE; + colorComb.Other = GR_COMBINE_OTHER_TEXTURE; break; case (FX_UM_E0_REPLACE | FX_UM_E1_MODULATE): /* Quake 2 and 3 */ if (tmu1 == FX_TMU1) { - grTexCombine(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_ZERO, - GR_COMBINE_FACTOR_NONE, FXFALSE, FXTRUE); - - grTexCombine(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, FXFALSE, FXFALSE); - + tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorRGB = GR_COMBINE_FACTOR_NONE; + tex1.FunctionAlpha = GR_COMBINE_FUNCTION_ZERO; + tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE; + tex1.InvertAlpha = FXTRUE; + + tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER; + tex0.FactorRGB = GR_COMBINE_FACTOR_LOCAL; + tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER; + tex0.FactorAlpha = GR_COMBINE_FACTOR_LOCAL; } else { - grTexCombine(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE); - - grTexCombine(GR_TMU0, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_LOCAL, - GR_COMBINE_FUNCTION_BLEND_OTHER, - GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE); + tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorRGB = GR_COMBINE_FACTOR_NONE; + tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE; + + tex0.FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER; + tex0.FactorRGB = GR_COMBINE_FACTOR_LOCAL; + tex0.FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER; + tex0.FactorAlpha = GR_COMBINE_FACTOR_ONE; } - if (ti0->baseLevelInternalFormat == GL_RGB) - grAlphaCombine(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - locala, GR_COMBINE_OTHER_NONE, FXFALSE); - else - grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - locala, GR_COMBINE_OTHER_NONE, FXFALSE); - + if (ti0->baseLevelInternalFormat == GL_RGB) { + alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL; + alphaComb.Factor = GR_COMBINE_FACTOR_NONE; + alphaComb.Other = GR_COMBINE_OTHER_NONE; + } else { + alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER; + alphaComb.Factor = GR_COMBINE_FACTOR_ONE; + alphaComb.Other = GR_COMBINE_OTHER_NONE; + } - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - localc, GR_COMBINE_OTHER_TEXTURE, FXFALSE); + colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER; + colorComb.Factor = GR_COMBINE_FACTOR_ONE; + colorComb.Other = GR_COMBINE_OTHER_TEXTURE; break; @@ -901,45 +1053,69 @@ fxSetupTextureDoubleTMU_NoLock(GLcontext * ctx) isalpha[tmu0] = (ti0->baseLevelInternalFormat == GL_ALPHA); isalpha[tmu1] = (ti1->baseLevelInternalFormat == GL_ALPHA); - if (isalpha[FX_TMU1]) - grTexCombine(GR_TMU1, - GR_COMBINE_FUNCTION_ZERO, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, FXTRUE, FXFALSE); - else - grTexCombine(GR_TMU1, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, FXFALSE, FXFALSE); - - if (isalpha[FX_TMU0]) - grTexCombine(GR_TMU0, - GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, - GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE); - else - grTexCombine(GR_TMU0, - GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, - GR_COMBINE_FACTOR_ONE, - GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL, - GR_COMBINE_FACTOR_ONE, FXFALSE, FXFALSE); - - grColorCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - localc, GR_COMBINE_OTHER_TEXTURE, FXFALSE); - - grAlphaCombine(GR_COMBINE_FUNCTION_SCALE_OTHER, - GR_COMBINE_FACTOR_LOCAL, - locala, GR_COMBINE_OTHER_TEXTURE, FXFALSE); + if (isalpha[FX_TMU1]) { + tex1.FunctionRGB = GR_COMBINE_FUNCTION_ZERO; + tex1.FactorRGB = GR_COMBINE_FACTOR_NONE; + tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE; + tex1.InvertRGB = FXTRUE; + } else { + tex1.FunctionRGB = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorRGB = GR_COMBINE_FACTOR_NONE; + tex1.FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL; + tex1.FactorAlpha = GR_COMBINE_FACTOR_NONE; + } + + if (isalpha[FX_TMU0]) { + tex0.FunctionRGB = GR_COMBINE_FUNCTION_SCALE_OTHER; + tex0.FactorRGB = GR_COMBINE_FACTOR_ONE; + tex0.FunctionAlpha = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL; + tex0.FactorAlpha = GR_COMBINE_FACTOR_ONE; + } else { + tex0.FunctionRGB = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL; + tex0.FactorRGB = GR_COMBINE_FACTOR_ONE; + tex0.FunctionAlpha = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL; + tex0.FactorAlpha = GR_COMBINE_FACTOR_ONE; + } + + colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER; + colorComb.Factor = GR_COMBINE_FACTOR_LOCAL; + colorComb.Other = GR_COMBINE_OTHER_TEXTURE; + + alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER; + alphaComb.Factor = GR_COMBINE_FACTOR_LOCAL; + alphaComb.Other = GR_COMBINE_OTHER_TEXTURE; break; } default: fprintf(stderr, "%s: Unexpected dual texture mode encountered\n", __FUNCTION__); - break; + return; } + + grAlphaCombine(alphaComb.Function, + alphaComb.Factor, + alphaComb.Local, + alphaComb.Other, + alphaComb.Invert); + grColorCombine(colorComb.Function, + colorComb.Factor, + colorComb.Local, + colorComb.Other, + colorComb.Invert); + grTexCombine(GR_TMU0, + tex0.FunctionRGB, + tex0.FactorRGB, + tex0.FunctionAlpha, + tex0.FactorAlpha, + tex0.InvertRGB, + tex0.InvertAlpha); + grTexCombine(GR_TMU1, + tex1.FunctionRGB, + tex1.FactorRGB, + tex1.FunctionAlpha, + tex1.FactorAlpha, + tex1.InvertRGB, + tex1.InvertAlpha); } /************************* No Texture ***************************/ @@ -967,16 +1143,22 @@ fxSetupTextureNone_NoLock(GLcontext * ctx) localc = GR_COMBINE_LOCAL_CONSTANT; grAlphaCombine(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - locala, GR_COMBINE_OTHER_NONE, FXFALSE); + GR_COMBINE_FACTOR_NONE, + locala, + GR_COMBINE_OTHER_NONE, + FXFALSE); grColorCombine(GR_COMBINE_FUNCTION_LOCAL, - GR_COMBINE_FACTOR_NONE, - localc, GR_COMBINE_OTHER_NONE, FXFALSE); + GR_COMBINE_FACTOR_NONE, + localc, + GR_COMBINE_OTHER_NONE, + FXFALSE); fxMesa->lastUnitsMode = FX_UM_NONE; } +#include "fxsetup.h" + /************************************************************************/ /************************** Texture Mode SetUp **************************/ /************************************************************************/ @@ -990,20 +1172,38 @@ fxSetupTexture_NoLock(GLcontext * ctx) fprintf(stderr, "%s(...)\n", __FUNCTION__); } - /* Texture Combine, Color Combine and Alpha Combine. */ - if (ctx->Texture.Unit[0]._ReallyEnabled == TEXTURE_2D_BIT && - ctx->Texture.Unit[1]._ReallyEnabled == TEXTURE_2D_BIT && - fxMesa->haveTwoTMUs) { - fxSetupTextureDoubleTMU_NoLock(ctx); - } - else if (ctx->Texture.Unit[0]._ReallyEnabled == TEXTURE_2D_BIT) { - fxSetupTextureSingleTMU_NoLock(ctx, 0); - } - else if (ctx->Texture.Unit[1]._ReallyEnabled == TEXTURE_2D_BIT) { - fxSetupTextureSingleTMU_NoLock(ctx, 1); - } - else { - fxSetupTextureNone_NoLock(ctx); + if (fxMesa->HaveCmbExt) { + /* Texture Combine, Color Combine and Alpha Combine. */ + if (ctx->Texture.Unit[0]._ReallyEnabled == TEXTURE_2D_BIT && + ctx->Texture.Unit[1]._ReallyEnabled == TEXTURE_2D_BIT && + fxMesa->haveTwoTMUs) { + fxSetupTextureDoubleTMUNapalm_NoLock(ctx); + } + else if (ctx->Texture.Unit[0]._ReallyEnabled == TEXTURE_2D_BIT) { + fxSetupTextureSingleTMUNapalm_NoLock(ctx, 0); + } + else if (ctx->Texture.Unit[1]._ReallyEnabled == TEXTURE_2D_BIT) { + fxSetupTextureSingleTMUNapalm_NoLock(ctx, 1); + } + else { + fxSetupTextureNoneNapalm_NoLock(ctx); + } + } else { + /* Texture Combine, Color Combine and Alpha Combine. */ + if (ctx->Texture.Unit[0]._ReallyEnabled == TEXTURE_2D_BIT && + ctx->Texture.Unit[1]._ReallyEnabled == TEXTURE_2D_BIT && + fxMesa->haveTwoTMUs) { + fxSetupTextureDoubleTMU_NoLock(ctx); + } + else if (ctx->Texture.Unit[0]._ReallyEnabled == TEXTURE_2D_BIT) { + fxSetupTextureSingleTMU_NoLock(ctx, 0); + } + else if (ctx->Texture.Unit[1]._ReallyEnabled == TEXTURE_2D_BIT) { + fxSetupTextureSingleTMU_NoLock(ctx, 1); + } + else { + fxSetupTextureNone_NoLock(ctx); + } } } @@ -1019,117 +1219,211 @@ fxSetupTexture(GLcontext * ctx) /**************************** Blend SetUp *******************************/ /************************************************************************/ -/* XXX consider supporting GL_INGR_blend_func_separate */ void -fxDDBlendFunc(GLcontext * ctx, GLenum sfactor, GLenum dfactor) +fxDDBlendFuncSeparate(GLcontext * ctx, GLenum sfactor, GLenum dfactor, GLenum asfactor, GLenum adfactor) { fxMesaContext fxMesa = FX_CONTEXT(ctx); tfxUnitsState *us = &fxMesa->unitsState; + GLboolean have32bpp = (fxMesa->colDepth == 32); + GLboolean haveAlpha = fxMesa->haveHwAlpha; GrAlphaBlendFnc_t sfact, dfact, asfact, adfact; - /* From the Glide documentation: - For alpha source and destination blend function factor - parameters, Voodoo Graphics supports only - GR_BLEND_ZERO and GR_BLEND_ONE. + /* [dBorca] Hack alert: + * We should condition *DST_ALPHA* modes + * by the boolean `haveAlpha' above! + * It indicates whether we really have HW alpha buffer... */ +/* +When the value A_COLOR is selected as the destination alpha blending factor, +the source pixel color is used as the destination blending factor. When the +value A_COLOR is selected as the source alpha blending factor, the destination +pixel color is used as the source blending factor. When the value A_SAMECOLOR +is selected as the destination alpha blending factor, the destination pixel +color is used as the destination blending factor. When the value A_SAMECOLOR +is selected as the source alpha blending factor, the source pixel color is +used as the source blending factor. Note also that the alpha blending +function 0xf (A_COLORBEFOREFOG/ASATURATE) is different depending upon whether +it is being used as a source or destination alpha blending function. When the +value 0xf is selected as the destination alpha blending factor, the source +color before the fog unit ("unfogged" color) is used as the destination +blending factor -- this alpha blending function is useful for multi-pass +rendering with atmospheric effects. When the value 0xf is selected as the +source alpha blending factor, the alpha-saturate anti-aliasing algorithm is +selected -- this MIN function performs polygonal anti-aliasing for polygons +which are drawn front-to-back. + +15/16 BPP alpha channel alpha blending modes + 0x0 AZERO Zero + 0x4 AONE One + +32 BPP alpha channel alpha blending modes + 0x0 AZERO Zero + 0x1 ASRC_ALPHA Source alpha + 0x3 ADST_ALPHA Destination alpha + 0x4 AONE One + 0x5 AOMSRC_ALPHA 1 - Source alpha + 0x7 AOMDST_ALPHA 1 - Destination alpha +*/ + switch (sfactor) { case GL_ZERO: - asfact = sfact = GR_BLEND_ZERO; + sfact = GR_BLEND_ZERO; break; case GL_ONE: - asfact = sfact = GR_BLEND_ONE; + sfact = GR_BLEND_ONE; break; case GL_DST_COLOR: sfact = GR_BLEND_DST_COLOR; - asfact = GR_BLEND_ONE; break; case GL_ONE_MINUS_DST_COLOR: sfact = GR_BLEND_ONE_MINUS_DST_COLOR; - asfact = GR_BLEND_ONE; break; case GL_SRC_ALPHA: sfact = GR_BLEND_SRC_ALPHA; - asfact = GR_BLEND_ONE; break; case GL_ONE_MINUS_SRC_ALPHA: sfact = GR_BLEND_ONE_MINUS_SRC_ALPHA; - asfact = GR_BLEND_ONE; break; case GL_DST_ALPHA: sfact = GR_BLEND_DST_ALPHA; - asfact = GR_BLEND_ONE; break; case GL_ONE_MINUS_DST_ALPHA: sfact = GR_BLEND_ONE_MINUS_DST_ALPHA; - asfact = GR_BLEND_ONE; break; case GL_SRC_ALPHA_SATURATE: sfact = GR_BLEND_ALPHA_SATURATE; - asfact = GR_BLEND_ONE; break; case GL_SRC_COLOR: case GL_ONE_MINUS_SRC_COLOR: /* USELESS */ - asfact = sfact = GR_BLEND_ONE; + sfact = GR_BLEND_ONE; break; default: - asfact = sfact = GR_BLEND_ONE; + sfact = GR_BLEND_ONE; break; } - if ((sfact != us->blendSrcFuncRGB) || (asfact != us->blendSrcFuncAlpha)) { - us->blendSrcFuncRGB = sfact; - us->blendSrcFuncAlpha = asfact; - fxMesa->new_state |= FX_NEW_BLEND; + switch (asfactor) { + case GL_ZERO: + asfact = GR_BLEND_ZERO; + break; + case GL_ONE: + asfact = GR_BLEND_ONE; + break; + case GL_DST_COLOR: + asfact = GR_BLEND_ONE/*bad*/; + break; + case GL_ONE_MINUS_DST_COLOR: + asfact = GR_BLEND_ONE/*bad*/; + break; + case GL_SRC_ALPHA: + asfact = have32bpp ? GR_BLEND_SRC_ALPHA : GR_BLEND_ONE/*bad*/; + break; + case GL_ONE_MINUS_SRC_ALPHA: + asfact = have32bpp ? GR_BLEND_ONE_MINUS_SRC_ALPHA : GR_BLEND_ONE/*bad*/; + break; + case GL_DST_ALPHA: + asfact = have32bpp ? GR_BLEND_DST_ALPHA : GR_BLEND_ONE/*bad*/; + break; + case GL_ONE_MINUS_DST_ALPHA: + asfact = have32bpp ? GR_BLEND_ONE_MINUS_DST_ALPHA : GR_BLEND_ONE/*bad*/; + break; + case GL_SRC_ALPHA_SATURATE: + asfact = GR_BLEND_ONE/*bad*/; + break; + case GL_SRC_COLOR: + case GL_ONE_MINUS_SRC_COLOR: + /* USELESS */ + asfact = GR_BLEND_ONE/*bad*/; + break; + default: + asfact = GR_BLEND_ONE/*bad*/; + break; } switch (dfactor) { case GL_ZERO: - adfact = dfact = GR_BLEND_ZERO; + dfact = GR_BLEND_ZERO; break; case GL_ONE: - adfact = dfact = GR_BLEND_ONE; + dfact = GR_BLEND_ONE; break; case GL_SRC_COLOR: dfact = GR_BLEND_SRC_COLOR; - adfact = GR_BLEND_ZERO; break; case GL_ONE_MINUS_SRC_COLOR: dfact = GR_BLEND_ONE_MINUS_SRC_COLOR; - adfact = GR_BLEND_ZERO; break; case GL_SRC_ALPHA: dfact = GR_BLEND_SRC_ALPHA; - adfact = GR_BLEND_ZERO; break; case GL_ONE_MINUS_SRC_ALPHA: dfact = GR_BLEND_ONE_MINUS_SRC_ALPHA; - adfact = GR_BLEND_ZERO; break; case GL_DST_ALPHA: /* dfact=GR_BLEND_DST_ALPHA; */ /* We can't do DST_ALPHA */ dfact = GR_BLEND_ONE; - adfact = GR_BLEND_ZERO; break; case GL_ONE_MINUS_DST_ALPHA: /* dfact=GR_BLEND_ONE_MINUS_DST_ALPHA; */ /* We can't do DST_ALPHA */ dfact = GR_BLEND_ZERO; + break; + case GL_SRC_ALPHA_SATURATE: + case GL_DST_COLOR: + case GL_ONE_MINUS_DST_COLOR: + /* USELESS */ + dfact = GR_BLEND_ZERO; + break; + default: + dfact = GR_BLEND_ZERO; + break; + } + + switch (adfactor) { + case GL_ZERO: adfact = GR_BLEND_ZERO; break; + case GL_ONE: + adfact = GR_BLEND_ONE; + break; + case GL_SRC_COLOR: + adfact = GR_BLEND_ZERO/*bad*/; + break; + case GL_ONE_MINUS_SRC_COLOR: + adfact = GR_BLEND_ZERO/*bad*/; + break; + case GL_SRC_ALPHA: + adfact = have32bpp ? GR_BLEND_SRC_ALPHA : GR_BLEND_ZERO/*bad*/; + break; + case GL_ONE_MINUS_SRC_ALPHA: + adfact = have32bpp ? GR_BLEND_ONE_MINUS_SRC_ALPHA : GR_BLEND_ZERO/*bad*/; + break; + case GL_DST_ALPHA: + adfact = have32bpp ? GR_BLEND_DST_ALPHA : GR_BLEND_ZERO/*bad*/; + break; + case GL_ONE_MINUS_DST_ALPHA: + adfact = have32bpp ? GR_BLEND_ONE_MINUS_DST_ALPHA : GR_BLEND_ZERO/*bad*/; + break; case GL_SRC_ALPHA_SATURATE: case GL_DST_COLOR: case GL_ONE_MINUS_DST_COLOR: /* USELESS */ - adfact = dfact = GR_BLEND_ZERO; + adfact = GR_BLEND_ZERO/*bad*/; break; default: - adfact = dfact = GR_BLEND_ZERO; + adfact = GR_BLEND_ZERO/*bad*/; break; } + if ((sfact != us->blendSrcFuncRGB) || (asfact != us->blendSrcFuncAlpha)) { + us->blendSrcFuncRGB = sfact; + us->blendSrcFuncAlpha = asfact; + fxMesa->new_state |= FX_NEW_BLEND; + } + if ((dfact != us->blendDstFuncRGB) || (adfact != us->blendDstFuncAlpha)) { us->blendDstFuncRGB = dfact; us->blendDstFuncAlpha = adfact; @@ -1137,18 +1431,66 @@ fxDDBlendFunc(GLcontext * ctx, GLenum sfactor, GLenum dfactor) } } +void +fxDDBlendFunc(GLcontext * ctx, GLenum sfactor, GLenum dfactor) +{ + fxDDBlendFuncSeparate(ctx, sfactor, dfactor, sfactor, dfactor); +} + +void +fxDDBlendEquation(GLcontext * ctx, GLenum mode) +{ + fxMesaContext fxMesa = FX_CONTEXT(ctx); + tfxUnitsState *us = &fxMesa->unitsState; + GrAlphaBlendOp_t q; + + switch (mode) { + case GL_FUNC_ADD_EXT: + q = GR_BLEND_OP_ADD; + break; + case GL_FUNC_SUBTRACT_EXT: + q = GR_BLEND_OP_SUB; + break; + case GL_FUNC_REVERSE_SUBTRACT_EXT: + q = GR_BLEND_OP_REVSUB; + break; + default: + return; + } + + if ((q != us->blendEq) && fxMesa->HavePixExt) { + us->blendEq = q; + fxMesa->new_state |= FX_NEW_BLEND; + } +} + static void fxSetupBlend(GLcontext * ctx) { - fxMesaContext fxMesa = FX_CONTEXT(ctx); - tfxUnitsState *us = &fxMesa->unitsState; - - if (us->blendEnabled) - grAlphaBlendFunction(us->blendSrcFuncRGB, us->blendDstFuncRGB, - us->blendSrcFuncAlpha, us->blendDstFuncAlpha); - else - grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO, GR_BLEND_ONE, - GR_BLEND_ZERO); + fxMesaContext fxMesa = FX_CONTEXT(ctx); + tfxUnitsState *us = &fxMesa->unitsState; + + if (fxMesa->HavePixExt) { + if (us->blendEnabled) { + fxMesa->Glide.grAlphaBlendFunctionExt(us->blendSrcFuncRGB, us->blendDstFuncRGB, + us->blendEq, + us->blendSrcFuncAlpha, us->blendDstFuncAlpha, + us->blendEq); + } else { + fxMesa->Glide.grAlphaBlendFunctionExt(GR_BLEND_ONE, GR_BLEND_ZERO, + GR_BLEND_OP_ADD, + GR_BLEND_ONE, GR_BLEND_ZERO, + GR_BLEND_OP_ADD); + } + } else { + if (us->blendEnabled) { + grAlphaBlendFunction(us->blendSrcFuncRGB, us->blendDstFuncRGB, + us->blendSrcFuncAlpha, us->blendDstFuncAlpha); + } else { + grAlphaBlendFunction(GR_BLEND_ONE, GR_BLEND_ZERO, + GR_BLEND_ONE, GR_BLEND_ZERO); + } + } } /************************************************************************/ @@ -1336,25 +1678,6 @@ fxSetupStencil (GLcontext * ctx) /**************************** Color Mask SetUp **************************/ /************************************************************************/ -void fxColorMask (fxMesaContext fxMesa, GLboolean enable) -{ -/* These are used in calls to FX_grColorMask() */ -static const FxBool false4[4] = { FXFALSE, FXFALSE, FXFALSE, FXFALSE }; -static const FxBool true4[4] = { FXTRUE, FXTRUE, FXTRUE, FXTRUE }; - - const FxBool *rgba = enable ? true4 : false4; - - if (fxMesa->colDepth != 16) { - /* 32bpp mode or 15bpp mode */ - fxMesa->Glide.grColorMaskExt(rgba[RCOMP], rgba[GCOMP], - rgba[BCOMP], rgba[ACOMP] && fxMesa->haveHwAlpha); - } - else { - /* 16 bpp mode */ - grColorMask(rgba[RCOMP] || rgba[GCOMP] || rgba[BCOMP], rgba[ACOMP] && fxMesa->haveHwAlpha); - } -} - void fxDDColorMask(GLcontext * ctx, GLboolean r, GLboolean g, GLboolean b, GLboolean a) @@ -1367,16 +1690,24 @@ fxDDColorMask(GLcontext * ctx, (void) a; } -static void +void fxSetupColorMask(GLcontext * ctx) { fxMesaContext fxMesa = FX_CONTEXT(ctx); - if (ctx->Color.DrawBuffer == GL_NONE) { - fxColorMask(fxMesa, GL_FALSE); + if (fxMesa->colDepth != 16) { + /* 32bpp mode or 15bpp mode */ + fxMesa->Glide.grColorMaskExt(ctx->Color.ColorMask[RCOMP], + ctx->Color.ColorMask[GCOMP], + ctx->Color.ColorMask[BCOMP], + ctx->Color.ColorMask[ACOMP] && fxMesa->haveHwAlpha); } else { - fxColorMask(fxMesa, GL_TRUE); + /* 16 bpp mode */ + grColorMask(ctx->Color.ColorMask[RCOMP] | + ctx->Color.ColorMask[GCOMP] | + ctx->Color.ColorMask[BCOMP], + ctx->Color.ColorMask[ACOMP] && fxMesa->haveHwAlpha); } } @@ -1453,30 +1784,34 @@ fxSetScissorValues(GLcontext * ctx) { fxMesaContext fxMesa = FX_CONTEXT(ctx); int xmin, xmax; - int ymin, ymax, check; + int ymin, ymax; if (ctx->Scissor.Enabled) { xmin = ctx->Scissor.X; xmax = ctx->Scissor.X + ctx->Scissor.Width; ymin = ctx->Scissor.Y; ymax = ctx->Scissor.Y + ctx->Scissor.Height; - check = 1; + + if (xmin < 0) + xmin = 0; + if (xmax > fxMesa->width) + xmax = fxMesa->width; + if (ymin < fxMesa->screen_height - fxMesa->height) + ymin = fxMesa->screen_height - fxMesa->height; + if (ymax > fxMesa->screen_height - 0) + ymax = fxMesa->screen_height - 0; } else { xmin = 0; ymin = 0; xmax = fxMesa->width; ymax = fxMesa->height; - check = 0; } - if (xmin < fxMesa->clipMinX) - xmin = fxMesa->clipMinX; - if (xmax > fxMesa->clipMaxX) - xmax = fxMesa->clipMaxX; - if (ymin < fxMesa->screen_height - fxMesa->clipMaxY) - ymin = fxMesa->screen_height - fxMesa->clipMaxY; - if (ymax > fxMesa->screen_height - fxMesa->clipMinY) - ymax = fxMesa->screen_height - fxMesa->clipMinY; + + fxMesa->clipMinX = xmin; + fxMesa->clipMinY = ymin; + fxMesa->clipMaxX = xmax; + fxMesa->clipMaxY = ymax; grClipWindow(xmin, ymin, xmax, ymax); } diff --git a/src/mesa/drivers/glide/fxsetup.h b/src/mesa/drivers/glide/fxsetup.h new file mode 100644 index 00000000000..9f028fb999e --- /dev/null +++ b/src/mesa/drivers/glide/fxsetup.h @@ -0,0 +1,1131 @@ +/* + * Mesa 3-D graphics library + * Version: 4.0 + * + * Copyright (C) 1999-2001 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. + */ + +/* Authors: + * David Bucciarelli + * Brian Paul + * Daryll Strauss + * Keith Whitwell + * Daniel Borca + * Hiroshi Morii + */ + +/* fxsetup.c - 3Dfx VooDoo rendering mode setup functions */ +/* [dBorca] Hack alert: + * this code belongs to fxsetup.c, but I didn't want to clutter + * the original code with Napalm specifics, in order to keep things + * clear -- especially for backward compatibility. I should have + * put it into another .c file, but I didn't want to export so many + * things... + * The point is, Napalm uses a different technique for texture env. + * SST1 Single texturing: + * setup standard grTexCombine + * fiddle with grColorCombine/grAlphaCombine + * SST1 Multi texturing: + * fiddle with grTexCombine/grColorCombine/grAlphaCombine + * Napalm Single texturing: + * setup standard grColorCombineExt/grAlphaCombineExt + * fiddle with grTexColorCombine/grTexAlphaCombine + * Napalm Multi texturing: + * setup standard grColorCombineExt/grAlphaCombineExt + * fiddle with grTexColorCombine/grTexAlphaCombine + */ + +/* + * These macros are used below when handling COMBINE_EXT. + */ +#define TEXENV_OPERAND_INVERTED(operand) \ + (((operand) == GL_ONE_MINUS_SRC_ALPHA) \ + || ((operand) == GL_ONE_MINUS_SRC_COLOR)) +#define TEXENV_OPERAND_ALPHA(operand) \ + (((operand) == GL_SRC_ALPHA) || ((operand) == GL_ONE_MINUS_SRC_ALPHA)) +#define TEXENV_SETUP_ARG_A(param, source, operand, iteratedAlpha) \ + switch (source) { \ + case GL_TEXTURE: \ + param = GR_CMBX_LOCAL_TEXTURE_ALPHA; \ + break; \ + case GL_CONSTANT_EXT: \ + param = GR_CMBX_TMU_CALPHA; \ + break; \ + case GL_PRIMARY_COLOR_EXT: \ + param = GR_CMBX_ITALPHA; \ + break; \ + case GL_PREVIOUS_EXT: \ + param = iteratedAlpha; \ + break; \ + default: \ + /* \ + * This is here just to keep from getting \ + * compiler warnings. \ + */ \ + param = GR_CMBX_ZERO; \ + break; \ + } + +#define TEXENV_SETUP_ARG_RGB(param, source, operand, iteratedColor, iteratedAlpha) \ + if (!TEXENV_OPERAND_ALPHA(operand)) { \ + switch (source) { \ + case GL_TEXTURE: \ + param = GR_CMBX_LOCAL_TEXTURE_RGB; \ + break; \ + case GL_CONSTANT_EXT: \ + param = GR_CMBX_TMU_CCOLOR; \ + break; \ + case GL_PRIMARY_COLOR_EXT: \ + param = GR_CMBX_ITRGB; \ + break; \ + case GL_PREVIOUS_EXT: \ + param = iteratedColor; \ + break; \ + default: \ + /* \ + * This is here just to keep from getting \ + * compiler warnings. \ + */ \ + param = GR_CMBX_ZERO; \ + break; \ + } \ + } else { \ + switch (source) { \ + case GL_TEXTURE: \ + param = GR_CMBX_LOCAL_TEXTURE_ALPHA; \ + break; \ + case GL_CONSTANT_EXT: \ + param = GR_CMBX_TMU_CALPHA; \ + break; \ + case GL_PRIMARY_COLOR_EXT: \ + param = GR_CMBX_ITALPHA; \ + break; \ + case GL_PREVIOUS_EXT: \ + param = iteratedAlpha; \ + break; \ + default: \ + /* \ + * This is here just to keep from getting \ + * compiler warnings. \ + */ \ + param = GR_CMBX_ZERO; \ + break; \ + } \ + } + +#define TEXENV_SETUP_MODE_RGB(param, operand) \ + switch (operand) { \ + case GL_SRC_COLOR: \ + case GL_SRC_ALPHA: \ + param = GR_FUNC_MODE_X; \ + break; \ + case GL_ONE_MINUS_SRC_ALPHA: \ + case GL_ONE_MINUS_SRC_COLOR: \ + param = GR_FUNC_MODE_ONE_MINUS_X; \ + break; \ + default: \ + param = GR_FUNC_MODE_ZERO; \ + break; \ + } + +#define TEXENV_SETUP_MODE_A(param, operand) \ + switch (operand) { \ + case GL_SRC_ALPHA: \ + param = GR_FUNC_MODE_X; \ + break; \ + case GL_ONE_MINUS_SRC_ALPHA: \ + param = GR_FUNC_MODE_ONE_MINUS_X; \ + break; \ + default: \ + param = GR_FUNC_MODE_ZERO; \ + break; \ + } + +static void +fxSetupTextureEnvNapalm_NoLock(GLcontext * ctx, GLuint textureset, GLuint tmu, GLboolean iterated) +{ + fxMesaContext fxMesa = FX_CONTEXT(ctx); + const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[textureset]; + struct tdfx_combine_alpha_ext alphaComb; + struct tdfx_combine_color_ext colorComb; + const GLfloat *envColor = texUnit->EnvColor; + GrCombineLocal_t localc, locala; /* fragmentColor/Alpha */ + GLint ifmt; + tfxTexInfo *ti; + struct gl_texture_object *tObj = texUnit->Current2D; + + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s(...)\n", __FUNCTION__); + } + + ti = fxTMGetTexInfo(tObj); + + ifmt = ti->baseLevelInternalFormat; + + if (iterated) { + /* we don't have upstream TMU */ + locala = GR_CMBX_ITALPHA; + localc = GR_CMBX_ITRGB; + } else { + /* we have upstream TMU */ + locala = GR_CMBX_OTHER_TEXTURE_ALPHA; + localc = GR_CMBX_OTHER_TEXTURE_RGB; + } + + alphaComb.InvertD = FXFALSE; + alphaComb.Shift = 0; + alphaComb.Invert = FXFALSE; + colorComb.InvertD = FXFALSE; + colorComb.Shift = 0; + colorComb.Invert = FXFALSE; + + switch (texUnit->EnvMode) { + case GL_DECAL: + alphaComb.SourceA = locala; + alphaComb.ModeA = GR_FUNC_MODE_X; + alphaComb.SourceB = GR_CMBX_ZERO; + alphaComb.ModeB = GR_FUNC_MODE_X; + alphaComb.SourceC = GR_CMBX_ZERO; + alphaComb.InvertC = FXTRUE; + alphaComb.SourceD = GR_CMBX_ZERO; + + colorComb.SourceA = GR_CMBX_LOCAL_TEXTURE_RGB; + colorComb.ModeA = GR_FUNC_MODE_X; + colorComb.SourceB = localc; + colorComb.ModeB = GR_FUNC_MODE_NEGATIVE_X; + colorComb.SourceC = GR_CMBX_LOCAL_TEXTURE_ALPHA; + colorComb.InvertC = FXFALSE; + colorComb.SourceD = GR_CMBX_B; + break; + case GL_MODULATE: + if (ifmt == GL_LUMINANCE || ifmt == GL_RGB) { + alphaComb.SourceA = locala; + alphaComb.ModeA = GR_FUNC_MODE_X; + alphaComb.SourceB = GR_CMBX_ZERO; + alphaComb.ModeB = GR_FUNC_MODE_X; + alphaComb.SourceC = GR_CMBX_ZERO; + alphaComb.InvertC = FXTRUE; + alphaComb.SourceD = GR_CMBX_ZERO; + } else { + alphaComb.SourceA = locala; + alphaComb.ModeA = GR_FUNC_MODE_X; + alphaComb.SourceB = GR_CMBX_ZERO; + alphaComb.ModeB = GR_FUNC_MODE_X; + alphaComb.SourceC = GR_CMBX_LOCAL_TEXTURE_ALPHA; + alphaComb.InvertC = FXFALSE; + alphaComb.SourceD = GR_CMBX_ZERO; + } + + if (ifmt == GL_ALPHA) { + colorComb.SourceA = localc; + colorComb.ModeA = GR_FUNC_MODE_X; + colorComb.SourceB = GR_CMBX_ZERO; + colorComb.ModeB = GR_FUNC_MODE_X; + colorComb.SourceC = GR_CMBX_ZERO; + colorComb.InvertC = FXTRUE; + colorComb.SourceD = GR_CMBX_ZERO; + } else { + colorComb.SourceA = localc; + colorComb.ModeA = GR_FUNC_MODE_X; + colorComb.SourceB = GR_CMBX_ZERO; + colorComb.ModeB = GR_FUNC_MODE_X; + colorComb.SourceC = GR_CMBX_LOCAL_TEXTURE_RGB; + colorComb.InvertC = FXFALSE; + colorComb.SourceD = GR_CMBX_ZERO; + } + break; + case GL_BLEND: + if (ifmt == GL_INTENSITY) { + alphaComb.SourceA = GR_CMBX_TMU_CALPHA; + alphaComb.ModeA = GR_FUNC_MODE_X; + alphaComb.SourceB = locala; + alphaComb.ModeB = GR_FUNC_MODE_X; + alphaComb.SourceC = GR_CMBX_LOCAL_TEXTURE_ALPHA; + alphaComb.InvertC = FXFALSE; + alphaComb.SourceD = GR_CMBX_ZERO; + } else { + alphaComb.SourceA = locala; + alphaComb.ModeA = GR_FUNC_MODE_X; + alphaComb.SourceB = GR_CMBX_ZERO; + alphaComb.ModeB = GR_FUNC_MODE_X; + alphaComb.SourceC = GR_CMBX_LOCAL_TEXTURE_ALPHA; + alphaComb.InvertC = FXFALSE; + alphaComb.SourceD = GR_CMBX_ZERO; + } + + if (ifmt == GL_ALPHA) { + colorComb.SourceA = localc; + colorComb.ModeA = GR_FUNC_MODE_X; + colorComb.SourceB = GR_CMBX_ZERO; + colorComb.ModeB = GR_FUNC_MODE_X; + colorComb.SourceC = GR_CMBX_ZERO; + colorComb.InvertC = FXTRUE; + colorComb.SourceD = GR_CMBX_ZERO; + } else { + colorComb.SourceA = GR_CMBX_TMU_CCOLOR; + colorComb.ModeA = GR_FUNC_MODE_X; + colorComb.SourceB = localc; + colorComb.ModeB = GR_FUNC_MODE_NEGATIVE_X; + colorComb.SourceC = GR_CMBX_LOCAL_TEXTURE_RGB; + colorComb.InvertC = FXFALSE; + colorComb.SourceD = GR_CMBX_B; + } + + fxMesa->Glide.grConstantColorValueExt(tmu, + ((GLuint)((envColor[0] * 255.0f)) ) | + ((GLuint)((envColor[1] * 255.0f)) << 8) | + ((GLuint)((envColor[2] * 255.0f)) << 16) | + ((GLuint)((envColor[3] * 255.0f)) << 24)); + break; + case GL_REPLACE: + if (ifmt == GL_LUMINANCE || ifmt == GL_RGB) { + alphaComb.SourceA = locala; + alphaComb.ModeA = GR_FUNC_MODE_X; + alphaComb.SourceB = GR_CMBX_ZERO; + alphaComb.ModeB = GR_FUNC_MODE_X; + alphaComb.SourceC = GR_CMBX_ZERO; + alphaComb.InvertC = FXTRUE; + alphaComb.SourceD = GR_CMBX_ZERO; + } else { + alphaComb.SourceA = GR_CMBX_LOCAL_TEXTURE_ALPHA; + alphaComb.ModeA = GR_FUNC_MODE_X; + alphaComb.SourceB = GR_CMBX_ZERO; + alphaComb.ModeB = GR_FUNC_MODE_X; + alphaComb.SourceC = GR_CMBX_ZERO; + alphaComb.InvertC = FXTRUE; + alphaComb.SourceD = GR_CMBX_ZERO; + } + + if (ifmt == GL_ALPHA) { + colorComb.SourceA = localc; + colorComb.ModeA = GR_FUNC_MODE_X; + colorComb.SourceB = GR_CMBX_ZERO; + colorComb.ModeB = GR_FUNC_MODE_X; + colorComb.SourceC = GR_CMBX_ZERO; + colorComb.InvertC = FXTRUE; + colorComb.SourceD = GR_CMBX_ZERO; + } else { + colorComb.SourceA = GR_CMBX_LOCAL_TEXTURE_RGB; + colorComb.ModeA = GR_FUNC_MODE_X; + colorComb.SourceB = GR_CMBX_ZERO; + colorComb.ModeB = GR_FUNC_MODE_X; + colorComb.SourceC = GR_CMBX_ZERO; + colorComb.InvertC = FXTRUE; + colorComb.SourceD = GR_CMBX_ZERO; + } + break; + case GL_ADD: + if (ifmt == GL_LUMINANCE || ifmt == GL_RGB) { + alphaComb.SourceA = locala; + alphaComb.ModeA = GR_FUNC_MODE_X; + alphaComb.SourceB = GR_CMBX_ZERO; + alphaComb.ModeB = GR_FUNC_MODE_X; + alphaComb.SourceC = GR_CMBX_ZERO; + alphaComb.InvertC = FXTRUE; + alphaComb.SourceD = GR_CMBX_ZERO; + } else if (ifmt == GL_INTENSITY) { + alphaComb.SourceA = locala; + alphaComb.ModeA = GR_FUNC_MODE_X; + alphaComb.SourceB = GR_CMBX_LOCAL_TEXTURE_ALPHA; + alphaComb.ModeB = GR_FUNC_MODE_X; + alphaComb.SourceC = GR_CMBX_ZERO; + alphaComb.InvertC = FXTRUE; + alphaComb.SourceD = GR_CMBX_ZERO; + } else { + alphaComb.SourceA = locala; + alphaComb.ModeA = GR_FUNC_MODE_X; + alphaComb.SourceB = GR_CMBX_ZERO; + alphaComb.ModeB = GR_FUNC_MODE_X; + alphaComb.SourceC = GR_CMBX_LOCAL_TEXTURE_ALPHA; + alphaComb.InvertC = FXFALSE; + alphaComb.SourceD = GR_CMBX_ZERO; + } + + if (ifmt == GL_ALPHA) { + colorComb.SourceA = localc; + colorComb.ModeA = GR_FUNC_MODE_X; + colorComb.SourceB = GR_CMBX_ZERO; + colorComb.ModeB = GR_FUNC_MODE_X; + colorComb.SourceC = GR_CMBX_ZERO; + colorComb.InvertC = FXTRUE; + colorComb.SourceD = GR_CMBX_ZERO; + } else { + colorComb.SourceA = localc; + colorComb.ModeA = GR_FUNC_MODE_X; + colorComb.SourceB = GR_CMBX_LOCAL_TEXTURE_RGB; + colorComb.ModeB = GR_FUNC_MODE_X; + colorComb.SourceC = GR_CMBX_ZERO; + colorComb.InvertC = FXTRUE; + colorComb.SourceD = GR_CMBX_ZERO; + } + break; + /* COMBINE_EXT */ + case GL_COMBINE_EXT: + /* [dBorca] Hack alert: + * INCOMPLETE!!! + */ + if (TDFX_DEBUG & (VERBOSE_DRIVER | VERBOSE_TEXTURE)) { + fprintf(stderr, "COMBINE_EXT: %s + %s\n", + _mesa_lookup_enum_by_nr(texUnit->CombineModeRGB), + _mesa_lookup_enum_by_nr(texUnit->CombineModeA)); + } + + alphaComb.Shift = texUnit->CombineScaleShiftA; + colorComb.Shift = texUnit->CombineScaleShiftRGB; + + switch (texUnit->CombineModeRGB) { + case GL_MODULATE: + /* Arg0 * Arg1 == (A + 0) * C + 0 */ + TEXENV_SETUP_ARG_RGB(colorComb.SourceA, + texUnit->CombineSourceRGB[0], + texUnit->CombineOperandRGB[0], + localc, locala); + TEXENV_SETUP_MODE_RGB(colorComb.ModeA, + texUnit->CombineOperandRGB[0]); + colorComb.SourceB = GR_CMBX_ZERO; + colorComb.ModeB = GR_FUNC_MODE_ZERO; + TEXENV_SETUP_ARG_RGB(colorComb.SourceC, + texUnit->CombineSourceRGB[1], + texUnit->CombineOperandRGB[1], + localc, locala); + colorComb.InvertC = TEXENV_OPERAND_INVERTED( + texUnit->CombineOperandRGB[1]); + colorComb.SourceD = GR_CMBX_ZERO; + break; + default: + fprintf(stderr, "COMBINE_EXT_color: %s\n", + _mesa_lookup_enum_by_nr(texUnit->CombineModeRGB)); + } + + switch (texUnit->CombineModeA) { + case GL_MODULATE: + /* Arg0 * Arg1 == (A + 0) * C + 0 */ + TEXENV_SETUP_ARG_A(alphaComb.SourceA, + texUnit->CombineSourceA[0], + texUnit->CombineOperandA[0], + locala); + TEXENV_SETUP_MODE_A(alphaComb.ModeA, + texUnit->CombineOperandA[0]); + alphaComb.SourceB = GR_CMBX_ZERO; + alphaComb.ModeB = GR_FUNC_MODE_ZERO; + TEXENV_SETUP_ARG_A(alphaComb.SourceC, + texUnit->CombineSourceA[1], + texUnit->CombineOperandA[1], + locala); + alphaComb.InvertC = TEXENV_OPERAND_INVERTED( + texUnit->CombineOperandA[1]); + alphaComb.SourceD = GR_CMBX_ZERO; + break; + default: + fprintf(stderr, "COMBINE_EXT_alpha: %s\n", + _mesa_lookup_enum_by_nr(texUnit->CombineModeA)); + } + + fxMesa->Glide.grConstantColorValueExt(tmu, + ((GLuint)((envColor[0] * 255.0f)) ) | + ((GLuint)((envColor[1] * 255.0f)) << 8) | + ((GLuint)((envColor[2] * 255.0f)) << 16) | + ((GLuint)((envColor[3] * 255.0f)) << 24)); + break; +#if 0 + { + FxU32 A_RGB, B_RGB, C_RGB, D_RGB; + FxU32 Amode_RGB, Bmode_RGB; + FxBool Cinv_RGB, Dinv_RGB, Ginv_RGB; + FxU32 Shift_RGB; + FxU32 A_A, B_A, C_A, D_A; + FxU32 Amode_A, Bmode_A; + FxBool Cinv_A, Dinv_A, Ginv_A; + FxU32 Shift_A; + + /* + * + * In the formulas below, we write: + * o "1(x)" for the identity function applied to x, + * so 1(x) = x. + * o "0(x)" for the constant function 0, so + * 0(x) = 0 for all values of x. + * + * Calculate the color combination. + */ + Shift_RGB = texUnit->CombineScaleShiftRGB; + Shift_A = texUnit->CombineScaleShiftA; + switch (texUnit->CombineModeRGB) { + case GL_REPLACE: + /* + * The formula is: Arg0 + * We implement this by the formula: + * (Arg0 + 0(0))*(1-0) + 0 + */ + TEXENV_SETUP_ARG_RGB(A_RGB, + texUnit->CombineSourceRGB[0], + texUnit->CombineOperandRGB[0], + incomingRGB, incomingAlpha); + TEXENV_SETUP_MODE_RGB(Amode_RGB, + texUnit->CombineOperandRGB[0]); + B_RGB = C_RGB = D_RGB = GR_CMBX_ZERO; + Bmode_RGB = GR_FUNC_MODE_ZERO; + Cinv_RGB = FXTRUE; + Dinv_RGB = Ginv_RGB = FXFALSE; + break; + case GL_MODULATE: + /* + * The formula is: Arg0 * Arg1 + * + * We implement this by the formula + * (Arg0 + 0(0)) * Arg1 + 0(0) + */ + TEXENV_SETUP_ARG_RGB(A_RGB, + texUnit->CombineSourceRGB[0], + texUnit->CombineOperandRGB[0], + incomingRGB, incomingAlpha); + TEXENV_SETUP_MODE_RGB(Amode_RGB, + texUnit->CombineOperandRGB[0]); + B_RGB = GR_CMBX_ZERO; + Bmode_RGB = GR_CMBX_ZERO; + TEXENV_SETUP_ARG_RGB(C_RGB, + texUnit->CombineSourceRGB[1], + texUnit->CombineOperandRGB[1], + incomingRGB, incomingAlpha); + Cinv_RGB = TEXENV_OPERAND_INVERTED + (texUnit->CombineOperandRGB[1]); + D_RGB = GR_CMBX_ZERO; + Dinv_RGB = Ginv_RGB = FXFALSE; + break; + case GL_ADD: + /* + * The formula is Arg0 + Arg1 + */ + TEXENV_SETUP_ARG_RGB(A_RGB, + texUnit->CombineSourceRGB[0], + texUnit->CombineOperandRGB[0], + incomingRGB, incomingAlpha); + TEXENV_SETUP_MODE_RGB(Amode_RGB, + texUnit->CombineOperandRGB[0]); + TEXENV_SETUP_ARG_RGB(B_RGB, + texUnit->CombineSourceRGB[1], + texUnit->CombineOperandRGB[1], + incomingRGB, incomingAlpha); + TEXENV_SETUP_MODE_RGB(Bmode_RGB, + texUnit->CombineOperandRGB[1]); + C_RGB = D_RGB = GR_CMBX_ZERO; + Cinv_RGB = FXTRUE; + Dinv_RGB = Ginv_RGB = FXFALSE; + break; + case GL_ADD_SIGNED_EXT: + /* + * The formula is: Arg0 + Arg1 - 0.5. + * We compute this by calculating: + * (Arg0 - 1/2) + Arg1 if op0 is SRC_{COLOR,ALPHA} + * Arg0 + (Arg1 - 1/2) if op1 is SRC_{COLOR,ALPHA} + * If both op0 and op1 are ONE_MINUS_SRC_{COLOR,ALPHA} + * we cannot implement the formula properly. + */ + TEXENV_SETUP_ARG_RGB(A_RGB, + texUnit->CombineSourceRGB[0], + texUnit->CombineOperandRGB[0], + incomingRGB, incomingAlpha); + TEXENV_SETUP_ARG_RGB(B_RGB, + texUnit->CombineSourceRGB[1], + texUnit->CombineOperandRGB[1], + incomingRGB, incomingAlpha); + if (!TEXENV_OPERAND_INVERTED(texUnit->CombineOperandRGB[0])) { + /* + * A is not inverted. So, choose it. + */ + Amode_RGB = GR_FUNC_MODE_X_MINUS_HALF; + if (!TEXENV_OPERAND_INVERTED + (texUnit->CombineOperandRGB[1])) { + Bmode_RGB = GR_FUNC_MODE_X; + } + else { + Bmode_RGB = GR_FUNC_MODE_ONE_MINUS_X; + } + } + else { + /* + * A is inverted, so try to subtract 1/2 + * from B. + */ + Amode_RGB = GR_FUNC_MODE_ONE_MINUS_X; + if (!TEXENV_OPERAND_INVERTED + (texUnit->CombineOperandRGB[1])) { + Bmode_RGB = GR_FUNC_MODE_X_MINUS_HALF; + } + else { + /* + * Both are inverted. This is the case + * we cannot handle properly. We just + * choose to not add the - 1/2. + */ + Bmode_RGB = GR_FUNC_MODE_ONE_MINUS_X; + return GL_FALSE; + } + } + C_RGB = D_RGB = GR_CMBX_ZERO; + Cinv_RGB = FXTRUE; + Dinv_RGB = Ginv_RGB = FXFALSE; + break; + case GL_INTERPOLATE_EXT: + /* + * The formula is: Arg0 * Arg2 + Arg1 * (1 - Arg2). + * We compute this by the formula: + * (Arg0 - Arg1) * Arg2 + Arg1 + * == Arg0 * Arg2 - Arg1 * Arg2 + Arg1 + * == Arg0 * Arg2 + Arg1 * (1 - Arg2) + * However, if both Arg1 is ONE_MINUS_X, the HW does + * not support it properly. + */ + TEXENV_SETUP_ARG_RGB(A_RGB, + texUnit->CombineSourceRGB[0], + texUnit->CombineOperandRGB[0], + incomingRGB, incomingAlpha); + TEXENV_SETUP_MODE_RGB(Amode_RGB, + texUnit->CombineOperandRGB[0]); + TEXENV_SETUP_ARG_RGB(B_RGB, + texUnit->CombineSourceRGB[1], + texUnit->CombineOperandRGB[1], + incomingRGB, incomingAlpha); + if (TEXENV_OPERAND_INVERTED(texUnit->CombineOperandRGB[1])) { + /* + * This case is wrong. + */ + Bmode_RGB = GR_FUNC_MODE_NEGATIVE_X; + return GL_FALSE; + } + else { + Bmode_RGB = GR_FUNC_MODE_NEGATIVE_X; + } + /* + * The Source/Operand for the C value must + * specify some kind of alpha value. + */ + TEXENV_SETUP_ARG_A(C_RGB, + texUnit->CombineSourceRGB[2], + texUnit->CombineOperandRGB[2], + incomingAlpha); + Cinv_RGB = FXFALSE; + D_RGB = GR_CMBX_B; + Dinv_RGB = Ginv_RGB = FXFALSE; + break; + default: + /* + * This is here mostly to keep from getting + * a compiler warning about these not being set. + * However, this should set all the texture values + * to zero. + */ + A_RGB = B_RGB = C_RGB = D_RGB = GR_CMBX_ZERO; + Amode_RGB = Bmode_RGB = GR_FUNC_MODE_X; + Cinv_RGB = Dinv_RGB = Ginv_RGB = FXFALSE; + break; + } + /* + * Calculate the alpha combination. + */ + switch (texUnit->CombineModeA) { + case GL_REPLACE: + /* + * The formula is: Arg0 + * We implement this by the formula: + * (Arg0 + 0(0))*(1-0) + 0 + */ + TEXENV_SETUP_ARG_A(A_A, + texUnit->CombineSourceA[0], + texUnit->CombineOperandA[0], + incomingAlpha); + TEXENV_SETUP_MODE_A(Amode_A, + texUnit->CombineOperandA[0]); + B_A = GR_CMBX_ITALPHA; + Bmode_A = GR_FUNC_MODE_ZERO; + C_A = D_A = GR_CMBX_ZERO; + Cinv_A = FXTRUE; + Dinv_A = Ginv_A = FXFALSE; + break; + case GL_MODULATE: + /* + * The formula is: Arg0 * Arg1 + * + * We implement this by the formula + * (Arg0 + 0(0)) * Arg1 + 0(0) + */ + TEXENV_SETUP_ARG_A(A_A, + texUnit->CombineSourceA[0], + texUnit->CombineOperandA[0], + incomingAlpha); + TEXENV_SETUP_MODE_A(Amode_A, + texUnit->CombineOperandA[0]); + B_A = GR_CMBX_ZERO; + Bmode_A = GR_CMBX_ZERO; + TEXENV_SETUP_ARG_A(C_A, + texUnit->CombineSourceA[1], + texUnit->CombineOperandA[1], + incomingAlpha); + Cinv_A = TEXENV_OPERAND_INVERTED + (texUnit->CombineOperandA[1]); + D_A = GR_CMBX_ZERO; + Dinv_A = Ginv_A = FXFALSE; + break; + case GL_ADD: + /* + * The formula is Arg0 + Arg1 + */ + TEXENV_SETUP_ARG_A(A_A, + texUnit->CombineSourceA[0], + texUnit->CombineOperandA[0], + incomingAlpha); + TEXENV_SETUP_MODE_A(Amode_A, + texUnit->CombineOperandA[0]); + TEXENV_SETUP_ARG_A(B_A, + texUnit->CombineSourceA[1], + texUnit->CombineOperandA[1], + incomingAlpha); + TEXENV_SETUP_MODE_A(Bmode_A, + texUnit->CombineOperandA[1]); + C_A = D_A = GR_CMBX_ZERO; + Cinv_A = FXTRUE; + Dinv_A = Ginv_A = FXFALSE; + break; + case GL_ADD_SIGNED_EXT: + /* + * The formula is: Arg0 + Arg1 - 0.5. + * We compute this by calculating: + * (Arg0 - 1/2) + Arg1 if op0 is SRC_{COLOR,ALPHA} + * Arg0 + (Arg1 - 1/2) if op1 is SRC_{COLOR,ALPHA} + * If both op0 and op1 are ONE_MINUS_SRC_{COLOR,ALPHA} + * we cannot implement the formula properly. + */ + TEXENV_SETUP_ARG_A(A_A, + texUnit->CombineSourceA[0], + texUnit->CombineOperandA[0], + incomingAlpha); + TEXENV_SETUP_ARG_A(B_A, + texUnit->CombineSourceA[1], + texUnit->CombineOperandA[1], + incomingAlpha); + if (!TEXENV_OPERAND_INVERTED(texUnit->CombineOperandA[0])) { + /* + * A is not inverted. So, choose it. + */ + Amode_A = GR_FUNC_MODE_X_MINUS_HALF; + if (!TEXENV_OPERAND_INVERTED + (texUnit->CombineOperandA[1])) { + Bmode_A = GR_FUNC_MODE_X; + } else { + Bmode_A = GR_FUNC_MODE_ONE_MINUS_X; + } + } else { + /* + * A is inverted, so try to subtract 1/2 + * from B. + */ + Amode_A = GR_FUNC_MODE_ONE_MINUS_X; + if (!TEXENV_OPERAND_INVERTED + (texUnit->CombineOperandA[1])) { + Bmode_A = GR_FUNC_MODE_X_MINUS_HALF; + } else { + /* + * Both are inverted. This is the case + * we cannot handle properly. We just + * choose to not add the - 1/2. + */ + Bmode_A = GR_FUNC_MODE_ONE_MINUS_X; + return GL_FALSE; + } + } + C_A = D_A = GR_CMBX_ZERO; + Cinv_A = FXTRUE; + Dinv_A = Ginv_A = FXFALSE; + break; + case GL_INTERPOLATE_EXT: + /* + * The formula is: Arg0 * Arg2 + Arg1 * (1 - Arg2). + * We compute this by the formula: + * (Arg0 - Arg1) * Arg2 + Arg1 + * == Arg0 * Arg2 - Arg1 * Arg2 + Arg1 + * == Arg0 * Arg2 + Arg1 * (1 - Arg2) + * However, if both Arg1 is ONE_MINUS_X, the HW does + * not support it properly. + */ + TEXENV_SETUP_ARG_A(A_A, + texUnit->CombineSourceA[0], + texUnit->CombineOperandA[0], + incomingAlpha); + TEXENV_SETUP_MODE_A(Amode_A, + texUnit->CombineOperandA[0]); + TEXENV_SETUP_ARG_A(B_A, + texUnit->CombineSourceA[1], + texUnit->CombineOperandA[1], + incomingAlpha); + if (!TEXENV_OPERAND_INVERTED(texUnit->CombineOperandA[1])) { + Bmode_A = GR_FUNC_MODE_NEGATIVE_X; + } + else { + /* + * This case is wrong. + */ + Bmode_A = GR_FUNC_MODE_NEGATIVE_X; + return GL_FALSE; + } + /* + * The Source/Operand for the C value must + * specify some kind of alpha value. + */ + TEXENV_SETUP_ARG_A(C_A, + texUnit->CombineSourceA[2], + texUnit->CombineOperandA[2], + incomingAlpha); + Cinv_A = FXFALSE; + D_A = GR_CMBX_B; + Dinv_A = Ginv_A = FXFALSE; + break; + default: + /* + * This is here mostly to keep from getting + * a compiler warning about these not being set. + * However, this should set all the alpha values + * to one. + */ + A_A = B_A = C_A = D_A = GR_CMBX_ZERO; + Amode_A = Bmode_A = GR_FUNC_MODE_X; + Cinv_A = Dinv_A = FXFALSE; + Ginv_A = FXTRUE; + break; + } + /* + * Save the parameters. + */ + env->Color.SourceA = A_RGB; + env->Color.ModeA = Amode_RGB; + env->Color.SourceB = B_RGB; + env->Color.ModeB = Bmode_RGB; + env->Color.SourceC = C_RGB; + env->Color.InvertC = Cinv_RGB; + env->Color.SourceD = D_RGB; + env->Color.InvertD = Dinv_RGB; + env->Color.Shift = Shift_RGB; + env->Color.Invert = Ginv_RGB; + env->Alpha.SourceA = A_A; + env->Alpha.ModeA = Amode_A; + env->Alpha.SourceB = B_A; + env->Alpha.ModeB = Bmode_A; + env->Alpha.SourceC = C_A; + env->Alpha.InvertC = Cinv_A; + env->Alpha.SourceD = D_A; + env->Alpha.InvertD = Dinv_A; + env->Alpha.Shift = Shift_A; + env->Alpha.Invert = Ginv_A; + env->EnvColor = PACK_RGBA32(texUnit->EnvColor[0] * 255.0F, + texUnit->EnvColor[1] * 255.0F, + texUnit->EnvColor[2] * 255.0F, + texUnit->EnvColor[3] * 255.0F); + } + break; +#endif + default: + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s: %x Texture.EnvMode not yet supported\n", __FUNCTION__, + texUnit->EnvMode); + } + return; + } + + /* On Napalm we simply put the color combine unit into passthrough mode + * and do everything we need with the texture combine units. */ + fxMesa->Glide.grColorCombineExt(GR_CMBX_TEXTURE_RGB, + GR_FUNC_MODE_X, + GR_CMBX_ZERO, + GR_FUNC_MODE_X, + GR_CMBX_ZERO, + FXTRUE, + GR_CMBX_ZERO, + FXFALSE, + 0, + FXFALSE); + fxMesa->Glide.grAlphaCombineExt(GR_CMBX_TEXTURE_ALPHA, + GR_FUNC_MODE_X, + GR_CMBX_ZERO, + GR_FUNC_MODE_X, + GR_CMBX_ZERO, + FXTRUE, + GR_CMBX_ZERO, + FXFALSE, + 0, + FXFALSE); + + fxMesa->Glide.grTexAlphaCombineExt(tmu, + alphaComb.SourceA, + alphaComb.ModeA, + alphaComb.SourceB, + alphaComb.ModeB, + alphaComb.SourceC, + alphaComb.InvertC, + alphaComb.SourceD, + alphaComb.InvertD, + alphaComb.Shift, + alphaComb.Invert); + fxMesa->Glide.grTexColorCombineExt(tmu, + colorComb.SourceA, + colorComb.ModeA, + colorComb.SourceB, + colorComb.ModeB, + colorComb.SourceC, + colorComb.InvertC, + colorComb.SourceD, + colorComb.InvertD, + colorComb.Shift, + colorComb.Invert); +} + + +/************************* Single Texture Set ***************************/ + +static void +fxSelectSingleTMUSrcNapalm_NoLock(fxMesaContext fxMesa, GLint tmu, FxBool LODblend) +{ + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s(%d, %d)\n", __FUNCTION__, tmu, LODblend); + } + + if (LODblend) { + /* [dBorca] Hack alert: + * TODO: GR_CMBX_LOD_FRAC + */ + + fxMesa->tmuSrc = FX_TMU_SPLIT; + } + else { + if (tmu != FX_TMU1) { + /* disable tex1 */ + if (fxMesa->haveTwoTMUs) { + fxMesa->Glide.grTexAlphaCombineExt(FX_TMU1, + GR_CMBX_ZERO, + GR_FUNC_MODE_ZERO, + GR_CMBX_ZERO, + GR_FUNC_MODE_ZERO, + GR_CMBX_ZERO, + FXTRUE, + GR_CMBX_ZERO, + FXFALSE, + 0, + FXFALSE); + fxMesa->Glide.grTexColorCombineExt(FX_TMU1, + GR_CMBX_ZERO, + GR_FUNC_MODE_ZERO, + GR_CMBX_ZERO, + GR_FUNC_MODE_ZERO, + GR_CMBX_ZERO, + FXTRUE, + GR_CMBX_ZERO, + FXFALSE, + 0, + FXFALSE); + } + + fxMesa->tmuSrc = FX_TMU0; + } + else { + grTexCombine(GR_TMU0, + GR_COMBINE_FUNCTION_BLEND, + GR_COMBINE_FACTOR_ONE, + GR_COMBINE_FUNCTION_BLEND, + GR_COMBINE_FACTOR_ONE, + FXFALSE, + FXFALSE); + /* + fxMesa->Glide.grTexAlphaCombineExt(FX_TMU0, + GR_CMBX_OTHER_TEXTURE_ALPHA, + GR_FUNC_MODE_X, + GR_CMBX_ZERO, + GR_FUNC_MODE_X, + GR_CMBX_ZERO, + FXTRUE, + GR_CMBX_ZERO, + FXFALSE, + 0, + FXFALSE); + fxMesa->Glide.grTexColorCombineExt(FX_TMU0, + GR_CMBX_OTHER_TEXTURE_RGB, + GR_FUNC_MODE_X, + GR_CMBX_ZERO, + GR_FUNC_MODE_X, + GR_CMBX_ZERO, + FXTRUE, + GR_CMBX_ZERO, + FXFALSE, + 0, + FXFALSE); + */ + + fxMesa->tmuSrc = FX_TMU1; + } + } +} + +static void +fxSetupTextureSingleTMUNapalm_NoLock(GLcontext * ctx, GLuint textureset) +{ + fxMesaContext fxMesa = FX_CONTEXT(ctx); + GLuint unitsmode; + tfxTexInfo *ti; + struct gl_texture_object *tObj = ctx->Texture.Unit[textureset].Current2D; + int tmu; + + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s(%d)\n", __FUNCTION__, textureset); + } + + ti = fxTMGetTexInfo(tObj); + + fxTexValidate(ctx, tObj); + + fxSetupSingleTMU_NoLock(fxMesa, tObj); + + if (ti->whichTMU == FX_TMU_BOTH) + tmu = FX_TMU0; + else + tmu = ti->whichTMU; + if (fxMesa->tmuSrc != tmu) + fxSelectSingleTMUSrcNapalm_NoLock(fxMesa, tmu, ti->LODblend); + + if (textureset == 0 || !fxMesa->haveTwoTMUs) + unitsmode = fxGetTexSetConfiguration(ctx, tObj, NULL); + else + unitsmode = fxGetTexSetConfiguration(ctx, NULL, tObj); + +/* if(fxMesa->lastUnitsMode==unitsmode) */ +/* return; */ + + fxMesa->lastUnitsMode = unitsmode; + + fxMesa->stw_hint_state = 0; + FX_grHints_NoLock(GR_HINT_STWHINT, 0); + + if (TDFX_DEBUG & (VERBOSE_DRIVER | VERBOSE_TEXTURE)) + fprintf(stderr, "%s: envmode is %s\n", __FUNCTION__, + _mesa_lookup_enum_by_nr(ctx->Texture.Unit[textureset].EnvMode)); + + /* [dBorca] Hack alert: + * what if we're in split mode? (LODBlend) + */ + fxSetupTextureEnvNapalm_NoLock(ctx, textureset, tmu, GL_TRUE); +} + + +/************************* Double Texture Set ***************************/ + +static void +fxSetupTextureDoubleTMUNapalm_NoLock(GLcontext * ctx) +{ + fxMesaContext fxMesa = FX_CONTEXT(ctx); + tfxTexInfo *ti0, *ti1; + struct gl_texture_object *tObj0 = ctx->Texture.Unit[0].Current2D; + struct gl_texture_object *tObj1 = ctx->Texture.Unit[1].Current2D; + GLuint unitsmode; + int tmu0 = 0, tmu1 = 1; + + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s(...)\n", __FUNCTION__); + } + + ti0 = fxTMGetTexInfo(tObj0); + fxTexValidate(ctx, tObj0); + + ti1 = fxTMGetTexInfo(tObj1); + fxTexValidate(ctx, tObj1); + + fxSetupDoubleTMU_NoLock(fxMesa, tObj0, tObj1); + + unitsmode = fxGetTexSetConfiguration(ctx, tObj0, tObj1); + +/* if(fxMesa->lastUnitsMode==unitsmode) */ +/* return; */ + + fxMesa->lastUnitsMode = unitsmode; + + fxMesa->stw_hint_state |= GR_STWHINT_ST_DIFF_TMU1; + FX_grHints_NoLock(GR_HINT_STWHINT, fxMesa->stw_hint_state); + + if (TDFX_DEBUG & (VERBOSE_DRIVER | VERBOSE_TEXTURE)) + fprintf(stderr, "%s: envmode is %s/%s\n", __FUNCTION__, + _mesa_lookup_enum_by_nr(ctx->Texture.Unit[0].EnvMode), + _mesa_lookup_enum_by_nr(ctx->Texture.Unit[1].EnvMode)); + + + if ((ti0->whichTMU == FX_TMU1) || (ti1->whichTMU == FX_TMU0)) { + tmu0 = 1; + tmu1 = 0; + } + fxMesa->tmuSrc = FX_TMU_BOTH; + + /* OpenGL vs Glide texture pipeline */ + /* [dBorca] Hack alert: + * TODO: revise this ASAP!!! + */ + fxSetupTextureEnvNapalm_NoLock(ctx, FX_TMU1 - tmu0, tmu0, tmu0 != 0); + fxSetupTextureEnvNapalm_NoLock(ctx, FX_TMU1 - tmu1, tmu1, tmu1 != 0); +} + +/************************* No Texture ***************************/ + +static void +fxSetupTextureNoneNapalm_NoLock(GLcontext * ctx) +{ + fxMesaContext fxMesa = FX_CONTEXT(ctx); + + if (TDFX_DEBUG & VERBOSE_DRIVER) { + fprintf(stderr, "%s(...)\n", __FUNCTION__); + } + + /* the combiner formula is: (A + B) * C + D + ** + ** a = tc_otherselect + ** a_mode = tc_invert_other + ** b = tc_localselect + ** b_mode = tc_invert_local + ** c = (tc_mselect, tc_mselect_7) + ** d = (tc_add_clocal, tc_add_alocal) + ** shift = tc_outshift + ** invert = tc_invert_output + */ + + fxMesa->Glide.grColorCombineExt(GR_CMBX_ITRGB, + GR_FUNC_MODE_X, + GR_CMBX_ZERO, + GR_FUNC_MODE_ZERO, + GR_CMBX_ZERO, + FXTRUE, + GR_CMBX_ZERO, + FXFALSE, + 0, + FXFALSE); + fxMesa->Glide.grAlphaCombineExt(GR_CMBX_ITALPHA, + GR_FUNC_MODE_X, + GR_CMBX_ZERO, + GR_FUNC_MODE_ZERO, + GR_CMBX_ZERO, + FXTRUE, + GR_CMBX_ZERO, + FXFALSE, + 0, + FXFALSE); + + fxMesa->lastUnitsMode = FX_UM_NONE; +} diff --git a/src/mesa/drivers/glide/fxtexman.c b/src/mesa/drivers/glide/fxtexman.c index 648649c0328..90704e34793 100644 --- a/src/mesa/drivers/glide/fxtexman.c +++ b/src/mesa/drivers/glide/fxtexman.c @@ -1,5 +1,3 @@ -/* $Id: fxtexman.c,v 1.17 2003/10/02 17:36:44 brianp Exp $ */ - /* * Mesa 3-D graphics library * Version: 4.0 @@ -45,6 +43,7 @@ #include "fxdrv.h" int texSwaps = 0; +static FxU32 texBoundMask; #define FX_2MB_SPLIT 0x200000 @@ -120,30 +119,37 @@ fxTMNewRangeNode(fxMesaContext fxMesa, FxU32 start, FxU32 end) fxCloseHardware(); exit(-1); } - result->next = NULL; } result->startAddr = start; result->endAddr = end; return result; } +#if 1 +#define fxTMDeleteRangeNode(fxMesa, range) \ + do { \ + range->next = fxMesa->tmPool; \ + fxMesa->tmPool = range; \ + } while (0); +#else static void fxTMDeleteRangeNode(fxMesaContext fxMesa, MemRange * range) { range->next = fxMesa->tmPool; fxMesa->tmPool = range; } +#endif static void fxTMUInit(fxMesaContext fxMesa, int tmu) { MemRange *tmn, *last; - FxU32 start, end, blockstart, blockend, boundary; + FxU32 start, end, blockstart, blockend, chunk; start = grTexMinAddress(tmu); end = grTexMaxAddress(tmu); - boundary = (fxMesa->type >= GR_SSTTYPE_Banshee) ? (end - start) : FX_2MB_SPLIT; + chunk = (fxMesa->type >= GR_SSTTYPE_Banshee) ? (end - start) : FX_2MB_SPLIT; if (fxMesa->verbose) { fprintf(stderr, "Voodoo %s configuration:\n", @@ -152,7 +158,7 @@ fxTMUInit(fxMesaContext fxMesa, int tmu) (unsigned int) start); fprintf(stderr, "Voodoo Higher texture memory address (%u)\n", (unsigned int) end); - fprintf(stderr, "Voodoo Splitting Texture memory in %luMB blocks:\n", boundary >> 20); + fprintf(stderr, "Voodoo Splitting Texture memory in %luMB blocks:\n", chunk >> 20); } fxMesa->freeTexMem[tmu] = end - start; @@ -161,16 +167,18 @@ fxTMUInit(fxMesaContext fxMesa, int tmu) last = 0; blockstart = start; while (blockstart < end) { - if (blockstart + boundary > end) + if (blockstart + chunk > end) blockend = end; else - blockend = blockstart + boundary; + blockend = blockstart + chunk; if (fxMesa->verbose) fprintf(stderr, "Voodoo %07u-%07u\n", (unsigned int) blockstart, (unsigned int) blockend); tmn = fxTMNewRangeNode(fxMesa, blockstart, blockend); + tmn->next = NULL; + if (last) last->next = tmn; @@ -178,7 +186,7 @@ fxTMUInit(fxMesaContext fxMesa, int tmu) fxMesa->tmFree[tmu] = tmn; last = tmn; - blockstart += boundary; + blockstart += chunk; } } @@ -189,6 +197,10 @@ fxTMFindStartAddr(fxMesaContext fxMesa, GLint tmu, int size) int result; struct gl_texture_object *obj; + if (fxMesa->HaveTexUma) { + tmu = FX_TMU0; + } + while (1) { prev = 0; tmp = fxMesa->tmFree[tmu]; @@ -225,11 +237,37 @@ fxTMFindStartAddr(fxMesaContext fxMesa, GLint tmu, int size) } } +int fxTMCheckStartAddr (fxMesaContext fxMesa, GLint tmu, tfxTexInfo *ti) +{ + MemRange *prev, *tmp; + int size; + struct gl_texture_object *obj; + + if (fxMesa->HaveTexUma) { + return FXTRUE; + } + + size = grTexTextureMemRequired(GR_MIPMAPLEVELMASK_BOTH, &(ti->info)); + + tmp = fxMesa->tmFree[tmu]; + while (tmp) { + if (tmp->endAddr - tmp->startAddr >= size) { /* Fits here */ + return FXTRUE; + } + tmp = tmp->next; + } + + return FXFALSE; +} + static void fxTMRemoveRange(fxMesaContext fxMesa, GLint tmu, MemRange * range) { MemRange *tmp, *prev; - FxU32 boundary = (fxMesa->type >= GR_SSTTYPE_Banshee) ? -1 : (FX_2MB_SPLIT - 1); + + if (fxMesa->HaveTexUma) { + tmu = FX_TMU0; + } if (range->startAddr == range->endAddr) { fxTMDeleteRangeNode(fxMesa, range); @@ -252,7 +290,7 @@ fxTMRemoveRange(fxMesaContext fxMesa, GLint tmu, MemRange * range) range->next = tmp; if (tmp) { if (range->endAddr == tmp->startAddr - && tmp->startAddr & boundary) { + && tmp->startAddr & texBoundMask) { /* Combine */ tmp->startAddr = range->startAddr; fxTMDeleteRangeNode(fxMesa, range); @@ -261,7 +299,7 @@ fxTMRemoveRange(fxMesaContext fxMesa, GLint tmu, MemRange * range) } if (prev) { if (prev->endAddr == range->startAddr - && range->startAddr & boundary) { + && range->startAddr & texBoundMask) { /* Combine */ prev->endAddr = range->endAddr; prev->next = range->next; @@ -312,7 +350,7 @@ fxTMFindOldestObject(fxMesaContext fxMesa, int tmu) } /* examine priority */ - if (obj->Priority < lowestPriority) { + if (tmp->Priority < lowestPriority) { lowestPriority = tmp->Priority; lowestPriorityObj = tmp; } @@ -320,8 +358,7 @@ fxTMFindOldestObject(fxMesaContext fxMesa, int tmu) tmp = tmp->Next; } - if (lowestPriority < 1.0) { - ASSERT(lowestPriorityObj); + if (lowestPriorityObj != NULL) { if (TDFX_DEBUG & VERBOSE_TEXTURE) { fprintf(stderr, "fxTMFindOldestObject: %d pri=%f\n", lowestPriorityObj->Name, lowestPriority); } @@ -521,7 +558,17 @@ fxTMReloadMipMapLevel(fxMesaContext fxMesa, struct gl_texture_object *tObj, } tmu = (int) ti->whichTMU; +#if 0 + /* [dBorca] + * We get here by (see Tex[Sub]Image2D), thus we are in TMU. + * Also, we just set the correct TMU above. fxTMMoveInTM will + * bail early, so don't bother... + */ fxTMMoveInTM(fxMesa, tObj, tmu); +#else + fxMesa->stats.reqTexUpload++; + fxMesa->stats.texUpload++; +#endif lodlevel = ti->info.largeLodLog2 - (level - ti->minLevel); @@ -749,10 +796,16 @@ fxTMInit(fxMesaContext fxMesa) fxMesa->texBindNumber = 0; fxMesa->tmPool = 0; + if (fxMesa->HaveTexUma) { + grEnable(GR_TEXTURE_UMA_EXT); + } + fxTMUInit(fxMesa, FX_TMU0); - if (fxMesa->haveTwoTMUs) + if (!fxMesa->HaveTexUma && fxMesa->haveTwoTMUs) fxTMUInit(fxMesa, FX_TMU1); + + texBoundMask = (fxMesa->type >= GR_SSTTYPE_Banshee) ? -1 : (FX_2MB_SPLIT - 1); } void diff --git a/src/mesa/drivers/glide/fxtris.c b/src/mesa/drivers/glide/fxtris.c index 3c6f51a3264..08ecc6dd81b 100644 --- a/src/mesa/drivers/glide/fxtris.c +++ b/src/mesa/drivers/glide/fxtris.c @@ -1,5 +1,3 @@ -/* $Id: fxtris.c,v 1.24 2003/10/02 17:36:44 brianp Exp $ */ - /* * Mesa 3-D graphics library * Version: 4.0 @@ -332,7 +330,7 @@ do { \ #define LOCAL_VARS(n) \ fxMesaContext fxMesa = FX_CONTEXT(ctx); \ GLubyte color[n][4]; \ - (void) color; + (void) color; @@ -532,6 +530,7 @@ static void init_rast_tab( void ) /* Accelerate vertex buffer rendering when renderindex == 0 and * there is no clipping. */ +#define INIT(x) fxRenderPrimitive( ctx, x ) static void fx_render_vb_points( GLcontext *ctx, GLuint start, @@ -547,7 +546,7 @@ static void fx_render_vb_points( GLcontext *ctx, fprintf(stderr, "fx_render_vb_points\n"); } - fxRenderPrimitive(ctx, GL_POINTS); + INIT(GL_POINTS); /* Adjust point coords */ for (i = start; i < count; i++) { @@ -578,7 +577,7 @@ static void fx_render_vb_line_strip( GLcontext *ctx, fprintf(stderr, "fx_render_vb_line_strip\n"); } - fxRenderPrimitive(ctx, GL_LINE_STRIP); + INIT(GL_LINE_STRIP); /* adjust line coords */ for (i = start; i < count; i++) { @@ -611,7 +610,7 @@ static void fx_render_vb_line_loop( GLcontext *ctx, fprintf(stderr, "fx_render_vb_line_loop\n"); } - fxRenderPrimitive(ctx, GL_LINE_LOOP); + INIT(GL_LINE_LOOP); if (!(flags & PRIM_BEGIN)) { j++; @@ -651,7 +650,7 @@ static void fx_render_vb_lines( GLcontext *ctx, fprintf(stderr, "fx_render_vb_lines\n"); } - fxRenderPrimitive(ctx, GL_LINES); + INIT(GL_LINES); /* adjust line coords */ for (i = start; i < count; i++) { @@ -682,7 +681,7 @@ static void fx_render_vb_triangles( GLcontext *ctx, fprintf(stderr, "fx_render_vb_triangles\n"); } - fxRenderPrimitive(ctx, GL_TRIANGLES); + INIT(GL_TRIANGLES); #if 0 /* [dBorca] @@ -718,7 +717,7 @@ static void fx_render_vb_tri_strip( GLcontext *ctx, fprintf(stderr, "fx_render_vb_tri_strip\n"); } - fxRenderPrimitive(ctx, GL_TRIANGLE_STRIP); + INIT(GL_TRIANGLE_STRIP); if (flags & PRIM_PARITY) mode = GR_TRIANGLE_STRIP_CONTINUE; @@ -743,7 +742,7 @@ static void fx_render_vb_tri_fan( GLcontext *ctx, fprintf(stderr, "fx_render_vb_tri_fan\n"); } - fxRenderPrimitive(ctx, GL_TRIANGLE_FAN); + INIT(GL_TRIANGLE_FAN); grDrawVertexArrayContiguous( GR_TRIANGLE_FAN, count-start, fxVB + start, sizeof(GrVertex) ); @@ -763,7 +762,7 @@ static void fx_render_vb_quads( GLcontext *ctx, fprintf(stderr, "fx_render_vb_quads\n"); } - fxRenderPrimitive(ctx, GL_QUADS); + INIT(GL_QUADS); for (i = start ; i < count-3 ; i += 4 ) { #define VERT(x) (fxVB + (x)) @@ -786,7 +785,7 @@ static void fx_render_vb_quad_strip( GLcontext *ctx, fprintf(stderr, "fx_render_vb_quad_strip\n"); } - fxRenderPrimitive(ctx, GL_QUAD_STRIP); + INIT(GL_QUAD_STRIP); count -= (count-start)&1; @@ -807,7 +806,7 @@ static void fx_render_vb_poly( GLcontext *ctx, fprintf(stderr, "fx_render_vb_poly\n"); } - fxRenderPrimitive(ctx, GL_POLYGON); + INIT(GL_POLYGON); grDrawVertexArrayContiguous( GR_POLYGON, count-start, fxVB + start, sizeof(GrVertex)); @@ -838,6 +837,7 @@ static void (*fx_render_tab_verts[GL_POLYGON+2])(GLcontext *, fx_render_vb_poly, fx_render_vb_noop, }; +#undef INIT(x) /**********************************************************************/ @@ -1026,11 +1026,24 @@ static void fxRunPipeline( GLcontext *ctx ) fprintf(stderr, "fxRunPipeline()\n"); } +#if 0 /* Recalculate fog table on projection matrix changes. This used to * be triggered by the NearFar callback. */ if (new_gl_state & _NEW_PROJECTION) fxMesa->new_state |= FX_NEW_FOG; + /* [dBorca] Hack alert: + * the above _NEW_PROJECTION is not included in the test below, + * so we may end up with fxMesa->new_state still dirty by the end + * of the routine. The fact is, we don't have NearFar callback + * anymore. We could use fxDDDepthRange instead, but it seems + * fog needs to be updated only by a fog-basis. + * Implementing fxDDDepthRange correctly is another story: + * that, together with a presumable fxDDViewport function would set + * fxMesa->SetupNewInputs |= VERT_BIT_CLIP; + * which might be useful in fxBuildVertices... + */ +#endif if (new_gl_state & (_FX_NEW_IS_IN_HARDWARE | _FX_NEW_RENDERSTATE | @@ -1097,8 +1110,6 @@ static GLenum reduced_prim[GL_POLYGON+1] = { */ static void fxRasterPrimitive( GLcontext *ctx, GLenum prim ) { - extern void fxSetupCull (GLcontext *ctx); - fxMesaContext fxMesa = FX_CONTEXT( ctx ); fxMesa->raster_primitive = prim; @@ -1176,7 +1187,7 @@ void fxCheckIsInHardware( GLcontext *ctx ) if (newfallback) { if (oldfallback == 0) { if (fxMesa->verbose) { - fprintf(stderr, "Voodoo ! begin SW 0x08%x %s\n", newfallback, getFallbackString(newfallback)); + fprintf(stderr, "Voodoo ! enter SW 0x%08x %s\n", newfallback, getFallbackString(newfallback)); } _swsetup_Wakeup( ctx ); } @@ -1197,7 +1208,7 @@ void fxCheckIsInHardware( GLcontext *ctx ) fxChooseVertexState(ctx); fxDDChooseRenderState(ctx); if (fxMesa->verbose) { - fprintf(stderr, "Voodoo ! end SW 0x08%x %s\n", oldfallback, getFallbackString(oldfallback)); + fprintf(stderr, "Voodoo ! leave SW 0x%08x %s\n", oldfallback, getFallbackString(oldfallback)); } } } diff --git a/src/mesa/drivers/glide/fxvb.c b/src/mesa/drivers/glide/fxvb.c index 2923530d466..8d3647ad60e 100644 --- a/src/mesa/drivers/glide/fxvb.c +++ b/src/mesa/drivers/glide/fxvb.c @@ -1,5 +1,3 @@ -/* $Id: fxvb.c,v 1.19.2.1 2003/11/21 13:40:21 keithw Exp $ */ - /* * Mesa 3-D graphics library * Version: 5.1 @@ -118,7 +116,7 @@ static void interp_extras( GLcontext *ctx, GET_COLOR(VB->ColorPtr[1], dst), GET_COLOR(VB->ColorPtr[1], out), GET_COLOR(VB->ColorPtr[1], in) ); -#if 0 /* [dBorca] leaving disabled for now */ +#if 1 /* [dBorca] GL_EXT_separate_specular_color */ if (VB->SecondaryColorPtr[1]) { INTERP_3CHAN( t, GET_COLOR(VB->SecondaryColorPtr[1], dst), @@ -143,7 +141,7 @@ static void copy_pv_extras( GLcontext *ctx, GLuint dst, GLuint src ) if (VB->ColorPtr[1]) { COPY_CHAN4( GET_COLOR(VB->ColorPtr[1], dst), GET_COLOR(VB->ColorPtr[1], src) ); -#if 0 /* [dBorca] leaving disabled for now */ +#if 1 /* [dBorca] GL_EXT_separate_specular_color */ if (VB->SecondaryColorPtr[1]) { COPY_CHAN4( GET_COLOR(VB->SecondaryColorPtr[1], dst), GET_COLOR(VB->SecondaryColorPtr[1], src) ); @@ -395,7 +393,7 @@ void fxFreeVB( GLcontext *ctx ) } if (fxMesa->UbyteColor.Ptr) { - ALIGN_FREE(fxMesa->UbyteColor.Ptr); + ALIGN_FREE((void *)fxMesa->UbyteColor.Ptr); fxMesa->UbyteColor.Ptr = 0; } } diff --git a/src/mesa/drivers/glide/fxvbtmp.h b/src/mesa/drivers/glide/fxvbtmp.h index d1a022ff5e4..7d5741cd75d 100644 --- a/src/mesa/drivers/glide/fxvbtmp.h +++ b/src/mesa/drivers/glide/fxvbtmp.h @@ -1,5 +1,3 @@ -/* $Id: fxvbtmp.h,v 1.13 2003/10/02 17:36:45 brianp Exp $ */ - /* * Mesa 3-D graphics library * Version: 4.1 @@ -29,6 +27,10 @@ */ +#define VIEWPORT_X(dst,x) dst = s[0] * x + s[12] +#define VIEWPORT_Y(dst,y) dst = s[5] * y + s[13] +#define VIEWPORT_Z(dst,z) dst = s[10] * z + s[14] + static void TAG(emit)( GLcontext *ctx, GLuint start, GLuint end, void *dest ) @@ -89,9 +91,9 @@ static void TAG(emit)( GLcontext *ctx, if (IND & SETUP_XYZW) { if (mask[i] == 0) { /* unclipped */ - v->x = s[0] * proj[0][0] + s[12]; - v->y = s[5] * proj[0][1] + s[13]; - v->ooz = s[10] * proj[0][2] + s[14]; + VIEWPORT_X(v->x, proj[0][0]); + VIEWPORT_Y(v->y, proj[0][1]); + VIEWPORT_Z(v->ooz, proj[0][2]); v->oow = proj[0][3]; } else { /* clipped */ @@ -122,32 +124,24 @@ static void TAG(emit)( GLcontext *ctx, } if (IND & SETUP_TMU0) { GLfloat w = v->oow; + v->tmuvtx[0].sow = tc0[0][0] * u0scale * w; + v->tmuvtx[0].tow = tc0[0][1] * v0scale * w; if (IND & SETUP_PTEX) { - v->tmuvtx[0].sow = tc0[0][0] * u0scale * w; - v->tmuvtx[0].tow = tc0[0][1] * v0scale * w; v->tmuvtx[0].oow = w; if (tc0_size == 4) - v->tmuvtx[0].oow = tc0[0][3] * w; - } - else { - v->tmuvtx[0].sow = tc0[0][0] * u0scale * w; - v->tmuvtx[0].tow = tc0[0][1] * v0scale * w; + v->tmuvtx[0].oow *= tc0[0][3]; } tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + tc0_stride); } if (IND & SETUP_TMU1) { GLfloat w = v->oow; + v->tmuvtx[1].sow = tc1[0][0] * u1scale * w; + v->tmuvtx[1].tow = tc1[0][1] * v1scale * w; if (IND & SETUP_PTEX) { - v->tmuvtx[1].sow = tc1[0][0] * u1scale * w; - v->tmuvtx[1].tow = tc1[0][1] * v1scale * w; v->tmuvtx[1].oow = w; if (tc1_size == 4) - v->tmuvtx[1].oow = tc1[0][3] * w; + v->tmuvtx[1].oow *= tc1[0][3]; } - else { - v->tmuvtx[1].sow = tc1[0][0] * u1scale * w; - v->tmuvtx[1].tow = tc1[0][1] * v1scale * w; - } tc1 = (GLfloat (*)[4])((GLubyte *)tc1 + tc1_stride); } } @@ -197,9 +191,9 @@ static void TAG(interp)( GLcontext *ctx, const GLfloat wout = 1.0F / out->oow; const GLfloat win = 1.0F / in->oow; - dst->x = s[0] * dstclip[0] * oow + s[12]; - dst->y = s[5] * dstclip[1] * oow + s[13]; - dst->ooz = s[10] * dstclip[2] * oow + s[14]; + VIEWPORT_X(dst->x, dstclip[0] * oow); + VIEWPORT_Y(dst->y, dstclip[1] * oow); + VIEWPORT_Z(dst->ooz, dstclip[2] * oow); dst->oow = oow; if (IND & SETUP_SNAP) { diff --git a/src/mesa/drivers/glide/fxwgl.c b/src/mesa/drivers/glide/fxwgl.c index 1337585aec8..4609880f8d3 100644 --- a/src/mesa/drivers/glide/fxwgl.c +++ b/src/mesa/drivers/glide/fxwgl.c @@ -1,5 +1,3 @@ -/* $Id: fxwgl.c,v 1.18 2003/10/02 17:36:45 brianp Exp $ */ - /* * Mesa 3-D graphics library * Version: 4.0 @@ -59,6 +57,11 @@ extern "C" #define MAX_MESA_ATTRS 20 +#if (_MSC_VER >= 1200) +#pragma warning( push ) +#pragma warning( disable : 4273 ) +#endif + struct __extensions__ { PROC proc; @@ -71,7 +74,7 @@ struct __pixelformat__ GLint mesaAttr[MAX_MESA_ATTRS]; }; -//WINGDIAPI void GLAPIENTRY gl3DfxSetPaletteEXT(GLuint *); +WINGDIAPI void GLAPIENTRY gl3DfxSetPaletteEXT(GLuint *); struct __pixelformat__ pix[] = { /* 16bit RGB565 single buffer with depth */ @@ -166,53 +169,6 @@ struct __pixelformat__ pix[] = { FXMESA_NONE} } , -#if 1 - /* 24bit RGB888 single buffer with depth */ - { - {sizeof(PIXELFORMATDESCRIPTOR), 1, - PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL, - PFD_TYPE_RGBA, - 24, - 8, 0, 8, 8, 8, 16, 0, 0, - 0, 0, 0, 0, 0, - 24, - 8, - 0, - PFD_MAIN_PLANE, - 0, 0, 0, 0} - , - {FXMESA_COLORDEPTH, 32, - FXMESA_ALPHA_SIZE, 8, - FXMESA_DEPTH_SIZE, 24, - FXMESA_STENCIL_SIZE, 8, - FXMESA_ACCUM_SIZE, 0, - FXMESA_NONE} - } - , - /* 24bit RGB888 double buffer with depth */ - { - {sizeof(PIXELFORMATDESCRIPTOR), 1, - PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | - PFD_DOUBLEBUFFER | PFD_SWAP_COPY, - PFD_TYPE_RGBA, - 24, - 8, 0, 8, 8, 8, 16, 0, 0, - 0, 0, 0, 0, 0, - 24, - 8, - 0, - PFD_MAIN_PLANE, - 0, 0, 0, 0} - , - {FXMESA_COLORDEPTH, 32, - FXMESA_DOUBLEBUFFER, - FXMESA_ALPHA_SIZE, 8, - FXMESA_DEPTH_SIZE, 24, - FXMESA_STENCIL_SIZE, 8, - FXMESA_ACCUM_SIZE, 0, - FXMESA_NONE} - }, -#endif /* 32bit ARGB8888 single buffer with depth */ { {sizeof(PIXELFORMATDESCRIPTOR), 1, @@ -365,7 +321,7 @@ wglCreateContext(HDC hdc) SetWindowLong(hWnd, GWL_WNDPROC, (LONG) __wglMonitor); } -#ifdef FX_DEBUG +#if FX_DEBUG freopen("MESA.LOG", "w", stderr); #endif @@ -915,7 +871,7 @@ wglDescribeLayerPlane(HDC hdc, int iPixelFormat, int iLayerPlane, GLAPI int GLAPIENTRY wglGetLayerPaletteEntries(HDC hdc, int iLayerPlane, int iStart, - int cEntries, CONST COLORREF *pcr) + int cEntries, COLORREF *pcr) { SetLastError(0); return (FALSE); @@ -936,4 +892,8 @@ wglSetLayerPaletteEntries(HDC hdc,int iLayerPlane, int iStart, return(FALSE); } +#if (_MSC_VER >= 1200) +#pragma warning( pop ) +#endif + #endif /* FX */ diff --git a/src/mesa/drivers/osmesa/osmesa.c b/src/mesa/drivers/osmesa/osmesa.c index 4fd58f20273..67d72446b8d 100644 --- a/src/mesa/drivers/osmesa/osmesa.c +++ b/src/mesa/drivers/osmesa/osmesa.c @@ -682,16 +682,6 @@ hook_in_driver_functions( GLcontext *ctx ) ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; -#if FEATURE_ARB_vertex_buffer_object - ctx->Driver.NewBufferObject = _mesa_new_buffer_object; - ctx->Driver.DeleteBuffer = _mesa_delete_buffer_object; - ctx->Driver.BindBuffer = NULL; - ctx->Driver.BufferData = _mesa_buffer_data; - ctx->Driver.BufferSubData = _mesa_buffer_subdata; - ctx->Driver.MapBuffer = _mesa_buffer_map; - ctx->Driver.UnmapBuffer = NULL; -#endif - swdd->SetBuffer = set_buffer; /* RGB(A) span/pixel functions */ @@ -793,8 +783,9 @@ hook_in_driver_functions( GLcontext *ctx ) GLAPI OSMesaContext GLAPIENTRY OSMesaCreateContext( GLenum format, OSMesaContext sharelist ) { + const GLint accumBits = (format == OSMESA_COLOR_INDEX) ? 0 : 16; return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS, - 8, 16, sharelist); + 8, accumBits, sharelist); } diff --git a/src/mesa/drivers/windows/gdi/wmesa.c b/src/mesa/drivers/windows/gdi/wmesa.c index 01b08e85094..f68e87fd190 100644 --- a/src/mesa/drivers/windows/gdi/wmesa.c +++ b/src/mesa/drivers/windows/gdi/wmesa.c @@ -1,4 +1,4 @@ -/* $Id: wmesa.c,v 1.1 2003/07/24 03:47:46 kschultz Exp $ */ +/* $Id: wmesa.c,v 1.1.2.1 2003/11/21 15:49:37 keithw Exp $ */ /* * Windows (Win32) device driver for Mesa 3.4 @@ -2247,7 +2247,14 @@ void RemoveContext(HWND hWnd) static LRESULT CALLBACK MyWndProc(HWND hwnd,UINT message,WPARAM wParam, LPARAM lParam) { - WMesaContext wc = Current->hwnd == hwnd ? Current : FindContext(hwnd); + WMesaContext wc; + + if (Current==0 || Current->hwnd != hwnd) + wc=FindContext(hwnd); + else + wc=Current; + + if( wc ) { LRESULT lret = CallWindowProc((WNDPROC)(wc->oldWndProc),hwnd,message,wParam,lParam); diff --git a/src/mesa/drivers/x11/xm_api.c b/src/mesa/drivers/x11/xm_api.c index b6cb487c2e1..2ad5a156ff5 100644 --- a/src/mesa/drivers/x11/xm_api.c +++ b/src/mesa/drivers/x11/xm_api.c @@ -175,7 +175,7 @@ static int host_byte_order( void ) * Error handling. */ #ifndef XFree86Server -static int mesaXErrorFlag = 0; +static volatile int mesaXErrorFlag = 0; static int mesaHandleXError( XMesaDisplay *dpy, XErrorEvent *event ) { @@ -1775,7 +1775,7 @@ XMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w, int hw; if (v->mesa_visual.depthBits > 0) { attribs[numAttribs++] = FXMESA_DEPTH_SIZE; - attribs[numAttribs++] = 1; + attribs[numAttribs++] = v->mesa_visual.depthBits; } if (v->mesa_visual.doubleBufferMode) { attribs[numAttribs++] = FXMESA_DOUBLEBUFFER; @@ -1790,16 +1790,16 @@ XMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w, } if (v->mesa_visual.alphaBits > 0) { attribs[numAttribs++] = FXMESA_ALPHA_SIZE; - attribs[numAttribs++] = 1; + attribs[numAttribs++] = v->mesa_visual.alphaBits; } if (1) { -#define FXMESA_SHARE_CONTEXT 990099 /* keep in sync with fxapi.c! */ attribs[numAttribs++] = FXMESA_SHARE_CONTEXT; attribs[numAttribs++] = (int) &(c->mesa); } attribs[numAttribs++] = FXMESA_NONE; - if ((hw = fxQueryHardware())==GR_SSTTYPE_VOODOO) { + /* [dBorca] need to revise this ASAP!!! */ + /*if ((hw = fxQueryHardware())==GR_SSTTYPE_VOODOO) { b->FXctx = fxMesaCreateBestContext(0, b->width, b->height, attribs); if ((v->undithered_pf!=PF_Index) && (b->backimage)) { b->FXisHackUsable = b->FXctx ? GL_TRUE : GL_FALSE; @@ -1809,7 +1809,7 @@ XMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w, b->FXwindowHack = GL_FALSE; } } - else { + else */{ if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W') b->FXctx = fxMesaCreateContext(w, GR_RESOLUTION_NONE, GR_REFRESH_75Hz, attribs); diff --git a/src/mesa/drivers/x11/xm_dd.c b/src/mesa/drivers/x11/xm_dd.c index a99c0d4b5fb..28e6154df4a 100644 --- a/src/mesa/drivers/x11/xm_dd.c +++ b/src/mesa/drivers/x11/xm_dd.c @@ -1015,16 +1015,6 @@ void xmesa_init_pointers( GLcontext *ctx ) ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; -#if FEATURE_ARB_vertex_buffer_object - ctx->Driver.NewBufferObject = _mesa_new_buffer_object; - ctx->Driver.DeleteBuffer = _mesa_delete_buffer_object; - ctx->Driver.BindBuffer = NULL; - ctx->Driver.BufferData = _mesa_buffer_data; - ctx->Driver.BufferSubData = _mesa_buffer_subdata; - ctx->Driver.MapBuffer = _mesa_buffer_map; - ctx->Driver.UnmapBuffer = NULL; -#endif - /* Initialize the TNL driver interface: */ tnl = TNL_CONTEXT(ctx); diff --git a/src/mesa/drivers/x11/xmesaP.h b/src/mesa/drivers/x11/xmesaP.h index bb014a0df39..36a610a4f98 100644 --- a/src/mesa/drivers/x11/xmesaP.h +++ b/src/mesa/drivers/x11/xmesaP.h @@ -40,7 +40,7 @@ #include "mtypes.h" #if defined(FX) #include "GL/fxmesa.h" -#include "FX/fxdrv.h" +#include "../glide/fxdrv.h" #endif diff --git a/src/mesa/glapi/glapitable.h b/src/mesa/glapi/glapitable.h index ca069e35f0d..305f71c28dd 100644 --- a/src/mesa/glapi/glapitable.h +++ b/src/mesa/glapi/glapitable.h @@ -6,716 +6,716 @@ struct _glapi_table { - void (*NewList)(GLuint list, GLenum mode); /* 0 */ - void (*EndList)(void); /* 1 */ - void (*CallList)(GLuint list); /* 2 */ - void (*CallLists)(GLsizei n, GLenum type, const GLvoid * lists); /* 3 */ - void (*DeleteLists)(GLuint list, GLsizei range); /* 4 */ - GLuint (*GenLists)(GLsizei range); /* 5 */ - void (*ListBase)(GLuint base); /* 6 */ - void (*Begin)(GLenum mode); /* 7 */ - void (*Bitmap)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap); /* 8 */ - void (*Color3b)(GLbyte red, GLbyte green, GLbyte blue); /* 9 */ - void (*Color3bv)(const GLbyte * v); /* 10 */ - void (*Color3d)(GLdouble red, GLdouble green, GLdouble blue); /* 11 */ - void (*Color3dv)(const GLdouble * v); /* 12 */ - void (*Color3f)(GLfloat red, GLfloat green, GLfloat blue); /* 13 */ - void (*Color3fv)(const GLfloat * v); /* 14 */ - void (*Color3i)(GLint red, GLint green, GLint blue); /* 15 */ - void (*Color3iv)(const GLint * v); /* 16 */ - void (*Color3s)(GLshort red, GLshort green, GLshort blue); /* 17 */ - void (*Color3sv)(const GLshort * v); /* 18 */ - void (*Color3ub)(GLubyte red, GLubyte green, GLubyte blue); /* 19 */ - void (*Color3ubv)(const GLubyte * v); /* 20 */ - void (*Color3ui)(GLuint red, GLuint green, GLuint blue); /* 21 */ - void (*Color3uiv)(const GLuint * v); /* 22 */ - void (*Color3us)(GLushort red, GLushort green, GLushort blue); /* 23 */ - void (*Color3usv)(const GLushort * v); /* 24 */ - void (*Color4b)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); /* 25 */ - void (*Color4bv)(const GLbyte * v); /* 26 */ - void (*Color4d)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); /* 27 */ - void (*Color4dv)(const GLdouble * v); /* 28 */ - void (*Color4f)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); /* 29 */ - void (*Color4fv)(const GLfloat * v); /* 30 */ - void (*Color4i)(GLint red, GLint green, GLint blue, GLint alpha); /* 31 */ - void (*Color4iv)(const GLint * v); /* 32 */ - void (*Color4s)(GLshort red, GLshort green, GLshort blue, GLshort alpha); /* 33 */ - void (*Color4sv)(const GLshort * v); /* 34 */ - void (*Color4ub)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); /* 35 */ - void (*Color4ubv)(const GLubyte * v); /* 36 */ - void (*Color4ui)(GLuint red, GLuint green, GLuint blue, GLuint alpha); /* 37 */ - void (*Color4uiv)(const GLuint * v); /* 38 */ - void (*Color4us)(GLushort red, GLushort green, GLushort blue, GLushort alpha); /* 39 */ - void (*Color4usv)(const GLushort * v); /* 40 */ - void (*EdgeFlag)(GLboolean flag); /* 41 */ - void (*EdgeFlagv)(const GLboolean * flag); /* 42 */ - void (*End)(void); /* 43 */ - void (*Indexd)(GLdouble c); /* 44 */ - void (*Indexdv)(const GLdouble * c); /* 45 */ - void (*Indexf)(GLfloat c); /* 46 */ - void (*Indexfv)(const GLfloat * c); /* 47 */ - void (*Indexi)(GLint c); /* 48 */ - void (*Indexiv)(const GLint * c); /* 49 */ - void (*Indexs)(GLshort c); /* 50 */ - void (*Indexsv)(const GLshort * c); /* 51 */ - void (*Normal3b)(GLbyte nx, GLbyte ny, GLbyte nz); /* 52 */ - void (*Normal3bv)(const GLbyte * v); /* 53 */ - void (*Normal3d)(GLdouble nx, GLdouble ny, GLdouble nz); /* 54 */ - void (*Normal3dv)(const GLdouble * v); /* 55 */ - void (*Normal3f)(GLfloat nx, GLfloat ny, GLfloat nz); /* 56 */ - void (*Normal3fv)(const GLfloat * v); /* 57 */ - void (*Normal3i)(GLint nx, GLint ny, GLint nz); /* 58 */ - void (*Normal3iv)(const GLint * v); /* 59 */ - void (*Normal3s)(GLshort nx, GLshort ny, GLshort nz); /* 60 */ - void (*Normal3sv)(const GLshort * v); /* 61 */ - void (*RasterPos2d)(GLdouble x, GLdouble y); /* 62 */ - void (*RasterPos2dv)(const GLdouble * v); /* 63 */ - void (*RasterPos2f)(GLfloat x, GLfloat y); /* 64 */ - void (*RasterPos2fv)(const GLfloat * v); /* 65 */ - void (*RasterPos2i)(GLint x, GLint y); /* 66 */ - void (*RasterPos2iv)(const GLint * v); /* 67 */ - void (*RasterPos2s)(GLshort x, GLshort y); /* 68 */ - void (*RasterPos2sv)(const GLshort * v); /* 69 */ - void (*RasterPos3d)(GLdouble x, GLdouble y, GLdouble z); /* 70 */ - void (*RasterPos3dv)(const GLdouble * v); /* 71 */ - void (*RasterPos3f)(GLfloat x, GLfloat y, GLfloat z); /* 72 */ - void (*RasterPos3fv)(const GLfloat * v); /* 73 */ - void (*RasterPos3i)(GLint x, GLint y, GLint z); /* 74 */ - void (*RasterPos3iv)(const GLint * v); /* 75 */ - void (*RasterPos3s)(GLshort x, GLshort y, GLshort z); /* 76 */ - void (*RasterPos3sv)(const GLshort * v); /* 77 */ - void (*RasterPos4d)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 78 */ - void (*RasterPos4dv)(const GLdouble * v); /* 79 */ - void (*RasterPos4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 80 */ - void (*RasterPos4fv)(const GLfloat * v); /* 81 */ - void (*RasterPos4i)(GLint x, GLint y, GLint z, GLint w); /* 82 */ - void (*RasterPos4iv)(const GLint * v); /* 83 */ - void (*RasterPos4s)(GLshort x, GLshort y, GLshort z, GLshort w); /* 84 */ - void (*RasterPos4sv)(const GLshort * v); /* 85 */ - void (*Rectd)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); /* 86 */ - void (*Rectdv)(const GLdouble * v1, const GLdouble * v2); /* 87 */ - void (*Rectf)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); /* 88 */ - void (*Rectfv)(const GLfloat * v1, const GLfloat * v2); /* 89 */ - void (*Recti)(GLint x1, GLint y1, GLint x2, GLint y2); /* 90 */ - void (*Rectiv)(const GLint * v1, const GLint * v2); /* 91 */ - void (*Rects)(GLshort x1, GLshort y1, GLshort x2, GLshort y2); /* 92 */ - void (*Rectsv)(const GLshort * v1, const GLshort * v2); /* 93 */ - void (*TexCoord1d)(GLdouble s); /* 94 */ - void (*TexCoord1dv)(const GLdouble * v); /* 95 */ - void (*TexCoord1f)(GLfloat s); /* 96 */ - void (*TexCoord1fv)(const GLfloat * v); /* 97 */ - void (*TexCoord1i)(GLint s); /* 98 */ - void (*TexCoord1iv)(const GLint * v); /* 99 */ - void (*TexCoord1s)(GLshort s); /* 100 */ - void (*TexCoord1sv)(const GLshort * v); /* 101 */ - void (*TexCoord2d)(GLdouble s, GLdouble t); /* 102 */ - void (*TexCoord2dv)(const GLdouble * v); /* 103 */ - void (*TexCoord2f)(GLfloat s, GLfloat t); /* 104 */ - void (*TexCoord2fv)(const GLfloat * v); /* 105 */ - void (*TexCoord2i)(GLint s, GLint t); /* 106 */ - void (*TexCoord2iv)(const GLint * v); /* 107 */ - void (*TexCoord2s)(GLshort s, GLshort t); /* 108 */ - void (*TexCoord2sv)(const GLshort * v); /* 109 */ - void (*TexCoord3d)(GLdouble s, GLdouble t, GLdouble r); /* 110 */ - void (*TexCoord3dv)(const GLdouble * v); /* 111 */ - void (*TexCoord3f)(GLfloat s, GLfloat t, GLfloat r); /* 112 */ - void (*TexCoord3fv)(const GLfloat * v); /* 113 */ - void (*TexCoord3i)(GLint s, GLint t, GLint r); /* 114 */ - void (*TexCoord3iv)(const GLint * v); /* 115 */ - void (*TexCoord3s)(GLshort s, GLshort t, GLshort r); /* 116 */ - void (*TexCoord3sv)(const GLshort * v); /* 117 */ - void (*TexCoord4d)(GLdouble s, GLdouble t, GLdouble r, GLdouble q); /* 118 */ - void (*TexCoord4dv)(const GLdouble * v); /* 119 */ - void (*TexCoord4f)(GLfloat s, GLfloat t, GLfloat r, GLfloat q); /* 120 */ - void (*TexCoord4fv)(const GLfloat * v); /* 121 */ - void (*TexCoord4i)(GLint s, GLint t, GLint r, GLint q); /* 122 */ - void (*TexCoord4iv)(const GLint * v); /* 123 */ - void (*TexCoord4s)(GLshort s, GLshort t, GLshort r, GLshort q); /* 124 */ - void (*TexCoord4sv)(const GLshort * v); /* 125 */ - void (*Vertex2d)(GLdouble x, GLdouble y); /* 126 */ - void (*Vertex2dv)(const GLdouble * v); /* 127 */ - void (*Vertex2f)(GLfloat x, GLfloat y); /* 128 */ - void (*Vertex2fv)(const GLfloat * v); /* 129 */ - void (*Vertex2i)(GLint x, GLint y); /* 130 */ - void (*Vertex2iv)(const GLint * v); /* 131 */ - void (*Vertex2s)(GLshort x, GLshort y); /* 132 */ - void (*Vertex2sv)(const GLshort * v); /* 133 */ - void (*Vertex3d)(GLdouble x, GLdouble y, GLdouble z); /* 134 */ - void (*Vertex3dv)(const GLdouble * v); /* 135 */ - void (*Vertex3f)(GLfloat x, GLfloat y, GLfloat z); /* 136 */ - void (*Vertex3fv)(const GLfloat * v); /* 137 */ - void (*Vertex3i)(GLint x, GLint y, GLint z); /* 138 */ - void (*Vertex3iv)(const GLint * v); /* 139 */ - void (*Vertex3s)(GLshort x, GLshort y, GLshort z); /* 140 */ - void (*Vertex3sv)(const GLshort * v); /* 141 */ - void (*Vertex4d)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 142 */ - void (*Vertex4dv)(const GLdouble * v); /* 143 */ - void (*Vertex4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 144 */ - void (*Vertex4fv)(const GLfloat * v); /* 145 */ - void (*Vertex4i)(GLint x, GLint y, GLint z, GLint w); /* 146 */ - void (*Vertex4iv)(const GLint * v); /* 147 */ - void (*Vertex4s)(GLshort x, GLshort y, GLshort z, GLshort w); /* 148 */ - void (*Vertex4sv)(const GLshort * v); /* 149 */ - void (*ClipPlane)(GLenum plane, const GLdouble * equation); /* 150 */ - void (*ColorMaterial)(GLenum face, GLenum mode); /* 151 */ - void (*CullFace)(GLenum mode); /* 152 */ - void (*Fogf)(GLenum pname, GLfloat param); /* 153 */ - void (*Fogfv)(GLenum pname, const GLfloat * params); /* 154 */ - void (*Fogi)(GLenum pname, GLint param); /* 155 */ - void (*Fogiv)(GLenum pname, const GLint * params); /* 156 */ - void (*FrontFace)(GLenum mode); /* 157 */ - void (*Hint)(GLenum target, GLenum mode); /* 158 */ - void (*Lightf)(GLenum light, GLenum pname, GLfloat param); /* 159 */ - void (*Lightfv)(GLenum light, GLenum pname, const GLfloat * params); /* 160 */ - void (*Lighti)(GLenum light, GLenum pname, GLint param); /* 161 */ - void (*Lightiv)(GLenum light, GLenum pname, const GLint * params); /* 162 */ - void (*LightModelf)(GLenum pname, GLfloat param); /* 163 */ - void (*LightModelfv)(GLenum pname, const GLfloat * params); /* 164 */ - void (*LightModeli)(GLenum pname, GLint param); /* 165 */ - void (*LightModeliv)(GLenum pname, const GLint * params); /* 166 */ - void (*LineStipple)(GLint factor, GLushort pattern); /* 167 */ - void (*LineWidth)(GLfloat width); /* 168 */ - void (*Materialf)(GLenum face, GLenum pname, GLfloat param); /* 169 */ - void (*Materialfv)(GLenum face, GLenum pname, const GLfloat * params); /* 170 */ - void (*Materiali)(GLenum face, GLenum pname, GLint param); /* 171 */ - void (*Materialiv)(GLenum face, GLenum pname, const GLint * params); /* 172 */ - void (*PointSize)(GLfloat size); /* 173 */ - void (*PolygonMode)(GLenum face, GLenum mode); /* 174 */ - void (*PolygonStipple)(const GLubyte * mask); /* 175 */ - void (*Scissor)(GLint x, GLint y, GLsizei width, GLsizei height); /* 176 */ - void (*ShadeModel)(GLenum mode); /* 177 */ - void (*TexParameterf)(GLenum target, GLenum pname, GLfloat param); /* 178 */ - void (*TexParameterfv)(GLenum target, GLenum pname, const GLfloat * params); /* 179 */ - void (*TexParameteri)(GLenum target, GLenum pname, GLint param); /* 180 */ - void (*TexParameteriv)(GLenum target, GLenum pname, const GLint * params); /* 181 */ - void (*TexImage1D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 182 */ - void (*TexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 183 */ - void (*TexEnvf)(GLenum target, GLenum pname, GLfloat param); /* 184 */ - void (*TexEnvfv)(GLenum target, GLenum pname, const GLfloat * params); /* 185 */ - void (*TexEnvi)(GLenum target, GLenum pname, GLint param); /* 186 */ - void (*TexEnviv)(GLenum target, GLenum pname, const GLint * params); /* 187 */ - void (*TexGend)(GLenum coord, GLenum pname, GLdouble param); /* 188 */ - void (*TexGendv)(GLenum coord, GLenum pname, const GLdouble * params); /* 189 */ - void (*TexGenf)(GLenum coord, GLenum pname, GLfloat param); /* 190 */ - void (*TexGenfv)(GLenum coord, GLenum pname, const GLfloat * params); /* 191 */ - void (*TexGeni)(GLenum coord, GLenum pname, GLint param); /* 192 */ - void (*TexGeniv)(GLenum coord, GLenum pname, const GLint * params); /* 193 */ - void (*FeedbackBuffer)(GLsizei size, GLenum type, GLfloat * buffer); /* 194 */ - void (*SelectBuffer)(GLsizei size, GLuint * buffer); /* 195 */ - GLint (*RenderMode)(GLenum mode); /* 196 */ - void (*InitNames)(void); /* 197 */ - void (*LoadName)(GLuint name); /* 198 */ - void (*PassThrough)(GLfloat token); /* 199 */ - void (*PopName)(void); /* 200 */ - void (*PushName)(GLuint name); /* 201 */ - void (*DrawBuffer)(GLenum mode); /* 202 */ - void (*Clear)(GLbitfield mask); /* 203 */ - void (*ClearAccum)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); /* 204 */ - void (*ClearIndex)(GLfloat c); /* 205 */ - void (*ClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); /* 206 */ - void (*ClearStencil)(GLint s); /* 207 */ - void (*ClearDepth)(GLclampd depth); /* 208 */ - void (*StencilMask)(GLuint mask); /* 209 */ - void (*ColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); /* 210 */ - void (*DepthMask)(GLboolean flag); /* 211 */ - void (*IndexMask)(GLuint mask); /* 212 */ - void (*Accum)(GLenum op, GLfloat value); /* 213 */ - void (*Disable)(GLenum cap); /* 214 */ - void (*Enable)(GLenum cap); /* 215 */ - void (*Finish)(void); /* 216 */ - void (*Flush)(void); /* 217 */ - void (*PopAttrib)(void); /* 218 */ - void (*PushAttrib)(GLbitfield mask); /* 219 */ - void (*Map1d)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points); /* 220 */ - void (*Map1f)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points); /* 221 */ - void (*Map2d)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble * points); /* 222 */ - void (*Map2f)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points); /* 223 */ - void (*MapGrid1d)(GLint un, GLdouble u1, GLdouble u2); /* 224 */ - void (*MapGrid1f)(GLint un, GLfloat u1, GLfloat u2); /* 225 */ - void (*MapGrid2d)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); /* 226 */ - void (*MapGrid2f)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); /* 227 */ - void (*EvalCoord1d)(GLdouble u); /* 228 */ - void (*EvalCoord1dv)(const GLdouble * u); /* 229 */ - void (*EvalCoord1f)(GLfloat u); /* 230 */ - void (*EvalCoord1fv)(const GLfloat * u); /* 231 */ - void (*EvalCoord2d)(GLdouble u, GLdouble v); /* 232 */ - void (*EvalCoord2dv)(const GLdouble * u); /* 233 */ - void (*EvalCoord2f)(GLfloat u, GLfloat v); /* 234 */ - void (*EvalCoord2fv)(const GLfloat * u); /* 235 */ - void (*EvalMesh1)(GLenum mode, GLint i1, GLint i2); /* 236 */ - void (*EvalPoint1)(GLint i); /* 237 */ - void (*EvalMesh2)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); /* 238 */ - void (*EvalPoint2)(GLint i, GLint j); /* 239 */ - void (*AlphaFunc)(GLenum func, GLclampf ref); /* 240 */ - void (*BlendFunc)(GLenum sfactor, GLenum dfactor); /* 241 */ - void (*LogicOp)(GLenum opcode); /* 242 */ - void (*StencilFunc)(GLenum func, GLint ref, GLuint mask); /* 243 */ - void (*StencilOp)(GLenum fail, GLenum zfail, GLenum zpass); /* 244 */ - void (*DepthFunc)(GLenum func); /* 245 */ - void (*PixelZoom)(GLfloat xfactor, GLfloat yfactor); /* 246 */ - void (*PixelTransferf)(GLenum pname, GLfloat param); /* 247 */ - void (*PixelTransferi)(GLenum pname, GLint param); /* 248 */ - void (*PixelStoref)(GLenum pname, GLfloat param); /* 249 */ - void (*PixelStorei)(GLenum pname, GLint param); /* 250 */ - void (*PixelMapfv)(GLenum map, GLsizei mapsize, const GLfloat * values); /* 251 */ - void (*PixelMapuiv)(GLenum map, GLsizei mapsize, const GLuint * values); /* 252 */ - void (*PixelMapusv)(GLenum map, GLsizei mapsize, const GLushort * values); /* 253 */ - void (*ReadBuffer)(GLenum mode); /* 254 */ - void (*CopyPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); /* 255 */ - void (*ReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * pixels); /* 256 */ - void (*DrawPixels)(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); /* 257 */ - void (*GetBooleanv)(GLenum pname, GLboolean * params); /* 258 */ - void (*GetClipPlane)(GLenum plane, GLdouble * equation); /* 259 */ - void (*GetDoublev)(GLenum pname, GLdouble * params); /* 260 */ - GLenum (*GetError)(void); /* 261 */ - void (*GetFloatv)(GLenum pname, GLfloat * params); /* 262 */ - void (*GetIntegerv)(GLenum pname, GLint * params); /* 263 */ - void (*GetLightfv)(GLenum light, GLenum pname, GLfloat * params); /* 264 */ - void (*GetLightiv)(GLenum light, GLenum pname, GLint * params); /* 265 */ - void (*GetMapdv)(GLenum target, GLenum query, GLdouble * v); /* 266 */ - void (*GetMapfv)(GLenum target, GLenum query, GLfloat * v); /* 267 */ - void (*GetMapiv)(GLenum target, GLenum query, GLint * v); /* 268 */ - void (*GetMaterialfv)(GLenum face, GLenum pname, GLfloat * params); /* 269 */ - void (*GetMaterialiv)(GLenum face, GLenum pname, GLint * params); /* 270 */ - void (*GetPixelMapfv)(GLenum map, GLfloat * values); /* 271 */ - void (*GetPixelMapuiv)(GLenum map, GLuint * values); /* 272 */ - void (*GetPixelMapusv)(GLenum map, GLushort * values); /* 273 */ - void (*GetPolygonStipple)(GLubyte * mask); /* 274 */ - const GLubyte * (*GetString)(GLenum name); /* 275 */ - void (*GetTexEnvfv)(GLenum target, GLenum pname, GLfloat * params); /* 276 */ - void (*GetTexEnviv)(GLenum target, GLenum pname, GLint * params); /* 277 */ - void (*GetTexGendv)(GLenum coord, GLenum pname, GLdouble * params); /* 278 */ - void (*GetTexGenfv)(GLenum coord, GLenum pname, GLfloat * params); /* 279 */ - void (*GetTexGeniv)(GLenum coord, GLenum pname, GLint * params); /* 280 */ - void (*GetTexImage)(GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels); /* 281 */ - void (*GetTexParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 282 */ - void (*GetTexParameteriv)(GLenum target, GLenum pname, GLint * params); /* 283 */ - void (*GetTexLevelParameterfv)(GLenum target, GLint level, GLenum pname, GLfloat * params); /* 284 */ - void (*GetTexLevelParameteriv)(GLenum target, GLint level, GLenum pname, GLint * params); /* 285 */ - GLboolean (*IsEnabled)(GLenum cap); /* 286 */ - GLboolean (*IsList)(GLuint list); /* 287 */ - void (*DepthRange)(GLclampd zNear, GLclampd zFar); /* 288 */ - void (*Frustum)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); /* 289 */ - void (*LoadIdentity)(void); /* 290 */ - void (*LoadMatrixf)(const GLfloat * m); /* 291 */ - void (*LoadMatrixd)(const GLdouble * m); /* 292 */ - void (*MatrixMode)(GLenum mode); /* 293 */ - void (*MultMatrixf)(const GLfloat * m); /* 294 */ - void (*MultMatrixd)(const GLdouble * m); /* 295 */ - void (*Ortho)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); /* 296 */ - void (*PopMatrix)(void); /* 297 */ - void (*PushMatrix)(void); /* 298 */ - void (*Rotated)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); /* 299 */ - void (*Rotatef)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); /* 300 */ - void (*Scaled)(GLdouble x, GLdouble y, GLdouble z); /* 301 */ - void (*Scalef)(GLfloat x, GLfloat y, GLfloat z); /* 302 */ - void (*Translated)(GLdouble x, GLdouble y, GLdouble z); /* 303 */ - void (*Translatef)(GLfloat x, GLfloat y, GLfloat z); /* 304 */ - void (*Viewport)(GLint x, GLint y, GLsizei width, GLsizei height); /* 305 */ - void (*ArrayElement)(GLint i); /* 306 */ - void (*BindTexture)(GLenum target, GLuint texture); /* 307 */ - void (*ColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 308 */ - void (*DisableClientState)(GLenum array); /* 309 */ - void (*DrawArrays)(GLenum mode, GLint first, GLsizei count); /* 310 */ - void (*DrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices); /* 311 */ - void (*EdgeFlagPointer)(GLsizei stride, const GLvoid * pointer); /* 312 */ - void (*EnableClientState)(GLenum array); /* 313 */ - void (*IndexPointer)(GLenum type, GLsizei stride, const GLvoid * pointer); /* 314 */ - void (*Indexub)(GLubyte c); /* 315 */ - void (*Indexubv)(const GLubyte * c); /* 316 */ - void (*InterleavedArrays)(GLenum format, GLsizei stride, const GLvoid * pointer); /* 317 */ - void (*NormalPointer)(GLenum type, GLsizei stride, const GLvoid * pointer); /* 318 */ - void (*PolygonOffset)(GLfloat factor, GLfloat units); /* 319 */ - void (*TexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 320 */ - void (*VertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 321 */ - GLboolean (*AreTexturesResident)(GLsizei n, const GLuint * textures, GLboolean * residences); /* 322 */ - void (*CopyTexImage1D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); /* 323 */ - void (*CopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); /* 324 */ - void (*CopyTexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); /* 325 */ - void (*CopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); /* 326 */ - void (*DeleteTextures)(GLsizei n, const GLuint * textures); /* 327 */ - void (*GenTextures)(GLsizei n, GLuint * textures); /* 328 */ - void (*GetPointerv)(GLenum pname, GLvoid ** params); /* 329 */ - GLboolean (*IsTexture)(GLuint texture); /* 330 */ - void (*PrioritizeTextures)(GLsizei n, const GLuint * textures, const GLclampf * priorities); /* 331 */ - void (*TexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels); /* 332 */ - void (*TexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); /* 333 */ - void (*PopClientAttrib)(void); /* 334 */ - void (*PushClientAttrib)(GLbitfield mask); /* 335 */ - void (*BlendColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); /* 336 */ - void (*BlendEquation)(GLenum mode); /* 337 */ - void (*DrawRangeElements)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices); /* 338 */ - void (*ColorTable)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table); /* 339 */ - void (*ColorTableParameterfv)(GLenum target, GLenum pname, const GLfloat * params); /* 340 */ - void (*ColorTableParameteriv)(GLenum target, GLenum pname, const GLint * params); /* 341 */ - void (*CopyColorTable)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); /* 342 */ - void (*GetColorTable)(GLenum target, GLenum format, GLenum type, GLvoid * table); /* 343 */ - void (*GetColorTableParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 344 */ - void (*GetColorTableParameteriv)(GLenum target, GLenum pname, GLint * params); /* 345 */ - void (*ColorSubTable)(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data); /* 346 */ - void (*CopyColorSubTable)(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); /* 347 */ - void (*ConvolutionFilter1D)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image); /* 348 */ - void (*ConvolutionFilter2D)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image); /* 349 */ - void (*ConvolutionParameterf)(GLenum target, GLenum pname, GLfloat params); /* 350 */ - void (*ConvolutionParameterfv)(GLenum target, GLenum pname, const GLfloat * params); /* 351 */ - void (*ConvolutionParameteri)(GLenum target, GLenum pname, GLint params); /* 352 */ - void (*ConvolutionParameteriv)(GLenum target, GLenum pname, const GLint * params); /* 353 */ - void (*CopyConvolutionFilter1D)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); /* 354 */ - void (*CopyConvolutionFilter2D)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); /* 355 */ - void (*GetConvolutionFilter)(GLenum target, GLenum format, GLenum type, GLvoid * image); /* 356 */ - void (*GetConvolutionParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 357 */ - void (*GetConvolutionParameteriv)(GLenum target, GLenum pname, GLint * params); /* 358 */ - void (*GetSeparableFilter)(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span); /* 359 */ - void (*SeparableFilter2D)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column); /* 360 */ - void (*GetHistogram)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 361 */ - void (*GetHistogramParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 362 */ - void (*GetHistogramParameteriv)(GLenum target, GLenum pname, GLint * params); /* 363 */ - void (*GetMinmax)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 364 */ - void (*GetMinmaxParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 365 */ - void (*GetMinmaxParameteriv)(GLenum target, GLenum pname, GLint * params); /* 366 */ - void (*Histogram)(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); /* 367 */ - void (*Minmax)(GLenum target, GLenum internalformat, GLboolean sink); /* 368 */ - void (*ResetHistogram)(GLenum target); /* 369 */ - void (*ResetMinmax)(GLenum target); /* 370 */ - void (*TexImage3D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 371 */ - void (*TexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); /* 372 */ - void (*CopyTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); /* 373 */ - void (*ActiveTextureARB)(GLenum texture); /* 374 */ - void (*ClientActiveTextureARB)(GLenum texture); /* 375 */ - void (*MultiTexCoord1dARB)(GLenum target, GLdouble s); /* 376 */ - void (*MultiTexCoord1dvARB)(GLenum target, const GLdouble * v); /* 377 */ - void (*MultiTexCoord1fARB)(GLenum target, GLfloat s); /* 378 */ - void (*MultiTexCoord1fvARB)(GLenum target, const GLfloat * v); /* 379 */ - void (*MultiTexCoord1iARB)(GLenum target, GLint s); /* 380 */ - void (*MultiTexCoord1ivARB)(GLenum target, const GLint * v); /* 381 */ - void (*MultiTexCoord1sARB)(GLenum target, GLshort s); /* 382 */ - void (*MultiTexCoord1svARB)(GLenum target, const GLshort * v); /* 383 */ - void (*MultiTexCoord2dARB)(GLenum target, GLdouble s, GLdouble t); /* 384 */ - void (*MultiTexCoord2dvARB)(GLenum target, const GLdouble * v); /* 385 */ - void (*MultiTexCoord2fARB)(GLenum target, GLfloat s, GLfloat t); /* 386 */ - void (*MultiTexCoord2fvARB)(GLenum target, const GLfloat * v); /* 387 */ - void (*MultiTexCoord2iARB)(GLenum target, GLint s, GLint t); /* 388 */ - void (*MultiTexCoord2ivARB)(GLenum target, const GLint * v); /* 389 */ - void (*MultiTexCoord2sARB)(GLenum target, GLshort s, GLshort t); /* 390 */ - void (*MultiTexCoord2svARB)(GLenum target, const GLshort * v); /* 391 */ - void (*MultiTexCoord3dARB)(GLenum target, GLdouble s, GLdouble t, GLdouble r); /* 392 */ - void (*MultiTexCoord3dvARB)(GLenum target, const GLdouble * v); /* 393 */ - void (*MultiTexCoord3fARB)(GLenum target, GLfloat s, GLfloat t, GLfloat r); /* 394 */ - void (*MultiTexCoord3fvARB)(GLenum target, const GLfloat * v); /* 395 */ - void (*MultiTexCoord3iARB)(GLenum target, GLint s, GLint t, GLint r); /* 396 */ - void (*MultiTexCoord3ivARB)(GLenum target, const GLint * v); /* 397 */ - void (*MultiTexCoord3sARB)(GLenum target, GLshort s, GLshort t, GLshort r); /* 398 */ - void (*MultiTexCoord3svARB)(GLenum target, const GLshort * v); /* 399 */ - void (*MultiTexCoord4dARB)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); /* 400 */ - void (*MultiTexCoord4dvARB)(GLenum target, const GLdouble * v); /* 401 */ - void (*MultiTexCoord4fARB)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); /* 402 */ - void (*MultiTexCoord4fvARB)(GLenum target, const GLfloat * v); /* 403 */ - void (*MultiTexCoord4iARB)(GLenum target, GLint s, GLint t, GLint r, GLint q); /* 404 */ - void (*MultiTexCoord4ivARB)(GLenum target, const GLint * v); /* 405 */ - void (*MultiTexCoord4sARB)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); /* 406 */ - void (*MultiTexCoord4svARB)(GLenum target, const GLshort * v); /* 407 */ - void (*LoadTransposeMatrixfARB)(const GLfloat * m); /* 408 */ - void (*LoadTransposeMatrixdARB)(const GLdouble * m); /* 409 */ - void (*MultTransposeMatrixfARB)(const GLfloat * m); /* 410 */ - void (*MultTransposeMatrixdARB)(const GLdouble * m); /* 411 */ - void (*SampleCoverageARB)(GLclampf value, GLboolean invert); /* 412 */ - void (*__unused413)(void); /* 413 */ - void (*PolygonOffsetEXT)(GLfloat factor, GLfloat bias); /* 414 */ - void (*GetTexFilterFuncSGIS)(GLenum target, GLenum filter, GLfloat * weights); /* 415 */ - void (*TexFilterFuncSGIS)(GLenum target, GLenum filter, GLsizei n, const GLfloat * weights); /* 416 */ - void (*GetHistogramEXT)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 417 */ - void (*GetHistogramParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params); /* 418 */ - void (*GetHistogramParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 419 */ - void (*GetMinmaxEXT)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 420 */ - void (*GetMinmaxParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params); /* 421 */ - void (*GetMinmaxParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 422 */ - void (*GetConvolutionFilterEXT)(GLenum target, GLenum format, GLenum type, GLvoid * image); /* 423 */ - void (*GetConvolutionParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params); /* 424 */ - void (*GetConvolutionParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 425 */ - void (*GetSeparableFilterEXT)(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span); /* 426 */ - void (*GetColorTableSGI)(GLenum target, GLenum format, GLenum type, GLvoid * table); /* 427 */ - void (*GetColorTableParameterfvSGI)(GLenum target, GLenum pname, GLfloat * params); /* 428 */ - void (*GetColorTableParameterivSGI)(GLenum target, GLenum pname, GLint * params); /* 429 */ - void (*PixelTexGenSGIX)(GLenum mode); /* 430 */ - void (*PixelTexGenParameteriSGIS)(GLenum pname, GLint param); /* 431 */ - void (*PixelTexGenParameterivSGIS)(GLenum pname, const GLint * params); /* 432 */ - void (*PixelTexGenParameterfSGIS)(GLenum pname, GLfloat param); /* 433 */ - void (*PixelTexGenParameterfvSGIS)(GLenum pname, const GLfloat * params); /* 434 */ - void (*GetPixelTexGenParameterivSGIS)(GLenum pname, GLint * params); /* 435 */ - void (*GetPixelTexGenParameterfvSGIS)(GLenum pname, GLfloat * params); /* 436 */ - void (*TexImage4DSGIS)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 437 */ - void (*TexSubImage4DSGIS)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid * pixels); /* 438 */ - GLboolean (*AreTexturesResidentEXT)(GLsizei n, const GLuint * textures, GLboolean * residences); /* 439 */ - void (*GenTexturesEXT)(GLsizei n, GLuint * textures); /* 440 */ - GLboolean (*IsTextureEXT)(GLuint texture); /* 441 */ - void (*DetailTexFuncSGIS)(GLenum target, GLsizei n, const GLfloat * points); /* 442 */ - void (*GetDetailTexFuncSGIS)(GLenum target, GLfloat * points); /* 443 */ - void (*SharpenTexFuncSGIS)(GLenum target, GLsizei n, const GLfloat * points); /* 444 */ - void (*GetSharpenTexFuncSGIS)(GLenum target, GLfloat * points); /* 445 */ - void (*SampleMaskSGIS)(GLclampf value, GLboolean invert); /* 446 */ - void (*SamplePatternSGIS)(GLenum pattern); /* 447 */ - void (*ColorPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 448 */ - void (*EdgeFlagPointerEXT)(GLsizei stride, GLsizei count, const GLboolean * pointer); /* 449 */ - void (*IndexPointerEXT)(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 450 */ - void (*NormalPointerEXT)(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 451 */ - void (*TexCoordPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 452 */ - void (*VertexPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 453 */ - void (*SpriteParameterfSGIX)(GLenum pname, GLfloat param); /* 454 */ - void (*SpriteParameterfvSGIX)(GLenum pname, const GLfloat * params); /* 455 */ - void (*SpriteParameteriSGIX)(GLenum pname, GLint param); /* 456 */ - void (*SpriteParameterivSGIX)(GLenum pname, const GLint * params); /* 457 */ - void (*PointParameterfEXT)(GLenum pname, GLfloat param); /* 458 */ - void (*PointParameterfvEXT)(GLenum pname, const GLfloat * params); /* 459 */ - GLint (*GetInstrumentsSGIX)(void); /* 460 */ - void (*InstrumentsBufferSGIX)(GLsizei size, GLint * buffer); /* 461 */ - GLint (*PollInstrumentsSGIX)(GLint * marker_p); /* 462 */ - void (*ReadInstrumentsSGIX)(GLint marker); /* 463 */ - void (*StartInstrumentsSGIX)(void); /* 464 */ - void (*StopInstrumentsSGIX)(GLint marker); /* 465 */ - void (*FrameZoomSGIX)(GLint factor); /* 466 */ - void (*TagSampleBufferSGIX)(void); /* 467 */ - void (*ReferencePlaneSGIX)(const GLdouble * equation); /* 468 */ - void (*FlushRasterSGIX)(void); /* 469 */ - void (*GetListParameterfvSGIX)(GLuint list, GLenum pname, GLfloat * params); /* 470 */ - void (*GetListParameterivSGIX)(GLuint list, GLenum pname, GLint * params); /* 471 */ - void (*ListParameterfSGIX)(GLuint list, GLenum pname, GLfloat param); /* 472 */ - void (*ListParameterfvSGIX)(GLuint list, GLenum pname, const GLfloat * params); /* 473 */ - void (*ListParameteriSGIX)(GLuint list, GLenum pname, GLint param); /* 474 */ - void (*ListParameterivSGIX)(GLuint list, GLenum pname, const GLint * params); /* 475 */ - void (*FragmentColorMaterialSGIX)(GLenum face, GLenum mode); /* 476 */ - void (*FragmentLightfSGIX)(GLenum light, GLenum pname, GLfloat param); /* 477 */ - void (*FragmentLightfvSGIX)(GLenum light, GLenum pname, const GLfloat * params); /* 478 */ - void (*FragmentLightiSGIX)(GLenum light, GLenum pname, GLint param); /* 479 */ - void (*FragmentLightivSGIX)(GLenum light, GLenum pname, const GLint * params); /* 480 */ - void (*FragmentLightModelfSGIX)(GLenum pname, GLfloat param); /* 481 */ - void (*FragmentLightModelfvSGIX)(GLenum pname, const GLfloat * params); /* 482 */ - void (*FragmentLightModeliSGIX)(GLenum pname, GLint param); /* 483 */ - void (*FragmentLightModelivSGIX)(GLenum pname, const GLint * params); /* 484 */ - void (*FragmentMaterialfSGIX)(GLenum face, GLenum pname, GLfloat param); /* 485 */ - void (*FragmentMaterialfvSGIX)(GLenum face, GLenum pname, const GLfloat * params); /* 486 */ - void (*FragmentMaterialiSGIX)(GLenum face, GLenum pname, GLint param); /* 487 */ - void (*FragmentMaterialivSGIX)(GLenum face, GLenum pname, const GLint * params); /* 488 */ - void (*GetFragmentLightfvSGIX)(GLenum light, GLenum pname, GLfloat * params); /* 489 */ - void (*GetFragmentLightivSGIX)(GLenum light, GLenum pname, GLint * params); /* 490 */ - void (*GetFragmentMaterialfvSGIX)(GLenum face, GLenum pname, GLfloat * params); /* 491 */ - void (*GetFragmentMaterialivSGIX)(GLenum face, GLenum pname, GLint * params); /* 492 */ - void (*LightEnviSGIX)(GLenum pname, GLint param); /* 493 */ - void (*VertexWeightfEXT)(GLfloat weight); /* 494 */ - void (*VertexWeightfvEXT)(const GLfloat * weight); /* 495 */ - void (*VertexWeightPointerEXT)(GLsizei size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 496 */ - void (*FlushVertexArrayRangeNV)(void); /* 497 */ - void (*VertexArrayRangeNV)(GLsizei length, const GLvoid * pointer); /* 498 */ - void (*CombinerParameterfvNV)(GLenum pname, const GLfloat * params); /* 499 */ - void (*CombinerParameterfNV)(GLenum pname, GLfloat param); /* 500 */ - void (*CombinerParameterivNV)(GLenum pname, const GLint * params); /* 501 */ - void (*CombinerParameteriNV)(GLenum pname, GLint param); /* 502 */ - void (*CombinerInputNV)(GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); /* 503 */ - void (*CombinerOutputNV)(GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); /* 504 */ - void (*FinalCombinerInputNV)(GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); /* 505 */ - void (*GetCombinerInputParameterfvNV)(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat * params); /* 506 */ - void (*GetCombinerInputParameterivNV)(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint * params); /* 507 */ - void (*GetCombinerOutputParameterfvNV)(GLenum stage, GLenum portion, GLenum pname, GLfloat * params); /* 508 */ - void (*GetCombinerOutputParameterivNV)(GLenum stage, GLenum portion, GLenum pname, GLint * params); /* 509 */ - void (*GetFinalCombinerInputParameterfvNV)(GLenum variable, GLenum pname, GLfloat * params); /* 510 */ - void (*GetFinalCombinerInputParameterivNV)(GLenum variable, GLenum pname, GLint * params); /* 511 */ - void (*ResizeBuffersMESA)(void); /* 512 */ - void (*WindowPos2dMESA)(GLdouble x, GLdouble y); /* 513 */ - void (*WindowPos2dvMESA)(const GLdouble * v); /* 514 */ - void (*WindowPos2fMESA)(GLfloat x, GLfloat y); /* 515 */ - void (*WindowPos2fvMESA)(const GLfloat * v); /* 516 */ - void (*WindowPos2iMESA)(GLint x, GLint y); /* 517 */ - void (*WindowPos2ivMESA)(const GLint * v); /* 518 */ - void (*WindowPos2sMESA)(GLshort x, GLshort y); /* 519 */ - void (*WindowPos2svMESA)(const GLshort * v); /* 520 */ - void (*WindowPos3dMESA)(GLdouble x, GLdouble y, GLdouble z); /* 521 */ - void (*WindowPos3dvMESA)(const GLdouble * v); /* 522 */ - void (*WindowPos3fMESA)(GLfloat x, GLfloat y, GLfloat z); /* 523 */ - void (*WindowPos3fvMESA)(const GLfloat * v); /* 524 */ - void (*WindowPos3iMESA)(GLint x, GLint y, GLint z); /* 525 */ - void (*WindowPos3ivMESA)(const GLint * v); /* 526 */ - void (*WindowPos3sMESA)(GLshort x, GLshort y, GLshort z); /* 527 */ - void (*WindowPos3svMESA)(const GLshort * v); /* 528 */ - void (*WindowPos4dMESA)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 529 */ - void (*WindowPos4dvMESA)(const GLdouble * v); /* 530 */ - void (*WindowPos4fMESA)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 531 */ - void (*WindowPos4fvMESA)(const GLfloat * v); /* 532 */ - void (*WindowPos4iMESA)(GLint x, GLint y, GLint z, GLint w); /* 533 */ - void (*WindowPos4ivMESA)(const GLint * v); /* 534 */ - void (*WindowPos4sMESA)(GLshort x, GLshort y, GLshort z, GLshort w); /* 535 */ - void (*WindowPos4svMESA)(const GLshort * v); /* 536 */ - void (*BlendFuncSeparateEXT)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); /* 537 */ - void (*IndexMaterialEXT)(GLenum face, GLenum mode); /* 538 */ - void (*IndexFuncEXT)(GLenum func, GLclampf ref); /* 539 */ - void (*LockArraysEXT)(GLint first, GLsizei count); /* 540 */ - void (*UnlockArraysEXT)(void); /* 541 */ - void (*CullParameterdvEXT)(GLenum pname, GLdouble * params); /* 542 */ - void (*CullParameterfvEXT)(GLenum pname, GLfloat * params); /* 543 */ - void (*HintPGI)(GLenum target, GLint mode); /* 544 */ - void (*FogCoordfEXT)(GLfloat coord); /* 545 */ - void (*FogCoordfvEXT)(const GLfloat * coord); /* 546 */ - void (*FogCoorddEXT)(GLdouble coord); /* 547 */ - void (*FogCoorddvEXT)(const GLdouble * coord); /* 548 */ - void (*FogCoordPointerEXT)(GLenum type, GLsizei stride, const GLvoid * pointer); /* 549 */ - void (*GetColorTableEXT)(GLenum target, GLenum format, GLenum type, GLvoid * data); /* 550 */ - void (*GetColorTableParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 551 */ - void (*GetColorTableParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params); /* 552 */ - void (*TbufferMask3DFX)(GLuint mask); /* 553 */ - void (*CompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data); /* 554 */ - void (*CompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data); /* 555 */ - void (*CompressedTexImage1DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data); /* 556 */ - void (*CompressedTexSubImage3DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data); /* 557 */ - void (*CompressedTexSubImage2DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data); /* 558 */ - void (*CompressedTexSubImage1DARB)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data); /* 559 */ - void (*GetCompressedTexImageARB)(GLenum target, GLint level, GLvoid * img); /* 560 */ - void (*SecondaryColor3bEXT)(GLbyte red, GLbyte green, GLbyte blue); /* 561 */ - void (*SecondaryColor3bvEXT)(const GLbyte * v); /* 562 */ - void (*SecondaryColor3dEXT)(GLdouble red, GLdouble green, GLdouble blue); /* 563 */ - void (*SecondaryColor3dvEXT)(const GLdouble * v); /* 564 */ - void (*SecondaryColor3fEXT)(GLfloat red, GLfloat green, GLfloat blue); /* 565 */ - void (*SecondaryColor3fvEXT)(const GLfloat * v); /* 566 */ - void (*SecondaryColor3iEXT)(GLint red, GLint green, GLint blue); /* 567 */ - void (*SecondaryColor3ivEXT)(const GLint * v); /* 568 */ - void (*SecondaryColor3sEXT)(GLshort red, GLshort green, GLshort blue); /* 569 */ - void (*SecondaryColor3svEXT)(const GLshort * v); /* 570 */ - void (*SecondaryColor3ubEXT)(GLubyte red, GLubyte green, GLubyte blue); /* 571 */ - void (*SecondaryColor3ubvEXT)(const GLubyte * v); /* 572 */ - void (*SecondaryColor3uiEXT)(GLuint red, GLuint green, GLuint blue); /* 573 */ - void (*SecondaryColor3uivEXT)(const GLuint * v); /* 574 */ - void (*SecondaryColor3usEXT)(GLushort red, GLushort green, GLushort blue); /* 575 */ - void (*SecondaryColor3usvEXT)(const GLushort * v); /* 576 */ - void (*SecondaryColorPointerEXT)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 577 */ - GLboolean (*AreProgramsResidentNV)(GLsizei n, const GLuint * ids, GLboolean * residences); /* 578 */ - void (*BindProgramNV)(GLenum target, GLuint id); /* 579 */ - void (*DeleteProgramsNV)(GLsizei n, const GLuint * ids); /* 580 */ - void (*ExecuteProgramNV)(GLenum target, GLuint id, const GLfloat * params); /* 581 */ - void (*GenProgramsNV)(GLsizei n, GLuint * ids); /* 582 */ - void (*GetProgramParameterdvNV)(GLenum target, GLuint index, GLenum pname, GLdouble * params); /* 583 */ - void (*GetProgramParameterfvNV)(GLenum target, GLuint index, GLenum pname, GLfloat * params); /* 584 */ - void (*GetProgramivNV)(GLuint id, GLenum pname, GLint * params); /* 585 */ - void (*GetProgramStringNV)(GLuint id, GLenum pname, GLubyte * program); /* 586 */ - void (*GetTrackMatrixivNV)(GLenum target, GLuint address, GLenum pname, GLint * params); /* 587 */ - void (*GetVertexAttribdvNV)(GLuint index, GLenum pname, GLdouble * params); /* 588 */ - void (*GetVertexAttribfvNV)(GLuint index, GLenum pname, GLfloat * params); /* 589 */ - void (*GetVertexAttribivNV)(GLuint index, GLenum pname, GLint * params); /* 590 */ - void (*GetVertexAttribPointervNV)(GLuint index, GLenum pname, GLvoid ** pointer); /* 591 */ - GLboolean (*IsProgramNV)(GLuint id); /* 592 */ - void (*LoadProgramNV)(GLenum target, GLuint id, GLsizei len, const GLubyte * program); /* 593 */ - void (*ProgramParameter4dNV)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 594 */ - void (*ProgramParameter4dvNV)(GLenum target, GLuint index, const GLdouble * params); /* 595 */ - void (*ProgramParameter4fNV)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 596 */ - void (*ProgramParameter4fvNV)(GLenum target, GLuint index, const GLfloat * params); /* 597 */ - void (*ProgramParameters4dvNV)(GLenum target, GLuint index, GLuint num, const GLdouble * params); /* 598 */ - void (*ProgramParameters4fvNV)(GLenum target, GLuint index, GLuint num, const GLfloat * params); /* 599 */ - void (*RequestResidentProgramsNV)(GLsizei n, const GLuint * ids); /* 600 */ - void (*TrackMatrixNV)(GLenum target, GLuint address, GLenum matrix, GLenum transform); /* 601 */ - void (*VertexAttribPointerNV)(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 602 */ - void (*VertexAttrib1dNV)(GLuint index, GLdouble x); /* 603 */ - void (*VertexAttrib1dvNV)(GLuint index, const GLdouble * v); /* 604 */ - void (*VertexAttrib1fNV)(GLuint index, GLfloat x); /* 605 */ - void (*VertexAttrib1fvNV)(GLuint index, const GLfloat * v); /* 606 */ - void (*VertexAttrib1sNV)(GLuint index, GLshort x); /* 607 */ - void (*VertexAttrib1svNV)(GLuint index, const GLshort * v); /* 608 */ - void (*VertexAttrib2dNV)(GLuint index, GLdouble x, GLdouble y); /* 609 */ - void (*VertexAttrib2dvNV)(GLuint index, const GLdouble * v); /* 610 */ - void (*VertexAttrib2fNV)(GLuint index, GLfloat x, GLfloat y); /* 611 */ - void (*VertexAttrib2fvNV)(GLuint index, const GLfloat * v); /* 612 */ - void (*VertexAttrib2sNV)(GLuint index, GLshort x, GLshort y); /* 613 */ - void (*VertexAttrib2svNV)(GLuint index, const GLshort * v); /* 614 */ - void (*VertexAttrib3dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z); /* 615 */ - void (*VertexAttrib3dvNV)(GLuint index, const GLdouble * v); /* 616 */ - void (*VertexAttrib3fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z); /* 617 */ - void (*VertexAttrib3fvNV)(GLuint index, const GLfloat * v); /* 618 */ - void (*VertexAttrib3sNV)(GLuint index, GLshort x, GLshort y, GLshort z); /* 619 */ - void (*VertexAttrib3svNV)(GLuint index, const GLshort * v); /* 620 */ - void (*VertexAttrib4dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 621 */ - void (*VertexAttrib4dvNV)(GLuint index, const GLdouble * v); /* 622 */ - void (*VertexAttrib4fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 623 */ - void (*VertexAttrib4fvNV)(GLuint index, const GLfloat * v); /* 624 */ - void (*VertexAttrib4sNV)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); /* 625 */ - void (*VertexAttrib4svNV)(GLuint index, const GLshort * v); /* 626 */ - void (*VertexAttrib4ubNV)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); /* 627 */ - void (*VertexAttrib4ubvNV)(GLuint index, const GLubyte * v); /* 628 */ - void (*VertexAttribs1dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 629 */ - void (*VertexAttribs1fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 630 */ - void (*VertexAttribs1svNV)(GLuint index, GLsizei n, const GLshort * v); /* 631 */ - void (*VertexAttribs2dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 632 */ - void (*VertexAttribs2fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 633 */ - void (*VertexAttribs2svNV)(GLuint index, GLsizei n, const GLshort * v); /* 634 */ - void (*VertexAttribs3dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 635 */ - void (*VertexAttribs3fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 636 */ - void (*VertexAttribs3svNV)(GLuint index, GLsizei n, const GLshort * v); /* 637 */ - void (*VertexAttribs4dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 638 */ - void (*VertexAttribs4fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 639 */ - void (*VertexAttribs4svNV)(GLuint index, GLsizei n, const GLshort * v); /* 640 */ - void (*VertexAttribs4ubvNV)(GLuint index, GLsizei n, const GLubyte * v); /* 641 */ - void (*PointParameteriNV)(GLenum pname, GLint params); /* 642 */ - void (*PointParameterivNV)(GLenum pname, const GLint * params); /* 643 */ - void (*MultiDrawArraysEXT)(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount); /* 644 */ - void (*MultiDrawElementsEXT)(GLenum mode, const GLsizei * count, GLenum type, const GLvoid ** indices, GLsizei primcount); /* 645 */ - void (*ActiveStencilFaceEXT)(GLenum face); /* 646 */ - void (*DeleteFencesNV)(GLsizei n, const GLuint * fences); /* 647 */ - void (*GenFencesNV)(GLsizei n, GLuint * fences); /* 648 */ - GLboolean (*IsFenceNV)(GLuint fence); /* 649 */ - GLboolean (*TestFenceNV)(GLuint fence); /* 650 */ - void (*GetFenceivNV)(GLuint fence, GLenum pname, GLint * params); /* 651 */ - void (*FinishFenceNV)(GLuint fence); /* 652 */ - void (*SetFenceNV)(GLuint fence, GLenum condition); /* 653 */ - void (*VertexAttrib4bvARB)(GLuint index, const GLbyte * v); /* 654 */ - void (*VertexAttrib4ivARB)(GLuint index, const GLint * v); /* 655 */ - void (*VertexAttrib4ubvARB)(GLuint index, const GLubyte * v); /* 656 */ - void (*VertexAttrib4usvARB)(GLuint index, const GLushort * v); /* 657 */ - void (*VertexAttrib4uivARB)(GLuint index, const GLuint * v); /* 658 */ - void (*VertexAttrib4NbvARB)(GLuint index, const GLbyte * v); /* 659 */ - void (*VertexAttrib4NsvARB)(GLuint index, const GLshort * v); /* 660 */ - void (*VertexAttrib4NivARB)(GLuint index, const GLint * v); /* 661 */ - void (*VertexAttrib4NusvARB)(GLuint index, const GLushort * v); /* 662 */ - void (*VertexAttrib4NuivARB)(GLuint index, const GLuint * v); /* 663 */ - void (*VertexAttribPointerARB)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer); /* 664 */ - void (*EnableVertexAttribArrayARB)(GLuint index); /* 665 */ - void (*DisableVertexAttribArrayARB)(GLuint index); /* 666 */ - void (*ProgramStringARB)(GLenum target, GLenum format, GLsizei len, const GLvoid * string); /* 667 */ - void (*ProgramEnvParameter4dARB)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 668 */ - void (*ProgramEnvParameter4dvARB)(GLenum target, GLuint index, const GLdouble * params); /* 669 */ - void (*ProgramEnvParameter4fARB)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 670 */ - void (*ProgramEnvParameter4fvARB)(GLenum target, GLuint index, const GLfloat * params); /* 671 */ - void (*ProgramLocalParameter4dARB)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 672 */ - void (*ProgramLocalParameter4dvARB)(GLenum target, GLuint index, const GLdouble * params); /* 673 */ - void (*ProgramLocalParameter4fARB)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 674 */ - void (*ProgramLocalParameter4fvARB)(GLenum target, GLuint index, const GLfloat * params); /* 675 */ - void (*GetProgramEnvParameterdvARB)(GLenum target, GLuint index, GLdouble * params); /* 676 */ - void (*GetProgramEnvParameterfvARB)(GLenum target, GLuint index, GLfloat * params); /* 677 */ - void (*GetProgramLocalParameterdvARB)(GLenum target, GLuint index, GLdouble * params); /* 678 */ - void (*GetProgramLocalParameterfvARB)(GLenum target, GLuint index, GLfloat * params); /* 679 */ - void (*GetProgramivARB)(GLenum target, GLenum pname, GLint * params); /* 680 */ - void (*GetProgramStringARB)(GLenum target, GLenum pname, GLvoid * string); /* 681 */ - void (*ProgramNamedParameter4fNV)(GLuint id, GLsizei len, const GLubyte * name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 682 */ - void (*ProgramNamedParameter4dNV)(GLuint id, GLsizei len, const GLubyte * name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 683 */ - void (*ProgramNamedParameter4fvNV)(GLuint id, GLsizei len, const GLubyte * name, const GLfloat * v); /* 684 */ - void (*ProgramNamedParameter4dvNV)(GLuint id, GLsizei len, const GLubyte * name, const GLdouble * v); /* 685 */ - void (*GetProgramNamedParameterfvNV)(GLuint id, GLsizei len, const GLubyte * name, GLfloat * params); /* 686 */ - void (*GetProgramNamedParameterdvNV)(GLuint id, GLsizei len, const GLubyte * name, GLdouble * params); /* 687 */ - void (*BindBufferARB)(GLenum target, GLuint buffer); /* 688 */ - void (*BufferDataARB)(GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage); /* 689 */ - void (*BufferSubDataARB)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data); /* 690 */ - void (*DeleteBuffersARB)(GLsizei n, const GLuint * buffer); /* 691 */ - void (*GenBuffersARB)(GLsizei n, GLuint * buffer); /* 692 */ - void (*GetBufferParameterivARB)(GLenum target, GLenum pname, GLint * params); /* 693 */ - void (*GetBufferPointervARB)(GLenum target, GLenum pname, GLvoid ** params); /* 694 */ - void (*GetBufferSubDataARB)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data); /* 695 */ - GLboolean (*IsBufferARB)(GLuint buffer); /* 696 */ - void * (*MapBufferARB)(GLenum target, GLenum access); /* 697 */ - GLboolean (*UnmapBufferARB)(GLenum target); /* 698 */ - void (*DepthBoundsEXT)(GLclampd zmin, GLclampd zmax); /* 699 */ - void (*GenQueriesARB)(GLsizei n, GLuint * ids); /* 700 */ - void (*DeleteQueriesARB)(GLsizei n, const GLuint * ids); /* 701 */ - GLboolean (*IsQueryARB)(GLuint id); /* 702 */ - void (*BeginQueryARB)(GLenum target, GLuint id); /* 703 */ - void (*EndQueryARB)(GLenum target); /* 704 */ - void (*GetQueryivARB)(GLenum target, GLenum pname, GLint * params); /* 705 */ - void (*GetQueryObjectivARB)(GLuint id, GLenum pname, GLint * params); /* 706 */ - void (*GetQueryObjectuivARB)(GLuint id, GLenum pname, GLuint * params); /* 707 */ - void (*MultiModeDrawArraysIBM)(const GLenum * mode, const GLint * first, const GLsizei * count, GLsizei primcount, GLint modestride); /* 708 */ - void (*MultiModeDrawElementsIBM)(const GLenum * mode, const GLsizei * count, GLenum type, const GLvoid * const * indices, GLsizei primcount, GLint modestride); /* 709 */ + void (GLAPIENTRYP NewList)(GLuint list, GLenum mode); /* 0 */ + void (GLAPIENTRYP EndList)(void); /* 1 */ + void (GLAPIENTRYP CallList)(GLuint list); /* 2 */ + void (GLAPIENTRYP CallLists)(GLsizei n, GLenum type, const GLvoid * lists); /* 3 */ + void (GLAPIENTRYP DeleteLists)(GLuint list, GLsizei range); /* 4 */ + GLuint (GLAPIENTRYP GenLists)(GLsizei range); /* 5 */ + void (GLAPIENTRYP ListBase)(GLuint base); /* 6 */ + void (GLAPIENTRYP Begin)(GLenum mode); /* 7 */ + void (GLAPIENTRYP Bitmap)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap); /* 8 */ + void (GLAPIENTRYP Color3b)(GLbyte red, GLbyte green, GLbyte blue); /* 9 */ + void (GLAPIENTRYP Color3bv)(const GLbyte * v); /* 10 */ + void (GLAPIENTRYP Color3d)(GLdouble red, GLdouble green, GLdouble blue); /* 11 */ + void (GLAPIENTRYP Color3dv)(const GLdouble * v); /* 12 */ + void (GLAPIENTRYP Color3f)(GLfloat red, GLfloat green, GLfloat blue); /* 13 */ + void (GLAPIENTRYP Color3fv)(const GLfloat * v); /* 14 */ + void (GLAPIENTRYP Color3i)(GLint red, GLint green, GLint blue); /* 15 */ + void (GLAPIENTRYP Color3iv)(const GLint * v); /* 16 */ + void (GLAPIENTRYP Color3s)(GLshort red, GLshort green, GLshort blue); /* 17 */ + void (GLAPIENTRYP Color3sv)(const GLshort * v); /* 18 */ + void (GLAPIENTRYP Color3ub)(GLubyte red, GLubyte green, GLubyte blue); /* 19 */ + void (GLAPIENTRYP Color3ubv)(const GLubyte * v); /* 20 */ + void (GLAPIENTRYP Color3ui)(GLuint red, GLuint green, GLuint blue); /* 21 */ + void (GLAPIENTRYP Color3uiv)(const GLuint * v); /* 22 */ + void (GLAPIENTRYP Color3us)(GLushort red, GLushort green, GLushort blue); /* 23 */ + void (GLAPIENTRYP Color3usv)(const GLushort * v); /* 24 */ + void (GLAPIENTRYP Color4b)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); /* 25 */ + void (GLAPIENTRYP Color4bv)(const GLbyte * v); /* 26 */ + void (GLAPIENTRYP Color4d)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); /* 27 */ + void (GLAPIENTRYP Color4dv)(const GLdouble * v); /* 28 */ + void (GLAPIENTRYP Color4f)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); /* 29 */ + void (GLAPIENTRYP Color4fv)(const GLfloat * v); /* 30 */ + void (GLAPIENTRYP Color4i)(GLint red, GLint green, GLint blue, GLint alpha); /* 31 */ + void (GLAPIENTRYP Color4iv)(const GLint * v); /* 32 */ + void (GLAPIENTRYP Color4s)(GLshort red, GLshort green, GLshort blue, GLshort alpha); /* 33 */ + void (GLAPIENTRYP Color4sv)(const GLshort * v); /* 34 */ + void (GLAPIENTRYP Color4ub)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); /* 35 */ + void (GLAPIENTRYP Color4ubv)(const GLubyte * v); /* 36 */ + void (GLAPIENTRYP Color4ui)(GLuint red, GLuint green, GLuint blue, GLuint alpha); /* 37 */ + void (GLAPIENTRYP Color4uiv)(const GLuint * v); /* 38 */ + void (GLAPIENTRYP Color4us)(GLushort red, GLushort green, GLushort blue, GLushort alpha); /* 39 */ + void (GLAPIENTRYP Color4usv)(const GLushort * v); /* 40 */ + void (GLAPIENTRYP EdgeFlag)(GLboolean flag); /* 41 */ + void (GLAPIENTRYP EdgeFlagv)(const GLboolean * flag); /* 42 */ + void (GLAPIENTRYP End)(void); /* 43 */ + void (GLAPIENTRYP Indexd)(GLdouble c); /* 44 */ + void (GLAPIENTRYP Indexdv)(const GLdouble * c); /* 45 */ + void (GLAPIENTRYP Indexf)(GLfloat c); /* 46 */ + void (GLAPIENTRYP Indexfv)(const GLfloat * c); /* 47 */ + void (GLAPIENTRYP Indexi)(GLint c); /* 48 */ + void (GLAPIENTRYP Indexiv)(const GLint * c); /* 49 */ + void (GLAPIENTRYP Indexs)(GLshort c); /* 50 */ + void (GLAPIENTRYP Indexsv)(const GLshort * c); /* 51 */ + void (GLAPIENTRYP Normal3b)(GLbyte nx, GLbyte ny, GLbyte nz); /* 52 */ + void (GLAPIENTRYP Normal3bv)(const GLbyte * v); /* 53 */ + void (GLAPIENTRYP Normal3d)(GLdouble nx, GLdouble ny, GLdouble nz); /* 54 */ + void (GLAPIENTRYP Normal3dv)(const GLdouble * v); /* 55 */ + void (GLAPIENTRYP Normal3f)(GLfloat nx, GLfloat ny, GLfloat nz); /* 56 */ + void (GLAPIENTRYP Normal3fv)(const GLfloat * v); /* 57 */ + void (GLAPIENTRYP Normal3i)(GLint nx, GLint ny, GLint nz); /* 58 */ + void (GLAPIENTRYP Normal3iv)(const GLint * v); /* 59 */ + void (GLAPIENTRYP Normal3s)(GLshort nx, GLshort ny, GLshort nz); /* 60 */ + void (GLAPIENTRYP Normal3sv)(const GLshort * v); /* 61 */ + void (GLAPIENTRYP RasterPos2d)(GLdouble x, GLdouble y); /* 62 */ + void (GLAPIENTRYP RasterPos2dv)(const GLdouble * v); /* 63 */ + void (GLAPIENTRYP RasterPos2f)(GLfloat x, GLfloat y); /* 64 */ + void (GLAPIENTRYP RasterPos2fv)(const GLfloat * v); /* 65 */ + void (GLAPIENTRYP RasterPos2i)(GLint x, GLint y); /* 66 */ + void (GLAPIENTRYP RasterPos2iv)(const GLint * v); /* 67 */ + void (GLAPIENTRYP RasterPos2s)(GLshort x, GLshort y); /* 68 */ + void (GLAPIENTRYP RasterPos2sv)(const GLshort * v); /* 69 */ + void (GLAPIENTRYP RasterPos3d)(GLdouble x, GLdouble y, GLdouble z); /* 70 */ + void (GLAPIENTRYP RasterPos3dv)(const GLdouble * v); /* 71 */ + void (GLAPIENTRYP RasterPos3f)(GLfloat x, GLfloat y, GLfloat z); /* 72 */ + void (GLAPIENTRYP RasterPos3fv)(const GLfloat * v); /* 73 */ + void (GLAPIENTRYP RasterPos3i)(GLint x, GLint y, GLint z); /* 74 */ + void (GLAPIENTRYP RasterPos3iv)(const GLint * v); /* 75 */ + void (GLAPIENTRYP RasterPos3s)(GLshort x, GLshort y, GLshort z); /* 76 */ + void (GLAPIENTRYP RasterPos3sv)(const GLshort * v); /* 77 */ + void (GLAPIENTRYP RasterPos4d)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 78 */ + void (GLAPIENTRYP RasterPos4dv)(const GLdouble * v); /* 79 */ + void (GLAPIENTRYP RasterPos4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 80 */ + void (GLAPIENTRYP RasterPos4fv)(const GLfloat * v); /* 81 */ + void (GLAPIENTRYP RasterPos4i)(GLint x, GLint y, GLint z, GLint w); /* 82 */ + void (GLAPIENTRYP RasterPos4iv)(const GLint * v); /* 83 */ + void (GLAPIENTRYP RasterPos4s)(GLshort x, GLshort y, GLshort z, GLshort w); /* 84 */ + void (GLAPIENTRYP RasterPos4sv)(const GLshort * v); /* 85 */ + void (GLAPIENTRYP Rectd)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); /* 86 */ + void (GLAPIENTRYP Rectdv)(const GLdouble * v1, const GLdouble * v2); /* 87 */ + void (GLAPIENTRYP Rectf)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); /* 88 */ + void (GLAPIENTRYP Rectfv)(const GLfloat * v1, const GLfloat * v2); /* 89 */ + void (GLAPIENTRYP Recti)(GLint x1, GLint y1, GLint x2, GLint y2); /* 90 */ + void (GLAPIENTRYP Rectiv)(const GLint * v1, const GLint * v2); /* 91 */ + void (GLAPIENTRYP Rects)(GLshort x1, GLshort y1, GLshort x2, GLshort y2); /* 92 */ + void (GLAPIENTRYP Rectsv)(const GLshort * v1, const GLshort * v2); /* 93 */ + void (GLAPIENTRYP TexCoord1d)(GLdouble s); /* 94 */ + void (GLAPIENTRYP TexCoord1dv)(const GLdouble * v); /* 95 */ + void (GLAPIENTRYP TexCoord1f)(GLfloat s); /* 96 */ + void (GLAPIENTRYP TexCoord1fv)(const GLfloat * v); /* 97 */ + void (GLAPIENTRYP TexCoord1i)(GLint s); /* 98 */ + void (GLAPIENTRYP TexCoord1iv)(const GLint * v); /* 99 */ + void (GLAPIENTRYP TexCoord1s)(GLshort s); /* 100 */ + void (GLAPIENTRYP TexCoord1sv)(const GLshort * v); /* 101 */ + void (GLAPIENTRYP TexCoord2d)(GLdouble s, GLdouble t); /* 102 */ + void (GLAPIENTRYP TexCoord2dv)(const GLdouble * v); /* 103 */ + void (GLAPIENTRYP TexCoord2f)(GLfloat s, GLfloat t); /* 104 */ + void (GLAPIENTRYP TexCoord2fv)(const GLfloat * v); /* 105 */ + void (GLAPIENTRYP TexCoord2i)(GLint s, GLint t); /* 106 */ + void (GLAPIENTRYP TexCoord2iv)(const GLint * v); /* 107 */ + void (GLAPIENTRYP TexCoord2s)(GLshort s, GLshort t); /* 108 */ + void (GLAPIENTRYP TexCoord2sv)(const GLshort * v); /* 109 */ + void (GLAPIENTRYP TexCoord3d)(GLdouble s, GLdouble t, GLdouble r); /* 110 */ + void (GLAPIENTRYP TexCoord3dv)(const GLdouble * v); /* 111 */ + void (GLAPIENTRYP TexCoord3f)(GLfloat s, GLfloat t, GLfloat r); /* 112 */ + void (GLAPIENTRYP TexCoord3fv)(const GLfloat * v); /* 113 */ + void (GLAPIENTRYP TexCoord3i)(GLint s, GLint t, GLint r); /* 114 */ + void (GLAPIENTRYP TexCoord3iv)(const GLint * v); /* 115 */ + void (GLAPIENTRYP TexCoord3s)(GLshort s, GLshort t, GLshort r); /* 116 */ + void (GLAPIENTRYP TexCoord3sv)(const GLshort * v); /* 117 */ + void (GLAPIENTRYP TexCoord4d)(GLdouble s, GLdouble t, GLdouble r, GLdouble q); /* 118 */ + void (GLAPIENTRYP TexCoord4dv)(const GLdouble * v); /* 119 */ + void (GLAPIENTRYP TexCoord4f)(GLfloat s, GLfloat t, GLfloat r, GLfloat q); /* 120 */ + void (GLAPIENTRYP TexCoord4fv)(const GLfloat * v); /* 121 */ + void (GLAPIENTRYP TexCoord4i)(GLint s, GLint t, GLint r, GLint q); /* 122 */ + void (GLAPIENTRYP TexCoord4iv)(const GLint * v); /* 123 */ + void (GLAPIENTRYP TexCoord4s)(GLshort s, GLshort t, GLshort r, GLshort q); /* 124 */ + void (GLAPIENTRYP TexCoord4sv)(const GLshort * v); /* 125 */ + void (GLAPIENTRYP Vertex2d)(GLdouble x, GLdouble y); /* 126 */ + void (GLAPIENTRYP Vertex2dv)(const GLdouble * v); /* 127 */ + void (GLAPIENTRYP Vertex2f)(GLfloat x, GLfloat y); /* 128 */ + void (GLAPIENTRYP Vertex2fv)(const GLfloat * v); /* 129 */ + void (GLAPIENTRYP Vertex2i)(GLint x, GLint y); /* 130 */ + void (GLAPIENTRYP Vertex2iv)(const GLint * v); /* 131 */ + void (GLAPIENTRYP Vertex2s)(GLshort x, GLshort y); /* 132 */ + void (GLAPIENTRYP Vertex2sv)(const GLshort * v); /* 133 */ + void (GLAPIENTRYP Vertex3d)(GLdouble x, GLdouble y, GLdouble z); /* 134 */ + void (GLAPIENTRYP Vertex3dv)(const GLdouble * v); /* 135 */ + void (GLAPIENTRYP Vertex3f)(GLfloat x, GLfloat y, GLfloat z); /* 136 */ + void (GLAPIENTRYP Vertex3fv)(const GLfloat * v); /* 137 */ + void (GLAPIENTRYP Vertex3i)(GLint x, GLint y, GLint z); /* 138 */ + void (GLAPIENTRYP Vertex3iv)(const GLint * v); /* 139 */ + void (GLAPIENTRYP Vertex3s)(GLshort x, GLshort y, GLshort z); /* 140 */ + void (GLAPIENTRYP Vertex3sv)(const GLshort * v); /* 141 */ + void (GLAPIENTRYP Vertex4d)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 142 */ + void (GLAPIENTRYP Vertex4dv)(const GLdouble * v); /* 143 */ + void (GLAPIENTRYP Vertex4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 144 */ + void (GLAPIENTRYP Vertex4fv)(const GLfloat * v); /* 145 */ + void (GLAPIENTRYP Vertex4i)(GLint x, GLint y, GLint z, GLint w); /* 146 */ + void (GLAPIENTRYP Vertex4iv)(const GLint * v); /* 147 */ + void (GLAPIENTRYP Vertex4s)(GLshort x, GLshort y, GLshort z, GLshort w); /* 148 */ + void (GLAPIENTRYP Vertex4sv)(const GLshort * v); /* 149 */ + void (GLAPIENTRYP ClipPlane)(GLenum plane, const GLdouble * equation); /* 150 */ + void (GLAPIENTRYP ColorMaterial)(GLenum face, GLenum mode); /* 151 */ + void (GLAPIENTRYP CullFace)(GLenum mode); /* 152 */ + void (GLAPIENTRYP Fogf)(GLenum pname, GLfloat param); /* 153 */ + void (GLAPIENTRYP Fogfv)(GLenum pname, const GLfloat * params); /* 154 */ + void (GLAPIENTRYP Fogi)(GLenum pname, GLint param); /* 155 */ + void (GLAPIENTRYP Fogiv)(GLenum pname, const GLint * params); /* 156 */ + void (GLAPIENTRYP FrontFace)(GLenum mode); /* 157 */ + void (GLAPIENTRYP Hint)(GLenum target, GLenum mode); /* 158 */ + void (GLAPIENTRYP Lightf)(GLenum light, GLenum pname, GLfloat param); /* 159 */ + void (GLAPIENTRYP Lightfv)(GLenum light, GLenum pname, const GLfloat * params); /* 160 */ + void (GLAPIENTRYP Lighti)(GLenum light, GLenum pname, GLint param); /* 161 */ + void (GLAPIENTRYP Lightiv)(GLenum light, GLenum pname, const GLint * params); /* 162 */ + void (GLAPIENTRYP LightModelf)(GLenum pname, GLfloat param); /* 163 */ + void (GLAPIENTRYP LightModelfv)(GLenum pname, const GLfloat * params); /* 164 */ + void (GLAPIENTRYP LightModeli)(GLenum pname, GLint param); /* 165 */ + void (GLAPIENTRYP LightModeliv)(GLenum pname, const GLint * params); /* 166 */ + void (GLAPIENTRYP LineStipple)(GLint factor, GLushort pattern); /* 167 */ + void (GLAPIENTRYP LineWidth)(GLfloat width); /* 168 */ + void (GLAPIENTRYP Materialf)(GLenum face, GLenum pname, GLfloat param); /* 169 */ + void (GLAPIENTRYP Materialfv)(GLenum face, GLenum pname, const GLfloat * params); /* 170 */ + void (GLAPIENTRYP Materiali)(GLenum face, GLenum pname, GLint param); /* 171 */ + void (GLAPIENTRYP Materialiv)(GLenum face, GLenum pname, const GLint * params); /* 172 */ + void (GLAPIENTRYP PointSize)(GLfloat size); /* 173 */ + void (GLAPIENTRYP PolygonMode)(GLenum face, GLenum mode); /* 174 */ + void (GLAPIENTRYP PolygonStipple)(const GLubyte * mask); /* 175 */ + void (GLAPIENTRYP Scissor)(GLint x, GLint y, GLsizei width, GLsizei height); /* 176 */ + void (GLAPIENTRYP ShadeModel)(GLenum mode); /* 177 */ + void (GLAPIENTRYP TexParameterf)(GLenum target, GLenum pname, GLfloat param); /* 178 */ + void (GLAPIENTRYP TexParameterfv)(GLenum target, GLenum pname, const GLfloat * params); /* 179 */ + void (GLAPIENTRYP TexParameteri)(GLenum target, GLenum pname, GLint param); /* 180 */ + void (GLAPIENTRYP TexParameteriv)(GLenum target, GLenum pname, const GLint * params); /* 181 */ + void (GLAPIENTRYP TexImage1D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 182 */ + void (GLAPIENTRYP TexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 183 */ + void (GLAPIENTRYP TexEnvf)(GLenum target, GLenum pname, GLfloat param); /* 184 */ + void (GLAPIENTRYP TexEnvfv)(GLenum target, GLenum pname, const GLfloat * params); /* 185 */ + void (GLAPIENTRYP TexEnvi)(GLenum target, GLenum pname, GLint param); /* 186 */ + void (GLAPIENTRYP TexEnviv)(GLenum target, GLenum pname, const GLint * params); /* 187 */ + void (GLAPIENTRYP TexGend)(GLenum coord, GLenum pname, GLdouble param); /* 188 */ + void (GLAPIENTRYP TexGendv)(GLenum coord, GLenum pname, const GLdouble * params); /* 189 */ + void (GLAPIENTRYP TexGenf)(GLenum coord, GLenum pname, GLfloat param); /* 190 */ + void (GLAPIENTRYP TexGenfv)(GLenum coord, GLenum pname, const GLfloat * params); /* 191 */ + void (GLAPIENTRYP TexGeni)(GLenum coord, GLenum pname, GLint param); /* 192 */ + void (GLAPIENTRYP TexGeniv)(GLenum coord, GLenum pname, const GLint * params); /* 193 */ + void (GLAPIENTRYP FeedbackBuffer)(GLsizei size, GLenum type, GLfloat * buffer); /* 194 */ + void (GLAPIENTRYP SelectBuffer)(GLsizei size, GLuint * buffer); /* 195 */ + GLint (GLAPIENTRYP RenderMode)(GLenum mode); /* 196 */ + void (GLAPIENTRYP InitNames)(void); /* 197 */ + void (GLAPIENTRYP LoadName)(GLuint name); /* 198 */ + void (GLAPIENTRYP PassThrough)(GLfloat token); /* 199 */ + void (GLAPIENTRYP PopName)(void); /* 200 */ + void (GLAPIENTRYP PushName)(GLuint name); /* 201 */ + void (GLAPIENTRYP DrawBuffer)(GLenum mode); /* 202 */ + void (GLAPIENTRYP Clear)(GLbitfield mask); /* 203 */ + void (GLAPIENTRYP ClearAccum)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); /* 204 */ + void (GLAPIENTRYP ClearIndex)(GLfloat c); /* 205 */ + void (GLAPIENTRYP ClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); /* 206 */ + void (GLAPIENTRYP ClearStencil)(GLint s); /* 207 */ + void (GLAPIENTRYP ClearDepth)(GLclampd depth); /* 208 */ + void (GLAPIENTRYP StencilMask)(GLuint mask); /* 209 */ + void (GLAPIENTRYP ColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); /* 210 */ + void (GLAPIENTRYP DepthMask)(GLboolean flag); /* 211 */ + void (GLAPIENTRYP IndexMask)(GLuint mask); /* 212 */ + void (GLAPIENTRYP Accum)(GLenum op, GLfloat value); /* 213 */ + void (GLAPIENTRYP Disable)(GLenum cap); /* 214 */ + void (GLAPIENTRYP Enable)(GLenum cap); /* 215 */ + void (GLAPIENTRYP Finish)(void); /* 216 */ + void (GLAPIENTRYP Flush)(void); /* 217 */ + void (GLAPIENTRYP PopAttrib)(void); /* 218 */ + void (GLAPIENTRYP PushAttrib)(GLbitfield mask); /* 219 */ + void (GLAPIENTRYP Map1d)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points); /* 220 */ + void (GLAPIENTRYP Map1f)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points); /* 221 */ + void (GLAPIENTRYP Map2d)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble * points); /* 222 */ + void (GLAPIENTRYP Map2f)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points); /* 223 */ + void (GLAPIENTRYP MapGrid1d)(GLint un, GLdouble u1, GLdouble u2); /* 224 */ + void (GLAPIENTRYP MapGrid1f)(GLint un, GLfloat u1, GLfloat u2); /* 225 */ + void (GLAPIENTRYP MapGrid2d)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); /* 226 */ + void (GLAPIENTRYP MapGrid2f)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); /* 227 */ + void (GLAPIENTRYP EvalCoord1d)(GLdouble u); /* 228 */ + void (GLAPIENTRYP EvalCoord1dv)(const GLdouble * u); /* 229 */ + void (GLAPIENTRYP EvalCoord1f)(GLfloat u); /* 230 */ + void (GLAPIENTRYP EvalCoord1fv)(const GLfloat * u); /* 231 */ + void (GLAPIENTRYP EvalCoord2d)(GLdouble u, GLdouble v); /* 232 */ + void (GLAPIENTRYP EvalCoord2dv)(const GLdouble * u); /* 233 */ + void (GLAPIENTRYP EvalCoord2f)(GLfloat u, GLfloat v); /* 234 */ + void (GLAPIENTRYP EvalCoord2fv)(const GLfloat * u); /* 235 */ + void (GLAPIENTRYP EvalMesh1)(GLenum mode, GLint i1, GLint i2); /* 236 */ + void (GLAPIENTRYP EvalPoint1)(GLint i); /* 237 */ + void (GLAPIENTRYP EvalMesh2)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); /* 238 */ + void (GLAPIENTRYP EvalPoint2)(GLint i, GLint j); /* 239 */ + void (GLAPIENTRYP AlphaFunc)(GLenum func, GLclampf ref); /* 240 */ + void (GLAPIENTRYP BlendFunc)(GLenum sfactor, GLenum dfactor); /* 241 */ + void (GLAPIENTRYP LogicOp)(GLenum opcode); /* 242 */ + void (GLAPIENTRYP StencilFunc)(GLenum func, GLint ref, GLuint mask); /* 243 */ + void (GLAPIENTRYP StencilOp)(GLenum fail, GLenum zfail, GLenum zpass); /* 244 */ + void (GLAPIENTRYP DepthFunc)(GLenum func); /* 245 */ + void (GLAPIENTRYP PixelZoom)(GLfloat xfactor, GLfloat yfactor); /* 246 */ + void (GLAPIENTRYP PixelTransferf)(GLenum pname, GLfloat param); /* 247 */ + void (GLAPIENTRYP PixelTransferi)(GLenum pname, GLint param); /* 248 */ + void (GLAPIENTRYP PixelStoref)(GLenum pname, GLfloat param); /* 249 */ + void (GLAPIENTRYP PixelStorei)(GLenum pname, GLint param); /* 250 */ + void (GLAPIENTRYP PixelMapfv)(GLenum map, GLsizei mapsize, const GLfloat * values); /* 251 */ + void (GLAPIENTRYP PixelMapuiv)(GLenum map, GLsizei mapsize, const GLuint * values); /* 252 */ + void (GLAPIENTRYP PixelMapusv)(GLenum map, GLsizei mapsize, const GLushort * values); /* 253 */ + void (GLAPIENTRYP ReadBuffer)(GLenum mode); /* 254 */ + void (GLAPIENTRYP CopyPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); /* 255 */ + void (GLAPIENTRYP ReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * pixels); /* 256 */ + void (GLAPIENTRYP DrawPixels)(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); /* 257 */ + void (GLAPIENTRYP GetBooleanv)(GLenum pname, GLboolean * params); /* 258 */ + void (GLAPIENTRYP GetClipPlane)(GLenum plane, GLdouble * equation); /* 259 */ + void (GLAPIENTRYP GetDoublev)(GLenum pname, GLdouble * params); /* 260 */ + GLenum (GLAPIENTRYP GetError)(void); /* 261 */ + void (GLAPIENTRYP GetFloatv)(GLenum pname, GLfloat * params); /* 262 */ + void (GLAPIENTRYP GetIntegerv)(GLenum pname, GLint * params); /* 263 */ + void (GLAPIENTRYP GetLightfv)(GLenum light, GLenum pname, GLfloat * params); /* 264 */ + void (GLAPIENTRYP GetLightiv)(GLenum light, GLenum pname, GLint * params); /* 265 */ + void (GLAPIENTRYP GetMapdv)(GLenum target, GLenum query, GLdouble * v); /* 266 */ + void (GLAPIENTRYP GetMapfv)(GLenum target, GLenum query, GLfloat * v); /* 267 */ + void (GLAPIENTRYP GetMapiv)(GLenum target, GLenum query, GLint * v); /* 268 */ + void (GLAPIENTRYP GetMaterialfv)(GLenum face, GLenum pname, GLfloat * params); /* 269 */ + void (GLAPIENTRYP GetMaterialiv)(GLenum face, GLenum pname, GLint * params); /* 270 */ + void (GLAPIENTRYP GetPixelMapfv)(GLenum map, GLfloat * values); /* 271 */ + void (GLAPIENTRYP GetPixelMapuiv)(GLenum map, GLuint * values); /* 272 */ + void (GLAPIENTRYP GetPixelMapusv)(GLenum map, GLushort * values); /* 273 */ + void (GLAPIENTRYP GetPolygonStipple)(GLubyte * mask); /* 274 */ + const GLubyte * (GLAPIENTRYP GetString)(GLenum name); /* 275 */ + void (GLAPIENTRYP GetTexEnvfv)(GLenum target, GLenum pname, GLfloat * params); /* 276 */ + void (GLAPIENTRYP GetTexEnviv)(GLenum target, GLenum pname, GLint * params); /* 277 */ + void (GLAPIENTRYP GetTexGendv)(GLenum coord, GLenum pname, GLdouble * params); /* 278 */ + void (GLAPIENTRYP GetTexGenfv)(GLenum coord, GLenum pname, GLfloat * params); /* 279 */ + void (GLAPIENTRYP GetTexGeniv)(GLenum coord, GLenum pname, GLint * params); /* 280 */ + void (GLAPIENTRYP GetTexImage)(GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels); /* 281 */ + void (GLAPIENTRYP GetTexParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 282 */ + void (GLAPIENTRYP GetTexParameteriv)(GLenum target, GLenum pname, GLint * params); /* 283 */ + void (GLAPIENTRYP GetTexLevelParameterfv)(GLenum target, GLint level, GLenum pname, GLfloat * params); /* 284 */ + void (GLAPIENTRYP GetTexLevelParameteriv)(GLenum target, GLint level, GLenum pname, GLint * params); /* 285 */ + GLboolean (GLAPIENTRYP IsEnabled)(GLenum cap); /* 286 */ + GLboolean (GLAPIENTRYP IsList)(GLuint list); /* 287 */ + void (GLAPIENTRYP DepthRange)(GLclampd zNear, GLclampd zFar); /* 288 */ + void (GLAPIENTRYP Frustum)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); /* 289 */ + void (GLAPIENTRYP LoadIdentity)(void); /* 290 */ + void (GLAPIENTRYP LoadMatrixf)(const GLfloat * m); /* 291 */ + void (GLAPIENTRYP LoadMatrixd)(const GLdouble * m); /* 292 */ + void (GLAPIENTRYP MatrixMode)(GLenum mode); /* 293 */ + void (GLAPIENTRYP MultMatrixf)(const GLfloat * m); /* 294 */ + void (GLAPIENTRYP MultMatrixd)(const GLdouble * m); /* 295 */ + void (GLAPIENTRYP Ortho)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); /* 296 */ + void (GLAPIENTRYP PopMatrix)(void); /* 297 */ + void (GLAPIENTRYP PushMatrix)(void); /* 298 */ + void (GLAPIENTRYP Rotated)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); /* 299 */ + void (GLAPIENTRYP Rotatef)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); /* 300 */ + void (GLAPIENTRYP Scaled)(GLdouble x, GLdouble y, GLdouble z); /* 301 */ + void (GLAPIENTRYP Scalef)(GLfloat x, GLfloat y, GLfloat z); /* 302 */ + void (GLAPIENTRYP Translated)(GLdouble x, GLdouble y, GLdouble z); /* 303 */ + void (GLAPIENTRYP Translatef)(GLfloat x, GLfloat y, GLfloat z); /* 304 */ + void (GLAPIENTRYP Viewport)(GLint x, GLint y, GLsizei width, GLsizei height); /* 305 */ + void (GLAPIENTRYP ArrayElement)(GLint i); /* 306 */ + void (GLAPIENTRYP BindTexture)(GLenum target, GLuint texture); /* 307 */ + void (GLAPIENTRYP ColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 308 */ + void (GLAPIENTRYP DisableClientState)(GLenum array); /* 309 */ + void (GLAPIENTRYP DrawArrays)(GLenum mode, GLint first, GLsizei count); /* 310 */ + void (GLAPIENTRYP DrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices); /* 311 */ + void (GLAPIENTRYP EdgeFlagPointer)(GLsizei stride, const GLvoid * pointer); /* 312 */ + void (GLAPIENTRYP EnableClientState)(GLenum array); /* 313 */ + void (GLAPIENTRYP IndexPointer)(GLenum type, GLsizei stride, const GLvoid * pointer); /* 314 */ + void (GLAPIENTRYP Indexub)(GLubyte c); /* 315 */ + void (GLAPIENTRYP Indexubv)(const GLubyte * c); /* 316 */ + void (GLAPIENTRYP InterleavedArrays)(GLenum format, GLsizei stride, const GLvoid * pointer); /* 317 */ + void (GLAPIENTRYP NormalPointer)(GLenum type, GLsizei stride, const GLvoid * pointer); /* 318 */ + void (GLAPIENTRYP PolygonOffset)(GLfloat factor, GLfloat units); /* 319 */ + void (GLAPIENTRYP TexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 320 */ + void (GLAPIENTRYP VertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 321 */ + GLboolean (GLAPIENTRYP AreTexturesResident)(GLsizei n, const GLuint * textures, GLboolean * residences); /* 322 */ + void (GLAPIENTRYP CopyTexImage1D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); /* 323 */ + void (GLAPIENTRYP CopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); /* 324 */ + void (GLAPIENTRYP CopyTexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); /* 325 */ + void (GLAPIENTRYP CopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); /* 326 */ + void (GLAPIENTRYP DeleteTextures)(GLsizei n, const GLuint * textures); /* 327 */ + void (GLAPIENTRYP GenTextures)(GLsizei n, GLuint * textures); /* 328 */ + void (GLAPIENTRYP GetPointerv)(GLenum pname, GLvoid ** params); /* 329 */ + GLboolean (GLAPIENTRYP IsTexture)(GLuint texture); /* 330 */ + void (GLAPIENTRYP PrioritizeTextures)(GLsizei n, const GLuint * textures, const GLclampf * priorities); /* 331 */ + void (GLAPIENTRYP TexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels); /* 332 */ + void (GLAPIENTRYP TexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); /* 333 */ + void (GLAPIENTRYP PopClientAttrib)(void); /* 334 */ + void (GLAPIENTRYP PushClientAttrib)(GLbitfield mask); /* 335 */ + void (GLAPIENTRYP BlendColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); /* 336 */ + void (GLAPIENTRYP BlendEquation)(GLenum mode); /* 337 */ + void (GLAPIENTRYP DrawRangeElements)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices); /* 338 */ + void (GLAPIENTRYP ColorTable)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table); /* 339 */ + void (GLAPIENTRYP ColorTableParameterfv)(GLenum target, GLenum pname, const GLfloat * params); /* 340 */ + void (GLAPIENTRYP ColorTableParameteriv)(GLenum target, GLenum pname, const GLint * params); /* 341 */ + void (GLAPIENTRYP CopyColorTable)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); /* 342 */ + void (GLAPIENTRYP GetColorTable)(GLenum target, GLenum format, GLenum type, GLvoid * table); /* 343 */ + void (GLAPIENTRYP GetColorTableParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 344 */ + void (GLAPIENTRYP GetColorTableParameteriv)(GLenum target, GLenum pname, GLint * params); /* 345 */ + void (GLAPIENTRYP ColorSubTable)(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data); /* 346 */ + void (GLAPIENTRYP CopyColorSubTable)(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); /* 347 */ + void (GLAPIENTRYP ConvolutionFilter1D)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image); /* 348 */ + void (GLAPIENTRYP ConvolutionFilter2D)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image); /* 349 */ + void (GLAPIENTRYP ConvolutionParameterf)(GLenum target, GLenum pname, GLfloat params); /* 350 */ + void (GLAPIENTRYP ConvolutionParameterfv)(GLenum target, GLenum pname, const GLfloat * params); /* 351 */ + void (GLAPIENTRYP ConvolutionParameteri)(GLenum target, GLenum pname, GLint params); /* 352 */ + void (GLAPIENTRYP ConvolutionParameteriv)(GLenum target, GLenum pname, const GLint * params); /* 353 */ + void (GLAPIENTRYP CopyConvolutionFilter1D)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); /* 354 */ + void (GLAPIENTRYP CopyConvolutionFilter2D)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); /* 355 */ + void (GLAPIENTRYP GetConvolutionFilter)(GLenum target, GLenum format, GLenum type, GLvoid * image); /* 356 */ + void (GLAPIENTRYP GetConvolutionParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 357 */ + void (GLAPIENTRYP GetConvolutionParameteriv)(GLenum target, GLenum pname, GLint * params); /* 358 */ + void (GLAPIENTRYP GetSeparableFilter)(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span); /* 359 */ + void (GLAPIENTRYP SeparableFilter2D)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column); /* 360 */ + void (GLAPIENTRYP GetHistogram)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 361 */ + void (GLAPIENTRYP GetHistogramParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 362 */ + void (GLAPIENTRYP GetHistogramParameteriv)(GLenum target, GLenum pname, GLint * params); /* 363 */ + void (GLAPIENTRYP GetMinmax)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 364 */ + void (GLAPIENTRYP GetMinmaxParameterfv)(GLenum target, GLenum pname, GLfloat * params); /* 365 */ + void (GLAPIENTRYP GetMinmaxParameteriv)(GLenum target, GLenum pname, GLint * params); /* 366 */ + void (GLAPIENTRYP Histogram)(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); /* 367 */ + void (GLAPIENTRYP Minmax)(GLenum target, GLenum internalformat, GLboolean sink); /* 368 */ + void (GLAPIENTRYP ResetHistogram)(GLenum target); /* 369 */ + void (GLAPIENTRYP ResetMinmax)(GLenum target); /* 370 */ + void (GLAPIENTRYP TexImage3D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 371 */ + void (GLAPIENTRYP TexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); /* 372 */ + void (GLAPIENTRYP CopyTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); /* 373 */ + void (GLAPIENTRYP ActiveTextureARB)(GLenum texture); /* 374 */ + void (GLAPIENTRYP ClientActiveTextureARB)(GLenum texture); /* 375 */ + void (GLAPIENTRYP MultiTexCoord1dARB)(GLenum target, GLdouble s); /* 376 */ + void (GLAPIENTRYP MultiTexCoord1dvARB)(GLenum target, const GLdouble * v); /* 377 */ + void (GLAPIENTRYP MultiTexCoord1fARB)(GLenum target, GLfloat s); /* 378 */ + void (GLAPIENTRYP MultiTexCoord1fvARB)(GLenum target, const GLfloat * v); /* 379 */ + void (GLAPIENTRYP MultiTexCoord1iARB)(GLenum target, GLint s); /* 380 */ + void (GLAPIENTRYP MultiTexCoord1ivARB)(GLenum target, const GLint * v); /* 381 */ + void (GLAPIENTRYP MultiTexCoord1sARB)(GLenum target, GLshort s); /* 382 */ + void (GLAPIENTRYP MultiTexCoord1svARB)(GLenum target, const GLshort * v); /* 383 */ + void (GLAPIENTRYP MultiTexCoord2dARB)(GLenum target, GLdouble s, GLdouble t); /* 384 */ + void (GLAPIENTRYP MultiTexCoord2dvARB)(GLenum target, const GLdouble * v); /* 385 */ + void (GLAPIENTRYP MultiTexCoord2fARB)(GLenum target, GLfloat s, GLfloat t); /* 386 */ + void (GLAPIENTRYP MultiTexCoord2fvARB)(GLenum target, const GLfloat * v); /* 387 */ + void (GLAPIENTRYP MultiTexCoord2iARB)(GLenum target, GLint s, GLint t); /* 388 */ + void (GLAPIENTRYP MultiTexCoord2ivARB)(GLenum target, const GLint * v); /* 389 */ + void (GLAPIENTRYP MultiTexCoord2sARB)(GLenum target, GLshort s, GLshort t); /* 390 */ + void (GLAPIENTRYP MultiTexCoord2svARB)(GLenum target, const GLshort * v); /* 391 */ + void (GLAPIENTRYP MultiTexCoord3dARB)(GLenum target, GLdouble s, GLdouble t, GLdouble r); /* 392 */ + void (GLAPIENTRYP MultiTexCoord3dvARB)(GLenum target, const GLdouble * v); /* 393 */ + void (GLAPIENTRYP MultiTexCoord3fARB)(GLenum target, GLfloat s, GLfloat t, GLfloat r); /* 394 */ + void (GLAPIENTRYP MultiTexCoord3fvARB)(GLenum target, const GLfloat * v); /* 395 */ + void (GLAPIENTRYP MultiTexCoord3iARB)(GLenum target, GLint s, GLint t, GLint r); /* 396 */ + void (GLAPIENTRYP MultiTexCoord3ivARB)(GLenum target, const GLint * v); /* 397 */ + void (GLAPIENTRYP MultiTexCoord3sARB)(GLenum target, GLshort s, GLshort t, GLshort r); /* 398 */ + void (GLAPIENTRYP MultiTexCoord3svARB)(GLenum target, const GLshort * v); /* 399 */ + void (GLAPIENTRYP MultiTexCoord4dARB)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); /* 400 */ + void (GLAPIENTRYP MultiTexCoord4dvARB)(GLenum target, const GLdouble * v); /* 401 */ + void (GLAPIENTRYP MultiTexCoord4fARB)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); /* 402 */ + void (GLAPIENTRYP MultiTexCoord4fvARB)(GLenum target, const GLfloat * v); /* 403 */ + void (GLAPIENTRYP MultiTexCoord4iARB)(GLenum target, GLint s, GLint t, GLint r, GLint q); /* 404 */ + void (GLAPIENTRYP MultiTexCoord4ivARB)(GLenum target, const GLint * v); /* 405 */ + void (GLAPIENTRYP MultiTexCoord4sARB)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); /* 406 */ + void (GLAPIENTRYP MultiTexCoord4svARB)(GLenum target, const GLshort * v); /* 407 */ + void (GLAPIENTRYP LoadTransposeMatrixfARB)(const GLfloat * m); /* 408 */ + void (GLAPIENTRYP LoadTransposeMatrixdARB)(const GLdouble * m); /* 409 */ + void (GLAPIENTRYP MultTransposeMatrixfARB)(const GLfloat * m); /* 410 */ + void (GLAPIENTRYP MultTransposeMatrixdARB)(const GLdouble * m); /* 411 */ + void (GLAPIENTRYP SampleCoverageARB)(GLclampf value, GLboolean invert); /* 412 */ + void (GLAPIENTRYP __unused413)(void); /* 413 */ + void (GLAPIENTRYP PolygonOffsetEXT)(GLfloat factor, GLfloat bias); /* 414 */ + void (GLAPIENTRYP GetTexFilterFuncSGIS)(GLenum target, GLenum filter, GLfloat * weights); /* 415 */ + void (GLAPIENTRYP TexFilterFuncSGIS)(GLenum target, GLenum filter, GLsizei n, const GLfloat * weights); /* 416 */ + void (GLAPIENTRYP GetHistogramEXT)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 417 */ + void (GLAPIENTRYP GetHistogramParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params); /* 418 */ + void (GLAPIENTRYP GetHistogramParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 419 */ + void (GLAPIENTRYP GetMinmaxEXT)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); /* 420 */ + void (GLAPIENTRYP GetMinmaxParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params); /* 421 */ + void (GLAPIENTRYP GetMinmaxParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 422 */ + void (GLAPIENTRYP GetConvolutionFilterEXT)(GLenum target, GLenum format, GLenum type, GLvoid * image); /* 423 */ + void (GLAPIENTRYP GetConvolutionParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params); /* 424 */ + void (GLAPIENTRYP GetConvolutionParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 425 */ + void (GLAPIENTRYP GetSeparableFilterEXT)(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span); /* 426 */ + void (GLAPIENTRYP GetColorTableSGI)(GLenum target, GLenum format, GLenum type, GLvoid * table); /* 427 */ + void (GLAPIENTRYP GetColorTableParameterfvSGI)(GLenum target, GLenum pname, GLfloat * params); /* 428 */ + void (GLAPIENTRYP GetColorTableParameterivSGI)(GLenum target, GLenum pname, GLint * params); /* 429 */ + void (GLAPIENTRYP PixelTexGenSGIX)(GLenum mode); /* 430 */ + void (GLAPIENTRYP PixelTexGenParameteriSGIS)(GLenum pname, GLint param); /* 431 */ + void (GLAPIENTRYP PixelTexGenParameterivSGIS)(GLenum pname, const GLint * params); /* 432 */ + void (GLAPIENTRYP PixelTexGenParameterfSGIS)(GLenum pname, GLfloat param); /* 433 */ + void (GLAPIENTRYP PixelTexGenParameterfvSGIS)(GLenum pname, const GLfloat * params); /* 434 */ + void (GLAPIENTRYP GetPixelTexGenParameterivSGIS)(GLenum pname, GLint * params); /* 435 */ + void (GLAPIENTRYP GetPixelTexGenParameterfvSGIS)(GLenum pname, GLfloat * params); /* 436 */ + void (GLAPIENTRYP TexImage4DSGIS)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid * pixels); /* 437 */ + void (GLAPIENTRYP TexSubImage4DSGIS)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid * pixels); /* 438 */ + GLboolean (GLAPIENTRYP AreTexturesResidentEXT)(GLsizei n, const GLuint * textures, GLboolean * residences); /* 439 */ + void (GLAPIENTRYP GenTexturesEXT)(GLsizei n, GLuint * textures); /* 440 */ + GLboolean (GLAPIENTRYP IsTextureEXT)(GLuint texture); /* 441 */ + void (GLAPIENTRYP DetailTexFuncSGIS)(GLenum target, GLsizei n, const GLfloat * points); /* 442 */ + void (GLAPIENTRYP GetDetailTexFuncSGIS)(GLenum target, GLfloat * points); /* 443 */ + void (GLAPIENTRYP SharpenTexFuncSGIS)(GLenum target, GLsizei n, const GLfloat * points); /* 444 */ + void (GLAPIENTRYP GetSharpenTexFuncSGIS)(GLenum target, GLfloat * points); /* 445 */ + void (GLAPIENTRYP SampleMaskSGIS)(GLclampf value, GLboolean invert); /* 446 */ + void (GLAPIENTRYP SamplePatternSGIS)(GLenum pattern); /* 447 */ + void (GLAPIENTRYP ColorPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 448 */ + void (GLAPIENTRYP EdgeFlagPointerEXT)(GLsizei stride, GLsizei count, const GLboolean * pointer); /* 449 */ + void (GLAPIENTRYP IndexPointerEXT)(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 450 */ + void (GLAPIENTRYP NormalPointerEXT)(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 451 */ + void (GLAPIENTRYP TexCoordPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 452 */ + void (GLAPIENTRYP VertexPointerEXT)(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer); /* 453 */ + void (GLAPIENTRYP SpriteParameterfSGIX)(GLenum pname, GLfloat param); /* 454 */ + void (GLAPIENTRYP SpriteParameterfvSGIX)(GLenum pname, const GLfloat * params); /* 455 */ + void (GLAPIENTRYP SpriteParameteriSGIX)(GLenum pname, GLint param); /* 456 */ + void (GLAPIENTRYP SpriteParameterivSGIX)(GLenum pname, const GLint * params); /* 457 */ + void (GLAPIENTRYP PointParameterfEXT)(GLenum pname, GLfloat param); /* 458 */ + void (GLAPIENTRYP PointParameterfvEXT)(GLenum pname, const GLfloat * params); /* 459 */ + GLint (GLAPIENTRYP GetInstrumentsSGIX)(void); /* 460 */ + void (GLAPIENTRYP InstrumentsBufferSGIX)(GLsizei size, GLint * buffer); /* 461 */ + GLint (GLAPIENTRYP PollInstrumentsSGIX)(GLint * marker_p); /* 462 */ + void (GLAPIENTRYP ReadInstrumentsSGIX)(GLint marker); /* 463 */ + void (GLAPIENTRYP StartInstrumentsSGIX)(void); /* 464 */ + void (GLAPIENTRYP StopInstrumentsSGIX)(GLint marker); /* 465 */ + void (GLAPIENTRYP FrameZoomSGIX)(GLint factor); /* 466 */ + void (GLAPIENTRYP TagSampleBufferSGIX)(void); /* 467 */ + void (GLAPIENTRYP ReferencePlaneSGIX)(const GLdouble * equation); /* 468 */ + void (GLAPIENTRYP FlushRasterSGIX)(void); /* 469 */ + void (GLAPIENTRYP GetListParameterfvSGIX)(GLuint list, GLenum pname, GLfloat * params); /* 470 */ + void (GLAPIENTRYP GetListParameterivSGIX)(GLuint list, GLenum pname, GLint * params); /* 471 */ + void (GLAPIENTRYP ListParameterfSGIX)(GLuint list, GLenum pname, GLfloat param); /* 472 */ + void (GLAPIENTRYP ListParameterfvSGIX)(GLuint list, GLenum pname, const GLfloat * params); /* 473 */ + void (GLAPIENTRYP ListParameteriSGIX)(GLuint list, GLenum pname, GLint param); /* 474 */ + void (GLAPIENTRYP ListParameterivSGIX)(GLuint list, GLenum pname, const GLint * params); /* 475 */ + void (GLAPIENTRYP FragmentColorMaterialSGIX)(GLenum face, GLenum mode); /* 476 */ + void (GLAPIENTRYP FragmentLightfSGIX)(GLenum light, GLenum pname, GLfloat param); /* 477 */ + void (GLAPIENTRYP FragmentLightfvSGIX)(GLenum light, GLenum pname, const GLfloat * params); /* 478 */ + void (GLAPIENTRYP FragmentLightiSGIX)(GLenum light, GLenum pname, GLint param); /* 479 */ + void (GLAPIENTRYP FragmentLightivSGIX)(GLenum light, GLenum pname, const GLint * params); /* 480 */ + void (GLAPIENTRYP FragmentLightModelfSGIX)(GLenum pname, GLfloat param); /* 481 */ + void (GLAPIENTRYP FragmentLightModelfvSGIX)(GLenum pname, const GLfloat * params); /* 482 */ + void (GLAPIENTRYP FragmentLightModeliSGIX)(GLenum pname, GLint param); /* 483 */ + void (GLAPIENTRYP FragmentLightModelivSGIX)(GLenum pname, const GLint * params); /* 484 */ + void (GLAPIENTRYP FragmentMaterialfSGIX)(GLenum face, GLenum pname, GLfloat param); /* 485 */ + void (GLAPIENTRYP FragmentMaterialfvSGIX)(GLenum face, GLenum pname, const GLfloat * params); /* 486 */ + void (GLAPIENTRYP FragmentMaterialiSGIX)(GLenum face, GLenum pname, GLint param); /* 487 */ + void (GLAPIENTRYP FragmentMaterialivSGIX)(GLenum face, GLenum pname, const GLint * params); /* 488 */ + void (GLAPIENTRYP GetFragmentLightfvSGIX)(GLenum light, GLenum pname, GLfloat * params); /* 489 */ + void (GLAPIENTRYP GetFragmentLightivSGIX)(GLenum light, GLenum pname, GLint * params); /* 490 */ + void (GLAPIENTRYP GetFragmentMaterialfvSGIX)(GLenum face, GLenum pname, GLfloat * params); /* 491 */ + void (GLAPIENTRYP GetFragmentMaterialivSGIX)(GLenum face, GLenum pname, GLint * params); /* 492 */ + void (GLAPIENTRYP LightEnviSGIX)(GLenum pname, GLint param); /* 493 */ + void (GLAPIENTRYP VertexWeightfEXT)(GLfloat weight); /* 494 */ + void (GLAPIENTRYP VertexWeightfvEXT)(const GLfloat * weight); /* 495 */ + void (GLAPIENTRYP VertexWeightPointerEXT)(GLsizei size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 496 */ + void (GLAPIENTRYP FlushVertexArrayRangeNV)(void); /* 497 */ + void (GLAPIENTRYP VertexArrayRangeNV)(GLsizei length, const GLvoid * pointer); /* 498 */ + void (GLAPIENTRYP CombinerParameterfvNV)(GLenum pname, const GLfloat * params); /* 499 */ + void (GLAPIENTRYP CombinerParameterfNV)(GLenum pname, GLfloat param); /* 500 */ + void (GLAPIENTRYP CombinerParameterivNV)(GLenum pname, const GLint * params); /* 501 */ + void (GLAPIENTRYP CombinerParameteriNV)(GLenum pname, GLint param); /* 502 */ + void (GLAPIENTRYP CombinerInputNV)(GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); /* 503 */ + void (GLAPIENTRYP CombinerOutputNV)(GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); /* 504 */ + void (GLAPIENTRYP FinalCombinerInputNV)(GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); /* 505 */ + void (GLAPIENTRYP GetCombinerInputParameterfvNV)(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat * params); /* 506 */ + void (GLAPIENTRYP GetCombinerInputParameterivNV)(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint * params); /* 507 */ + void (GLAPIENTRYP GetCombinerOutputParameterfvNV)(GLenum stage, GLenum portion, GLenum pname, GLfloat * params); /* 508 */ + void (GLAPIENTRYP GetCombinerOutputParameterivNV)(GLenum stage, GLenum portion, GLenum pname, GLint * params); /* 509 */ + void (GLAPIENTRYP GetFinalCombinerInputParameterfvNV)(GLenum variable, GLenum pname, GLfloat * params); /* 510 */ + void (GLAPIENTRYP GetFinalCombinerInputParameterivNV)(GLenum variable, GLenum pname, GLint * params); /* 511 */ + void (GLAPIENTRYP ResizeBuffersMESA)(void); /* 512 */ + void (GLAPIENTRYP WindowPos2dMESA)(GLdouble x, GLdouble y); /* 513 */ + void (GLAPIENTRYP WindowPos2dvMESA)(const GLdouble * v); /* 514 */ + void (GLAPIENTRYP WindowPos2fMESA)(GLfloat x, GLfloat y); /* 515 */ + void (GLAPIENTRYP WindowPos2fvMESA)(const GLfloat * v); /* 516 */ + void (GLAPIENTRYP WindowPos2iMESA)(GLint x, GLint y); /* 517 */ + void (GLAPIENTRYP WindowPos2ivMESA)(const GLint * v); /* 518 */ + void (GLAPIENTRYP WindowPos2sMESA)(GLshort x, GLshort y); /* 519 */ + void (GLAPIENTRYP WindowPos2svMESA)(const GLshort * v); /* 520 */ + void (GLAPIENTRYP WindowPos3dMESA)(GLdouble x, GLdouble y, GLdouble z); /* 521 */ + void (GLAPIENTRYP WindowPos3dvMESA)(const GLdouble * v); /* 522 */ + void (GLAPIENTRYP WindowPos3fMESA)(GLfloat x, GLfloat y, GLfloat z); /* 523 */ + void (GLAPIENTRYP WindowPos3fvMESA)(const GLfloat * v); /* 524 */ + void (GLAPIENTRYP WindowPos3iMESA)(GLint x, GLint y, GLint z); /* 525 */ + void (GLAPIENTRYP WindowPos3ivMESA)(const GLint * v); /* 526 */ + void (GLAPIENTRYP WindowPos3sMESA)(GLshort x, GLshort y, GLshort z); /* 527 */ + void (GLAPIENTRYP WindowPos3svMESA)(const GLshort * v); /* 528 */ + void (GLAPIENTRYP WindowPos4dMESA)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 529 */ + void (GLAPIENTRYP WindowPos4dvMESA)(const GLdouble * v); /* 530 */ + void (GLAPIENTRYP WindowPos4fMESA)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 531 */ + void (GLAPIENTRYP WindowPos4fvMESA)(const GLfloat * v); /* 532 */ + void (GLAPIENTRYP WindowPos4iMESA)(GLint x, GLint y, GLint z, GLint w); /* 533 */ + void (GLAPIENTRYP WindowPos4ivMESA)(const GLint * v); /* 534 */ + void (GLAPIENTRYP WindowPos4sMESA)(GLshort x, GLshort y, GLshort z, GLshort w); /* 535 */ + void (GLAPIENTRYP WindowPos4svMESA)(const GLshort * v); /* 536 */ + void (GLAPIENTRYP BlendFuncSeparateEXT)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); /* 537 */ + void (GLAPIENTRYP IndexMaterialEXT)(GLenum face, GLenum mode); /* 538 */ + void (GLAPIENTRYP IndexFuncEXT)(GLenum func, GLclampf ref); /* 539 */ + void (GLAPIENTRYP LockArraysEXT)(GLint first, GLsizei count); /* 540 */ + void (GLAPIENTRYP UnlockArraysEXT)(void); /* 541 */ + void (GLAPIENTRYP CullParameterdvEXT)(GLenum pname, GLdouble * params); /* 542 */ + void (GLAPIENTRYP CullParameterfvEXT)(GLenum pname, GLfloat * params); /* 543 */ + void (GLAPIENTRYP HintPGI)(GLenum target, GLint mode); /* 544 */ + void (GLAPIENTRYP FogCoordfEXT)(GLfloat coord); /* 545 */ + void (GLAPIENTRYP FogCoordfvEXT)(const GLfloat * coord); /* 546 */ + void (GLAPIENTRYP FogCoorddEXT)(GLdouble coord); /* 547 */ + void (GLAPIENTRYP FogCoorddvEXT)(const GLdouble * coord); /* 548 */ + void (GLAPIENTRYP FogCoordPointerEXT)(GLenum type, GLsizei stride, const GLvoid * pointer); /* 549 */ + void (GLAPIENTRYP GetColorTableEXT)(GLenum target, GLenum format, GLenum type, GLvoid * data); /* 550 */ + void (GLAPIENTRYP GetColorTableParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 551 */ + void (GLAPIENTRYP GetColorTableParameterfvEXT)(GLenum target, GLenum pname, GLfloat * params); /* 552 */ + void (GLAPIENTRYP TbufferMask3DFX)(GLuint mask); /* 553 */ + void (GLAPIENTRYP CompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data); /* 554 */ + void (GLAPIENTRYP CompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data); /* 555 */ + void (GLAPIENTRYP CompressedTexImage1DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data); /* 556 */ + void (GLAPIENTRYP CompressedTexSubImage3DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data); /* 557 */ + void (GLAPIENTRYP CompressedTexSubImage2DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data); /* 558 */ + void (GLAPIENTRYP CompressedTexSubImage1DARB)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data); /* 559 */ + void (GLAPIENTRYP GetCompressedTexImageARB)(GLenum target, GLint level, GLvoid * img); /* 560 */ + void (GLAPIENTRYP SecondaryColor3bEXT)(GLbyte red, GLbyte green, GLbyte blue); /* 561 */ + void (GLAPIENTRYP SecondaryColor3bvEXT)(const GLbyte * v); /* 562 */ + void (GLAPIENTRYP SecondaryColor3dEXT)(GLdouble red, GLdouble green, GLdouble blue); /* 563 */ + void (GLAPIENTRYP SecondaryColor3dvEXT)(const GLdouble * v); /* 564 */ + void (GLAPIENTRYP SecondaryColor3fEXT)(GLfloat red, GLfloat green, GLfloat blue); /* 565 */ + void (GLAPIENTRYP SecondaryColor3fvEXT)(const GLfloat * v); /* 566 */ + void (GLAPIENTRYP SecondaryColor3iEXT)(GLint red, GLint green, GLint blue); /* 567 */ + void (GLAPIENTRYP SecondaryColor3ivEXT)(const GLint * v); /* 568 */ + void (GLAPIENTRYP SecondaryColor3sEXT)(GLshort red, GLshort green, GLshort blue); /* 569 */ + void (GLAPIENTRYP SecondaryColor3svEXT)(const GLshort * v); /* 570 */ + void (GLAPIENTRYP SecondaryColor3ubEXT)(GLubyte red, GLubyte green, GLubyte blue); /* 571 */ + void (GLAPIENTRYP SecondaryColor3ubvEXT)(const GLubyte * v); /* 572 */ + void (GLAPIENTRYP SecondaryColor3uiEXT)(GLuint red, GLuint green, GLuint blue); /* 573 */ + void (GLAPIENTRYP SecondaryColor3uivEXT)(const GLuint * v); /* 574 */ + void (GLAPIENTRYP SecondaryColor3usEXT)(GLushort red, GLushort green, GLushort blue); /* 575 */ + void (GLAPIENTRYP SecondaryColor3usvEXT)(const GLushort * v); /* 576 */ + void (GLAPIENTRYP SecondaryColorPointerEXT)(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 577 */ + GLboolean (GLAPIENTRYP AreProgramsResidentNV)(GLsizei n, const GLuint * ids, GLboolean * residences); /* 578 */ + void (GLAPIENTRYP BindProgramNV)(GLenum target, GLuint id); /* 579 */ + void (GLAPIENTRYP DeleteProgramsNV)(GLsizei n, const GLuint * ids); /* 580 */ + void (GLAPIENTRYP ExecuteProgramNV)(GLenum target, GLuint id, const GLfloat * params); /* 581 */ + void (GLAPIENTRYP GenProgramsNV)(GLsizei n, GLuint * ids); /* 582 */ + void (GLAPIENTRYP GetProgramParameterdvNV)(GLenum target, GLuint index, GLenum pname, GLdouble * params); /* 583 */ + void (GLAPIENTRYP GetProgramParameterfvNV)(GLenum target, GLuint index, GLenum pname, GLfloat * params); /* 584 */ + void (GLAPIENTRYP GetProgramivNV)(GLuint id, GLenum pname, GLint * params); /* 585 */ + void (GLAPIENTRYP GetProgramStringNV)(GLuint id, GLenum pname, GLubyte * program); /* 586 */ + void (GLAPIENTRYP GetTrackMatrixivNV)(GLenum target, GLuint address, GLenum pname, GLint * params); /* 587 */ + void (GLAPIENTRYP GetVertexAttribdvNV)(GLuint index, GLenum pname, GLdouble * params); /* 588 */ + void (GLAPIENTRYP GetVertexAttribfvNV)(GLuint index, GLenum pname, GLfloat * params); /* 589 */ + void (GLAPIENTRYP GetVertexAttribivNV)(GLuint index, GLenum pname, GLint * params); /* 590 */ + void (GLAPIENTRYP GetVertexAttribPointervNV)(GLuint index, GLenum pname, GLvoid ** pointer); /* 591 */ + GLboolean (GLAPIENTRYP IsProgramNV)(GLuint id); /* 592 */ + void (GLAPIENTRYP LoadProgramNV)(GLenum target, GLuint id, GLsizei len, const GLubyte * program); /* 593 */ + void (GLAPIENTRYP ProgramParameter4dNV)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 594 */ + void (GLAPIENTRYP ProgramParameter4dvNV)(GLenum target, GLuint index, const GLdouble * params); /* 595 */ + void (GLAPIENTRYP ProgramParameter4fNV)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 596 */ + void (GLAPIENTRYP ProgramParameter4fvNV)(GLenum target, GLuint index, const GLfloat * params); /* 597 */ + void (GLAPIENTRYP ProgramParameters4dvNV)(GLenum target, GLuint index, GLuint num, const GLdouble * params); /* 598 */ + void (GLAPIENTRYP ProgramParameters4fvNV)(GLenum target, GLuint index, GLuint num, const GLfloat * params); /* 599 */ + void (GLAPIENTRYP RequestResidentProgramsNV)(GLsizei n, const GLuint * ids); /* 600 */ + void (GLAPIENTRYP TrackMatrixNV)(GLenum target, GLuint address, GLenum matrix, GLenum transform); /* 601 */ + void (GLAPIENTRYP VertexAttribPointerNV)(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 602 */ + void (GLAPIENTRYP VertexAttrib1dNV)(GLuint index, GLdouble x); /* 603 */ + void (GLAPIENTRYP VertexAttrib1dvNV)(GLuint index, const GLdouble * v); /* 604 */ + void (GLAPIENTRYP VertexAttrib1fNV)(GLuint index, GLfloat x); /* 605 */ + void (GLAPIENTRYP VertexAttrib1fvNV)(GLuint index, const GLfloat * v); /* 606 */ + void (GLAPIENTRYP VertexAttrib1sNV)(GLuint index, GLshort x); /* 607 */ + void (GLAPIENTRYP VertexAttrib1svNV)(GLuint index, const GLshort * v); /* 608 */ + void (GLAPIENTRYP VertexAttrib2dNV)(GLuint index, GLdouble x, GLdouble y); /* 609 */ + void (GLAPIENTRYP VertexAttrib2dvNV)(GLuint index, const GLdouble * v); /* 610 */ + void (GLAPIENTRYP VertexAttrib2fNV)(GLuint index, GLfloat x, GLfloat y); /* 611 */ + void (GLAPIENTRYP VertexAttrib2fvNV)(GLuint index, const GLfloat * v); /* 612 */ + void (GLAPIENTRYP VertexAttrib2sNV)(GLuint index, GLshort x, GLshort y); /* 613 */ + void (GLAPIENTRYP VertexAttrib2svNV)(GLuint index, const GLshort * v); /* 614 */ + void (GLAPIENTRYP VertexAttrib3dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z); /* 615 */ + void (GLAPIENTRYP VertexAttrib3dvNV)(GLuint index, const GLdouble * v); /* 616 */ + void (GLAPIENTRYP VertexAttrib3fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z); /* 617 */ + void (GLAPIENTRYP VertexAttrib3fvNV)(GLuint index, const GLfloat * v); /* 618 */ + void (GLAPIENTRYP VertexAttrib3sNV)(GLuint index, GLshort x, GLshort y, GLshort z); /* 619 */ + void (GLAPIENTRYP VertexAttrib3svNV)(GLuint index, const GLshort * v); /* 620 */ + void (GLAPIENTRYP VertexAttrib4dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 621 */ + void (GLAPIENTRYP VertexAttrib4dvNV)(GLuint index, const GLdouble * v); /* 622 */ + void (GLAPIENTRYP VertexAttrib4fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 623 */ + void (GLAPIENTRYP VertexAttrib4fvNV)(GLuint index, const GLfloat * v); /* 624 */ + void (GLAPIENTRYP VertexAttrib4sNV)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); /* 625 */ + void (GLAPIENTRYP VertexAttrib4svNV)(GLuint index, const GLshort * v); /* 626 */ + void (GLAPIENTRYP VertexAttrib4ubNV)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); /* 627 */ + void (GLAPIENTRYP VertexAttrib4ubvNV)(GLuint index, const GLubyte * v); /* 628 */ + void (GLAPIENTRYP VertexAttribs1dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 629 */ + void (GLAPIENTRYP VertexAttribs1fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 630 */ + void (GLAPIENTRYP VertexAttribs1svNV)(GLuint index, GLsizei n, const GLshort * v); /* 631 */ + void (GLAPIENTRYP VertexAttribs2dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 632 */ + void (GLAPIENTRYP VertexAttribs2fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 633 */ + void (GLAPIENTRYP VertexAttribs2svNV)(GLuint index, GLsizei n, const GLshort * v); /* 634 */ + void (GLAPIENTRYP VertexAttribs3dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 635 */ + void (GLAPIENTRYP VertexAttribs3fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 636 */ + void (GLAPIENTRYP VertexAttribs3svNV)(GLuint index, GLsizei n, const GLshort * v); /* 637 */ + void (GLAPIENTRYP VertexAttribs4dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 638 */ + void (GLAPIENTRYP VertexAttribs4fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 639 */ + void (GLAPIENTRYP VertexAttribs4svNV)(GLuint index, GLsizei n, const GLshort * v); /* 640 */ + void (GLAPIENTRYP VertexAttribs4ubvNV)(GLuint index, GLsizei n, const GLubyte * v); /* 641 */ + void (GLAPIENTRYP PointParameteriNV)(GLenum pname, GLint params); /* 642 */ + void (GLAPIENTRYP PointParameterivNV)(GLenum pname, const GLint * params); /* 643 */ + void (GLAPIENTRYP MultiDrawArraysEXT)(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount); /* 644 */ + void (GLAPIENTRYP MultiDrawElementsEXT)(GLenum mode, const GLsizei * count, GLenum type, const GLvoid ** indices, GLsizei primcount); /* 645 */ + void (GLAPIENTRYP ActiveStencilFaceEXT)(GLenum face); /* 646 */ + void (GLAPIENTRYP DeleteFencesNV)(GLsizei n, const GLuint * fences); /* 647 */ + void (GLAPIENTRYP GenFencesNV)(GLsizei n, GLuint * fences); /* 648 */ + GLboolean (GLAPIENTRYP IsFenceNV)(GLuint fence); /* 649 */ + GLboolean (GLAPIENTRYP TestFenceNV)(GLuint fence); /* 650 */ + void (GLAPIENTRYP GetFenceivNV)(GLuint fence, GLenum pname, GLint * params); /* 651 */ + void (GLAPIENTRYP FinishFenceNV)(GLuint fence); /* 652 */ + void (GLAPIENTRYP SetFenceNV)(GLuint fence, GLenum condition); /* 653 */ + void (GLAPIENTRYP VertexAttrib4bvARB)(GLuint index, const GLbyte * v); /* 654 */ + void (GLAPIENTRYP VertexAttrib4ivARB)(GLuint index, const GLint * v); /* 655 */ + void (GLAPIENTRYP VertexAttrib4ubvARB)(GLuint index, const GLubyte * v); /* 656 */ + void (GLAPIENTRYP VertexAttrib4usvARB)(GLuint index, const GLushort * v); /* 657 */ + void (GLAPIENTRYP VertexAttrib4uivARB)(GLuint index, const GLuint * v); /* 658 */ + void (GLAPIENTRYP VertexAttrib4NbvARB)(GLuint index, const GLbyte * v); /* 659 */ + void (GLAPIENTRYP VertexAttrib4NsvARB)(GLuint index, const GLshort * v); /* 660 */ + void (GLAPIENTRYP VertexAttrib4NivARB)(GLuint index, const GLint * v); /* 661 */ + void (GLAPIENTRYP VertexAttrib4NusvARB)(GLuint index, const GLushort * v); /* 662 */ + void (GLAPIENTRYP VertexAttrib4NuivARB)(GLuint index, const GLuint * v); /* 663 */ + void (GLAPIENTRYP VertexAttribPointerARB)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer); /* 664 */ + void (GLAPIENTRYP EnableVertexAttribArrayARB)(GLuint index); /* 665 */ + void (GLAPIENTRYP DisableVertexAttribArrayARB)(GLuint index); /* 666 */ + void (GLAPIENTRYP ProgramStringARB)(GLenum target, GLenum format, GLsizei len, const GLvoid * string); /* 667 */ + void (GLAPIENTRYP ProgramEnvParameter4dARB)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 668 */ + void (GLAPIENTRYP ProgramEnvParameter4dvARB)(GLenum target, GLuint index, const GLdouble * params); /* 669 */ + void (GLAPIENTRYP ProgramEnvParameter4fARB)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 670 */ + void (GLAPIENTRYP ProgramEnvParameter4fvARB)(GLenum target, GLuint index, const GLfloat * params); /* 671 */ + void (GLAPIENTRYP ProgramLocalParameter4dARB)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 672 */ + void (GLAPIENTRYP ProgramLocalParameter4dvARB)(GLenum target, GLuint index, const GLdouble * params); /* 673 */ + void (GLAPIENTRYP ProgramLocalParameter4fARB)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 674 */ + void (GLAPIENTRYP ProgramLocalParameter4fvARB)(GLenum target, GLuint index, const GLfloat * params); /* 675 */ + void (GLAPIENTRYP GetProgramEnvParameterdvARB)(GLenum target, GLuint index, GLdouble * params); /* 676 */ + void (GLAPIENTRYP GetProgramEnvParameterfvARB)(GLenum target, GLuint index, GLfloat * params); /* 677 */ + void (GLAPIENTRYP GetProgramLocalParameterdvARB)(GLenum target, GLuint index, GLdouble * params); /* 678 */ + void (GLAPIENTRYP GetProgramLocalParameterfvARB)(GLenum target, GLuint index, GLfloat * params); /* 679 */ + void (GLAPIENTRYP GetProgramivARB)(GLenum target, GLenum pname, GLint * params); /* 680 */ + void (GLAPIENTRYP GetProgramStringARB)(GLenum target, GLenum pname, GLvoid * string); /* 681 */ + void (GLAPIENTRYP ProgramNamedParameter4fNV)(GLuint id, GLsizei len, const GLubyte * name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 682 */ + void (GLAPIENTRYP ProgramNamedParameter4dNV)(GLuint id, GLsizei len, const GLubyte * name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 683 */ + void (GLAPIENTRYP ProgramNamedParameter4fvNV)(GLuint id, GLsizei len, const GLubyte * name, const GLfloat * v); /* 684 */ + void (GLAPIENTRYP ProgramNamedParameter4dvNV)(GLuint id, GLsizei len, const GLubyte * name, const GLdouble * v); /* 685 */ + void (GLAPIENTRYP GetProgramNamedParameterfvNV)(GLuint id, GLsizei len, const GLubyte * name, GLfloat * params); /* 686 */ + void (GLAPIENTRYP GetProgramNamedParameterdvNV)(GLuint id, GLsizei len, const GLubyte * name, GLdouble * params); /* 687 */ + void (GLAPIENTRYP BindBufferARB)(GLenum target, GLuint buffer); /* 688 */ + void (GLAPIENTRYP BufferDataARB)(GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage); /* 689 */ + void (GLAPIENTRYP BufferSubDataARB)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data); /* 690 */ + void (GLAPIENTRYP DeleteBuffersARB)(GLsizei n, const GLuint * buffer); /* 691 */ + void (GLAPIENTRYP GenBuffersARB)(GLsizei n, GLuint * buffer); /* 692 */ + void (GLAPIENTRYP GetBufferParameterivARB)(GLenum target, GLenum pname, GLint * params); /* 693 */ + void (GLAPIENTRYP GetBufferPointervARB)(GLenum target, GLenum pname, GLvoid ** params); /* 694 */ + void (GLAPIENTRYP GetBufferSubDataARB)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data); /* 695 */ + GLboolean (GLAPIENTRYP IsBufferARB)(GLuint buffer); /* 696 */ + void * (GLAPIENTRYP MapBufferARB)(GLenum target, GLenum access); /* 697 */ + GLboolean (GLAPIENTRYP UnmapBufferARB)(GLenum target); /* 698 */ + void (GLAPIENTRYP DepthBoundsEXT)(GLclampd zmin, GLclampd zmax); /* 699 */ + void (GLAPIENTRYP GenQueriesARB)(GLsizei n, GLuint * ids); /* 700 */ + void (GLAPIENTRYP DeleteQueriesARB)(GLsizei n, const GLuint * ids); /* 701 */ + GLboolean (GLAPIENTRYP IsQueryARB)(GLuint id); /* 702 */ + void (GLAPIENTRYP BeginQueryARB)(GLenum target, GLuint id); /* 703 */ + void (GLAPIENTRYP EndQueryARB)(GLenum target); /* 704 */ + void (GLAPIENTRYP GetQueryivARB)(GLenum target, GLenum pname, GLint * params); /* 705 */ + void (GLAPIENTRYP GetQueryObjectivARB)(GLuint id, GLenum pname, GLint * params); /* 706 */ + void (GLAPIENTRYP GetQueryObjectuivARB)(GLuint id, GLenum pname, GLuint * params); /* 707 */ + void (GLAPIENTRYP MultiModeDrawArraysIBM)(const GLenum * mode, const GLint * first, const GLsizei * count, GLsizei primcount, GLint modestride); /* 708 */ + void (GLAPIENTRYP MultiModeDrawElementsIBM)(const GLenum * mode, const GLsizei * count, GLenum type, const GLvoid * const * indices, GLsizei primcount, GLint modestride); /* 709 */ }; #endif diff --git a/src/mesa/glapi/gltable.py b/src/mesa/glapi/gltable.py index 54dacb18d2c..9fb57c86d18 100644 --- a/src/mesa/glapi/gltable.py +++ b/src/mesa/glapi/gltable.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# $Id: gltable.py,v 1.3 2001/11/18 22:42:57 brianp Exp $ +# $Id: gltable.py,v 1.3.14.1 2003/11/21 15:49:38 keithw Exp $ # Mesa 3-D graphics library # Version: 4.1 @@ -77,7 +77,7 @@ def PrintRecords(): pass prevk = int(k) (name, returnType, argList) = records[k] - print ' %s (*%s)(%s); /* %d */' % (returnType, name, argList, k) + print ' %s (GLAPIENTRYP %s)(%s); /* %d */' % (returnType, name, argList, k) #endef diff --git a/src/mesa/glapi/glx86asm.py b/src/mesa/glapi/glx86asm.py index f881abeea94..cd3123e673c 100644 --- a/src/mesa/glapi/glx86asm.py +++ b/src/mesa/glapi/glx86asm.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# $Id: glx86asm.py,v 1.6 2002/06/11 01:26:58 brianp Exp $ +# $Id: glx86asm.py,v 1.6.14.1 2003/11/21 15:49:38 keithw Exp $ # Mesa 3-D graphics library # Version: 4.1 @@ -43,21 +43,24 @@ def PrintHead(): print '#include "glapioffsets.h"' print '' print '#ifndef __WIN32__' - print '' - print '#if defined(USE_MGL_NAMESPACE)' - print '#define GL_PREFIX(n) GLNAME(CONCAT(mgl,n))' + print '' + print '#if defined(STDCALL_API)' + print '#define GL_PREFIX(n,n2) GLNAME(CONCAT(gl,n2))' + print '#elif defined(USE_MGL_NAMESPACE)' + print '#define GL_PREFIX(n,n2) GLNAME(CONCAT(mgl,n))' print '#else' - print '#define GL_PREFIX(n) GLNAME(CONCAT(gl,n))' + print '#define GL_PREFIX(n,n2) GLNAME(CONCAT(gl,n))' print '#endif' print '' print '#define GL_OFFSET(x) CODEPTR(REGOFF(4 * x, EAX))' print '' - print '#if defined(GNU_ASSEMBLER) && !defined(DJGPP)' + print '#if defined(GNU_ASSEMBLER) && !defined(__DJGPP__) && !defined(__MINGW32__)' print '#define GLOBL_FN(x) GLOBL x ; .type x,@function' print '#else' print '#define GLOBL_FN(x) GLOBL x' print '#endif' print '' + print 'SEG_TEXT' print '' print 'EXTERN GLNAME(_glapi_Dispatch)' print '' @@ -83,6 +86,19 @@ def FindOffset(funcName): return -1 #enddef +# Find the size of the arguments on the stack for _stdcall name mangling +def FindStackSize(typeList): + result = 0 + for typ in typeList: + if typ == 'GLdouble' or typ == 'GLclampd': + result += 8; + else: + result += 4; + #endif + #endfor + return result +#enddef + def EmitFunction(name, returnType, argTypeList, argNameList, alias, offset): argList = apiparser.MakeArgList(argTypeList, argNameList) if alias != '': @@ -104,18 +120,18 @@ def EmitFunction(name, returnType, argTypeList, argNameList, alias, offset): # save this info in case we need to look up an alias later records.append((name, dispatchName, offset)) + # Find the argument stack size for _stdcall name mangling + stackSize = FindStackSize(argTypeList) + # print the assembly code print 'ALIGNTEXT16' - print "GLOBL_FN(GL_PREFIX(%s))" % (name) - print "GL_PREFIX(%s):" % (name) + print "GLOBL_FN(GL_PREFIX(%s,%s@%s))" % (name, name, stackSize) + print "GL_PREFIX(%s,%s@%s):" % (name, name, stackSize) print '\tMOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX)' print "\tJMP(GL_OFFSET(_gloffset_%s))" % (dispatchName) print '' - #enddef - - PrintHead() apiparser.ProcessSpecFile("APIspec", EmitFunction) PrintTail() diff --git a/src/mesa/main/Makefile.OSMesa16 b/src/mesa/main/Makefile.OSMesa16 deleted file mode 100644 index 206c4d9376e..00000000000 --- a/src/mesa/main/Makefile.OSMesa16 +++ /dev/null @@ -1,221 +0,0 @@ - -# Mesa 3-D graphics library -# Version: 5.1 -# Copyright (C) 1995-2003 Brian Paul - -# Makefile for building Mesa for 16/32-bit/channel rendering with the OSMesa -# driver. - - -##### MACROS ##### - -GL_MAJOR = 1 -GL_MINOR = 4 -GL_TINY = 0$(MESA_MAJOR)0$(MESA_MINOR)0$(MESA_TINY) - -VPATH = RCS - -INCDIR = ../include -LIBDIR = ../lib - - - -CORE_SOURCES = \ - api_arrayelt.c \ - api_loopback.c \ - api_noop.c \ - api_validate.c \ - accum.c \ - arbprogram.c \ - attrib.c \ - blend.c \ - bufferobj.c \ - buffers.c \ - clip.c \ - colortab.c \ - context.c \ - convolve.c \ - debug.c \ - depth.c \ - dispatch.c \ - dlist.c \ - drawpix.c \ - enable.c \ - enums.c \ - eval.c \ - extensions.c \ - feedback.c \ - fog.c \ - get.c \ - glapi.c \ - glthread.c \ - hash.c \ - hint.c \ - histogram.c \ - image.c \ - imports.c \ - light.c \ - lines.c \ - matrix.c \ - nvprogram.c \ - nvfragparse.c \ - nvvertexec.c \ - nvvertparse.c \ - pixel.c \ - points.c \ - polygon.c \ - rastpos.c \ - state.c \ - stencil.c \ - texcompress.c \ - texformat.c \ - teximage.c \ - texobj.c \ - texstate.c \ - texstore.c \ - texutil.c \ - varray.c \ - vtxfmt.c \ - X86/x86.c \ - X86/common_x86.c \ - X86/3dnow.c \ - X86/sse.c \ - math/m_debug_clip.c \ - math/m_debug_norm.c \ - math/m_debug_xform.c \ - math/m_eval.c \ - math/m_matrix.c \ - math/m_translate.c \ - math/m_vector.c \ - math/m_xform.c \ - array_cache/ac_context.c \ - array_cache/ac_import.c \ - swrast/s_aaline.c \ - swrast/s_aatriangle.c \ - swrast/s_accum.c \ - swrast/s_alpha.c \ - swrast/s_alphabuf.c \ - swrast/s_bitmap.c \ - swrast/s_blend.c \ - swrast/s_buffers.c \ - swrast/s_copypix.c \ - swrast/s_context.c \ - swrast/s_depth.c \ - swrast/s_drawpix.c \ - swrast/s_feedback.c \ - swrast/s_fog.c \ - swrast/s_imaging.c \ - swrast/s_lines.c \ - swrast/s_logic.c \ - swrast/s_masking.c \ - swrast/s_nvfragprog.c \ - swrast/s_pixeltex.c \ - swrast/s_points.c \ - swrast/s_readpix.c \ - swrast/s_span.c \ - swrast/s_stencil.c \ - swrast/s_texture.c \ - swrast/s_texstore.c \ - swrast/s_triangle.c \ - swrast/s_zoom.c \ - swrast_setup/ss_context.c \ - swrast_setup/ss_triangle.c \ - swrast_setup/ss_vb.c \ - tnl/t_array_api.c \ - tnl/t_array_import.c \ - tnl/t_context.c \ - tnl/t_eval_api.c \ - tnl/t_imm_alloc.c \ - tnl/t_imm_api.c \ - tnl/t_imm_debug.c \ - tnl/t_imm_dlist.c \ - tnl/t_imm_elt.c \ - tnl/t_imm_eval.c \ - tnl/t_imm_exec.c \ - tnl/t_imm_fixup.c \ - tnl/t_pipeline.c \ - tnl/t_vb_fog.c \ - tnl/t_vb_light.c \ - tnl/t_vb_normals.c \ - tnl/t_vb_points.c \ - tnl/t_vb_program.c \ - tnl/t_vb_render.c \ - tnl/t_vb_texgen.c \ - tnl/t_vb_texmat.c \ - tnl/t_vb_vertex.c \ - OSmesa/osmesa.c - -ASM_SOURCES = - -ADDITIONAL_OBJ = - -OBJECTS = $(ASM_SOURCES:.S=.o) \ - $(CORE_SOURCES:.c=.o) \ - $(ADDITIONAL_OBJ) - - - -##### RULES ##### - -.c.o: - $(CC) -c -I. -I$(INCDIR) $(CFLAGS) $< -o $@ - -.S.o: - $(CC) -c -I. $(CFLAGS) $< -o $@ - - -OSmesa/osmesa.o: OSmesa/osmesa.c - $(CC) -c -I. -I$(INCDIR) $(CFLAGS) $< -o $@ - -X86/x86.o: X86/x86.c - $(CC) -c -I. -I$(INCDIR) $(CFLAGS) $< -o $@ -X86/common_x86.o: X86/common_x86.c - $(CC) -c -I. -I$(INCDIR) $(CFLAGS) $< -o $@ -X86/common_x86_asm.o: X86/common_x86_asm.S X86/matypes.h -X86/3dnow.o: X86/3dnow.c - $(CC) -c -I. -I$(INCDIR) $(CFLAGS) $< -o $@ -X86/sse.o: X86/sse.c - $(CC) -c -I. -I$(INCDIR) $(CFLAGS) $< -o $@ -X86/matypes.h: mtypes.h tnl/t_context.h X86/gen_matypes.c - $(CC) -I. -I$(INCDIR) $(CFLAGS) X86/gen_matypes.c -o X86/gen_matypes - ./X86/gen_matypes > X86/matypes.h - rm -f X86/gen_matypes X86/*.o - -# We have X86/matypes.h depend on X86/matypes.h so that if ASM_SOURCES -# is empty we don't get an invalid Makefile. -$(ASM_SOURCES) X86/matypes.h: X86/matypes.h - - -##### TARGETS ##### - -#default: -# @echo "Specify a target configuration" - -clean: - -rm -f *.o *~ */*.o */*~ *.lo *.la - -rm -rf .libs - -targets: $(LIBDIR)/$(OSMESA16_LIB) - -# Make the 16-bit/channel OSMesa library -$(LIBDIR)/$(OSMESA16_LIB): $(OBJECTS) - $(MAKELIB) $(OSMESA16_LIB) $(GL_MAJOR) $(GL_MINOR) $(GL_TINY) $(OBJECTS) - rm -f $(LIBDIR)/$(OSMESA16_LIB)* - mv $(OSMESA16_LIB)* $(LIBDIR) - - -include ../Make-config - -include depend - - - -# -# Run 'make dep' to update the dependencies if you change what's included -# by any source file. -# -dep: $(CORE_SOURCES) - makedepend -fdepend -Y -I../include $(CORE_SOURCES) - -tags: - etags `find . -name \*.[ch]` `find ../include` diff --git a/src/mesa/main/Makefile.X11 b/src/mesa/main/Makefile.X11 deleted file mode 100644 index 1f9bd666d5d..00000000000 --- a/src/mesa/main/Makefile.X11 +++ /dev/null @@ -1,265 +0,0 @@ -# Makefile for GL library - - -##### MACROS ##### - -GL_MAJOR = 1 -GL_MINOR = 4 -GL_TINY = 0$(MESA_MAJOR)0$(MESA_MINOR)0$(MESA_TINY) - -GL_LIB_NAME = "GL" # may be overridden in Make-config -OSMESA_LIB_NAME = "OSMesa" # may be overridden in Make-config - -VPATH = RCS - -TOP = .. -INCDIR = $(TOP)/include -LIBDIR = $(TOP)/lib - - - -CORE_SOURCES = \ - api_arrayelt.c \ - api_loopback.c \ - api_noop.c \ - api_validate.c \ - accum.c \ - arbprogram.c \ - attrib.c \ - blend.c \ - bufferobj.c \ - buffers.c \ - clip.c \ - colortab.c \ - context.c \ - convolve.c \ - debug.c \ - depth.c \ - dispatch.c \ - dlist.c \ - drawpix.c \ - enable.c \ - enums.c \ - eval.c \ - extensions.c \ - feedback.c \ - fog.c \ - get.c \ - glapi.c \ - glthread.c \ - hash.c \ - hint.c \ - histogram.c \ - image.c \ - imports.c \ - light.c \ - lines.c \ - matrix.c \ - nvprogram.c \ - nvfragparse.c \ - nvvertexec.c \ - nvvertparse.c \ - pixel.c \ - points.c \ - polygon.c \ - program.c \ - rastpos.c \ - state.c \ - stencil.c \ - texcompress.c \ - texformat.c \ - teximage.c \ - texobj.c \ - texstate.c \ - texstore.c \ - texutil.c \ - varray.c \ - vtxfmt.c \ - X86/x86.c \ - X86/common_x86.c \ - X86/3dnow.c \ - X86/sse.c \ - math/m_debug_clip.c \ - math/m_debug_norm.c \ - math/m_debug_xform.c \ - math/m_eval.c \ - math/m_matrix.c \ - math/m_translate.c \ - math/m_vector.c \ - math/m_xform.c \ - array_cache/ac_context.c \ - array_cache/ac_import.c \ - swrast/s_aaline.c \ - swrast/s_aatriangle.c \ - swrast/s_accum.c \ - swrast/s_alpha.c \ - swrast/s_alphabuf.c \ - swrast/s_bitmap.c \ - swrast/s_blend.c \ - swrast/s_buffers.c \ - swrast/s_copypix.c \ - swrast/s_context.c \ - swrast/s_depth.c \ - swrast/s_drawpix.c \ - swrast/s_feedback.c \ - swrast/s_fog.c \ - swrast/s_imaging.c \ - swrast/s_lines.c \ - swrast/s_logic.c \ - swrast/s_masking.c \ - swrast/s_nvfragprog.c \ - swrast/s_pixeltex.c \ - swrast/s_points.c \ - swrast/s_readpix.c \ - swrast/s_span.c \ - swrast/s_stencil.c \ - swrast/s_texture.c \ - swrast/s_texstore.c \ - swrast/s_triangle.c \ - swrast/s_zoom.c \ - swrast_setup/ss_context.c \ - swrast_setup/ss_triangle.c \ - swrast_setup/ss_vb.c \ - tnl/t_array_api.c \ - tnl/t_array_import.c \ - tnl/t_context.c \ - tnl/t_eval_api.c \ - tnl/t_imm_alloc.c \ - tnl/t_imm_api.c \ - tnl/t_imm_debug.c \ - tnl/t_imm_dlist.c \ - tnl/t_imm_elt.c \ - tnl/t_imm_eval.c \ - tnl/t_imm_exec.c \ - tnl/t_imm_fixup.c \ - tnl/t_pipeline.c \ - tnl/t_vb_fog.c \ - tnl/t_vb_light.c \ - tnl/t_vb_normals.c \ - tnl/t_vb_points.c \ - tnl/t_vb_program.c \ - tnl/t_vb_render.c \ - tnl/t_vb_texgen.c \ - tnl/t_vb_texmat.c \ - tnl/t_vb_vertex.c - - -DRIVER_SOURCES = \ - FX/fxapi.c \ - FX/fxdd.c \ - FX/fxddspan.c \ - FX/fxddtex.c \ - FX/fxsetup.c \ - FX/fxtexman.c \ - FX/fxtris.c \ - FX/fxvb.c \ - FX/fxglidew.c \ - X/glxapi.c \ - X/fakeglx.c \ - X/xfonts.c \ - X/xm_api.c \ - X/xm_dd.c \ - X/xm_line.c \ - X/xm_span.c \ - X/xm_tri.c \ - SVGA/svgamesa.c \ - SVGA/svgamesa8.c \ - SVGA/svgamesa15.c \ - SVGA/svgamesa16.c \ - SVGA/svgamesa24.c \ - SVGA/svgamesa32.c - - -ASM_SOURCES = - -ADDITIONAL_OBJ = - -OBJECTS = $(ASM_SOURCES:.S=.o) \ - $(CORE_SOURCES:.c=.o) \ - $(DRIVER_SOURCES:.c=.o) \ - $(ADDITIONAL_OBJ) - -CORE_OBJECTS = $(CORE_SOURCES:.c=.o) - -OSMESA_SOURCES = OSmesa/osmesa.c -OSMESA_OBJECTS = OSmesa/osmesa.o - - - -##### RULES ##### - -.c.o: - $(CC) -c -I. -I$(INCDIR) $(CFLAGS) $< -o $@ - -.S.o: - $(CC) -c -I. $(CFLAGS) $< -o $@ - - -X86/x86.o: X86/x86.c - $(CC) -c -I. -I$(INCDIR) $(CFLAGS) $< -o $@ -X86/common_x86.o: X86/common_x86.c - $(CC) -c -I. -I$(INCDIR) $(CFLAGS) $< -o $@ -X86/common_x86_asm.o: X86/common_x86_asm.S X86/matypes.h -X86/3dnow.o: X86/3dnow.c - $(CC) -c -I. -I$(INCDIR) $(CFLAGS) $< -o $@ -X86/sse.o: X86/sse.c - $(CC) -c -I. -I$(INCDIR) $(CFLAGS) $< -o $@ -X86/matypes.h: mtypes.h tnl/t_context.h X86/gen_matypes.c - $(CC) -I. -I$(INCDIR) $(CFLAGS) X86/gen_matypes.c -o X86/gen_matypes - ./X86/gen_matypes > X86/matypes.h - rm -f X86/gen_matypes X86/*.o - -# We have X86/matypes.h depend on X86/matypes.h so that if ASM_SOURCES -# is empty we don't get an invalid Makefile. -$(ASM_SOURCES) X86/matypes.h: X86/matypes.h - - -##### TARGETS ##### - -#default: -# @echo "Specify a target configuration" - -clean: - -rm -f *.o *~ */*.o */*~ *.lo *.la - -rm -rf .libs - -targets: $(LIBDIR)/$(GL_LIB) $(LIBDIR)/$(OSMESA_LIB) - -# Make the GL library -$(LIBDIR)/$(GL_LIB): $(OBJECTS) - $(TOP)/bin/mklib -o $(GL_LIB_NAME) -major $(GL_MAJOR) \ - -minor $(GL_MINOR) -patch $(GL_TINY) -install $(LIBDIR) \ - $(GL_LIB_DEPS) $(OBJECTS) - - -# Make the OSMesa library -$(LIBDIR)/$(OSMESA_LIB): $(OSMESA_OBJECTS) $(LIBDIR)/$(GL_LIB) - if [ ${OSMESA_LIB} ] ; then $(TOP)/bin/mklib -o $(OSMESA_LIB_NAME) \ - -major $(MESA_MAJOR) -minor $(MESA_MINOR) -patch $(GL_TINY) \ - -L$(LIBDIR) -l$(GL_LIB_NAME) -install $(LIBDIR) \ - $(OSMESA_OBJECTS) ; fi - - -# Make an optional library with _just_ core objects -libmesa: $(LIBDIR)/$(MESA_LIB) - if [ ${MESA_LIB} ] ; then $(MAKELIB) $(MESA_LIB) $(MESA_MAJOR) $(MESA_MINOR) $(GL_TINY) $(CORE_OBJECTS) ; fi - if [ ${MESA_LIB} ] ; then rm -f $(LIBDIR)/$(MESA_LIB)* ; fi - if [ ${MESA_LIB} ] ; then mv $(MESA_LIB)* $(LIBDIR) ; fi - -$(LIBDIR)/$(MESA_LIB): $(CORE_OBJECTS) - -include $(TOP)/Make-config - -include depend - - - -# -# Run 'make dep' to update the dependencies if you change what's included -# by any source file. -# -dep: $(CORE_SOURCES) $(DRIVER_SOURCES) $(OSMESA_SOURCES) - makedepend -fdepend -Y -I$(TOP)/include -DGGI -DSVGA -DFX $(CORE_SOURCES) $(DRIVER_SOURCES) $(OSMESA_SOURCES) - -tags: - etags `find . -name \*.[ch]` `find $(TOP)/include` diff --git a/src/mesa/main/accum.c b/src/mesa/main/accum.c index 3ca7d27f83f..315bd33b61d 100644 --- a/src/mesa/main/accum.c +++ b/src/mesa/main/accum.c @@ -1,9 +1,8 @@ - /* * Mesa 3-D graphics library - * Version: 4.1 + * Version: 5.1 * - * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * Copyright (C) 1999-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"), @@ -32,7 +31,7 @@ #include "mtypes.h" -void +void GLAPIENTRY _mesa_ClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ) { GLfloat tmp[4]; @@ -51,9 +50,8 @@ _mesa_ClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ) COPY_4FV( ctx->Accum.ClearColor, tmp ); } -/* Should really be a driver-supplied function? - */ -void + +void GLAPIENTRY _mesa_Accum( GLenum op, GLfloat value ) { GET_CURRENT_CONTEXT(ctx); @@ -68,6 +66,11 @@ _mesa_Accum( GLenum op, GLfloat value ) if (ctx->NewState) _mesa_update_state( ctx ); + if (ctx->RenderMode != GL_RENDER) { + /* no-op */ + return; + } + /* Determine region to operate upon. */ if (ctx->Scissor.Enabled) { xpos = ctx->Scissor.X; diff --git a/src/mesa/main/accum.h b/src/mesa/main/accum.h index 625d0bfd61d..ce92688a5b9 100644 --- a/src/mesa/main/accum.h +++ b/src/mesa/main/accum.h @@ -42,11 +42,11 @@ #if _HAVE_FULL_GL -extern void +extern void GLAPIENTRY _mesa_Accum( GLenum op, GLfloat value ); -extern void +extern void GLAPIENTRY _mesa_ClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); extern void diff --git a/src/mesa/main/api_loopback.c b/src/mesa/main/api_loopback.c index 3dea1de9713..c163d668fdd 100644 --- a/src/mesa/main/api_loopback.c +++ b/src/mesa/main/api_loopback.c @@ -74,8 +74,7 @@ #define FOGCOORDF(x) _glapi_Dispatch->FogCoordfEXT(x) #define SECONDARYCOLORF(a,b,c) _glapi_Dispatch->SecondaryColor3fEXT(a,b,c) - -static void +static void GLAPIENTRY loopback_Color3b_f( GLbyte red, GLbyte green, GLbyte blue ) { COLORF( BYTE_TO_FLOAT(red), @@ -84,41 +83,41 @@ loopback_Color3b_f( GLbyte red, GLbyte green, GLbyte blue ) 1.0 ); } -static void +static void GLAPIENTRY loopback_Color3d_f( GLdouble red, GLdouble green, GLdouble blue ) { COLORF( (GLfloat) red, (GLfloat) green, (GLfloat) blue, 1.0 ); } -static void +static void GLAPIENTRY loopback_Color3i_f( GLint red, GLint green, GLint blue ) { COLORF( INT_TO_FLOAT(red), INT_TO_FLOAT(green), INT_TO_FLOAT(blue), 1.0); } -static void +static void GLAPIENTRY loopback_Color3s_f( GLshort red, GLshort green, GLshort blue ) { COLORF( SHORT_TO_FLOAT(red), SHORT_TO_FLOAT(green), SHORT_TO_FLOAT(blue), 1.0); } -static void +static void GLAPIENTRY loopback_Color3ui_f( GLuint red, GLuint green, GLuint blue ) { COLORF( UINT_TO_FLOAT(red), UINT_TO_FLOAT(green), UINT_TO_FLOAT(blue), 1.0 ); } -static void +static void GLAPIENTRY loopback_Color3us_f( GLushort red, GLushort green, GLushort blue ) { COLORF( USHORT_TO_FLOAT(red), USHORT_TO_FLOAT(green), USHORT_TO_FLOAT(blue), 1.0 ); } -static void +static void GLAPIENTRY loopback_Color3ub_f( GLubyte red, GLubyte green, GLubyte blue ) { COLORF( UBYTE_TO_FLOAT(red), UBYTE_TO_FLOAT(green), @@ -126,48 +125,48 @@ loopback_Color3ub_f( GLubyte red, GLubyte green, GLubyte blue ) } -static void +static void GLAPIENTRY loopback_Color3bv_f( const GLbyte *v ) { COLORF( BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]), BYTE_TO_FLOAT(v[2]), 1.0 ); } -static void +static void GLAPIENTRY loopback_Color3dv_f( const GLdouble *v ) { COLORF( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0 ); } -static void +static void GLAPIENTRY loopback_Color3iv_f( const GLint *v ) { COLORF( INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]), INT_TO_FLOAT(v[2]), INT_TO_FLOAT(v[3]) ); } -static void +static void GLAPIENTRY loopback_Color3sv_f( const GLshort *v ) { COLORF( SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]), SHORT_TO_FLOAT(v[2]), 1.0 ); } -static void +static void GLAPIENTRY loopback_Color3uiv_f( const GLuint *v ) { COLORF( UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1]), UINT_TO_FLOAT(v[2]), 1.0 ); } -static void +static void GLAPIENTRY loopback_Color3usv_f( const GLushort *v ) { COLORF( USHORT_TO_FLOAT(v[0]), USHORT_TO_FLOAT(v[1]), USHORT_TO_FLOAT(v[2]), 1.0 ); } -static void +static void GLAPIENTRY loopback_Color3ubv_f( const GLubyte *v ) { COLORF( UBYTE_TO_FLOAT(v[0]), UBYTE_TO_FLOAT(v[1]), @@ -175,7 +174,7 @@ loopback_Color3ubv_f( const GLubyte *v ) } -static void +static void GLAPIENTRY loopback_Color4b_f( GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha ) { @@ -183,21 +182,21 @@ loopback_Color4b_f( GLbyte red, GLbyte green, GLbyte blue, BYTE_TO_FLOAT(blue), BYTE_TO_FLOAT(alpha) ); } -static void +static void GLAPIENTRY loopback_Color4d_f( GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha ) { COLORF( (GLfloat) red, (GLfloat) green, (GLfloat) blue, (GLfloat) alpha ); } -static void +static void GLAPIENTRY loopback_Color4i_f( GLint red, GLint green, GLint blue, GLint alpha ) { COLORF( INT_TO_FLOAT(red), INT_TO_FLOAT(green), INT_TO_FLOAT(blue), INT_TO_FLOAT(alpha) ); } -static void +static void GLAPIENTRY loopback_Color4s_f( GLshort red, GLshort green, GLshort blue, GLshort alpha ) { @@ -205,14 +204,14 @@ loopback_Color4s_f( GLshort red, GLshort green, GLshort blue, SHORT_TO_FLOAT(blue), SHORT_TO_FLOAT(alpha) ); } -static void +static void GLAPIENTRY loopback_Color4ui_f( GLuint red, GLuint green, GLuint blue, GLuint alpha ) { COLORF( UINT_TO_FLOAT(red), UINT_TO_FLOAT(green), UINT_TO_FLOAT(blue), UINT_TO_FLOAT(alpha) ); } -static void +static void GLAPIENTRY loopback_Color4us_f( GLushort red, GLushort green, GLushort blue, GLushort alpha ) { COLORF( USHORT_TO_FLOAT(red), USHORT_TO_FLOAT(green), @@ -227,7 +226,7 @@ loopback_Color4ub_f( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha ) } -static void +static void GLAPIENTRY loopback_Color4iv_f( const GLint *v ) { COLORF( INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]), @@ -235,21 +234,21 @@ loopback_Color4iv_f( const GLint *v ) } -static void +static void GLAPIENTRY loopback_Color4bv_f( const GLbyte *v ) { COLORF( BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]), BYTE_TO_FLOAT(v[2]), BYTE_TO_FLOAT(v[3]) ); } -static void +static void GLAPIENTRY loopback_Color4dv_f( const GLdouble *v ) { COLORF( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3] ); } -static void +static void GLAPIENTRY loopback_Color4sv_f( const GLshort *v) { COLORF( SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]), @@ -257,578 +256,578 @@ loopback_Color4sv_f( const GLshort *v) } -static void +static void GLAPIENTRY loopback_Color4uiv_f( const GLuint *v) { COLORF( UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1]), UINT_TO_FLOAT(v[2]), UINT_TO_FLOAT(v[3]) ); } -static void +static void GLAPIENTRY loopback_Color4usv_f( const GLushort *v) { COLORF( USHORT_TO_FLOAT(v[0]), USHORT_TO_FLOAT(v[1]), USHORT_TO_FLOAT(v[2]), USHORT_TO_FLOAT(v[3]) ); } -static void +static void GLAPIENTRY loopback_Color4ubv_f( const GLubyte *v) { COLORF( UBYTE_TO_FLOAT(v[0]), UBYTE_TO_FLOAT(v[1]), UBYTE_TO_FLOAT(v[2]), UBYTE_TO_FLOAT(v[3]) ); } -static void +static void GLAPIENTRY loopback_FogCoorddEXT( GLdouble d ) { FOGCOORDF( (GLfloat) d ); } -static void +static void GLAPIENTRY loopback_FogCoorddvEXT( const GLdouble *v ) { FOGCOORDF( (GLfloat) *v ); } -static void +static void GLAPIENTRY loopback_Indexd( GLdouble c ) { INDEX( (GLfloat) c ); } -static void +static void GLAPIENTRY loopback_Indexi( GLint c ) { INDEX( (GLfloat) c ); } -static void +static void GLAPIENTRY loopback_Indexs( GLshort c ) { INDEX( (GLfloat) c ); } -static void +static void GLAPIENTRY loopback_Indexub( GLubyte c ) { INDEX( (GLfloat) c ); } -static void +static void GLAPIENTRY loopback_Indexdv( const GLdouble *c ) { INDEX( (GLfloat) *c ); } -static void +static void GLAPIENTRY loopback_Indexiv( const GLint *c ) { INDEX( (GLfloat) *c ); } -static void +static void GLAPIENTRY loopback_Indexsv( const GLshort *c ) { INDEX( (GLfloat) *c ); } -static void +static void GLAPIENTRY loopback_Indexubv( const GLubyte *c ) { INDEX( (GLfloat) *c ); } -static void +static void GLAPIENTRY loopback_Normal3b( GLbyte nx, GLbyte ny, GLbyte nz ) { NORMAL( BYTE_TO_FLOAT(nx), BYTE_TO_FLOAT(ny), BYTE_TO_FLOAT(nz) ); } -static void +static void GLAPIENTRY loopback_Normal3d( GLdouble nx, GLdouble ny, GLdouble nz ) { NORMAL((GLfloat) nx, (GLfloat) ny, (GLfloat) nz); } -static void +static void GLAPIENTRY loopback_Normal3i( GLint nx, GLint ny, GLint nz ) { NORMAL( INT_TO_FLOAT(nx), INT_TO_FLOAT(ny), INT_TO_FLOAT(nz) ); } -static void +static void GLAPIENTRY loopback_Normal3s( GLshort nx, GLshort ny, GLshort nz ) { NORMAL( SHORT_TO_FLOAT(nx), SHORT_TO_FLOAT(ny), SHORT_TO_FLOAT(nz) ); } -static void +static void GLAPIENTRY loopback_Normal3bv( const GLbyte *v ) { NORMAL( BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]), BYTE_TO_FLOAT(v[2]) ); } -static void +static void GLAPIENTRY loopback_Normal3dv( const GLdouble *v ) { NORMAL( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] ); } -static void +static void GLAPIENTRY loopback_Normal3iv( const GLint *v ) { NORMAL( INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]), INT_TO_FLOAT(v[2]) ); } -static void +static void GLAPIENTRY loopback_Normal3sv( const GLshort *v ) { NORMAL( SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]), SHORT_TO_FLOAT(v[2]) ); } -static void +static void GLAPIENTRY loopback_TexCoord1d( GLdouble s ) { TEXCOORD1((GLfloat) s); } -static void +static void GLAPIENTRY loopback_TexCoord1i( GLint s ) { TEXCOORD1((GLfloat) s); } -static void +static void GLAPIENTRY loopback_TexCoord1s( GLshort s ) { TEXCOORD1((GLfloat) s); } -static void +static void GLAPIENTRY loopback_TexCoord2d( GLdouble s, GLdouble t ) { TEXCOORD2((GLfloat) s,(GLfloat) t); } -static void +static void GLAPIENTRY loopback_TexCoord2s( GLshort s, GLshort t ) { TEXCOORD2((GLfloat) s,(GLfloat) t); } -static void +static void GLAPIENTRY loopback_TexCoord2i( GLint s, GLint t ) { TEXCOORD2((GLfloat) s,(GLfloat) t); } -static void +static void GLAPIENTRY loopback_TexCoord3d( GLdouble s, GLdouble t, GLdouble r ) { TEXCOORD3((GLfloat) s,(GLfloat) t,(GLfloat) r); } -static void +static void GLAPIENTRY loopback_TexCoord3i( GLint s, GLint t, GLint r ) { TEXCOORD3((GLfloat) s,(GLfloat) t,(GLfloat) r); } -static void +static void GLAPIENTRY loopback_TexCoord3s( GLshort s, GLshort t, GLshort r ) { TEXCOORD3((GLfloat) s,(GLfloat) t,(GLfloat) r); } -static void +static void GLAPIENTRY loopback_TexCoord4d( GLdouble s, GLdouble t, GLdouble r, GLdouble q ) { TEXCOORD4((GLfloat) s,(GLfloat) t,(GLfloat) r,(GLfloat) q); } -static void +static void GLAPIENTRY loopback_TexCoord4i( GLint s, GLint t, GLint r, GLint q ) { TEXCOORD4((GLfloat) s,(GLfloat) t,(GLfloat) r,(GLfloat) q); } -static void +static void GLAPIENTRY loopback_TexCoord4s( GLshort s, GLshort t, GLshort r, GLshort q ) { TEXCOORD4((GLfloat) s,(GLfloat) t,(GLfloat) r,(GLfloat) q); } -static void +static void GLAPIENTRY loopback_TexCoord1dv( const GLdouble *v ) { TEXCOORD1((GLfloat) v[0]); } -static void +static void GLAPIENTRY loopback_TexCoord1iv( const GLint *v ) { TEXCOORD1((GLfloat) v[0]); } -static void +static void GLAPIENTRY loopback_TexCoord1sv( const GLshort *v ) { TEXCOORD1((GLfloat) v[0]); } -static void +static void GLAPIENTRY loopback_TexCoord2dv( const GLdouble *v ) { TEXCOORD2((GLfloat) v[0],(GLfloat) v[1]); } -static void +static void GLAPIENTRY loopback_TexCoord2iv( const GLint *v ) { TEXCOORD2((GLfloat) v[0],(GLfloat) v[1]); } -static void +static void GLAPIENTRY loopback_TexCoord2sv( const GLshort *v ) { TEXCOORD2((GLfloat) v[0],(GLfloat) v[1]); } -static void +static void GLAPIENTRY loopback_TexCoord3dv( const GLdouble *v ) { TEXCOORD2((GLfloat) v[0],(GLfloat) v[1]); } -static void +static void GLAPIENTRY loopback_TexCoord3iv( const GLint *v ) { TEXCOORD3((GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2]); } -static void +static void GLAPIENTRY loopback_TexCoord3sv( const GLshort *v ) { TEXCOORD3((GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2]); } -static void +static void GLAPIENTRY loopback_TexCoord4dv( const GLdouble *v ) { TEXCOORD4((GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2],(GLfloat) v[3]); } -static void +static void GLAPIENTRY loopback_TexCoord4iv( const GLint *v ) { TEXCOORD4((GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2],(GLfloat) v[3]); } -static void +static void GLAPIENTRY loopback_TexCoord4sv( const GLshort *v ) { TEXCOORD4((GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2],(GLfloat) v[3]); } -static void +static void GLAPIENTRY loopback_Vertex2d( GLdouble x, GLdouble y ) { VERTEX2( (GLfloat) x, (GLfloat) y ); } -static void +static void GLAPIENTRY loopback_Vertex2i( GLint x, GLint y ) { VERTEX2( (GLfloat) x, (GLfloat) y ); } -static void +static void GLAPIENTRY loopback_Vertex2s( GLshort x, GLshort y ) { VERTEX2( (GLfloat) x, (GLfloat) y ); } -static void +static void GLAPIENTRY loopback_Vertex3d( GLdouble x, GLdouble y, GLdouble z ) { VERTEX3( (GLfloat) x, (GLfloat) y, (GLfloat) z ); } -static void +static void GLAPIENTRY loopback_Vertex3i( GLint x, GLint y, GLint z ) { VERTEX3( (GLfloat) x, (GLfloat) y, (GLfloat) z ); } -static void +static void GLAPIENTRY loopback_Vertex3s( GLshort x, GLshort y, GLshort z ) { VERTEX3( (GLfloat) x, (GLfloat) y, (GLfloat) z ); } -static void +static void GLAPIENTRY loopback_Vertex4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w ) { VERTEX4( (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w ); } -static void +static void GLAPIENTRY loopback_Vertex4i( GLint x, GLint y, GLint z, GLint w ) { VERTEX4( (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w ); } -static void +static void GLAPIENTRY loopback_Vertex4s( GLshort x, GLshort y, GLshort z, GLshort w ) { VERTEX4( (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w ); } -static void +static void GLAPIENTRY loopback_Vertex2dv( const GLdouble *v ) { VERTEX2( (GLfloat) v[0], (GLfloat) v[1] ); } -static void +static void GLAPIENTRY loopback_Vertex2iv( const GLint *v ) { VERTEX2( (GLfloat) v[0], (GLfloat) v[1] ); } -static void +static void GLAPIENTRY loopback_Vertex2sv( const GLshort *v ) { VERTEX2( (GLfloat) v[0], (GLfloat) v[1] ); } -static void +static void GLAPIENTRY loopback_Vertex3dv( const GLdouble *v ) { VERTEX3( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] ); } -static void +static void GLAPIENTRY loopback_Vertex3iv( const GLint *v ) { VERTEX3( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] ); } -static void +static void GLAPIENTRY loopback_Vertex3sv( const GLshort *v ) { VERTEX3( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] ); } -static void +static void GLAPIENTRY loopback_Vertex4dv( const GLdouble *v ) { VERTEX4( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3] ); } -static void +static void GLAPIENTRY loopback_Vertex4iv( const GLint *v ) { VERTEX4( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3] ); } -static void +static void GLAPIENTRY loopback_Vertex4sv( const GLshort *v ) { VERTEX4( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3] ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord1dARB(GLenum target, GLdouble s) { MULTI_TEXCOORD1( target, (GLfloat) s ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord1dvARB(GLenum target, const GLdouble *v) { MULTI_TEXCOORD1( target, (GLfloat) v[0] ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord1iARB(GLenum target, GLint s) { MULTI_TEXCOORD1( target, (GLfloat) s ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord1ivARB(GLenum target, const GLint *v) { MULTI_TEXCOORD1( target, (GLfloat) v[0] ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord1sARB(GLenum target, GLshort s) { MULTI_TEXCOORD1( target, (GLfloat) s ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord1svARB(GLenum target, const GLshort *v) { MULTI_TEXCOORD1( target, (GLfloat) v[0] ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord2dARB(GLenum target, GLdouble s, GLdouble t) { MULTI_TEXCOORD2( target, (GLfloat) s, (GLfloat) t ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord2dvARB(GLenum target, const GLdouble *v) { MULTI_TEXCOORD2( target, (GLfloat) v[0], (GLfloat) v[1] ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord2iARB(GLenum target, GLint s, GLint t) { MULTI_TEXCOORD2( target, (GLfloat) s, (GLfloat) t ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord2ivARB(GLenum target, const GLint *v) { MULTI_TEXCOORD2( target, (GLfloat) v[0], (GLfloat) v[1] ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord2sARB(GLenum target, GLshort s, GLshort t) { MULTI_TEXCOORD2( target, (GLfloat) s, (GLfloat) t ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord2svARB(GLenum target, const GLshort *v) { MULTI_TEXCOORD2( target, (GLfloat) v[0], (GLfloat) v[1] ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord3dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r) { MULTI_TEXCOORD3( target, (GLfloat) s, (GLfloat) t, (GLfloat) r ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord3dvARB(GLenum target, const GLdouble *v) { MULTI_TEXCOORD3( target, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord3iARB(GLenum target, GLint s, GLint t, GLint r) { MULTI_TEXCOORD3( target, (GLfloat) s, (GLfloat) t, (GLfloat) r ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord3ivARB(GLenum target, const GLint *v) { MULTI_TEXCOORD3( target, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord3sARB(GLenum target, GLshort s, GLshort t, GLshort r) { MULTI_TEXCOORD3( target, (GLfloat) s, (GLfloat) t, (GLfloat) r ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord3svARB(GLenum target, const GLshort *v) { MULTI_TEXCOORD3( target, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord4dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q) { MULTI_TEXCOORD4( target, (GLfloat) s, (GLfloat) t, (GLfloat) r, (GLfloat) q ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord4dvARB(GLenum target, const GLdouble *v) { MULTI_TEXCOORD4( target, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3] ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord4iARB(GLenum target, GLint s, GLint t, GLint r, GLint q) { MULTI_TEXCOORD4( target, (GLfloat) s, (GLfloat) t, (GLfloat) r, (GLfloat) q ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord4ivARB(GLenum target, const GLint *v) { MULTI_TEXCOORD4( target, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3] ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord4sARB(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q) { MULTI_TEXCOORD4( target, (GLfloat) s, (GLfloat) t, (GLfloat) r, (GLfloat) q ); } -static void +static void GLAPIENTRY loopback_MultiTexCoord4svARB(GLenum target, const GLshort *v) { MULTI_TEXCOORD4( target, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3] ); } -static void +static void GLAPIENTRY loopback_EvalCoord2dv( const GLdouble *u ) { EVALCOORD2( (GLfloat) u[0], (GLfloat) u[1] ); } -static void +static void GLAPIENTRY loopback_EvalCoord2fv( const GLfloat *u ) { EVALCOORD2( u[0], u[1] ); } -static void +static void GLAPIENTRY loopback_EvalCoord2d( GLdouble u, GLdouble v ) { EVALCOORD2( (GLfloat) u, (GLfloat) v ); } -static void +static void GLAPIENTRY loopback_EvalCoord1dv( const GLdouble *u ) { EVALCOORD1( (GLfloat) *u ); } -static void +static void GLAPIENTRY loopback_EvalCoord1fv( const GLfloat *u ) { EVALCOORD1( (GLfloat) *u ); } -static void +static void GLAPIENTRY loopback_EvalCoord1d( GLdouble u ) { EVALCOORD1( (GLfloat) u ); } -static void +static void GLAPIENTRY loopback_Materialf( GLenum face, GLenum pname, GLfloat param ) { GLfloat fparam[4]; @@ -836,14 +835,14 @@ loopback_Materialf( GLenum face, GLenum pname, GLfloat param ) MATERIALFV( face, pname, fparam ); } -static void +static void GLAPIENTRY loopback_Materiali(GLenum face, GLenum pname, GLint param ) { GLfloat p = (GLfloat) param; MATERIALFV(face, pname, &p); } -static void +static void GLAPIENTRY loopback_Materialiv(GLenum face, GLenum pname, const GLint *params ) { GLfloat fparam[4]; @@ -873,49 +872,49 @@ loopback_Materialiv(GLenum face, GLenum pname, const GLint *params ) } -static void +static void GLAPIENTRY loopback_Rectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) { RECTF((GLfloat) x1, (GLfloat) y1, (GLfloat) x2, (GLfloat) y2); } -static void +static void GLAPIENTRY loopback_Rectdv(const GLdouble *v1, const GLdouble *v2) { RECTF((GLfloat) v1[0], (GLfloat) v1[1], (GLfloat) v2[0], (GLfloat) v2[1]); } -static void +static void GLAPIENTRY loopback_Rectfv(const GLfloat *v1, const GLfloat *v2) { RECTF(v1[0], v1[1], v2[0], v2[1]); } -static void +static void GLAPIENTRY loopback_Recti(GLint x1, GLint y1, GLint x2, GLint y2) { RECTF((GLfloat) x1, (GLfloat) y1, (GLfloat) x2, (GLfloat) y2); } -static void +static void GLAPIENTRY loopback_Rectiv(const GLint *v1, const GLint *v2) { RECTF((GLfloat) v1[0], (GLfloat) v1[1], (GLfloat) v2[0], (GLfloat) v2[1]); } -static void +static void GLAPIENTRY loopback_Rects(GLshort x1, GLshort y1, GLshort x2, GLshort y2) { RECTF((GLfloat) x1, (GLfloat) y1, (GLfloat) x2, (GLfloat) y2); } -static void +static void GLAPIENTRY loopback_Rectsv(const GLshort *v1, const GLshort *v2) { RECTF((GLfloat) v1[0], (GLfloat) v1[1], (GLfloat) v2[0], (GLfloat) v2[1]); } -static void +static void GLAPIENTRY loopback_SecondaryColor3bEXT_f( GLbyte red, GLbyte green, GLbyte blue ) { SECONDARYCOLORF( BYTE_TO_FLOAT(red), @@ -923,13 +922,13 @@ loopback_SecondaryColor3bEXT_f( GLbyte red, GLbyte green, GLbyte blue ) BYTE_TO_FLOAT(blue) ); } -static void +static void GLAPIENTRY loopback_SecondaryColor3dEXT_f( GLdouble red, GLdouble green, GLdouble blue ) { SECONDARYCOLORF( (GLfloat) red, (GLfloat) green, (GLfloat) blue ); } -static void +static void GLAPIENTRY loopback_SecondaryColor3iEXT_f( GLint red, GLint green, GLint blue ) { SECONDARYCOLORF( INT_TO_FLOAT(red), @@ -937,7 +936,7 @@ loopback_SecondaryColor3iEXT_f( GLint red, GLint green, GLint blue ) INT_TO_FLOAT(blue)); } -static void +static void GLAPIENTRY loopback_SecondaryColor3sEXT_f( GLshort red, GLshort green, GLshort blue ) { SECONDARYCOLORF(SHORT_TO_FLOAT(red), @@ -945,7 +944,7 @@ loopback_SecondaryColor3sEXT_f( GLshort red, GLshort green, GLshort blue ) SHORT_TO_FLOAT(blue)); } -static void +static void GLAPIENTRY loopback_SecondaryColor3uiEXT_f( GLuint red, GLuint green, GLuint blue ) { SECONDARYCOLORF(UINT_TO_FLOAT(red), @@ -953,7 +952,7 @@ loopback_SecondaryColor3uiEXT_f( GLuint red, GLuint green, GLuint blue ) UINT_TO_FLOAT(blue)); } -static void +static void GLAPIENTRY loopback_SecondaryColor3usEXT_f( GLushort red, GLushort green, GLushort blue ) { SECONDARYCOLORF(USHORT_TO_FLOAT(red), @@ -961,7 +960,7 @@ loopback_SecondaryColor3usEXT_f( GLushort red, GLushort green, GLushort blue ) USHORT_TO_FLOAT(blue)); } -static void +static void GLAPIENTRY loopback_SecondaryColor3ubEXT_f( GLubyte red, GLubyte green, GLubyte blue ) { SECONDARYCOLORF(UBYTE_TO_FLOAT(red), @@ -969,7 +968,7 @@ loopback_SecondaryColor3ubEXT_f( GLubyte red, GLubyte green, GLubyte blue ) UBYTE_TO_FLOAT(blue)); } -static void +static void GLAPIENTRY loopback_SecondaryColor3bvEXT_f( const GLbyte *v ) { SECONDARYCOLORF(BYTE_TO_FLOAT(v[0]), @@ -977,12 +976,12 @@ loopback_SecondaryColor3bvEXT_f( const GLbyte *v ) BYTE_TO_FLOAT(v[2])); } -static void +static void GLAPIENTRY loopback_SecondaryColor3dvEXT_f( const GLdouble *v ) { SECONDARYCOLORF( (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] ); } -static void +static void GLAPIENTRY loopback_SecondaryColor3ivEXT_f( const GLint *v ) { SECONDARYCOLORF(INT_TO_FLOAT(v[0]), @@ -990,7 +989,7 @@ loopback_SecondaryColor3ivEXT_f( const GLint *v ) INT_TO_FLOAT(v[2])); } -static void +static void GLAPIENTRY loopback_SecondaryColor3svEXT_f( const GLshort *v ) { SECONDARYCOLORF(SHORT_TO_FLOAT(v[0]), @@ -998,7 +997,7 @@ loopback_SecondaryColor3svEXT_f( const GLshort *v ) SHORT_TO_FLOAT(v[2])); } -static void +static void GLAPIENTRY loopback_SecondaryColor3uivEXT_f( const GLuint *v ) { SECONDARYCOLORF(UINT_TO_FLOAT(v[0]), @@ -1006,7 +1005,7 @@ loopback_SecondaryColor3uivEXT_f( const GLuint *v ) UINT_TO_FLOAT(v[2])); } -static void +static void GLAPIENTRY loopback_SecondaryColor3usvEXT_f( const GLushort *v ) { SECONDARYCOLORF(USHORT_TO_FLOAT(v[0]), @@ -1014,7 +1013,7 @@ loopback_SecondaryColor3usvEXT_f( const GLushort *v ) USHORT_TO_FLOAT(v[2])); } -static void +static void GLAPIENTRY loopback_SecondaryColor3ubvEXT_f( const GLubyte *v ) { SECONDARYCOLORF(UBYTE_TO_FLOAT(v[0]), @@ -1027,153 +1026,153 @@ loopback_SecondaryColor3ubvEXT_f( const GLubyte *v ) * GL_NV_vertex_program */ -static void +static void GLAPIENTRY loopback_VertexAttrib1sNV(GLuint index, GLshort x) { ATTRIB1(index, (GLfloat) x); } -static void +static void GLAPIENTRY loopback_VertexAttrib1fNV(GLuint index, GLfloat x) { ATTRIB1(index, x); } -static void +static void GLAPIENTRY loopback_VertexAttrib1dNV(GLuint index, GLdouble x) { ATTRIB1(index, (GLfloat) x); } -static void +static void GLAPIENTRY loopback_VertexAttrib2sNV(GLuint index, GLshort x, GLshort y) { ATTRIB2(index, (GLfloat) x, y); } -static void +static void GLAPIENTRY loopback_VertexAttrib2fNV(GLuint index, GLfloat x, GLfloat y) { ATTRIB2(index, (GLfloat) x, y); } -static void +static void GLAPIENTRY loopback_VertexAttrib2dNV(GLuint index, GLdouble x, GLdouble y) { ATTRIB2(index, (GLfloat) x, (GLfloat) y); } -static void +static void GLAPIENTRY loopback_VertexAttrib3sNV(GLuint index, GLshort x, GLshort y, GLshort z) { ATTRIB3(index, (GLfloat) x, y, z); } -static void +static void GLAPIENTRY loopback_VertexAttrib3fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z) { ATTRIB3(index, x, y, z); } -static void +static void GLAPIENTRY loopback_VertexAttrib3dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z) { ATTRIB4(index, (GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); } -static void +static void GLAPIENTRY loopback_VertexAttrib4sNV(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) { ATTRIB4(index, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); } -static void +static void GLAPIENTRY loopback_VertexAttrib4dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { ATTRIB4(index, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); } -static void +static void GLAPIENTRY loopback_VertexAttrib4ubNV(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) { ATTRIB4(index, UBYTE_TO_FLOAT(x), UBYTE_TO_FLOAT(y), UBYTE_TO_FLOAT(z), UBYTE_TO_FLOAT(w)); } -static void +static void GLAPIENTRY loopback_VertexAttrib1svNV(GLuint index, const GLshort *v) { ATTRIB1(index, (GLfloat) v[0]); } -static void +static void GLAPIENTRY loopback_VertexAttrib1fvNV(GLuint index, const GLfloat *v) { ATTRIB1(index, v[0]); } -static void +static void GLAPIENTRY loopback_VertexAttrib1dvNV(GLuint index, const GLdouble *v) { ATTRIB1(index, (GLfloat) v[0]); } -static void +static void GLAPIENTRY loopback_VertexAttrib2svNV(GLuint index, const GLshort *v) { ATTRIB2(index, (GLfloat) v[0], (GLfloat) v[1]); } -static void +static void GLAPIENTRY loopback_VertexAttrib2fvNV(GLuint index, const GLfloat *v) { ATTRIB2(index, v[0], v[1]); } -static void +static void GLAPIENTRY loopback_VertexAttrib2dvNV(GLuint index, const GLdouble *v) { ATTRIB2(index, (GLfloat) v[0], (GLfloat) v[1]); } -static void +static void GLAPIENTRY loopback_VertexAttrib3svNV(GLuint index, const GLshort *v) { ATTRIB2(index, (GLfloat) v[0], (GLfloat) v[1]); } -static void +static void GLAPIENTRY loopback_VertexAttrib3fvNV(GLuint index, const GLfloat *v) { ATTRIB3(index, v[0], v[1], v[2]); } -static void +static void GLAPIENTRY loopback_VertexAttrib3dvNV(GLuint index, const GLdouble *v) { ATTRIB3(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]); } -static void +static void GLAPIENTRY loopback_VertexAttrib4svNV(GLuint index, const GLshort *v) { ATTRIB4(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat)v[3]); } -static void +static void GLAPIENTRY loopback_VertexAttrib4fvNV(GLuint index, const GLfloat *v) { ATTRIB4(index, v[0], v[1], v[2], v[3]); } -static void +static void GLAPIENTRY loopback_VertexAttrib4dvNV(GLuint index, const GLdouble *v) { ATTRIB4(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]); } -static void +static void GLAPIENTRY loopback_VertexAttrib4ubvNV(GLuint index, const GLubyte *v) { ATTRIB4(index, UBYTE_TO_FLOAT(v[0]), UBYTE_TO_FLOAT(v[1]), @@ -1181,7 +1180,7 @@ loopback_VertexAttrib4ubvNV(GLuint index, const GLubyte *v) } -static void +static void GLAPIENTRY loopback_VertexAttribs1svNV(GLuint index, GLsizei n, const GLshort *v) { GLint i; @@ -1189,7 +1188,7 @@ loopback_VertexAttribs1svNV(GLuint index, GLsizei n, const GLshort *v) loopback_VertexAttrib1svNV(index + i, v + i); } -static void +static void GLAPIENTRY loopback_VertexAttribs1fvNV(GLuint index, GLsizei n, const GLfloat *v) { GLint i; @@ -1197,7 +1196,7 @@ loopback_VertexAttribs1fvNV(GLuint index, GLsizei n, const GLfloat *v) loopback_VertexAttrib1fvNV(index + i, v + i); } -static void +static void GLAPIENTRY loopback_VertexAttribs1dvNV(GLuint index, GLsizei n, const GLdouble *v) { GLint i; @@ -1205,7 +1204,7 @@ loopback_VertexAttribs1dvNV(GLuint index, GLsizei n, const GLdouble *v) loopback_VertexAttrib1dvNV(index + i, v + i); } -static void +static void GLAPIENTRY loopback_VertexAttribs2svNV(GLuint index, GLsizei n, const GLshort *v) { GLint i; @@ -1213,7 +1212,7 @@ loopback_VertexAttribs2svNV(GLuint index, GLsizei n, const GLshort *v) loopback_VertexAttrib2svNV(index + i, v + 2 * i); } -static void +static void GLAPIENTRY loopback_VertexAttribs2fvNV(GLuint index, GLsizei n, const GLfloat *v) { GLint i; @@ -1221,7 +1220,7 @@ loopback_VertexAttribs2fvNV(GLuint index, GLsizei n, const GLfloat *v) loopback_VertexAttrib2fvNV(index + i, v + 2 * i); } -static void +static void GLAPIENTRY loopback_VertexAttribs2dvNV(GLuint index, GLsizei n, const GLdouble *v) { GLint i; @@ -1229,7 +1228,7 @@ loopback_VertexAttribs2dvNV(GLuint index, GLsizei n, const GLdouble *v) loopback_VertexAttrib2dvNV(index + i, v + 2 * i); } -static void +static void GLAPIENTRY loopback_VertexAttribs3svNV(GLuint index, GLsizei n, const GLshort *v) { GLint i; @@ -1237,7 +1236,7 @@ loopback_VertexAttribs3svNV(GLuint index, GLsizei n, const GLshort *v) loopback_VertexAttrib3svNV(index + i, v + 3 * i); } -static void +static void GLAPIENTRY loopback_VertexAttribs3fvNV(GLuint index, GLsizei n, const GLfloat *v) { GLint i; @@ -1245,7 +1244,7 @@ loopback_VertexAttribs3fvNV(GLuint index, GLsizei n, const GLfloat *v) loopback_VertexAttrib3fvNV(index + i, v + 3 * i); } -static void +static void GLAPIENTRY loopback_VertexAttribs3dvNV(GLuint index, GLsizei n, const GLdouble *v) { GLint i; @@ -1253,7 +1252,7 @@ loopback_VertexAttribs3dvNV(GLuint index, GLsizei n, const GLdouble *v) loopback_VertexAttrib3dvNV(index + i, v + 3 * i); } -static void +static void GLAPIENTRY loopback_VertexAttribs4svNV(GLuint index, GLsizei n, const GLshort *v) { GLint i; @@ -1261,7 +1260,7 @@ loopback_VertexAttribs4svNV(GLuint index, GLsizei n, const GLshort *v) loopback_VertexAttrib4svNV(index + i, v + 4 * i); } -static void +static void GLAPIENTRY loopback_VertexAttribs4fvNV(GLuint index, GLsizei n, const GLfloat *v) { GLint i; @@ -1269,7 +1268,7 @@ loopback_VertexAttribs4fvNV(GLuint index, GLsizei n, const GLfloat *v) loopback_VertexAttrib4fvNV(index + i, v + 4 * i); } -static void +static void GLAPIENTRY loopback_VertexAttribs4dvNV(GLuint index, GLsizei n, const GLdouble *v) { GLint i; @@ -1277,7 +1276,7 @@ loopback_VertexAttribs4dvNV(GLuint index, GLsizei n, const GLdouble *v) loopback_VertexAttrib4dvNV(index + i, v + 4 * i); } -static void +static void GLAPIENTRY loopback_VertexAttribs4ubvNV(GLuint index, GLsizei n, const GLubyte *v) { GLint i; @@ -1290,65 +1289,65 @@ loopback_VertexAttribs4ubvNV(GLuint index, GLsizei n, const GLubyte *v) * GL_ARB_vertex_program */ -static void +static void GLAPIENTRY loopback_VertexAttrib4bvARB(GLuint index, const GLbyte * v) { ATTRIB4(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]); } -static void +static void GLAPIENTRY loopback_VertexAttrib4ivARB(GLuint index, const GLint * v) { ATTRIB4(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]); } -static void +static void GLAPIENTRY loopback_VertexAttrib4ubvARB(GLuint index, const GLubyte * v) { ATTRIB4(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]); } -static void +static void GLAPIENTRY loopback_VertexAttrib4usvARB(GLuint index, const GLushort * v) { ATTRIB4(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]); } -static void +static void GLAPIENTRY loopback_VertexAttrib4uivARB(GLuint index, const GLuint * v) { ATTRIB4(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]); } -static void +static void GLAPIENTRY loopback_VertexAttrib4NbvARB(GLuint index, const GLbyte * v) { ATTRIB4(index, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]), BYTE_TO_FLOAT(v[2]), BYTE_TO_FLOAT(v[3])); } -static void +static void GLAPIENTRY loopback_VertexAttrib4NsvARB(GLuint index, const GLshort * v) { ATTRIB4(index, SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]), SHORT_TO_FLOAT(v[2]), SHORT_TO_FLOAT(v[3])); } -static void +static void GLAPIENTRY loopback_VertexAttrib4NivARB(GLuint index, const GLint * v) { ATTRIB4(index, INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]), INT_TO_FLOAT(v[2]), INT_TO_FLOAT(v[3])); } -static void +static void GLAPIENTRY loopback_VertexAttrib4NusvARB(GLuint index, const GLushort * v) { ATTRIB4(index, USHORT_TO_FLOAT(v[0]), USHORT_TO_FLOAT(v[1]), USHORT_TO_FLOAT(v[2]), USHORT_TO_FLOAT(v[3])); } -static void +static void GLAPIENTRY loopback_VertexAttrib4NuivARB(GLuint index, const GLuint * v) { ATTRIB4(index, UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1]), diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c index 945f68c1741..f6193aec556 100644 --- a/src/mesa/main/api_validate.c +++ b/src/mesa/main/api_validate.c @@ -45,7 +45,7 @@ _mesa_validate_DrawElements(GLcontext *ctx, } if (mode > GL_POLYGON) { - _mesa_error(ctx, GL_INVALID_ENUM, "glDrawArrays(mode)" ); + _mesa_error(ctx, GL_INVALID_ENUM, "glDrawElements(mode)" ); return GL_FALSE; } @@ -58,14 +58,39 @@ _mesa_validate_DrawElements(GLcontext *ctx, } if (ctx->NewState) - _mesa_update_state( ctx ); + _mesa_update_state(ctx); - if (ctx->Array.Vertex.Enabled - || (ctx->VertexProgram.Enabled && ctx->Array.VertexAttrib[0].Enabled)) - return GL_TRUE; - else + /* Always need vertex positions */ + if (!ctx->Array.Vertex.Enabled + && !(ctx->VertexProgram.Enabled && ctx->Array.VertexAttrib[0].Enabled)) return GL_FALSE; + if (ctx->Const.CheckArrayBounds) { + /* find max array index */ + GLuint max = 0; + GLint i; + if (type == GL_UNSIGNED_INT) { + for (i = 0; i < count; i++) + if (((GLuint *) indices)[i] > max) + max = ((GLuint *) indices)[i]; + } + else if (type == GL_UNSIGNED_SHORT) { + for (i = 0; i < count; i++) + if (((GLushort *) indices)[i] > max) + max = ((GLushort *) indices)[i]; + } + else { + ASSERT(type == GL_UNSIGNED_BYTE); + for (i = 0; i < count; i++) + if (((GLubyte *) indices)[i] > max) + max = ((GLubyte *) indices)[i]; + } + if (max >= ctx->Array._MaxElement) { + /* the max element is out of bounds of one or more enabled arrays */ + return GL_FALSE; + } + } + return GL_TRUE; } @@ -80,12 +105,12 @@ _mesa_validate_DrawRangeElements(GLcontext *ctx, GLenum mode, if (count <= 0) { if (count < 0) - _mesa_error(ctx, GL_INVALID_VALUE, "glDrawElements(count)" ); + _mesa_error(ctx, GL_INVALID_VALUE, "glDrawRangeElements(count)" ); return GL_FALSE; } if (mode > GL_POLYGON) { - _mesa_error(ctx, GL_INVALID_ENUM, "glDrawArrays(mode)" ); + _mesa_error(ctx, GL_INVALID_ENUM, "glDrawRangeElements(mode)" ); return GL_FALSE; } @@ -97,29 +122,61 @@ _mesa_validate_DrawRangeElements(GLcontext *ctx, GLenum mode, if (type != GL_UNSIGNED_INT && type != GL_UNSIGNED_BYTE && type != GL_UNSIGNED_SHORT) { - _mesa_error(ctx, GL_INVALID_ENUM, "glDrawElements(type)" ); + _mesa_error(ctx, GL_INVALID_ENUM, "glDrawRangeElements(type)" ); return GL_FALSE; } if (ctx->NewState) - _mesa_update_state( ctx ); + _mesa_update_state(ctx); - if (ctx->Array.Vertex.Enabled - || (ctx->VertexProgram.Enabled && ctx->Array.VertexAttrib[0].Enabled)) - return GL_TRUE; - else + /* Always need vertex positions */ + if (!ctx->Array.Vertex.Enabled + && !(ctx->VertexProgram.Enabled && ctx->Array.VertexAttrib[0].Enabled)) return GL_FALSE; -} + if (ctx->Const.CheckArrayBounds) { + /* Find max array index. + * We don't trust the user's start and end values. + */ + GLuint max = 0; + GLint i; + if (type == GL_UNSIGNED_INT) { + for (i = 0; i < count; i++) + if (((GLuint *) indices)[i] > max) + max = ((GLuint *) indices)[i]; + } + else if (type == GL_UNSIGNED_SHORT) { + for (i = 0; i < count; i++) + if (((GLushort *) indices)[i] > max) + max = ((GLushort *) indices)[i]; + } + else { + ASSERT(type == GL_UNSIGNED_BYTE); + for (i = 0; i < count; i++) + if (((GLubyte *) indices)[i] > max) + max = ((GLubyte *) indices)[i]; + } + if (max >= ctx->Array._MaxElement) { + /* the max element is out of bounds of one or more enabled arrays */ + return GL_FALSE; + } + } + + return GL_TRUE; +} +/** + * Called from the tnl module to error check the function parameters and + * verify that we really can draw something. + */ GLboolean _mesa_validate_DrawArrays(GLcontext *ctx, GLenum mode, GLint start, GLsizei count) { ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); - if (count<0) { + if (count < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "glDrawArrays(count)" ); return GL_FALSE; } @@ -130,11 +187,17 @@ _mesa_validate_DrawArrays(GLcontext *ctx, } if (ctx->NewState) - _mesa_update_state( ctx ); + _mesa_update_state(ctx); - if (ctx->Array.Vertex.Enabled - || (ctx->VertexProgram.Enabled && ctx->Array.VertexAttrib[0].Enabled)) - return GL_TRUE; - else + /* Always need vertex positions */ + if (!ctx->Array.Vertex.Enabled + && !(ctx->VertexProgram.Enabled && ctx->Array.VertexAttrib[0].Enabled)) return GL_FALSE; + + if (ctx->Const.CheckArrayBounds) { + if (start + count > ctx->Array._MaxElement) + return GL_FALSE; + } + + return GL_TRUE; } diff --git a/src/mesa/main/arbfragparse.c b/src/mesa/main/arbfragparse.c index 39aa1c38306..eb7d0c24a66 100644 --- a/src/mesa/main/arbfragparse.c +++ b/src/mesa/main/arbfragparse.c @@ -22,11 +22,12 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#define DEBUG_FP 0 /** * \file arbfragparse.c * ARB_fragment_program parser. - * \author + * \author Karl Rasche */ #include "glheader.h" @@ -34,13 +35,189 @@ #include "imports.h" #include "macros.h" #include "mtypes.h" +#include "arbparse.h" #include "arbfragparse.h" +static void +debug_fp_inst(GLint num, struct fp_instruction *fp) +{ + GLint a; + + fprintf(stderr, "PROGRAM_OUTPUT: 0x%x\n", PROGRAM_OUTPUT); + fprintf(stderr, "PROGRAM_INPUT: 0x%x\n", PROGRAM_INPUT); + fprintf(stderr, "PROGRAM_TEMPORARY: 0x%x\n", PROGRAM_TEMPORARY); + + for (a=0; a<num; a++) { + switch (fp[a].Opcode) { + case FP_OPCODE_END: + fprintf(stderr, "FP_OPCODE_END"); break; + + case FP_OPCODE_ABS: + fprintf(stderr, "FP_OPCODE_ABS"); break; + + case FP_OPCODE_ADD: + fprintf(stderr, "FP_OPCODE_ADD"); break; + + case FP_OPCODE_CMP: + fprintf(stderr, "FP_OPCODE_CMP"); break; + + case FP_OPCODE_COS: + fprintf(stderr, "FP_OPCODE_COS"); break; + + case FP_OPCODE_DP3: + fprintf(stderr, "FP_OPCODE_DP3"); break; + + case FP_OPCODE_DP4: + fprintf(stderr, "FP_OPCODE_DP4"); break; + + case FP_OPCODE_DPH: + fprintf(stderr, "FP_OPCODE_DPH"); break; + + case FP_OPCODE_DST: + fprintf(stderr, "FP_OPCODE_DST"); break; + + case FP_OPCODE_EX2: + fprintf(stderr, "FP_OPCODE_EX2"); break; + + case FP_OPCODE_FLR: + fprintf(stderr, "FP_OPCODE_FLR"); break; + + case FP_OPCODE_FRC: + fprintf(stderr, "FP_OPCODE_FRC"); break; + + case FP_OPCODE_KIL: + fprintf(stderr, "FP_OPCODE_KIL"); break; + + case FP_OPCODE_LG2: + fprintf(stderr, "FP_OPCODE_LG2"); break; + + case FP_OPCODE_LIT: + fprintf(stderr, "FP_OPCODE_LIT"); break; + + case FP_OPCODE_LRP: + fprintf(stderr, "FP_OPCODE_LRP"); break; + + case FP_OPCODE_MAD: + fprintf(stderr, "FP_OPCODE_MAD"); break; + + case FP_OPCODE_MAX: + fprintf(stderr, "FP_OPCODE_MAX"); break; + + case FP_OPCODE_MIN: + fprintf(stderr, "FP_OPCODE_MIN"); break; + + case FP_OPCODE_MOV: + fprintf(stderr, "FP_OPCODE_MOV"); break; + + case FP_OPCODE_MUL: + fprintf(stderr, "FP_OPCODE_MUL"); break; + + case FP_OPCODE_POW: + fprintf(stderr, "FP_OPCODE_POW"); break; + + case FP_OPCODE_RCP: + fprintf(stderr, "FP_OPCODE_RCP"); break; + + case FP_OPCODE_RSQ: + fprintf(stderr, "FP_OPCODE_RSQ"); break; + + case FP_OPCODE_SCS: + fprintf(stderr, "FP_OPCODE_SCS"); break; + + case FP_OPCODE_SIN: + fprintf(stderr, "FP_OPCODE_SIN"); break; + + case FP_OPCODE_SLT: + fprintf(stderr, "FP_OPCODE_SLT"); break; + + case FP_OPCODE_SUB: + fprintf(stderr, "FP_OPCODE_SUB"); break; + + case FP_OPCODE_SWZ: + fprintf(stderr, "FP_OPCODE_SWZ"); break; + + case FP_OPCODE_TEX: + fprintf(stderr, "FP_OPCODE_TEX"); break; + + case FP_OPCODE_TXB: + fprintf(stderr, "FP_OPCODE_TXB"); break; + + case FP_OPCODE_TXP: + fprintf(stderr, "FP_OPCODE_TXP"); break; + + case FP_OPCODE_X2D: + fprintf(stderr, "FP_OPCODE_XPD"); break; + } + + fprintf(stderr, " D(0x%x:%d:%d%d%d%d) ", + fp[a].DstReg.File, fp[a].DstReg.Index, + fp[a].DstReg.WriteMask[0], fp[a].DstReg.WriteMask[1], + fp[a].DstReg.WriteMask[2], fp[a].DstReg.WriteMask[3]); + + fprintf(stderr, "S1(0x%x:%d:%d%d%d%d) ", fp[a].SrcReg[0].File, fp[a].SrcReg[0].Index, + fp[a].SrcReg[0].Swizzle[0], + fp[a].SrcReg[0].Swizzle[1], + fp[a].SrcReg[0].Swizzle[2], + fp[a].SrcReg[0].Swizzle[3]); + + fprintf(stderr, "S2(0x%x:%d:%d%d%d%d) ", fp[a].SrcReg[1].File, fp[a].SrcReg[1].Index, + fp[a].SrcReg[1].Swizzle[0], + fp[a].SrcReg[1].Swizzle[1], + fp[a].SrcReg[1].Swizzle[2], + fp[a].SrcReg[1].Swizzle[3]); + + fprintf(stderr, "S3(0x%x:%d:%d%d%d%d)", fp[a].SrcReg[2].File, fp[a].SrcReg[2].Index, + fp[a].SrcReg[2].Swizzle[0], + fp[a].SrcReg[2].Swizzle[1], + fp[a].SrcReg[2].Swizzle[2], + fp[a].SrcReg[2].Swizzle[3]); + + fprintf(stderr, "\n"); + } +} void _mesa_parse_arb_fragment_program(GLcontext * ctx, GLenum target, const GLubyte * str, GLsizei len, struct fragment_program *program) { + GLuint retval; + struct arb_program ap; + + retval = _mesa_parse_arb_program(ctx, str, len, &ap); + + /* XXX: Parse error. Cleanup things and return */ + if (retval) + { + return; + } + + /* XXX: Eh.. we parsed something that wasn't a fragment program. doh! */ + if (ap.type != GL_FRAGMENT_PROGRAM_ARB) + { + return; + } + +#if DEBUG_FP + debug_fp_inst(ap.Base.NumInstructions, ap.FPInstructions); +#endif + /* copy the relvant contents of the arb_program struct into the + * fragment_program struct + */ + program->Base.NumInstructions = ap.Base.NumInstructions; + program->Base.NumTemporaries = ap.Base.NumTemporaries; + program->Base.NumParameters = ap.Base.NumParameters; + program->Base.NumAttributes = ap.Base.NumAttributes; + program->Base.NumAddressRegs = ap.Base.NumAddressRegs; + + program->Instructions = ap.FPInstructions; + program->InputsRead = ap.InputsRead; + program->OutputsWritten = ap.OutputsWritten; + for (retval=0; retval<MAX_TEXTURE_IMAGE_UNITS; retval++) + program->TexturesUsed[retval] = ap.TexturesUsed[retval]; + program->NumAluInstructions = ap.NumAluInstructions; + program->NumTexInstructions = ap.NumTexInstructions; + program->NumTexIndirections = ap.NumTexIndirections; + program->Parameters = ap.Parameters; } diff --git a/src/mesa/main/arbparse.c b/src/mesa/main/arbparse.c new file mode 100644 index 00000000000..032b5cc5035 --- /dev/null +++ b/src/mesa/main/arbparse.c @@ -0,0 +1,5718 @@ +/* + * Mesa 3-D graphics library + * Version: 5.1 + * + * Copyright (C) 1999-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. + */ + +#define DEBUG_PARSING 0 + +/** + * \file arbparse.c + * ARB_*_program parser core + * \author Michal Krol, Karl Rasche + */ + + +#include "mtypes.h" +#include "glheader.h" +#include "context.h" +#include "hash.h" +#include "imports.h" +#include "macros.h" +#include "program.h" +#include "nvvertprog.h" +#include "nvfragprog.h" +#include "arbparse.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/* TODO: + * Fragment Program Stuff: + * ----------------------------------------------------- + * - How does negating on SWZ work?? If any of the components have a -, negate? + * - how does thing like 'foo[N]' work in src registers? + * + * - things from Michal's email + * + overflow on atoi + * + not-overflowing floats (don't use parse_integer..) + * + * + fix multiple cases in switches, that might change + * (these are things that are #defined to the same value, but occur + * only on fp or vp's, which funkifies the switch statements) + * - STATE_TEX_* STATE_CLIP_PLANE, etc and PRECISION_HINT_FASTEST/PositionInvariant + * + * - check all limits of number of various variables + * + parameters + * + modelview matrix number + * + * - test! test! test! + * + * Vertex Program Stuff: + * ----------------------------------------------------- + * - Add in cases for vp attribs + * + VERTEX_ATTRIB_MATRIXINDEX -- ?? + * + VERTEX_ATTRIB_GENERIC + * * Test for input alias error --> bleh! + * + * - ARRAY_INDEX_RELATIVE + * - grep for XXX + * + * Mesa Stuff + * ----------------------------------------------------- + * - vp_src swizzle is GLubyte, fp_src swizzle is GLuint + * - fetch state listed in program_parameters list + * + WTF should this go??? + * + currently in nvvertexec.c and s_nvfragprog.c + * + * - allow for multiple address registers (and fetch address regs properly) + * + * Cosmetic Stuff + * ----------------------------------------------------- + * - fix compiler warnings + * - remove any leftover unused grammer.c stuff (dict_ ?) + * - fix grammer.c error handling so its not static + * - #ifdef around stuff pertaining to extentions + * + * Outstanding Questions: + * ----------------------------------------------------- + * - palette matrix? do we support this extension? what is the extention? + * - When can we fetch env/local params from their own register files, and when + * to we have to fetch them into the main state register file? (think arrays) + * + * Grammar Changes: + * ----------------------------------------------------- + * - changed optional_exponent rule from: + * " exponent .or .true .emit '1' .emit 0x00;\n" + * to + * " exponent .or .true .emit '1' .emit 0x00 .emit $;\n" + * + * - XXX: need to recognize "1" as a valid float ? + */ + +typedef unsigned char byte; +typedef byte *production; + +/*----------------------------------------------------------------------- + * From here on down is the syntax checking portion + */ + +/* VERSION: 0.3 */ + +/* + INTRODUCTION + ------------ + + The task is to check the syntax of an input string. Input string is a stream of ASCII + characters terminated with null-character ('\0'). Checking it using C language is + difficult and hard to implement without bugs. It is hard to maintain and change prior + to further syntax changes. + + This is because of high redundancy of the C code. Large blocks of code are duplicated with + only small changes. Even using macros does not solve the problem, because macros cannot + erase the complexity of the code. + + The resolution is to create a new language that will be highly oriented to our task. Once + we describe particular syntax, we are done. We can then focus on the code that implements + the language. The size and complexity of it is relatively small than the code that directly + checks the syntax. + + First, we must implement our new language. Here, the language is implemented in C, but it + could also be implemented in any other language. The code is listed below. We must take + a good care that it is bug free. This is simple because the code is simple and clean. + + Next, we must describe the syntax of our new language in itself. Once created and checked + manually that it is correct, we can use it to check another scripts. + + Note that our new language loading code does not have to check the syntax. It is because we + assume that the script describing itself is correct, and other scripts can be syntactically + checked by the former script. The loading code must only do semantic checking which leads us to + simple resolving references. + + THE LANGUAGE + ------------ + + Here I will describe the syntax of the new language (further called "Synek"). It is mainly a + sequence of declarations terminated by a semicolon. The declaration consists of a symbol, + which is an identifier, and its definition. A definition is in turn a sequence of specifiers + connected with ".and" or ".or" operator. These operators cannot be mixed together in a one + definition. Specifier can be a symbol, string, character, character range or a special + keyword ".true" or ".false". + + On the very beginning of the script there is a declaration of a root symbol and is in the form: + .syntax <root_symbol>; + The <root_symbol> must be on of the symbols in declaration sequence. The syntax is correct if + the root symbol evaluates to true. A symbol evaluates to true if the definition associated with + the symbol evaluates to true. Definition evaluation depends on the operator used to connect + specifiers in the definition. If ".and" operator is used, definition evaluates to true if and + only if all the specifiers evaluate to true. If ".or" operator is used, definition evalutes to + true if any of the specifiers evaluates to true. If definition contains only one specifier, + it is evaluated as if it was connected with ".true" keyword by ".and" operator. + + If specifier is a ".true" keyword, it always evaluates to true. + + If specifier is a ".false" keyword, it always evaluates to false. Specifier evaluates to false + when it does not evaluate to true. + + Character range specifier is in the form: + '<first_character>' - '<second_character>' + If specifier is a character range, it evaluates to true if character in the stream is greater + or equal to <first_character> and less or equal to <second_character>. In that situation + the stream pointer is advanced to point to next character in the stream. All C-style escape + sequences are supported although trigraph sequences are not. The comparisions are performed + on 8-bit unsigned integers. + + Character specifier is in the form: + '<single_character>' + It evaluates to true if the following character range specifier evaluates to true: + '<single_character>' - '<single_character>' + + String specifier is in the form: + "<string>" + Let N be the number of characters in <string>. Let <string>[i] designate i-th character in + <string>. Then the string specifier evaluates to true if and only if for i in the range [0, N) + the following character specifier evaluates to true: + '<string>[i]' + If <string>[i] is a quotation mark, '<string>[i]' is replaced with '\<string>[i]'. + + Symbol specifier can be optionally preceded by a ".loop" keyword in the form: + .loop <symbol> (1) + where <symbol> is defined as follows: + <symbol> <definition>; (2) + Construction (1) is replaced by the following code: + <symbol$1> + and declaration (2) is replaced by the following: + <symbol$1> <symbol$2> .or .true; + <symbol$2> <symbol> .and <symbol$1>; + <symbol> <definition>; + + ESCAPE SEQUENCES + ---------------- + + Synek supports all escape sequences in character specifiers. The mapping table is listed below. + All occurences of the characters in the first column are replaced with the corresponding + character in the second column. + + Escape sequence Represents + ------------------------------------------------------------------------------------------------ + \a Bell (alert) + \b Backspace + \f Formfeed + \n New line + \r Carriage return + \t Horizontal tab + \v Vertical tab + \' Single quotation mark + \" Double quotation mark + \\ Backslash + \? Literal question mark + \ooo ASCII character in octal notation + \xhhh ASCII character in hexadecimal notation + ------------------------------------------------------------------------------------------------ + + RAISING ERRORS + -------------- + + Any specifier can be followed by a special construction that is executed when the specifier + evaluates to false. The construction is in the form: + .error <ERROR_TEXT> + <ERROR_TEXT> is an identifier declared earlier by error text declaration. The declaration is + in the form: + .errtext <ERROR_TEXT> "<error_desc>" + When specifier evaluates to false and this construction is present, parsing is stopped + immediately and <error_desc> is returned as a result of parsing. The error position is also + returned and it is meant as an offset from the beggining of the stream to the character that + was valid so far. Example: + + (**** syntax script ****) + + .syntax program; + .errtext MISSING_SEMICOLON "missing ';'" + program declaration .and .loop space .and ';' .error MISSING_SEMICOLON .and + .loop space .and '\0'; + declaration "declare" .and .loop space .and identifier; + space ' '; + + (**** sample code ****) + + declare foo , + + In the example above checking the sample code will result in error message "missing ';'" and + error position 12. The sample code is not correct. Note the presence of '\0' specifier to + assure that there is no code after semicolon - only spaces. + <error_desc> can optionally contain identifier surrounded by dollar signs $. In such a case, + the identifier and dollar signs are replaced by a string retrieved by invoking symbol with + the identifier name. The starting position is the error position. The lenght of the resulting + string is the position after invoking the symbol. + + PRODUCTION + ---------- + + Synek not only checks the syntax but it can also produce (emit) bytes associated with specifiers + that evaluate to true. That is, every specifier and optional error construction can be followed + by a number of emit constructions that are in the form: + .emit <parameter> + <paramater> can be a HEX number, identifier, a star * or a dollar $. HEX number is preceded by + 0x or 0X. If <parameter> is an identifier, it must be earlier declared by emit code declaration + in the form: + .emtcode <identifier> <hex_number> + + When given specifier evaluates to true, all emits associated with the specifier are output + in order they were declared. A star means that last-read character should be output instead + of constant value. Example: + + (**** syntax script ****) + + .syntax foobar; + .emtcode WORD_FOO 0x01 + .emtcode WORD_BAR 0x02 + foobar FOO .emit WORD_FOO .or BAR .emit WORD_BAR .or .true .emit 0x00; + FOO "foo" .and SPACE; + BAR "bar" .and SPACE; + SPACE ' ' .or '\0'; + + (**** sample text 1 ****) + + foo + + (**** sample text 2 ****) + + foobar + + For both samples the result will be one-element array. For first sample text it will be + value 1, for second - 0. Note that every text will be accepted because of presence of + .true as an alternative. + + Another example: + + (**** syntax script ****) + + .syntax declaration; + .emtcode VARIABLE 0x01 + declaration "declare" .and .loop space .and + identifier .emit VARIABLE .and (1) + .true .emit 0x00 .and (2) + .loop space .and ';'; + space ' ' .or '\t'; + identifier .loop id_char .emit *; (3) + id_char 'a'-'z' .or 'A'-'Z' .or '_'; + + (**** sample code ****) + + declare fubar; + + In specifier (1) symbol <identifier> is followed by .emit VARIABLE. If it evaluates to + true, VARIABLE constant and then production of the symbol is output. Specifier (2) is used + to terminate the string with null to signal when the string ends. Specifier (3) outputs + all characters that make declared identifier. The result of sample code will be the + following array: + { 1, 'f', 'u', 'b', 'a', 'r', 0 } + + If .emit is followed by dollar $, it means that current position should be output. Current + position is a 32-bit unsigned integer distance from the very beginning of the parsed string to + first character consumed by the specifier associated with the .emit instruction. Current + position is stored in the output buffer in Little-Endian convention (the lowest byte comes + first). +*/ + +/** + * This is the text describing the rules to parse the grammar + */ +#include "arbparse_syn.h" + +/** + * These should match up with the values defined in arbparse.syn.h + */ + +#define REVISION 0x03 + +/* program type */ +#define FRAGMENT_PROGRAM 0x01 +#define VERTEX_PROGRAM 0x02 + +/* program section */ +#define OPTION 0x01 +#define INSTRUCTION 0x02 +#define DECLARATION 0x03 +#define END 0x04 + +/* fragment program option flags */ +#define ARB_PRECISION_HINT_FASTEST 0x01 +#define ARB_PRECISION_HINT_NICEST 0x02 +#define ARB_FOG_EXP 0x04 +#define ARB_FOG_EXP2 0x08 +#define ARB_FOG_LINEAR 0x10 + +/* vertex program option flags */ +#define ARB_POSITION_INVARIANT 0x01 + +/* fragment program instruction class */ +#define F_ALU_INST 0x01 +#define F_TEX_INST 0x02 + +/* fragment program instruction type */ +#define F_ALU_VECTOR 0x01 +#define F_ALU_SCALAR 0x02 +#define F_ALU_BINSC 0x03 +#define F_ALU_BIN 0x04 +#define F_ALU_TRI 0x05 +#define F_ALU_SWZ 0x06 +#define F_TEX_SAMPLE 0x07 +#define F_TEX_KIL 0x08 + +/* vertex program instruction type */ +#define V_GEN_ARL 0x01 +#define V_GEN_VECTOR 0x02 +#define V_GEN_SCALAR 0x03 +#define V_GEN_BINSC 0x04 +#define V_GEN_BIN 0x05 +#define V_GEN_TRI 0x06 +#define V_GEN_SWZ 0x07 + +/* fragment program instruction code */ +#define F_ABS 0x00 +#define F_ABS_SAT 0x01 +#define F_FLR 0x02 +#define F_FLR_SAT 0x03 +#define F_FRC 0x04 +#define F_FRC_SAT 0x05 +#define F_LIT 0x06 +#define F_LIT_SAT 0x07 +#define F_MOV 0x08 +#define F_MOV_SAT 0x09 +#define F_COS 0x0A +#define F_COS_SAT 0x0B +#define F_EX2 0x0C +#define F_EX2_SAT 0x0D +#define F_LG2 0x0E +#define F_LG2_SAT 0x0F +#define F_RCP 0x10 +#define F_RCP_SAT 0x11 +#define F_RSQ 0x12 +#define F_RSQ_SAT 0x13 +#define F_SIN 0x14 +#define F_SIN_SAT 0x15 +#define F_SCS 0x16 +#define F_SCS_SAT 0x17 +#define F_POW 0x18 +#define F_POW_SAT 0x19 +#define F_ADD 0x1A +#define F_ADD_SAT 0x1B +#define F_DP3 0x1C +#define F_DP3_SAT 0x1D +#define F_DP4 0x1E +#define F_DP4_SAT 0x1F +#define F_DPH 0x20 +#define F_DPH_SAT 0x21 +#define F_DST 0x22 +#define F_DST_SAT 0x23 +#define F_MAX 0x24 +#define F_MAX_SAT 0x25 +#define F_MIN 0x26 +#define F_MIN_SAT 0x27 +#define F_MUL 0x28 +#define F_MUL_SAT 0x29 +#define F_SGE 0x2A +#define F_SGE_SAT 0x2B +#define F_SLT 0x2C +#define F_SLT_SAT 0x2D +#define F_SUB 0x2E +#define F_SUB_SAT 0x2F +#define F_XPD 0x30 +#define F_XPD_SAT 0x31 +#define F_CMP 0x32 +#define F_CMP_SAT 0x33 +#define F_LRP 0x34 +#define F_LRP_SAT 0x35 +#define F_MAD 0x36 +#define F_MAD_SAT 0x37 +#define F_SWZ 0x38 +#define F_SWZ_SAT 0x39 +#define F_TEX 0x3A +#define F_TEX_SAT 0x3B +#define F_TXB 0x3C +#define F_TXB_SAT 0x3D +#define F_TXP 0x3E +#define F_TXP_SAT 0x3F +#define F_KIL 0x40 + +/* vertex program instruction code */ +#define V_ARL 0x01 +#define V_ABS 0x02 +#define V_FLR 0x03 +#define V_FRC 0x04 +#define V_LIT 0x05 +#define V_MOV 0x06 +#define V_EX2 0x07 +#define V_EXP 0x08 +#define V_LG2 0x09 +#define V_LOG 0x0A +#define V_RCP 0x0B +#define V_RSQ 0x0C +#define V_POW 0x0D +#define V_ADD 0x0E +#define V_DP3 0x0F +#define V_DP4 0x10 +#define V_DPH 0x11 +#define V_DST 0x12 +#define V_MAX 0x13 +#define V_MIN 0x14 +#define V_MUL 0x15 +#define V_SGE 0x16 +#define V_SLT 0x17 +#define V_SUB 0x18 +#define V_XPD 0x19 +#define V_MAD 0x1A +#define V_SWZ 0x1B + +/* fragment attribute binding */ +#define FRAGMENT_ATTRIB_COLOR 0x01 +#define FRAGMENT_ATTRIB_TEXCOORD 0x02 +#define FRAGMENT_ATTRIB_FOGCOORD 0x03 +#define FRAGMENT_ATTRIB_POSITION 0x04 + +/* vertex attribute binding */ +#define VERTEX_ATTRIB_POSITION 0x01 +#define VERTEX_ATTRIB_WEIGHT 0x02 +#define VERTEX_ATTRIB_NORMAL 0x03 +#define VERTEX_ATTRIB_COLOR 0x04 +#define VERTEX_ATTRIB_FOGCOORD 0x05 +#define VERTEX_ATTRIB_TEXCOORD 0x06 +#define VERTEX_ATTRIB_MATRIXINDEX 0x07 +#define VERTEX_ATTRIB_GENERIC 0x08 + +/* fragment result binding */ +#define FRAGMENT_RESULT_COLOR 0x01 +#define FRAGMENT_RESULT_DEPTH 0x02 + +/* vertex result binding */ +#define VERTEX_RESULT_POSITION 0x01 +#define VERTEX_RESULT_COLOR 0x02 +#define VERTEX_RESULT_FOGCOORD 0x03 +#define VERTEX_RESULT_POINTSIZE 0x04 +#define VERTEX_RESULT_TEXCOORD 0x05 + +/* texture target */ +#define TEXTARGET_1D 0x01 +#define TEXTARGET_2D 0x02 +#define TEXTARGET_3D 0x03 +#define TEXTARGET_RECT 0x04 +#define TEXTARGET_CUBE 0x05 + +/* sign */ +/* +$3: removed. '+' and '-' are used instead. +*/ +/* +#define SIGN_PLUS 0x00 +#define SIGN_MINUS 0x01 +*/ + +/* face type */ +#define FACE_FRONT 0x00 +#define FACE_BACK 0x01 + +/* color type */ +#define COLOR_PRIMARY 0x00 +#define COLOR_SECONDARY 0x01 + +/* component */ +/* +$3: Added enumerants. +*/ +#define COMPONENT_X 0x00 +#define COMPONENT_Y 0x01 +#define COMPONENT_Z 0x02 +#define COMPONENT_W 0x03 +#define COMPONENT_0 0x04 +#define COMPONENT_1 0x05 + +#define ARRAY_INDEX_ABSOLUTE 0x00 +#define ARRAY_INDEX_RELATIVE 0x01 + +/* matrix name */ +#define MATRIX_MODELVIEW 0x01 +#define MATRIX_PROJECTION 0x02 +#define MATRIX_MVP 0x03 +#define MATRIX_TEXTURE 0x04 +#define MATRIX_PALETTE 0x05 +#define MATRIX_PROGRAM 0x06 + +/* matrix modifier */ +#define MATRIX_MODIFIER_IDENTITY 0x00 +#define MATRIX_MODIFIER_INVERSE 0x01 +#define MATRIX_MODIFIER_TRANSPOSE 0x02 +#define MATRIX_MODIFIER_INVTRANS 0x03 + +/* constant type */ +#define CONSTANT_SCALAR 0x01 +#define CONSTANT_VECTOR 0x02 + +/* program param type */ +#define PROGRAM_PARAM_ENV 0x01 +#define PROGRAM_PARAM_LOCAL 0x02 + +/* register type */ +#define REGISTER_ATTRIB 0x01 +#define REGISTER_PARAM 0x02 +#define REGISTER_RESULT 0x03 +#define REGISTER_ESTABLISHED_NAME 0x04 + +/* param binding */ +#define PARAM_NULL 0x00 +#define PARAM_ARRAY_ELEMENT 0x01 +#define PARAM_STATE_ELEMENT 0x02 +#define PARAM_PROGRAM_ELEMENT 0x03 +#define PARAM_PROGRAM_ELEMENTS 0x04 +#define PARAM_CONSTANT 0x05 + +/* param state property */ +#define STATE_MATERIAL_PARSER 0x01 +#define STATE_LIGHT_PARSER 0x02 +#define STATE_LIGHT_MODEL 0x03 +#define STATE_LIGHT_PROD 0x04 +#define STATE_FOG 0x05 +#define STATE_MATRIX_ROWS 0x06 +/* fragment program only */ +#define STATE_TEX_ENV 0x07 +#define STATE_DEPTH 0x08 +/* vertex program only */ +#define STATE_TEX_GEN 0x07 +#define STATE_CLIP_PLANE 0x08 +#define STATE_POINT 0x09 + +/* state material property */ +#define MATERIAL_AMBIENT 0x01 +#define MATERIAL_DIFFUSE 0x02 +#define MATERIAL_SPECULAR 0x03 +#define MATERIAL_EMISSION 0x04 +#define MATERIAL_SHININESS 0x05 + +/* state light property */ +#define LIGHT_AMBIENT 0x01 +#define LIGHT_DIFFUSE 0x02 +#define LIGHT_SPECULAR 0x03 +#define LIGHT_POSITION 0x04 +#define LIGHT_ATTENUATION 0x05 +#define LIGHT_HALF 0x06 +#define LIGHT_SPOT_DIRECTION 0x07 + +/* state light model property */ +#define LIGHT_MODEL_AMBIENT 0x01 +#define LIGHT_MODEL_SCENECOLOR 0x02 + +/* state light product property */ +#define LIGHT_PROD_AMBIENT 0x01 +#define LIGHT_PROD_DIFFUSE 0x02 +#define LIGHT_PROD_SPECULAR 0x03 + +/* state texture environment property */ +#define TEX_ENV_COLOR 0x01 + +/* state texture generation coord property */ +#define TEX_GEN_EYE 0x01 +#define TEX_GEN_OBJECT 0x02 + +/* state fog property */ +#define FOG_COLOR 0x01 +#define FOG_PARAMS 0x02 + +/* state depth property */ +#define DEPTH_RANGE 0x01 + +/* state point parameters property */ +#define POINT_SIZE 0x01 +#define POINT_ATTENUATION 0x02 + +/* declaration */ +#define ATTRIB 0x01 +#define PARAM 0x02 +#define TEMP 0x03 +#define OUTPUT 0x04 +#define ALIAS 0x05 +/* vertex program 1.0 only */ +#define ADDRESS 0x06 + +/* + memory management routines +*/ +static GLvoid *mem_alloc (GLsizei); +static GLvoid mem_free (GLvoid **); +static GLvoid *mem_realloc (GLvoid *, GLsizei, GLsizei); +static byte *str_duplicate (const byte *); + +/* + internal error messages +*/ +static const byte *OUT_OF_MEMORY = + (byte *) "internal error 1001: out of physical memory"; +static const byte *UNRESOLVED_REFERENCE = + (byte *) "internal error 1002: unresolved reference '$'"; +static const byte *INVALID_PARAMETER = + (byte *) "internal error 1003: invalid parameter"; + +static const byte *error_message = NULL; +static byte *error_param = NULL; /* this is inserted into error_message in place of $ */ +static GLint error_position = -1; + +static byte *unknown = (byte *) "???"; + +static GLvoid +clear_last_error () +{ + /* reset error message */ + error_message = NULL; + + /* free error parameter - if error_param is a "???" don't free it - it's static */ + if (error_param != unknown) + mem_free ((GLvoid **) & error_param); + else + error_param = NULL; + + /* reset error position */ + error_position = -1; +} + +static GLvoid +set_last_error (const byte * msg, byte * param, GLint pos) +{ + if (error_message != NULL) + return; + + error_message = msg; + if (param != NULL) + error_param = param; + else + error_param = unknown; + + error_position = pos; +} + +/* + memory management routines +*/ +static GLvoid * +mem_alloc (GLsizei size) +{ + GLvoid *ptr = _mesa_malloc (size); + if (ptr == NULL) + set_last_error (OUT_OF_MEMORY, NULL, -1); + return ptr; +} + +static GLvoid +mem_free (GLvoid ** ptr) +{ + _mesa_free (*ptr); + *ptr = NULL; +} + +static GLvoid * +mem_realloc (GLvoid * ptr, GLsizei old_size, GLsizei new_size) +{ + GLvoid *ptr2 = _mesa_realloc (ptr, old_size, new_size); + if (ptr2 == NULL) + set_last_error (OUT_OF_MEMORY, NULL, -1); + return ptr2; +} + +static byte * +str_duplicate (const byte * str) +{ + return (byte *) _mesa_strdup ((const char *) str); +} + +/* + emit type typedef +*/ +typedef enum emit_type_ +{ + et_byte, /* explicit number */ + et_stream, /* eaten character */ + et_position /* current position */ +} +emit_type; + +/* + emit typedef +*/ +typedef struct emit_ +{ + emit_type m_emit_type; + byte m_byte; /* et_byte */ + struct emit_ *m_next; +} +emit; + +static GLvoid +emit_create (emit ** em) +{ + *em = mem_alloc (sizeof (emit)); + if (*em) { + (**em).m_emit_type = et_byte; + (**em).m_byte = 0; + (**em).m_next = NULL; + } +} + +static GLvoid +emit_destroy (emit ** em) +{ + if (*em) { + emit_destroy (&(**em).m_next); + mem_free ((GLvoid **) em); + } +} + +static GLvoid +emit_append (emit ** em, emit ** ne) +{ + if (*em) + emit_append (&(**em).m_next, ne); + else + *em = *ne; +} + +/* + * error typedef + */ +typedef struct error_ +{ + byte *m_text; + byte *m_token_name; + struct defntn_ *m_token; +} +error; + +static GLvoid +error_create (error ** er) +{ + *er = mem_alloc (sizeof (error)); + if (*er) { + (**er).m_text = NULL; + (**er).m_token_name = NULL; + (**er).m_token = NULL; + } +} + +static GLvoid +error_destroy (error ** er) +{ + if (*er) { + mem_free ((GLvoid **) & (**er).m_text); + mem_free ((GLvoid **) & (**er).m_token_name); + mem_free ((GLvoid **) er); + } +} + +struct dict_; +static byte *error_get_token (error *, struct dict_ *, const byte *, GLuint); + +/* + * specifier type typedef +*/ +typedef enum spec_type_ +{ + st_false, + st_true, + st_byte, + st_byte_range, + st_string, + st_identifier, + st_identifier_loop, + st_debug +} spec_type; + + +/* + * specifier typedef + */ +typedef struct spec_ +{ + spec_type m_spec_type; + byte m_byte[2]; /* st_byte, st_byte_range */ + byte *m_string; /* st_string */ + struct defntn_ *m_defntn; /* st_identifier, st_identifier_loop */ + emit *m_emits; + error *m_errtext; + struct spec_ *m_next; +} spec; + + +static GLvoid +spec_create (spec ** sp) +{ + *sp = mem_alloc (sizeof (spec)); + if (*sp) { + (**sp).m_spec_type = st_false; + (**sp).m_byte[0] = '\0'; + (**sp).m_byte[1] = '\0'; + (**sp).m_string = NULL; + (**sp).m_defntn = NULL; + (**sp).m_emits = NULL; + (**sp).m_errtext = NULL; + (**sp).m_next = NULL; + } +} + +static GLvoid +spec_destroy (spec ** sp) +{ + if (*sp) { + spec_destroy (&(**sp).m_next); + emit_destroy (&(**sp).m_emits); + error_destroy (&(**sp).m_errtext); + mem_free ((GLvoid **) & (**sp).m_string); + mem_free ((GLvoid **) sp); + } +} + +static GLvoid +spec_append (spec ** sp, spec ** ns) +{ + if (*sp) + spec_append (&(**sp).m_next, ns); + else + *sp = *ns; +} + +/* + * operator typedef + */ +typedef enum oper_ +{ + op_none, + op_and, + op_or +} oper; + + +/* + * definition typedef + */ +typedef struct defntn_ +{ + oper m_oper; + spec *m_specs; + struct defntn_ *m_next; +#ifndef NDEBUG + GLint m_referenced; +#endif +} defntn; + + +static GLvoid +defntn_create (defntn ** de) +{ + *de = mem_alloc (sizeof (defntn)); + if (*de) { + (**de).m_oper = op_none; + (**de).m_specs = NULL; + (**de).m_next = NULL; +#ifndef NDEBUG + (**de).m_referenced = 0; +#endif + } +} + +static GLvoid +defntn_destroy (defntn ** de) +{ + if (*de) { + defntn_destroy (&(**de).m_next); + spec_destroy (&(**de).m_specs); + mem_free ((GLvoid **) de); + } +} + +static GLvoid +defntn_append (defntn ** de, defntn ** nd) +{ + if (*de) + defntn_append (&(**de).m_next, nd); + else + *de = *nd; +} + +/* + * dictionary typedef + */ +typedef struct dict_ +{ + defntn *m_defntns; + defntn *m_syntax; + defntn *m_string; + struct dict_ *m_next; +} dict; + + +static GLvoid +dict_create (dict ** di) +{ + *di = mem_alloc (sizeof (dict)); + if (*di) { + (**di).m_defntns = NULL; + (**di).m_syntax = NULL; + (**di).m_string = NULL; + (**di).m_next = NULL; + } +} + +static GLvoid +dict_destroy (dict ** di) +{ + if (*di) { + dict_destroy (&(**di).m_next); + defntn_destroy (&(**di).m_defntns); + mem_free ((GLvoid **) di); + } +} + +/* + * byte array typedef + */ +typedef struct barray_ +{ + byte *data; + GLuint len; +} barray; + + +static GLvoid +barray_create (barray ** ba) +{ + *ba = mem_alloc (sizeof (barray)); + if (*ba) { + (**ba).data = NULL; + (**ba).len = 0; + } +} + +static GLvoid +barray_destroy (barray ** ba) +{ + if (*ba) { + mem_free ((GLvoid **) & (**ba).data); + mem_free ((GLvoid **) ba); + } +} + +/* + * reallocates byte array to requested size, + * returns 0 on success, + * returns 1 otherwise + */ +static GLint +barray_resize (barray ** ba, GLuint nlen) +{ + byte *new_pointer; + + if (nlen == 0) { + mem_free ((void **) &(**ba).data); + (**ba).data = NULL; + (**ba).len = 0; + + return 0; + } + else { + new_pointer = + mem_realloc ((**ba).data, (**ba).len * sizeof (byte), + nlen * sizeof (byte)); + if (new_pointer) { + (**ba).data = new_pointer; + (**ba).len = nlen; + + return 0; + } + } + + return 1; +} + +/* + * adds byte array pointed by *nb to the end of array pointed by *ba, + * returns 0 on success, + * returns 1 otherwise + */ +static GLint +barray_append (barray ** ba, barray ** nb) +{ + GLuint i; + const GLuint len = (**ba).len; + + if (barray_resize (ba, (**ba).len + (**nb).len)) + return 1; + + for (i = 0; i < (**nb).len; i++) + (**ba).data[len + i] = (**nb).data[i]; + + return 0; +} + +/* + * adds emit chain pointed by em to the end of array pointed by *ba, + * returns 0 on success, + * returns 1 otherwise + */ +static GLint +barray_push (barray ** ba, emit * em, byte c, GLuint pos) +{ + emit *temp = em; + GLuint count = 0; + + while (temp) { + if (temp->m_emit_type == et_position) + count += 4; /* position is a 32-bit unsigned integer */ + else + count++; + + temp = temp->m_next; + } + + if (barray_resize (ba, (**ba).len + count)) + return 1; + + while (em) { + if (em->m_emit_type == et_byte) + (**ba).data[(**ba).len - count--] = em->m_byte; + else if (em->m_emit_type == et_stream) + (**ba).data[(**ba).len - count--] = c; + + /* This is where the position is emitted into the stream */ + else { /* em->type == et_position */ +#if 0 + (**ba).data[(**ba).len - count--] = (byte) pos, + (**ba).data[(**ba).len - count--] = (byte) (pos >> 8), + (**ba).data[(**ba).len - count--] = (byte) (pos >> 16), + (**ba).data[(**ba).len - count--] = (byte) (pos >> 24); +#else + (**ba).data[(**ba).len - count--] = (byte) pos; + (**ba).data[(**ba).len - count--] = (byte) (pos / 0x100); + (**ba).data[(**ba).len - count--] = (byte) (pos / 0x10000); + (**ba).data[(**ba).len - count--] = (byte) (pos / 0x1000000); +#endif + } + + em = em->m_next; + } + + return 0; +} + +/* + * string to string map typedef + */ +typedef struct map_str_ +{ + byte *key; + byte *data; + struct map_str_ *next; +} map_str; + + +static GLvoid +map_str_create (map_str ** ma) +{ + *ma = mem_alloc (sizeof (map_str)); + if (*ma) { + (**ma).key = NULL; + (**ma).data = NULL; + (**ma).next = NULL; + } +} + +static GLvoid +map_str_destroy (map_str ** ma) +{ + if (*ma) { + map_str_destroy (&(**ma).next); + mem_free ((GLvoid **) & (**ma).key); + mem_free ((GLvoid **) & (**ma).data); + mem_free ((GLvoid **) ma); + } +} + +static GLvoid +map_str_append (map_str ** ma, map_str ** nm) +{ + if (*ma) + map_str_append (&(**ma).next, nm); + else + *ma = *nm; +} + +/* + * searches the map for specified key, + * if the key is matched, *data is filled with data associated with the key, + * returns 0 if the key is matched, + * returns 1 otherwise + */ +static GLint +map_str_find (map_str ** ma, const byte * key, byte ** data) +{ + while (*ma) { + if (strcmp ((const char *) (**ma).key, (const char *) key) == 0) { + *data = str_duplicate ((**ma).data); + if (*data == NULL) + return 1; + + return 0; + } + + ma = &(**ma).next; + } + + set_last_error (UNRESOLVED_REFERENCE, str_duplicate (key), -1); + return 1; +} + +/* + * string to byte map typedef + */ +typedef struct map_byte_ +{ + byte *key; + byte data; + struct map_byte_ *next; +} map_byte; + +static GLvoid +map_byte_create (map_byte ** ma) +{ + *ma = mem_alloc (sizeof (map_byte)); + if (*ma) { + (**ma).key = NULL; + (**ma).data = 0; + (**ma).next = NULL; + } +} + +static GLvoid +map_byte_destroy (map_byte ** ma) +{ + if (*ma) { + map_byte_destroy (&(**ma).next); + mem_free ((GLvoid **) & (**ma).key); + mem_free ((GLvoid **) ma); + } +} + +static GLvoid +map_byte_append (map_byte ** ma, map_byte ** nm) +{ + if (*ma) + map_byte_append (&(**ma).next, nm); + else + *ma = *nm; +} + +/* + * searches the map for specified key, + * if the key is matched, *data is filled with data associated with the key, + * returns 0 if the is matched, + * returns 1 otherwise + */ +static GLint +map_byte_find (map_byte ** ma, const byte * key, byte * data) +{ + while (*ma) { + if (strcmp ((const char *) (**ma).key, (const char *) key) == 0) { + *data = (**ma).data; + return 0; + } + + ma = &(**ma).next; + } + + set_last_error (UNRESOLVED_REFERENCE, str_duplicate (key), -1); + return 1; +} + +/* + * string to defntn map typedef + */ +typedef struct map_def_ +{ + byte *key; + defntn *data; + struct map_def_ *next; +} map_def; + +static GLvoid +map_def_create (map_def ** ma) +{ + *ma = mem_alloc (sizeof (map_def)); + if (*ma) { + (**ma).key = NULL; + (**ma).data = NULL; + (**ma).next = NULL; + } +} + +static GLvoid +map_def_destroy (map_def ** ma) +{ + if (*ma) { + map_def_destroy (&(**ma).next); + mem_free ((GLvoid **) & (**ma).key); + mem_free ((GLvoid **) ma); + } +} + +static GLvoid +map_def_append (map_def ** ma, map_def ** nm) +{ + if (*ma) + map_def_append (&(**ma).next, nm); + else + *ma = *nm; +} + +/* + * searches the map for specified key, + * if the key is matched, *data is filled with data associated with the key, + * returns 0 if the is matched, + * returns 1 otherwise + */ +static GLint +map_def_find (map_def ** ma, const byte * key, defntn ** data) +{ + while (*ma) { + if (_mesa_strcmp ((const char *) (**ma).key, (const char *) key) == 0) { + *data = (**ma).data; + + return 0; + } + + ma = &(**ma).next; + } + + set_last_error (UNRESOLVED_REFERENCE, str_duplicate (key), -1); + return 1; +} + +/* + * returns 1 if given character is a space, + * returns 0 otherwise + */ +static GLint +is_space (byte c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\r'; +} + +/* + * advances text pointer by 1 if character pointed by *text is a space, + * returns 1 if a space has been eaten, + * returns 0 otherwise + */ +static GLint +eat_space (const byte ** text) +{ + if (is_space (**text)) { + (*text)++; + + return 1; + } + + return 0; +} + +/* + * returns 1 if text points to C-style comment start string "/ *", + * returns 0 otherwise + */ +static GLint +is_comment_start (const byte * text) +{ + return text[0] == '/' && text[1] == '*'; +} + +/* + * advances text pointer to first character after C-style comment block - if any, + * returns 1 if C-style comment block has been encountered and eaten, + * returns 0 otherwise + */ +static GLint +eat_comment (const byte ** text) +{ + if (is_comment_start (*text)) { + /* *text points to comment block - skip two characters to enter comment body */ + *text += 2; + /* skip any character except consecutive '*' and '/' */ + while (!((*text)[0] == '*' && (*text)[1] == '/')) + (*text)++; + /* skip those two terminating characters */ + *text += 2; + + return 1; + } + + return 0; +} + +/* + * advances text pointer to first character that is neither space nor C-style comment block + */ +static GLvoid +eat_spaces (const byte ** text) +{ + while (eat_space (text) || eat_comment (text)); +} + +/* + * resizes string pointed by *ptr to successfully add character c to the end of the string, + * returns 0 on success, + * returns 1 otherwise + */ +static GLint +string_grow (byte ** ptr, GLuint * len, byte c) +{ + /* reallocate the string in 16-length increments */ + if ((*len & 0x0F) == 0x0F || *ptr == NULL) { + byte *tmp = mem_realloc (*ptr, (*len) * sizeof (byte), + ((*len + 1 + 1 + + 0x0F) & ~0x0F) * sizeof (byte)); + if (tmp == NULL) + return 1; + + *ptr = tmp; + } + + if (c) { + /* append given character */ + (*ptr)[*len] = c; + (*len)++; + } + (*ptr)[*len] = '\0'; + + return 0; +} + +/* + * returns 1 if given character is valid identifier character a-z, A-Z, 0-9 or _ + * returns 0 otherwise + */ +static GLint +is_identifier (byte c) +{ + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || + (c >= '0' && c <= '9') || c == '_'; +} + +/* + * copies characters from *text to *id until non-identifier character is encountered, + * assumes that *id points to NULL object - caller is responsible for later freeing the string, + * text pointer is advanced to point past the copied identifier, + * returns 0 if identifier was successfully copied, + * returns 1 otherwise + */ +static GLint +get_identifier (const byte ** text, byte ** id) +{ + const byte *t = *text; + byte *p = NULL; + GLuint len = 0; + + if (string_grow (&p, &len, '\0')) + return 1; + + /* loop while next character in buffer is valid for identifiers */ + while (is_identifier (*t)) { + if (string_grow (&p, &len, *t++)) { + mem_free ((GLvoid **) & p); + return 1; + } + } + + *text = t; + *id = p; + + return 0; +} + +/* + * returns 1 if given character is HEX digit 0-9, A-F or a-f, + * returns 0 otherwise + */ +static GLint +is_hex (byte c) +{ + return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' + && c <= 'f'); +} + +/* + * returns value of passed character as if it was HEX digit + */ +static GLuint +hex2dec (byte c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + if (c >= 'A' && c <= 'F') + return c - 'A' + 10; + return c - 'a' + 10; +} + +/* + * converts sequence of HEX digits pointed by *text until non-HEX digit is encountered, + * advances text pointer past the converted sequence, + * returns the converted value + */ +static GLuint +hex_convert (const byte ** text) +{ + GLuint value = 0; + + while (is_hex (**text)) { + value = value * 0x10 + hex2dec (**text); + (*text)++; + } + + return value; +} + +/* + * returns 1 if given character is OCT digit 0-7, + * returns 0 otherwise + */ +static GLint +is_oct (byte c) +{ + return c >= '0' && c <= '7'; +} + +/* + * returns value of passed character as if it was OCT digit + */ +static GLint +oct2dec (byte c) +{ + return c - '0'; +} + +static byte +get_escape_sequence (const byte ** text) +{ + GLint value = 0; + + /* skip '\' character */ + (*text)++; + + switch (*(*text)++) { + case '\'': + return '\''; + case '"': + return '\"'; + case '?': + return '\?'; + case '\\': + return '\\'; + case 'a': + return '\a'; + case 'b': + return '\b'; + case 'f': + return '\f'; + case 'n': + return '\n'; + case 'r': + return '\r'; + case 't': + return '\t'; + case 'v': + return '\v'; + case 'x': + return (byte) hex_convert (text); + } + + (*text)--; + if (is_oct (**text)) { + value = oct2dec (*(*text)++); + if (is_oct (**text)) { + value = value * 010 + oct2dec (*(*text)++); + if (is_oct (**text)) + value = value * 010 + oct2dec (*(*text)++); + } + } + + return (byte) value; +} + +/* + * copies characters from *text to *str until " or ' character is encountered, + * assumes that *str points to NULL object - caller is responsible for later freeing the string, + * assumes that *text points to " or ' character that starts the string, + * text pointer is advanced to point past the " or ' character, + * returns 0 if string was successfully copied, + * returns 1 otherwise + */ +static GLint +get_string (const byte ** text, byte ** str) +{ + const byte *t = *text; + byte *p = NULL; + GLuint len = 0; + byte term_char; + + if (string_grow (&p, &len, '\0')) + return 1; + + /* read " or ' character that starts the string */ + term_char = *t++; + /* while next character is not the terminating character */ + while (*t && *t != term_char) { + byte c; + + if (*t == '\\') + c = get_escape_sequence (&t); + else + c = *t++; + + if (string_grow (&p, &len, c)) { + mem_free ((GLvoid **) & p); + return 1; + } + } + + /* skip " or ' character that ends the string */ + t++; + + *text = t; + *str = p; + return 0; +} + +/* + * gets emit code, the syntax is: ".emtcode" " " <symbol> " " ("0x" | "0X") <hex_value> + * assumes that *text already points to <symbol>, + * returns 0 if emit code is successfully read, + * returns 1 otherwise + */ +static GLint +get_emtcode (const byte ** text, map_byte ** ma) +{ + const byte *t = *text; + map_byte *m = NULL; + + map_byte_create (&m); + if (m == NULL) + return 1; + + if (get_identifier (&t, &m->key)) { + map_byte_destroy (&m); + return 1; + } + eat_spaces (&t); + + if (*t == '\'') { + byte *c; + + if (get_string (&t, &c)) { + map_byte_destroy (&m); + return 1; + } + + m->data = (byte) c[0]; + mem_free ((GLvoid **) & c); + } + else { + /* skip HEX "0x" or "0X" prefix */ + t += 2; + m->data = (byte) hex_convert (&t); + } + + eat_spaces (&t); + + *text = t; + *ma = m; + return 0; +} + +/* + * returns 0 on success, + * returns 1 otherwise + */ +static GLint +get_errtext (const byte ** text, map_str ** ma) +{ + const byte *t = *text; + map_str *m = NULL; + + map_str_create (&m); + if (m == NULL) + return 1; + + if (get_identifier (&t, &m->key)) { + map_str_destroy (&m); + return 1; + } + eat_spaces (&t); + + if (get_string (&t, &m->data)) { + map_str_destroy (&m); + return 1; + } + eat_spaces (&t); + + *text = t; + *ma = m; + return 0; +} + +/* + * returns 0 on success, + * returns 1 otherwise, + */ +static GLint +get_error (const byte ** text, error ** er, map_str * maps) +{ + const byte *t = *text; + byte *temp = NULL; + + if (*t != '.') + return 0; + + t++; + if (get_identifier (&t, &temp)) + return 1; + eat_spaces (&t); + + if (_mesa_strcmp ("error", (char *) temp) != 0) { + mem_free ((GLvoid **) & temp); + return 0; + } + + mem_free ((GLvoid **) & temp); + + error_create (er); + if (*er == NULL) + return 1; + + if (*t == '\"') { + if (get_string (&t, &(**er).m_text)) { + error_destroy (er); + return 1; + } + eat_spaces (&t); + } + else { + if (get_identifier (&t, &temp)) { + error_destroy (er); + return 1; + } + eat_spaces (&t); + + if (map_str_find (&maps, temp, &(**er).m_text)) { + mem_free ((GLvoid **) & temp); + error_destroy (er); + return 1; + } + + mem_free ((GLvoid **) & temp); + } + + /* try to extract "token" from "...$token$..." */ + { + char *processed = NULL; + GLuint len = 0, i = 0; + + if (string_grow ((byte **) (&processed), &len, '\0')) { + error_destroy (er); + return 1; + } + + while (i < _mesa_strlen ((char *) ((**er).m_text))) { + /* check if the dollar sign is repeated - if so skip it */ + if ((**er).m_text[i] == '$' && (**er).m_text[i + 1] == '$') { + if (string_grow ((byte **) (&processed), &len, '$')) { + mem_free ((GLvoid **) & processed); + error_destroy (er); + return 1; + } + + i += 2; + } + else if ((**er).m_text[i] != '$') { + if (string_grow ((byte **) (&processed), &len, (**er).m_text[i])) { + mem_free ((GLvoid **) & processed); + error_destroy (er); + return 1; + } + + i++; + } + else { + if (string_grow ((byte **) (&processed), &len, '$')) { + mem_free ((GLvoid **) & processed); + error_destroy (er); + return 1; + } + + { + /* length of token being extracted */ + GLuint tlen = 0; + + if (string_grow (&(**er).m_token_name, &tlen, '\0')) { + mem_free ((GLvoid **) & processed); + error_destroy (er); + return 1; + } + + /* skip the dollar sign */ + i++; + + while ((**er).m_text[i] != '$') { + if (string_grow + (&(**er).m_token_name, &tlen, (**er).m_text[i])) { + mem_free ((GLvoid **) & processed); + error_destroy (er); + return 1; + } + + i++; + } + + /* skip the dollar sign */ + i++; + } + } + } + + mem_free ((GLvoid **) & (**er).m_text); + (**er).m_text = (byte *) processed; + } + + *text = t; + return 0; +} + +/* + * returns 0 on success, + * returns 1 otherwise, + */ +static GLint +get_emits (const byte ** text, emit ** em, map_byte * mapb) +{ + const byte *t = *text; + byte *temp = NULL; + emit *e = NULL; + + if (*t != '.') + return 0; + + t++; + if (get_identifier (&t, &temp)) + return 1; + eat_spaces (&t); + + /* .emit */ + if (_mesa_strcmp ("emit", (char *) temp) != 0) { + mem_free ((GLvoid **) & temp); + return 0; + } + + mem_free ((GLvoid **) & temp); + + emit_create (&e); + if (e == NULL) + return 1; + + /* 0xNN */ + if (*t == '0') { + t += 2; + e->m_byte = (byte) hex_convert (&t); + + e->m_emit_type = et_byte; + } + /* * */ + else if (*t == '*') { + t++; + + e->m_emit_type = et_stream; + } + /* $ */ + else if (*t == '$') { + t++; + + e->m_emit_type = et_position; + } + /* 'c' */ + else if (*t == '\'') { + if (get_string (&t, &temp)) { + emit_destroy (&e); + return 1; + } + e->m_byte = (byte) temp[0]; + + mem_free ((GLvoid **) & temp); + + e->m_emit_type = et_byte; + } + else { + if (get_identifier (&t, &temp)) { + emit_destroy (&e); + return 1; + } + + if (map_byte_find (&mapb, temp, &e->m_byte)) { + mem_free ((GLvoid **) & temp); + emit_destroy (&e); + return 1; + } + + mem_free ((GLvoid **) & temp); + + e->m_emit_type = et_byte; + } + + eat_spaces (&t); + + if (get_emits (&t, &e->m_next, mapb)) { + emit_destroy (&e); + return 1; + } + + *text = t; + *em = e; + return 0; +} + +/* + * returns 0 on success, + * returns 1 otherwise, + */ +static GLint +get_spec (const byte ** text, spec ** sp, map_str * maps, map_byte * mapb) +{ + const byte *t = *text; + spec *s = NULL; + + spec_create (&s); + if (s == NULL) + return 1; + + if (*t == '\'') { + byte *temp = NULL; + + if (get_string (&t, &temp)) { + spec_destroy (&s); + return 1; + } + eat_spaces (&t); + + if (*t == '-') { + byte *temp2 = NULL; + + /* skip the '-' character */ + t++; + eat_spaces (&t); + + if (get_string (&t, &temp2)) { + mem_free ((GLvoid **) & temp); + spec_destroy (&s); + return 1; + } + eat_spaces (&t); + + s->m_spec_type = st_byte_range; + s->m_byte[0] = *temp; + s->m_byte[1] = *temp2; + + mem_free ((GLvoid **) & temp2); + } + else { + s->m_spec_type = st_byte; + *s->m_byte = *temp; + } + + mem_free ((GLvoid **) & temp); + } + else if (*t == '"') { + if (get_string (&t, &s->m_string)) { + spec_destroy (&s); + return 1; + } + eat_spaces (&t); + + s->m_spec_type = st_string; + } + else if (*t == '.') { + byte *keyword = NULL; + + /* skip the dot */ + t++; + + if (get_identifier (&t, &keyword)) { + spec_destroy (&s); + return 1; + } + eat_spaces (&t); + + /* .true */ + if (_mesa_strcmp ("true", (char *) keyword) == 0) { + s->m_spec_type = st_true; + } + /* .false */ + else if (_mesa_strcmp ("false", (char *) keyword) == 0) { + s->m_spec_type = st_false; + } + /* .debug */ + else if (_mesa_strcmp ("debug", (char *) keyword) == 0) { + s->m_spec_type = st_debug; + } + /* .loop */ + else if (_mesa_strcmp ("loop", (char *) keyword) == 0) { + if (get_identifier (&t, &s->m_string)) { + mem_free ((GLvoid **) & keyword); + spec_destroy (&s); + return 1; + } + eat_spaces (&t); + + s->m_spec_type = st_identifier_loop; + } + + mem_free ((GLvoid **) & keyword); + } + else { + if (get_identifier (&t, &s->m_string)) { + spec_destroy (&s); + return 1; + } + eat_spaces (&t); + + s->m_spec_type = st_identifier; + } + + if (get_error (&t, &s->m_errtext, maps)) { + spec_destroy (&s); + return 1; + } + + if (get_emits (&t, &s->m_emits, mapb)) { + spec_destroy (&s); + return 1; + } + + *text = t; + *sp = s; + return 0; +} + +/* + * returns 0 on success, + * returns 1 otherwise, + */ +static GLint +get_definition (const byte ** text, defntn ** de, map_str * maps, + map_byte * mapb) +{ + const byte *t = *text; + defntn *d = NULL; + + defntn_create (&d); + if (d == NULL) + return 1; + + if (get_spec (&t, &d->m_specs, maps, mapb)) { + defntn_destroy (&d); + return 1; + } + + while (*t != ';') { + byte *op = NULL; + spec *sp = NULL; + + /* skip the dot that precedes "and" or "or" */ + t++; + + /* read "and" or "or" keyword */ + if (get_identifier (&t, &op)) { + defntn_destroy (&d); + return 1; + } + eat_spaces (&t); + + if (d->m_oper == op_none) { + /* .and */ + if (_mesa_strcmp ("and", (char *) op) == 0) + d->m_oper = op_and; + /* .or */ + else + d->m_oper = op_or; + } + + mem_free ((GLvoid **) & op); + + if (get_spec (&t, &sp, maps, mapb)) { + defntn_destroy (&d); + return 1; + } + + spec_append (&d->m_specs, &sp); + } + + /* skip the semicolon */ + t++; + eat_spaces (&t); + + *text = t; + *de = d; + return 0; +} + +/* + * returns 0 on success, + * returns 1 otherwise, + */ +static GLint +update_dependency (map_def * mapd, byte * symbol, defntn ** def) +{ + if (map_def_find (&mapd, symbol, def)) + return 1; + +#ifndef NDEBUG + (**def).m_referenced = 1; +#endif + + return 0; +} + +/* + * returns 0 on success, + * returns 1 otherwise, + */ +static GLint +update_dependencies (dict * di, map_def * mapd, byte ** syntax_symbol, + byte ** string_symbol) +{ + defntn *de = di->m_defntns; + + if (update_dependency (mapd, *syntax_symbol, &di->m_syntax) || + (*string_symbol != NULL + && update_dependency (mapd, *string_symbol, &di->m_string))) + return 1; + + mem_free ((GLvoid **) syntax_symbol); + mem_free ((GLvoid **) string_symbol); + + while (de) { + spec *sp = de->m_specs; + + while (sp) { + if (sp->m_spec_type == st_identifier + || sp->m_spec_type == st_identifier_loop) { + if (update_dependency (mapd, sp->m_string, &sp->m_defntn)) + return 1; + + mem_free ((GLvoid **) & sp->m_string); + } + + if (sp->m_errtext && sp->m_errtext->m_token_name) { + if (update_dependency + (mapd, sp->m_errtext->m_token_name, &sp->m_errtext->m_token)) + return 1; + + mem_free ((GLvoid **) & sp->m_errtext->m_token_name); + } + + sp = sp->m_next; + } + + de = de->m_next; + } + + return 0; +} + +typedef enum match_result_ +{ + mr_not_matched, /* the examined string does not match */ + mr_matched, /* the examined string matches */ + mr_error_raised, /* mr_not_matched + error has been raised */ + mr_dont_emit, /* used by identifier loops only */ + mr_internal_error /* an internal error has occured such as out of memory */ +} match_result; + +static match_result +match (dict * di, const byte * text, GLuint * index, defntn * de, + barray ** ba, GLint filtering_string) +{ + GLuint ind = *index; + match_result status = mr_not_matched; + spec *sp = de->m_specs; + + /* for every specifier in the definition */ + while (sp) { + GLuint i, len, save_ind = ind; + barray *array = NULL; + + switch (sp->m_spec_type) { + case st_identifier: + barray_create (&array); + if (array == NULL) + return mr_internal_error; + + status = + match (di, text, &ind, sp->m_defntn, &array, filtering_string); + if (status == mr_internal_error) { + barray_destroy (&array); + return mr_internal_error; + } + break; + case st_string: + len = _mesa_strlen ((char *) (sp->m_string)); + + /* prefilter the stream */ + if (!filtering_string && di->m_string) { + barray *ba; + GLuint filter_index = 0; + match_result result; + + barray_create (&ba); + if (ba == NULL) + return mr_internal_error; + + result = + match (di, text + ind, &filter_index, di->m_string, &ba, 1); + + if (result == mr_internal_error) { + barray_destroy (&ba); + return mr_internal_error; + } + + if (result != mr_matched) { + barray_destroy (&ba); + status = mr_not_matched; + break; + } + + barray_destroy (&ba); + + if (filter_index != len + || _mesa_strncmp ((char *)sp->m_string, (char *)(text + ind), len)) { + status = mr_not_matched; + break; + } + + status = mr_matched; + ind += len; + } + else { + status = mr_matched; + for (i = 0; status == mr_matched && i < len; i++) + if (text[ind + i] != sp->m_string[i]) + status = mr_not_matched; + if (status == mr_matched) + ind += len; + } + break; + case st_byte: + status = text[ind] == *sp->m_byte ? mr_matched : mr_not_matched; + if (status == mr_matched) + ind++; + break; + case st_byte_range: + status = (text[ind] >= sp->m_byte[0] + && text[ind] <= + sp->m_byte[1]) ? mr_matched : mr_not_matched; + if (status == mr_matched) + ind++; + break; + case st_true: + status = mr_matched; + break; + case st_false: + status = mr_not_matched; + break; + case st_debug: + status = mr_matched; + break; + case st_identifier_loop: + barray_create (&array); + if (array == NULL) + return mr_internal_error; + + status = mr_dont_emit; + for (;;) { + match_result result; + + save_ind = ind; + result = + match (di, text, &ind, sp->m_defntn, &array, + filtering_string); + + if (result == mr_error_raised) { + status = result; + break; + } + else if (result == mr_matched) { + if (barray_push (ba, sp->m_emits, text[ind - 1], save_ind) + || barray_append (ba, &array)) { + barray_destroy (&array); + return mr_internal_error; + } + barray_destroy (&array); + barray_create (&array); + if (array == NULL) + return mr_internal_error; + } + else if (result == mr_internal_error) { + barray_destroy (&array); + return mr_internal_error; + } + else + break; + } + break; + }; + + if (status == mr_error_raised) { + barray_destroy (&array); + + return mr_error_raised; + } + + if (de->m_oper == op_and && status != mr_matched + && status != mr_dont_emit) { + barray_destroy (&array); + + if (sp->m_errtext) { + set_last_error (sp->m_errtext->m_text, + error_get_token (sp->m_errtext, di, text, ind), + ind); + + return mr_error_raised; + } + + return mr_not_matched; + } + + if (status == mr_matched) { + if (sp->m_emits) + if (barray_push (ba, sp->m_emits, text[ind - 1], save_ind)) { + barray_destroy (&array); + return mr_internal_error; + } + + if (array) + if (barray_append (ba, &array)) { + barray_destroy (&array); + return mr_internal_error; + } + } + + barray_destroy (&array); + + if (de->m_oper == op_or + && (status == mr_matched || status == mr_dont_emit)) { + *index = ind; + return mr_matched; + } + + sp = sp->m_next; + } + + if (de->m_oper == op_and + && (status == mr_matched || status == mr_dont_emit)) { + *index = ind; + return mr_matched; + } + + return mr_not_matched; +} + +static byte * +error_get_token (error * er, dict * di, const byte * text, unsigned int ind) +{ + byte *str = NULL, *result = NULL; + + if (er->m_token) { + barray *ba; + unsigned int filter_index = 0; + + barray_create (&ba); + if (ba != NULL) { + if (match (di, text + ind, &filter_index, er->m_token, &ba, 0) == + mr_matched && filter_index) { + str = mem_alloc (filter_index + 1); + if (str != NULL) { + _mesa_strncpy ((char *) str, (char *) (text + ind), + filter_index); + str[filter_index] = '\0'; + } + } + barray_destroy (&ba); + } + } + + return str; +} + +typedef struct grammar_load_state_ +{ + dict *di; + byte *syntax_symbol; + byte *string_symbol; + map_str *maps; + map_byte *mapb; + map_def *mapd; +} grammar_load_state; + + +static GLvoid +grammar_load_state_create (grammar_load_state ** gr) +{ + *gr = mem_alloc (sizeof (grammar_load_state)); + if (*gr) { + (**gr).di = NULL; + (**gr).syntax_symbol = NULL; + (**gr).string_symbol = NULL; + (**gr).maps = NULL; + (**gr).mapb = NULL; + (**gr).mapd = NULL; + } +} + +static GLvoid +grammar_load_state_destroy (grammar_load_state ** gr) +{ + if (*gr) { + dict_destroy (&(**gr).di); + mem_free ((GLvoid **) &(**gr).syntax_symbol); + mem_free ((GLvoid **) &(**gr).string_symbol); + map_str_destroy (&(**gr).maps); + map_byte_destroy (&(**gr).mapb); + map_def_destroy (&(**gr).mapd); + mem_free ((GLvoid **) gr); + } +} + +/* + * the API + */ + +/* + * loads grammar script from null-terminated ASCII text + * returns the grammar object + * returns NULL if an error occurs (call grammar_get_last_error to retrieve the error text) + */ + +static dict * +grammar_load_from_text (const byte * text) +{ + dict *d = NULL; + grammar_load_state *g = NULL; + + clear_last_error (); + + grammar_load_state_create (&g); + if (g == NULL) + return NULL; + + dict_create (&g->di); + if (g->di == NULL) { + grammar_load_state_destroy (&g); + return NULL; + } + + eat_spaces (&text); + + /* skip ".syntax" keyword */ + text += 7; + eat_spaces (&text); + + /* retrieve root symbol */ + if (get_identifier (&text, &g->syntax_symbol)) { + grammar_load_state_destroy (&g); + return NULL; + } + eat_spaces (&text); + + /* skip semicolon */ + text++; + eat_spaces (&text); + + while (*text) { + byte *symbol = NULL; + GLint is_dot = *text == '.'; + + if (is_dot) + text++; + + if (get_identifier (&text, &symbol)) { + grammar_load_state_destroy (&g); + return NULL; + } + eat_spaces (&text); + + /* .emtcode */ + if (is_dot && _mesa_strcmp ((char *) symbol, "emtcode") == 0) { + map_byte *ma = NULL; + + mem_free ((void **) &symbol); + + if (get_emtcode (&text, &ma)) { + grammar_load_state_destroy (&g); + return NULL; + } + + map_byte_append (&g->mapb, &ma); + } + /* .errtext */ + else if (is_dot && _mesa_strcmp ((char *) symbol, "errtext") == 0) { + map_str *ma = NULL; + + mem_free ((GLvoid **) &symbol); + + if (get_errtext (&text, &ma)) { + grammar_load_state_destroy (&g); + return NULL; + } + + map_str_append (&g->maps, &ma); + } + /* .string */ + else if (is_dot && _mesa_strcmp ((char *) symbol, "string") == 0) { + mem_free ((GLvoid **) (&symbol)); + + if (g->di->m_string != NULL) { + grammar_load_state_destroy (&g); + return NULL; + } + + if (get_identifier (&text, &g->string_symbol)) { + grammar_load_state_destroy (&g); + return NULL; + } + + /* skip semicolon */ + eat_spaces (&text); + text++; + eat_spaces (&text); + } + else { + defntn *de = NULL; + map_def *ma = NULL; + + if (get_definition (&text, &de, g->maps, g->mapb)) { + grammar_load_state_destroy (&g); + return NULL; + } + + defntn_append (&g->di->m_defntns, &de); + + /* if definition consist of only one specifier, give it an ".and" operator */ + if (de->m_oper == op_none) + de->m_oper = op_and; + + map_def_create (&ma); + if (ma == NULL) { + grammar_load_state_destroy (&g); + return NULL; + } + + ma->key = symbol; + ma->data = de; + map_def_append (&g->mapd, &ma); + } + } + + if (update_dependencies + (g->di, g->mapd, &g->syntax_symbol, &g->string_symbol)) { + grammar_load_state_destroy (&g); + return NULL; + } + + d = g->di; + g->di = NULL; + + grammar_load_state_destroy (&g); + + return d; +} + +/** + * checks if a null-terminated text matches given grammar + * returns 0 on error (call grammar_get_last_error to retrieve the error text) + * returns 1 on success, the prod points to newly allocated buffer with production and size + * is filled with the production size + * + * \param id - The grammar returned from grammar_load_from_text() + * \param text - The program string + * \param production - The return parameter for the binary array holding the parsed results + * \param size - The return parameter for the size of production + * + * \return 1 on sucess, 0 on parser error + */ +static GLint +grammar_check (dict * di, const byte * text, byte ** production, + GLuint *size) +{ + barray *ba = NULL; + GLuint index = 0; + + clear_last_error (); + + barray_create (&ba); + if (ba == NULL) + return 0; + + *production = NULL; + *size = 0; + + if (match (di, text, &index, di->m_syntax, &ba, 0) != mr_matched) { + barray_destroy (&ba); + return 0; + } + + *production = mem_alloc (ba->len * sizeof (byte)); + if (*production == NULL) { + barray_destroy (&ba); + return 0; + } + + memcpy (*production, ba->data, ba->len * sizeof (byte)); + *size = ba->len; + barray_destroy (&ba); + + return 1; +} + +static GLvoid +grammar_get_last_error (byte * text, int size, int *pos) +{ + GLint len = 0, dots_made = 0; + const byte *p = error_message; + + *text = '\0'; +#define APPEND_CHARACTER(x) if (dots_made == 0) {\ + if (len < size - 1) {\ + text[len++] = (x); text[len] = '\0';\ + } else {\ + int i;\ + for (i = 0; i < 3; i++)\ + if (--len >= 0)\ + text[len] = '.';\ + dots_made = 1;\ + }\ +} + + if (p) { + while (*p) { + if (*p == '$') { + const byte *r = error_param; + + while (*r) { + APPEND_CHARACTER (*r) + r++; + } + + p++; + } + else { + APPEND_CHARACTER (*p) + p++; + } + } + } + *pos = error_position; +} + +/*----------------------------------------------------------------------- + * From here on down is the semantic checking portion + * + */ + +/** + * Variable Table Handling functions + */ +typedef enum +{ + vt_none, + vt_address, + vt_attrib, + vt_param, + vt_temp, + vt_output, + vt_alias +} var_type; + + +/* + * Setting an explicit field for each of the binding properties is a bit wasteful + * of space, but it should be much more clear when reading later on.. + */ +struct var_cache +{ + byte *name; + var_type type; + GLuint address_binding; /* The index of the address register we should + * be using */ + GLuint attrib_binding; /* For type vt_attrib, see nvfragprog.h for values */ + GLuint attrib_binding_idx; /* The index into the attrib register file corresponding + * to the state in attrib_binding */ + GLuint temp_binding; /* The index of the temp register we are to use */ + GLuint output_binding; /* For type vt_output, see nvfragprog.h for values */ + GLuint output_binding_idx; /* This is the index into the result register file + * corresponding to the bound result state */ + struct var_cache *alias_binding; /* For type vt_alias, points to the var_cache entry + * * that this is aliased to */ + GLuint param_binding_type; /* {PROGRAM_STATE_VAR, PROGRAM_LOCAL_PARAM, + * PROGRAM_ENV_PARAM} */ + GLuint param_binding_begin; /* This is the offset into the program_parameter_list where + * the tokens representing our bound state (or constants) + * start */ + GLuint param_binding_length; /* This is how many entries in the the program_parameter_list + * we take up with our state tokens or constants. Note that + * this is _not_ the same as the number of param registers + * we eventually use */ + struct var_cache *next; +}; + +static GLvoid +var_cache_create (struct var_cache **va) +{ + *va = _mesa_malloc (sizeof (struct var_cache)); + if (*va) { + (**va).name = NULL; + (**va).type = vt_none; + (**va).attrib_binding = -1; + (**va).temp_binding = -1; + (**va).output_binding = -1; + (**va).output_binding_idx = -1; + (**va).param_binding_type = -1; + (**va).param_binding_begin = -1; + (**va).param_binding_length = -1; + (**va).alias_binding = NULL; + (**va).next = NULL; + } +} + +static GLvoid +var_cache_destroy (struct var_cache **va) +{ + if (*va) { + var_cache_destroy (&(**va).next); + _mesa_free (*va); + *va = NULL; + } +} + +static GLvoid +var_cache_append (struct var_cache **va, struct var_cache *nv) +{ + if (*va) + var_cache_append (&(**va).next, nv); + else + *va = nv; +} + +static struct var_cache * +var_cache_find (struct var_cache *va, byte * name) +{ + struct var_cache *first = va; + + while (va) { + if (!strcmp ( (const char*) name, (const char*) va->name)) { + if (va->type == vt_alias) + return var_cache_find (first, va->name); + return va; + } + + va = va->next; + } + + return NULL; +} + +/** + * constructs an integer from 4 bytes in LE format + */ +static GLuint +parse_position (byte ** inst) +{ + GLuint value; + + value = (GLuint) (*(*inst)++); + value += (GLuint) (*(*inst)++) * 0x100; + value += (GLuint) (*(*inst)++) * 0x10000; + value += (GLuint) (*(*inst)++) * 0x1000000; + + return value; +} + +/** + * This will, given a string, lookup the string as a variable name in the + * var cache. If the name is found, the var cache node corresponding to the + * var name is returned. If it is not found, a new entry is allocated + * + * \param I Points into the binary array where the string identifier begins + * \param found 1 if the string was found in the var_cache, 0 if it was allocated + * \return The location on the var_cache corresponding the the string starting at I + */ +static struct var_cache * +parse_string (byte ** inst, struct var_cache **vc_head, + struct arb_program *Program, GLuint * found) +{ + byte *i = *inst; + struct var_cache *va = NULL; + + *inst += _mesa_strlen ((char *) i) + 1; + + va = var_cache_find (*vc_head, i); + + if (va) { + *found = 1; + return va; + } + + *found = 0; + var_cache_create (&va); + va->name = i; + + var_cache_append (vc_head, va); + + return va; +} + +static char * +parse_string_without_adding (byte ** inst, struct arb_program *Program) +{ + byte *i = *inst; + + *inst += _mesa_strlen ((char *) i) + 1; + + return (char *) i; +} + +/** + * \return 0 if sign is plus, 1 if sign is minus + */ +static GLuint +parse_sign (byte ** inst) +{ + /*return *(*inst)++ != '+'; */ + + if (**inst == '-') { + *(*inst)++; + return 1; + } + else if (**inst == '+') { + *(*inst)++; + return 0; + } + + return 0; +} + +/** + * parses and returns signed integer + */ +static GLint +parse_integer (byte ** inst, struct arb_program *Program) +{ + GLint sign; + GLint value; + + /* check if *inst points to '+' or '-' + * if yes, grab the sign and increment *inst + */ + sign = parse_sign (inst); + + /* now check if *inst points to 0 + * if yes, increment the *inst and return the default value + */ + if (**inst == 0) { + *(*inst)++; + return 0; + } + + /* parse the integer as you normally would do it */ + value = _mesa_atoi (parse_string_without_adding (inst, Program)); + + /* now, after terminating 0 there is a position + * to parse it - parse_position() + */ + Program->Position = parse_position (inst); + + if (sign) + value *= -1; + + return value; +} + +/** + */ +static GLfloat +parse_float (byte ** inst, struct arb_program *Program) +{ + GLint tmp[5], denom; + GLfloat value = 0; + +#if 0 + tmp[0] = parse_sign (inst); /* This is the sign of the number + - >0, - -> 1 */ +#endif + tmp[1] = parse_integer (inst, Program); /* This is the integer portion of the number */ + tmp[2] = parse_integer (inst, Program); /* This is the fractional portion of the number */ + tmp[3] = parse_sign (inst); /* This is the sign of the exponent */ + tmp[4] = parse_integer (inst, Program); /* This is the exponent */ + + value = (GLfloat) tmp[1]; + denom = 1; + while (denom < tmp[2]) + denom *= 10; + value += (GLfloat) tmp[2] / (GLfloat) denom; +#if 0 + if (tmp[0]) + value *= -1; +#endif + value *= _mesa_pow (10, (GLfloat) tmp[3] * (GLfloat) tmp[4]); + + return value; +} + +/** + */ +static GLfloat +parse_signed_float (byte ** inst, struct arb_program *Program) +{ + GLint negate; + GLfloat value; + + negate = parse_sign (inst); + + value = parse_float (inst, Program); + + if (negate) + value *= -1; + + return value; +} + +/** + * This picks out a constant value from the parsed array. The constant vector is r + * returned in the *values array, which should be of length 4. + * + * \param values - The 4 component vector with the constant value in it + */ +static GLvoid +parse_constant (byte ** inst, GLfloat *values, struct arb_program *Program, + GLboolean use) +{ + GLuint components, i; + + + switch (*(*inst)++) { + case CONSTANT_SCALAR: + if (use == GL_TRUE) { + values[0] = + values[1] = + values[2] = values[3] = parse_float (inst, Program); + } + else { + values[0] = + values[1] = + values[2] = values[3] = parse_signed_float (inst, Program); + } + + break; + case CONSTANT_VECTOR: + values[0] = values[1] = values[2] = 0; + values[3] = 1; + components = *(*inst)++; + for (i = 0; i < components; i++) { + values[i] = parse_signed_float (inst, Program); + } + break; + } +} + + +/** + * \param color 0 if color type is primary, 1 if color type is secondary + * \return 0 on sucess, 1 on error + */ +static GLuint +parse_color_type (GLcontext * ctx, byte ** inst, struct arb_program *Program, + GLint * color) +{ + *color = *(*inst)++ != COLOR_PRIMARY; + return 0; +} + +/** + * \param coord The texture unit index + * \return 0 on sucess, 1 on error + */ +static GLuint +parse_texcoord_num (GLcontext * ctx, byte ** inst, + struct arb_program *Program, GLuint * coord) +{ + *coord = parse_integer (inst, Program); + + if ((*coord < 0) || (*coord >= ctx->Const.MaxTextureUnits)) { + _mesa_set_program_error (ctx, Program->Position, + "Invalid texture unit index"); + _mesa_error (ctx, GL_INVALID_OPERATION, "Invalid texture unit index"); + return 1; + } + + Program->TexturesUsed[*coord] = 1; + return 0; +} + +/** + * \param coord The weight index + * \return 0 on sucess, 1 on error + */ +static GLuint +parse_weight_num (GLcontext * ctx, byte ** inst, struct arb_program *Program, + GLint * coord) +{ + *coord = parse_integer (inst, Program); + + if ((*coord < 0) || (*coord >= 1)) { + _mesa_set_program_error (ctx, Program->Position, + "Invalid weight index"); + _mesa_error (ctx, GL_INVALID_OPERATION, "Invalid weight index"); + return 1; + } + + return 0; +} + +/** + * \param coord The clip plane index + * \return 0 on sucess, 1 on error + */ +static GLuint +parse_clipplane_num (GLcontext * ctx, byte ** inst, + struct arb_program *Program, GLint * coord) +{ + *coord = parse_integer (inst, Program); + + if ((*coord < 0) || (*coord >= ctx->Const.MaxClipPlanes)) { + _mesa_set_program_error (ctx, Program->Position, + "Invalid clip plane index"); + _mesa_error (ctx, GL_INVALID_OPERATION, "Invalid clip plane index"); + return 1; + } + + return 0; +} + + + + +/** + * \return 0 on front face, 1 on back face + */ +static GLuint +parse_face_type (byte ** inst) +{ + switch (*(*inst)++) { + case FACE_FRONT: + return 0; + + case FACE_BACK: + return 1; + } +} + +/** + * Given a matrix and a modifier token on the binary array, return tokens + * that _mesa_fetch_state() [program.c] can understand. + * + * \param matrix - the matrix we are talking about + * \param matrix_idx - the index of the matrix we have (for texture & program matricies) + * \param matrix_modifier - the matrix modifier (trans, inv, etc) + * \return 0 on sucess, 1 on failure + */ +static GLuint +parse_matrix (GLcontext * ctx, byte ** inst, struct arb_program *Program, + GLint * matrix, GLint * matrix_idx, GLint * matrix_modifier) +{ + byte mat = *(*inst)++; + + *matrix_idx = 0; + + switch (mat) { + case MATRIX_MODELVIEW: + *matrix = STATE_MODELVIEW; + *matrix_idx = parse_integer (inst, Program); + /* XXX: if (*matrix_idx >= ctx->Const. */ + break; + + case MATRIX_PROJECTION: + *matrix = STATE_PROJECTION; + break; + + case MATRIX_MVP: + *matrix = STATE_MVP; + break; + + case MATRIX_TEXTURE: + *matrix = STATE_TEXTURE; + *matrix_idx = parse_integer (inst, Program); + if (*matrix_idx >= ctx->Const.MaxTextureUnits) { + _mesa_set_program_error (ctx, Program->Position, + "Invalid Texture Unit"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Invalid Texture Unit: %d", *matrix_idx); + return 1; + } + break; + + /* XXX: How should we handle the palette matrix? */ + case MATRIX_PALETTE: + *matrix_idx = parse_integer (inst, Program); + break; + + case MATRIX_PROGRAM: + *matrix = STATE_PROGRAM; + *matrix_idx = parse_integer (inst, Program); + if (*matrix_idx >= ctx->Const.MaxProgramMatrices) { + _mesa_set_program_error (ctx, Program->Position, + "Invalid Program Matrix"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Invalid Program Matrix: %d", *matrix_idx); + return 1; + } + break; + } + + switch (*(*inst)++) { + case MATRIX_MODIFIER_IDENTITY: + *matrix_modifier = 0; + break; + case MATRIX_MODIFIER_INVERSE: + *matrix_modifier = STATE_MATRIX_INVERSE; + break; + case MATRIX_MODIFIER_TRANSPOSE: + *matrix_modifier = STATE_MATRIX_TRANSPOSE; + break; + case MATRIX_MODIFIER_INVTRANS: + *matrix_modifier = STATE_MATRIX_INVTRANS; + break; + } + + return 0; +} + + +/** + * This parses a state string (rather, the binary version of it) into + * a 6-token sequence as described in _mesa_fetch_state() [program.c] + * + * \param inst - the start in the binary arry to start working from + * \param state_tokens - the storage for the 6-token state description + * \return - 0 on sucess, 1 on error + */ +static GLuint +parse_state_single_item (GLcontext * ctx, byte ** inst, + struct arb_program *Program, GLint * state_tokens) +{ + switch (*(*inst)++) { + case STATE_MATERIAL_PARSER: + state_tokens[0] = STATE_MATERIAL; + state_tokens[1] = parse_face_type (inst); + switch (*(*inst)++) { + case MATERIAL_AMBIENT: + state_tokens[2] = STATE_AMBIENT; + break; + case MATERIAL_DIFFUSE: + state_tokens[2] = STATE_DIFFUSE; + break; + case MATERIAL_SPECULAR: + state_tokens[2] = STATE_SPECULAR; + break; + case MATERIAL_EMISSION: + state_tokens[2] = STATE_EMISSION; + break; + case MATERIAL_SHININESS: + state_tokens[2] = STATE_SHININESS; + break; + } + break; + + case STATE_LIGHT_PARSER: + state_tokens[0] = STATE_LIGHT; + state_tokens[1] = parse_integer (inst, Program); + + /* Check the value of state_tokens[1] against the # of lights */ + if (state_tokens[1] >= ctx->Const.MaxLights) { + _mesa_set_program_error (ctx, Program->Position, + "Invalid Light Number"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Invalid Light Number: %d", state_tokens[1]); + return 1; + } + + switch (*(*inst)++) { + case LIGHT_AMBIENT: + state_tokens[2] = STATE_AMBIENT; + break; + case LIGHT_DIFFUSE: + state_tokens[2] = STATE_DIFFUSE; + break; + case LIGHT_SPECULAR: + state_tokens[2] = STATE_SPECULAR; + break; + case LIGHT_POSITION: + state_tokens[2] = STATE_POSITION; + break; + case LIGHT_ATTENUATION: + state_tokens[2] = STATE_ATTENUATION; + break; + case LIGHT_HALF: + state_tokens[2] = STATE_HALF; + break; + case LIGHT_SPOT_DIRECTION: + state_tokens[2] = STATE_SPOT_DIRECTION; + break; + } + break; + + case STATE_LIGHT_MODEL: + switch (*(*inst)++) { + case LIGHT_MODEL_AMBIENT: + state_tokens[0] = STATE_LIGHTMODEL_AMBIENT; + break; + case LIGHT_MODEL_SCENECOLOR: + state_tokens[0] = STATE_LIGHTMODEL_SCENECOLOR; + state_tokens[1] = parse_face_type (inst); + break; + } + break; + + case STATE_LIGHT_PROD: + state_tokens[0] = STATE_LIGHTPROD; + state_tokens[1] = parse_integer (inst, Program); + + /* Check the value of state_tokens[1] against the # of lights */ + if (state_tokens[1] >= ctx->Const.MaxLights) { + _mesa_set_program_error (ctx, Program->Position, + "Invalid Light Number"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Invalid Light Number: %d", state_tokens[1]); + return 1; + } + + state_tokens[2] = parse_face_type (inst); + switch (*(*inst)++) { + case LIGHT_PROD_AMBIENT: + state_tokens[3] = STATE_AMBIENT; + break; + case LIGHT_PROD_DIFFUSE: + state_tokens[3] = STATE_DIFFUSE; + break; + case LIGHT_PROD_SPECULAR: + state_tokens[3] = STATE_SPECULAR; + break; + } + break; + + + case STATE_FOG: + switch (*(*inst)++) { + case FOG_COLOR: + state_tokens[0] = STATE_FOG_COLOR; + break; + case FOG_PARAMS: + state_tokens[0] = STATE_FOG_PARAMS; + break; + } + break; + + /* STATE_TEX_ENV == STATE_TEX_GEN */ + case STATE_TEX_ENV: + if (Program->type == GL_FRAGMENT_PROGRAM_ARB) { + state_tokens[1] = parse_integer (inst, Program); + switch (*(*inst)++) { + case TEX_ENV_COLOR: + state_tokens[0] = STATE_TEXENV_COLOR; + break; + } + } + /* For vertex programs, this case is STATE_TEX_GEN */ + else { + GLuint type, coord; + + state_tokens[0] = STATE_TEXGEN; + /*state_tokens[1] = parse_integer (inst, Program);*/ /* Texture Unit */ + + if (parse_texcoord_num (ctx, inst, Program, &coord)) + return 1; + state_tokens[1] = coord; + + /* EYE or OBJECT */ + type = *(*inst++); + + /* 0 - s, 1 - t, 2 - r, 3 - q */ + coord = *(*inst++); + + if (type == TEX_GEN_EYE) { + switch (coord) { + case COMPONENT_X: + state_tokens[2] = STATE_TEXGEN_EYE_S; + break; + case COMPONENT_Y: + state_tokens[2] = STATE_TEXGEN_EYE_T; + break; + case COMPONENT_Z: + state_tokens[2] = STATE_TEXGEN_EYE_R; + break; + case COMPONENT_W: + state_tokens[2] = STATE_TEXGEN_EYE_Q; + break; + } + } + else { + switch (coord) { + case COMPONENT_X: + state_tokens[2] = STATE_TEXGEN_OBJECT_S; + break; + case COMPONENT_Y: + state_tokens[2] = STATE_TEXGEN_OBJECT_T; + break; + case COMPONENT_Z: + state_tokens[2] = STATE_TEXGEN_OBJECT_R; + break; + case COMPONENT_W: + state_tokens[2] = STATE_TEXGEN_OBJECT_Q; + break; + } + } + } + break; + + /* STATE_DEPTH = STATE_CLIP_PLANE */ + case STATE_DEPTH: + if (Program->type == GL_FRAGMENT_PROGRAM_ARB) { + switch (*(*inst)++) { + case DEPTH_RANGE: + state_tokens[0] = STATE_DEPTH_RANGE; + break; + } + } + /* for vertex programs, we want STATE_CLIP_PLANE */ + else { + state_tokens[0] = STATE_CLIPPLANE; + state_tokens[1] = parse_integer (inst, Program); + if (parse_clipplane_num (ctx, inst, Program, &state_tokens[1])) + return 1; + } + break; + + case STATE_POINT: + switch (*(*inst++)) { + case POINT_SIZE: + state_tokens[0] = STATE_POINT_SIZE; + break; + + case POINT_ATTENUATION: + state_tokens[0] = STATE_POINT_ATTENUATION; + break; + } + break; + + /* XXX: I think this is the correct format for a matrix row */ + case STATE_MATRIX_ROWS: + state_tokens[0] = STATE_MATRIX; + + if (parse_matrix + (ctx, inst, Program, &state_tokens[1], &state_tokens[2], + &state_tokens[5])) + return 1; + + state_tokens[3] = parse_integer (inst, Program); /* The first row to grab */ + + state_tokens[4] = parse_integer (inst, Program); /* Either the last row, 0 */ + if (state_tokens[4] == 0) { + state_tokens[4] = state_tokens[3]; + } + break; + } + + return 0; +} + +/** + * This parses a state string (rather, the binary version of it) into + * a 6-token similar for the state fetching code in program.c + * + * One might ask, why fetch these parameters into just like you fetch + * state when they are already stored in other places? + * + * Because of array offsets -> We can stick env/local parameters in the + * middle of a parameter array and then index someplace into the array + * when we execute. + * + * One optimization might be to only do this for the cases where the + * env/local parameters end up inside of an array, and leave the + * single parameters (or arrays of pure env/local pareameters) in their + * respective register files. + * + * For ENV parameters, the format is: + * state_tokens[0] = STATE_FRAGMENT_PROGRAM / STATE_VERTEX_PROGRAM + * state_tokens[1] = STATE_ENV + * state_tokens[2] = the parameter index + * + * for LOCAL parameters, the format is: + * state_tokens[0] = STATE_FRAGMENT_PROGRAM / STATE_VERTEX_PROGRAM + * state_tokens[1] = STATE_LOCAL + * state_tokens[2] = the parameter index + * + * \param inst - the start in the binary arry to start working from + * \param state_tokens - the storage for the 6-token state description + * \return - 0 on sucess, 1 on failure + */ +static GLuint +parse_program_single_item (GLcontext * ctx, byte ** inst, + struct arb_program *Program, GLint * state_tokens) +{ + if (Program->type == GL_FRAGMENT_PROGRAM_ARB) + state_tokens[0] = STATE_FRAGMENT_PROGRAM; + else + state_tokens[0] = STATE_VERTEX_PROGRAM; + + + switch (*(*inst)++) { + case PROGRAM_PARAM_ENV: + state_tokens[1] = STATE_ENV; + state_tokens[2] = parse_integer (inst, Program); + /* Check state_tokens[2] against the number of ENV parameters available */ + if (((Program->type == GL_FRAGMENT_PROGRAM_ARB) && + (state_tokens[2] >= ctx->Const.MaxFragmentProgramEnvParams)) + || + ((Program->type == GL_VERTEX_PROGRAM_ARB) && + (state_tokens[2] >= ctx->Const.MaxVertexProgramEnvParams))) { + _mesa_set_program_error (ctx, Program->Position, + "Invalid Program Env Parameter"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Invalid Program Env Parameter: %d", + state_tokens[2]); + return 1; + } + + break; + + case PROGRAM_PARAM_LOCAL: + state_tokens[1] = STATE_LOCAL; + state_tokens[2] = parse_integer (inst, Program); + /* Check state_tokens[2] against the number of LOCAL parameters available */ + if (((Program->type == GL_FRAGMENT_PROGRAM_ARB) && + (state_tokens[2] >= ctx->Const.MaxFragmentProgramLocalParams)) + || + ((Program->type == GL_VERTEX_PROGRAM_ARB) && + (state_tokens[2] >= ctx->Const.MaxVertexProgramLocalParams))) { + _mesa_set_program_error (ctx, Program->Position, + "Invalid Program Local Parameter"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Invalid Program Local Parameter: %d", + state_tokens[2]); + return 1; + } + break; + } + + return 0; +} + + +/** + * This will handle the binding side of an ATTRIB var declaration + * + * \param binding - the fragment input register state, defined in nvfragprog.h + * \param binding_idx - the index in the attrib register file that binding is associated with + * \return returns 0 on sucess, 1 on error + * + * See nvfragparse.c for attrib register file layout + */ +static GLuint +parse_attrib_binding (GLcontext * ctx, byte ** inst, + struct arb_program *Program, GLuint * binding, + GLuint * binding_idx) +{ + GLuint texcoord; + GLint coord; + GLint err = 0; + + if (Program->type == GL_FRAGMENT_PROGRAM_ARB) { + switch (*(*inst)++) { + case FRAGMENT_ATTRIB_COLOR: + err = parse_color_type (ctx, inst, Program, &coord); + *binding = FRAG_ATTRIB_COL0 + coord; + *binding_idx = 1 + coord; + break; + + case FRAGMENT_ATTRIB_TEXCOORD: + err = parse_texcoord_num (ctx, inst, Program, &texcoord); + *binding = FRAG_ATTRIB_TEX0 + texcoord; + *binding_idx = 4 + texcoord; + break; + + case FRAGMENT_ATTRIB_FOGCOORD: + *binding = FRAG_ATTRIB_FOGC; + *binding_idx = 3; + break; + + case FRAGMENT_ATTRIB_POSITION: + *binding = FRAG_ATTRIB_WPOS; + *binding_idx = 0; + break; + + default: + err = 1; + break; + } + } + else { + switch (*(*inst)++) { + case VERTEX_ATTRIB_POSITION: + *binding = VERT_ATTRIB_POS; + *binding_idx = 0; + break; + + case VERTEX_ATTRIB_WEIGHT: + { + GLint weight; + + err = parse_weight_num (ctx, inst, Program, &weight); + *binding = VERT_ATTRIB_WEIGHT; + *binding_idx = 1; + } + break; + + case VERTEX_ATTRIB_NORMAL: + *binding = VERT_ATTRIB_NORMAL; + *binding_idx = 2; + break; + + case VERTEX_ATTRIB_COLOR: + { + GLint color; + + err = parse_color_type (ctx, inst, Program, &color); + if (color) { + *binding = VERT_ATTRIB_COLOR1; + *binding_idx = 4; + } + else { + *binding = VERT_ATTRIB_COLOR0; + *binding_idx = 3; + } + } + break; + + case VERTEX_ATTRIB_FOGCOORD: + *binding = VERT_ATTRIB_FOG; + *binding_idx = 5; + break; + + case VERTEX_ATTRIB_TEXCOORD: + { + GLuint unit; + + err = parse_texcoord_num (ctx, inst, Program, &unit); + *binding = VERT_ATTRIB_TEX0 + unit; + *binding_idx = 8 + unit; + } + break; + + /* XXX: It looks like we don't support this at all, atm */ + case VERTEX_ATTRIB_MATRIXINDEX: + parse_integer (inst, Program); + break; + + /* XXX: */ + case VERTEX_ATTRIB_GENERIC: + break; + + default: + err = 1; + break; + } + } + + /* Can this even happen? */ + if (err) { + _mesa_set_program_error (ctx, Program->Position, + "Bad attribute binding"); + _mesa_error (ctx, GL_INVALID_OPERATION, "Bad attribute binding"); + } + + Program->InputsRead |= (1 << *binding_idx); + + return err; +} + +/** + * This translates between a binary token for an output variable type + * and the mesa token for the same thing. + * + * + * XXX: What is the 'name' for vertex program state? -> do we need it? + * I don't think we do; + * + * See nvfragprog.h for definitions + * + * \param inst - The parsed tokens + * \param binding - The name of the state we are binding too + * \param binding_idx - The index into the result register file that this is bound too + * + * See nvfragparse.c for the register file layout for fragment programs + * See nvvertparse.c for the register file layout for vertex programs + */ +static GLuint +parse_result_binding (GLcontext * ctx, byte ** inst, GLuint * binding, + GLuint * binding_idx, struct arb_program *Program) +{ + GLint a; + GLuint b; + + switch (*(*inst)++) { + case FRAGMENT_RESULT_COLOR: + /* for frag programs, this is FRAGMENT_RESULT_COLOR */ + if (Program->type == GL_FRAGMENT_PROGRAM_ARB) { + *binding = FRAG_OUTPUT_COLR; + *binding_idx = 0; + } + /* for vtx programs, this is VERTEX_RESULT_POSITION */ + else { + *binding_idx = 0; + } + break; + + case FRAGMENT_RESULT_DEPTH: + /* for frag programs, this is FRAGMENT_RESULT_DEPTH */ + if (Program->type == GL_FRAGMENT_PROGRAM_ARB) { + *binding = FRAG_OUTPUT_DEPR; + *binding_idx = 2; + } + /* for vtx programs, this is VERTEX_RESULT_COLOR */ + else { + GLint color_type; + GLuint face_type = parse_face_type(inst); + GLint color_type_ret = parse_color_type(ctx, inst, Program, &color_type); + + /* back face */ + if (face_type) { + if (color_type_ret) return 1; + + /* secondary color */ + if (color_type) { + *binding_idx = 4; + } + /* primary color */ + else { + *binding_idx = 3; + } + } + /* front face */ + else { + /* secondary color */ + if (color_type) { + *binding_idx = 2; + } + /* primary color */ + else { + *binding_idx = 1; + } + } + } + break; + + case VERTEX_RESULT_FOGCOORD: + *binding_idx = 5; + break; + + case VERTEX_RESULT_POINTSIZE: + *binding_idx = 6; + break; + + case VERTEX_RESULT_TEXCOORD: + if (parse_texcoord_num (ctx, inst, Program, &b)) + return 1; + *binding_idx = 7 + b; + break; + } + + Program->OutputsWritten |= (1 << *binding_idx); + + return 0; +} + +/** + * This handles the declaration of ATTRIB variables + * + * XXX: Still needs + * parse_vert_attrib_binding(), or something like that + * + * \return 0 on sucess, 1 on error + */ +static GLint +parse_attrib (GLcontext * ctx, byte ** inst, struct var_cache **vc_head, + struct arb_program *Program) +{ + GLuint found; + char *error_msg; + struct var_cache *attrib_var; + + attrib_var = parse_string (inst, vc_head, Program, &found); + Program->Position = parse_position (inst); + if (found) { + error_msg = + _mesa_malloc (_mesa_strlen ((char *) attrib_var->name) + 40); + _mesa_sprintf (error_msg, "Duplicate Varible Declaration: %s", + attrib_var->name); + + _mesa_set_program_error (ctx, Program->Position, error_msg); + _mesa_error (ctx, GL_INVALID_OPERATION, error_msg); + + _mesa_free (error_msg); + return 1; + } + + attrib_var->type = vt_attrib; + + /* I think this is ok now - karl */ + /* XXX: */ + /*if (Program->type == GL_FRAGMENT_PROGRAM_ARB) */ + { + if (parse_attrib_binding + (ctx, inst, Program, &attrib_var->attrib_binding, + &attrib_var->attrib_binding_idx)) + return 1; + } + + Program->Base.NumAttributes++; + return 0; +} + +/** + * \param use -- TRUE if we're called when declaring implicit parameters, + * FALSE if we're declaraing variables. This has to do with + * if we get a signed or unsigned float for scalar constants + */ +static GLuint +parse_param_elements (GLcontext * ctx, byte ** inst, + struct var_cache *param_var, + struct arb_program *Program, GLboolean use) +{ + GLint idx; + GLuint found, specified_length, err; + GLint state_tokens[6]; + GLfloat const_values[4]; + char *error_msg; + + err = 0; + + switch (*(*inst)++) { + case PARAM_STATE_ELEMENT: + if (parse_state_single_item (ctx, inst, Program, state_tokens)) + return 1; + + /* If we adding STATE_MATRIX that has multiple rows, we need to + * unroll it and call _mesa_add_state_reference() for each row + */ + if ((state_tokens[0] == STATE_MATRIX) + && (state_tokens[3] != state_tokens[4])) { + GLint row; + GLint first_row = state_tokens[3]; + GLint last_row = state_tokens[4]; + + for (row = first_row; row <= last_row; row++) { + state_tokens[3] = state_tokens[4] = row; + + idx = + _mesa_add_state_reference (Program->Parameters, + state_tokens); + if (param_var->param_binding_begin == -1) + param_var->param_binding_begin = idx; + param_var->param_binding_length++; + Program->Base.NumParameters++; + } + } + else { + idx = + _mesa_add_state_reference (Program->Parameters, state_tokens); + if (param_var->param_binding_begin == -1) + param_var->param_binding_begin = idx; + param_var->param_binding_length++; + Program->Base.NumParameters++; + } + break; + + case PARAM_PROGRAM_ELEMENT: + if (parse_program_single_item (ctx, inst, Program, state_tokens)) + return 1; + idx = _mesa_add_state_reference (Program->Parameters, state_tokens); + if (param_var->param_binding_begin == -1) + param_var->param_binding_begin = idx; + param_var->param_binding_length++; + Program->Base.NumParameters++; + + /* Check if there is more: 0 -> we're done, else its an integer */ + if (**inst) { + GLuint out_of_range, new_idx; + GLuint start_idx = state_tokens[2] + 1; + GLuint end_idx = parse_integer (inst, Program); + + out_of_range = 0; + if (Program->type == GL_FRAGMENT_PROGRAM_ARB) { + if (((state_tokens[1] == STATE_ENV) + && (end_idx >= ctx->Const.MaxFragmentProgramEnvParams)) + || ((state_tokens[1] == STATE_LOCAL) + && (end_idx >= + ctx->Const.MaxFragmentProgramLocalParams))) + out_of_range = 1; + } + else { + if (((state_tokens[1] == STATE_ENV) + && (end_idx >= ctx->Const.MaxFragmentProgramEnvParams)) + || ((state_tokens[1] == STATE_LOCAL) + && (end_idx >= + ctx->Const.MaxFragmentProgramLocalParams))) + out_of_range = 1; + } + if (out_of_range) { + _mesa_set_program_error (ctx, Program->Position, + "Invalid Program Parameter"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Invalid Program Parameter: %d", end_idx); + return 1; + } + + for (new_idx = start_idx; new_idx <= end_idx; new_idx++) { + state_tokens[2] = new_idx; + idx = + _mesa_add_state_reference (Program->Parameters, + state_tokens); + param_var->param_binding_length++; + Program->Base.NumParameters++; + } + } + break; + + case PARAM_CONSTANT: + parse_constant (inst, const_values, Program, use); + idx = + _mesa_add_named_constant (Program->Parameters, + (char *) param_var->name, const_values); + if (param_var->param_binding_begin == -1) + param_var->param_binding_begin = idx; + param_var->param_binding_length++; + Program->Base.NumParameters++; + break; + + default: + _mesa_set_program_error (ctx, Program->Position, + "Unexpected token in parse_param_elements()"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Unexpected token in parse_param_elements()"); + return 1; + } + + /* Make sure we haven't blown past our parameter limits */ + if (((Program->type == GL_VERTEX_PROGRAM_ARB) && + (Program->Base.NumParameters >= + ctx->Const.MaxVertexProgramLocalParams)) + || ((Program->type == GL_FRAGMENT_PROGRAM_ARB) + && (Program->Base.NumParameters >= + ctx->Const.MaxFragmentProgramLocalParams))) { + _mesa_set_program_error (ctx, Program->Position, + "Too many parameter variables"); + _mesa_error (ctx, GL_INVALID_OPERATION, "Too many parameter variables"); + return 1; + } + + return err; +} + +/** + * This picks out PARAM program parameter bindings. + * + * XXX: This needs to be stressed & tested + * + * \return 0 on sucess, 1 on error + */ +static GLuint +parse_param (GLcontext * ctx, byte ** inst, struct var_cache **vc_head, + struct arb_program *Program) +{ + GLuint found, specified_length, err; + GLint state_tokens[6]; + GLfloat const_values[4]; + char *error_msg; + struct var_cache *param_var; + + err = 0; + param_var = parse_string (inst, vc_head, Program, &found); + Program->Position = parse_position (inst); + + if (found) { + error_msg = _mesa_malloc (_mesa_strlen ((char *) param_var->name) + 40); + _mesa_sprintf (error_msg, "Duplicate Varible Declaration: %s", + param_var->name); + + _mesa_set_program_error (ctx, Program->Position, error_msg); + _mesa_error (ctx, GL_INVALID_OPERATION, error_msg); + + _mesa_free (error_msg); + return 1; + } + + specified_length = parse_integer (inst, Program); + + if (specified_length < 0) { + _mesa_set_program_error (ctx, Program->Position, + "Negative parameter array length"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Negative parameter array length: %d", specified_length); + return 1; + } + + param_var->type = vt_param; + param_var->param_binding_length = 0; + + /* Right now, everything is shoved into the main state register file. + * + * In the future, it would be nice to leave things ENV/LOCAL params + * in their respective register files, if possible + */ + param_var->param_binding_type = PROGRAM_STATE_VAR; + + /* Remember to: + * * - add each guy to the parameter list + * * - increment the param_var->param_binding_len + * * - store the param_var->param_binding_begin for the first one + * * - compare the actual len to the specified len at the end + */ + while (**inst != PARAM_NULL) { + if (parse_param_elements (ctx, inst, param_var, Program, GL_FALSE)) + return 1; + } + + /* Test array length here! */ + if (specified_length) { + if (specified_length != param_var->param_binding_length) { + _mesa_set_program_error (ctx, Program->Position, + "Declared parameter array lenght does not match parameter list"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Declared parameter array lenght does not match parameter list"); + } + } + + (*inst)++; + + return 0; +} + +/** + * + */ +static GLuint +parse_param_use (GLcontext * ctx, byte ** inst, struct var_cache **vc_head, + struct arb_program *Program, struct var_cache **new_var) +{ + struct var_cache *param_var; + + /* First, insert a dummy entry into the var_cache */ + var_cache_create (¶m_var); + param_var->name = (byte *) _mesa_strdup (" "); + param_var->type = vt_param; + + param_var->param_binding_length = 0; + /* Don't fill in binding_begin; We use the default value of -1 + * to tell if its already initialized, elsewhere. + * + * param_var->param_binding_begin = 0; + */ + param_var->param_binding_type = PROGRAM_STATE_VAR; + + + var_cache_append (vc_head, param_var); + + /* Then fill it with juicy parameter goodness */ + if (parse_param_elements (ctx, inst, param_var, Program, GL_TRUE)) + return 1; + + *new_var = param_var; + + return 0; +} + + +/** + * This handles the declaration of TEMP variables + * + * \return 0 on sucess, 1 on error + */ +static GLuint +parse_temp (GLcontext * ctx, byte ** inst, struct var_cache **vc_head, + struct arb_program *Program) +{ + GLuint found; + struct var_cache *temp_var; + char *error_msg; + + while (**inst != 0) { + temp_var = parse_string (inst, vc_head, Program, &found); + Program->Position = parse_position (inst); + if (found) { + error_msg = + _mesa_malloc (_mesa_strlen ((char *) temp_var->name) + 40); + _mesa_sprintf (error_msg, "Duplicate Varible Declaration: %s", + temp_var->name); + + _mesa_set_program_error (ctx, Program->Position, error_msg); + _mesa_error (ctx, GL_INVALID_OPERATION, error_msg); + + _mesa_free (error_msg); + return 1; + } + + temp_var->type = vt_temp; + + if (((Program->type == GL_FRAGMENT_PROGRAM_ARB) && + (Program->Base.NumTemporaries >= + ctx->Const.MaxFragmentProgramTemps)) + || ((Program->type == GL_VERTEX_PROGRAM_ARB) + && (Program->Base.NumTemporaries >= + ctx->Const.MaxVertexProgramTemps))) { + _mesa_set_program_error (ctx, Program->Position, + "Too many TEMP variables declared"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Too many TEMP variables declared"); + return 1; + } + + temp_var->temp_binding = Program->Base.NumTemporaries; + Program->Base.NumTemporaries++; + } + (*inst)++; + + return 0; +} + +/** + * This handles variables of the OUTPUT variety + * + * \return 0 on sucess, 1 on error + */ +static GLuint +parse_output (GLcontext * ctx, byte ** inst, struct var_cache **vc_head, + struct arb_program *Program) +{ + GLuint found; + struct var_cache *output_var; + + output_var = parse_string (inst, vc_head, Program, &found); + Program->Position = parse_position (inst); + if (found) { + char *error_msg; + error_msg = + _mesa_malloc (_mesa_strlen ((char *) output_var->name) + 40); + _mesa_sprintf (error_msg, "Duplicate Varible Declaration: %s", + output_var->name); + + _mesa_set_program_error (ctx, Program->Position, error_msg); + _mesa_error (ctx, GL_INVALID_OPERATION, error_msg); + + _mesa_free (error_msg); + return 1; + } + + output_var->type = vt_output; + return parse_result_binding (ctx, inst, &output_var->output_binding, + &output_var->output_binding_idx, Program); +} + +/** + * This handles variables of the ALIAS kind + * + * \return 0 on sucess, 1 on error + */ +static GLuint +parse_alias (GLcontext * ctx, byte ** inst, struct var_cache **vc_head, + struct arb_program *Program) +{ + GLuint found; + struct var_cache *temp_var; + char *error_msg; + + while (**inst != 0) { + temp_var = parse_string (inst, vc_head, Program, &found); + Program->Position = parse_position (inst); + if (found) { + error_msg = + _mesa_malloc (_mesa_strlen ((char *) temp_var->name) + 40); + _mesa_sprintf (error_msg, "Duplicate Varible Declaration: %s", + temp_var->name); + + _mesa_set_program_error (ctx, Program->Position, error_msg); + _mesa_error (ctx, GL_INVALID_OPERATION, error_msg); + + _mesa_free (error_msg); + return 1; + } + + temp_var->type = vt_temp; + + if (((Program->type == GL_FRAGMENT_PROGRAM_ARB) && + (Program->Base.NumTemporaries >= + ctx->Const.MaxFragmentProgramTemps)) + || ((Program->type == GL_VERTEX_PROGRAM_ARB) + && (Program->Base.NumTemporaries >= + ctx->Const.MaxVertexProgramTemps))) { + _mesa_set_program_error (ctx, Program->Position, + "Too many TEMP variables declared"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Too many TEMP variables declared"); + return 1; + } + + temp_var->temp_binding = Program->Base.NumTemporaries; + Program->Base.NumTemporaries++; + } + (*inst)++; + + return 0; +} + +/** + * This handles variables of the ADDRESS kind + * + * \return 0 on sucess, 1 on error + */ +static GLuint +parse_address (GLcontext * ctx, byte ** inst, struct var_cache **vc_head, + struct arb_program *Program) +{ + GLuint found; + struct var_cache *temp_var; + char *error_msg; + + while (**inst != 0) { + temp_var = parse_string (inst, vc_head, Program, &found); + Program->Position = parse_position (inst); + if (found) { + error_msg = + _mesa_malloc (_mesa_strlen ((char *) temp_var->name) + 40); + _mesa_sprintf (error_msg, "Duplicate Varible Declaration: %s", + temp_var->name); + + _mesa_set_program_error (ctx, Program->Position, error_msg); + _mesa_error (ctx, GL_INVALID_OPERATION, error_msg); + + _mesa_free (error_msg); + return 1; + } + + temp_var->type = vt_address; + + if (Program->Base.NumAddressRegs >= + ctx->Const.MaxVertexProgramAddressRegs) { + _mesa_set_program_error (ctx, Program->Position, + "Too many ADDRESS variables declared"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Too many ADDRESS variables declared"); + return 1; + } + + temp_var->address_binding = Program->Base.NumAddressRegs; + Program->Base.NumAddressRegs++; + } + (*inst)++; + + return 0; +} + +/** + * Parse a program declaration + * + * \return 0 on sucess, 1 on error + */ +static GLint +parse_declaration (GLcontext * ctx, byte ** inst, struct var_cache **vc_head, + struct arb_program *Program) +{ + GLint err = 0; + + switch (*(*inst)++) { + case ADDRESS: + err = parse_address (ctx, inst, vc_head, Program); + break; + + case ALIAS: + err = parse_alias (ctx, inst, vc_head, Program); + break; + + case ATTRIB: + err = parse_attrib (ctx, inst, vc_head, Program); + break; + + case OUTPUT: + err = parse_output (ctx, inst, vc_head, Program); + break; + + case PARAM: + err = parse_param (ctx, inst, vc_head, Program); + break; + + case TEMP: + err = parse_temp (ctx, inst, vc_head, Program); + break; + } + + return err; +} + +/** + * Handle the parsing out of a masked destination register + * + * \param File - The register file we write to + * \param Index - The register index we write to + * \param WriteMask - The mask controlling which components we write (1->write) + * + * \return 0 on sucess, 1 on error + */ +static GLuint +parse_masked_dst_reg (GLcontext * ctx, byte ** inst, + struct var_cache **vc_head, struct arb_program *Program, + GLint * File, GLint * Index, GLboolean * WriteMask) +{ + GLuint err, result; + byte mask; + struct var_cache *dst; + + /* We either have a result register specified, or a + * variable that may or may not be writable + */ + switch (*(*inst)++) { + case REGISTER_RESULT: + if (parse_result_binding + (ctx, inst, &result, (GLuint *) Index, Program)) + return 1; + *File = PROGRAM_OUTPUT; + break; + + case REGISTER_ESTABLISHED_NAME: + dst = parse_string (inst, vc_head, Program, &result); + Program->Position = parse_position (inst); + + /* If the name has never been added to our symbol table, we're hosed */ + if (!result) { + _mesa_set_program_error (ctx, Program->Position, + "Undefined variable"); + _mesa_error (ctx, GL_INVALID_OPERATION, "Undefined variable: %s", + dst->name); + return 1; + } + + switch (dst->type) { + case vt_output: + *File = PROGRAM_OUTPUT; + *Index = dst->output_binding_idx; + break; + + case vt_temp: + *File = PROGRAM_TEMPORARY; + *Index = dst->temp_binding; + break; + + /* If the var type is not vt_output or vt_temp, no go */ + default: + _mesa_set_program_error (ctx, Program->Position, + "Destination register is read only"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Destination register is read only: %s", + dst->name); + return 1; + } + break; + + default: + _mesa_set_program_error (ctx, Program->Position, + "Unexpected opcode in parse_masked_dst_reg()"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Unexpected opcode in parse_masked_dst_reg()"); + return 1; + } + + /* And then the mask. + * w,a -> bit 0 + * z,b -> bit 1 + * y,g -> bit 2 + * x,r -> bit 3 + */ + mask = *(*inst)++; + + WriteMask[0] = (mask & (1 << 3)) >> 3; + WriteMask[1] = (mask & (1 << 2)) >> 2; + WriteMask[2] = (mask & (1 << 1)) >> 1; + WriteMask[3] = (mask & (1)); + + return 0; +} + +/** + * Handle the parsing out of a masked address register + * + * \param Index - The register index we write to + * \param WriteMask - The mask controlling which components we write (1->write) + * + * \return 0 on sucess, 1 on error + */ +static GLuint +parse_masked_address_reg (GLcontext * ctx, byte ** inst, + struct var_cache **vc_head, + struct arb_program *Program, GLint * Index, + GLboolean * WriteMask) +{ + GLuint err, result; + byte mask; + struct var_cache *dst; + + dst = parse_string (inst, vc_head, Program, &result); + Program->Position = parse_position (inst); + + /* If the name has never been added to our symbol table, we're hosed */ + if (!result) { + _mesa_set_program_error (ctx, Program->Position, "Undefined variable"); + _mesa_error (ctx, GL_INVALID_OPERATION, "Undefined variable: %s", + dst->name); + return 1; + } + + if (dst->type != vt_address) { + _mesa_set_program_error (ctx, Program->Position, + "Variable is not of type ADDRESS"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Variable: %s is not of type ADDRESS", dst->name); + return 1; + } + + /* Writemask of .x is implied */ + WriteMask[0] = 1; + WriteMask[1] = WriteMask[2] = WriteMask[3] = 0; + + return 0; +} + +/** + * Parse out a swizzle mask. + * + * The values in the input stream are: + * COMPONENT_X -> x/r + * COMPONENT_Y -> y/g + * COMPONENT_Z-> z/b + * COMPONENT_W-> w/a + * + * The values in the output mask are: + * 0 -> x/r + * 1 -> y/g + * 2 -> z/b + * 3 -> w/a + * + * The len parameter allows us to grab 4 components for a vector + * swizzle, or just 1 component for a scalar src register selection + */ +static GLuint +parse_swizzle_mask (byte ** inst, GLubyte * mask, GLint len) +{ + GLint a; + + for (a = 0; a < 4; a++) + mask[a] = a; + + for (a = 0; a < len; a++) { + switch (*(*inst)++) { + case COMPONENT_X: + mask[a] = 0; + break; + + case COMPONENT_Y: + mask[a] = 1; + break; + + case COMPONENT_Z: + mask[a] = 2; + break; + + case COMPONENT_W: + mask[a] = 3; + break; + } + } + + return 0; +} + +/** + */ +static GLuint +parse_extended_swizzle_mask (byte ** inst, GLubyte * mask, GLboolean * Negate) +{ + GLint a; + byte swz; + + *Negate = GL_FALSE; + for (a = 0; a < 4; a++) { + if (parse_sign (inst)) + *Negate = GL_TRUE; + + swz = *(*inst)++; + + switch (swz) { + case COMPONENT_0: + mask[a] = SWIZZLE_ZERO; + break; + case COMPONENT_1: + mask[a] = SWIZZLE_ONE; + break; + case COMPONENT_X: + mask[a] = 0; + break; + case COMPONENT_Y: + mask[a] = 1; + break; + case COMPONENT_Z: + mask[a] = 2; + break; + case COMPONENT_W: + mask[a] = 3; + break; + + } +#if 0 + if (swz == 0) + mask[a] = SWIZZLE_ZERO; + else if (swz == 1) + mask[a] = SWIZZLE_ONE; + else + mask[a] = swz - 2; +#endif + + } + + return 0; +} + + +static GLuint +parse_src_reg (GLcontext * ctx, byte ** inst, struct var_cache **vc_head, + struct arb_program *Program, GLint * File, GLint * Index) +{ + struct var_cache *src; + GLuint binding_state, binding_idx, found, offset; + + /* And the binding for the src */ + switch (*(*inst)++) { + case REGISTER_ATTRIB: + if (parse_attrib_binding + (ctx, inst, Program, &binding_state, &binding_idx)) + return 1; + *File = PROGRAM_INPUT; + *Index = binding_idx; + break; + + case REGISTER_PARAM: + + switch (**inst) { + case PARAM_ARRAY_ELEMENT: + *(*inst)++; + src = parse_string (inst, vc_head, Program, &found); + Program->Position = parse_position (inst); + + if (!found) { + _mesa_set_program_error (ctx, Program->Position, + "Undefined variable"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Undefined variable: %s", src->name); + return 1; + } + + *File = src->param_binding_type; + + switch (*(*inst)++) { + case ARRAY_INDEX_ABSOLUTE: + offset = parse_integer (inst, Program); + + if ((offset < 0) + || (offset >= src->param_binding_length)) { + _mesa_set_program_error (ctx, Program->Position, + "Index out of range"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Index %d out of range for %s", offset, + src->name); + return 1; + } + + *Index = src->param_binding_begin + offset; + break; + + /* XXX: */ + case ARRAY_INDEX_RELATIVE: + break; + } + break; + + default: + if (parse_param_use (ctx, inst, vc_head, Program, &src)) + return 1; + + *File = src->param_binding_type; + *Index = src->param_binding_begin; + break; + } + break; + + case REGISTER_ESTABLISHED_NAME: + src = parse_string (inst, vc_head, Program, &found); + Program->Position = parse_position (inst); + + /* If the name has never been added to our symbol table, we're hosed */ + if (!found) { + _mesa_set_program_error (ctx, Program->Position, + "Undefined variable"); + _mesa_error (ctx, GL_INVALID_OPERATION, "Undefined variable: %s", + src->name); + return 1; + } + + switch (src->type) { + case vt_attrib: + *File = PROGRAM_INPUT; + *Index = src->attrib_binding_idx; + break; + + /* XXX: We have to handle offsets someplace in here! -- or are those above? */ + case vt_param: + *File = src->param_binding_type; + *Index = src->param_binding_begin; + break; + + case vt_temp: + *File = PROGRAM_TEMPORARY; + *Index = src->temp_binding; + break; + + /* If the var type is vt_output no go */ + default: + _mesa_set_program_error (ctx, Program->Position, + "destination register is read only"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "destination register is read only: %s", + src->name); + return 1; + } + break; + + default: + _mesa_set_program_error (ctx, Program->Position, + "Unknown token in parse_src_reg"); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Unknown token in parse_src_reg"); + return 1; + } + + return 0; +} + +/** + */ +static GLuint +parse_vector_src_reg (GLcontext * ctx, byte ** inst, + struct var_cache **vc_head, struct arb_program *Program, + GLint * File, GLint * Index, GLboolean * Negate, + GLubyte * Swizzle) +{ + /* Grab the sign */ + *Negate = parse_sign (inst); + + /* And the src reg */ + if (parse_src_reg (ctx, inst, vc_head, Program, File, Index)) + return 1; + + /* finally, the swizzle */ + parse_swizzle_mask (inst, Swizzle, 4); + + return 0; +} + +/** + */ +static GLuint +parse_scalar_src_reg (GLcontext * ctx, byte ** inst, + struct var_cache **vc_head, struct arb_program *Program, + GLint * File, GLint * Index, GLboolean * Negate, + GLubyte * Swizzle) +{ + GLint a; + + /* Grab the sign */ + *Negate = parse_sign (inst); + + /* And the src reg */ + if (parse_src_reg (ctx, inst, vc_head, Program, File, Index)) + return 1; + + /* Now, get the component and shove it into all the swizzle slots */ + parse_swizzle_mask (inst, Swizzle, 1); + + return 0; +} + +/** + * This is a big mother that handles getting opcodes into the instruction + * and handling the src & dst registers for fragment program instructions + */ +static GLuint +parse_fp_instruction (GLcontext * ctx, byte ** inst, + struct var_cache **vc_head, struct arb_program *Program, + struct fp_instruction *fp) +{ + GLint a, b; + GLubyte swz[4]; /* FP's swizzle mask is a GLubyte, while VP's is GLuint */ + GLuint texcoord; + byte class, type, code; + + /* No condition codes in ARB_fp */ + fp->UpdateCondRegister = 0; + + /* Record the position in the program string for debugging */ + fp->StringPos = Program->Position; + + /* F_ALU_INST or F_TEX_INST */ + class = *(*inst)++; + + /* F_ALU_{VECTOR, SCALAR, BINSC, BIN, TRI, SWZ}, + * F_TEX_{SAMPLE, KIL} + */ + type = *(*inst)++; + + /* The actual opcode name */ + code = *(*inst)++; + + + /* Increment the correct count */ + switch (class) { + case F_ALU_INST: + Program->NumAluInstructions++; + break; + case F_TEX_INST: + Program->NumTexInstructions++; + break; + } + + fp->Saturate = 0; + fp->Precision = FLOAT32; + + fp->DstReg.CondMask = COND_TR; + + switch (type) { + case F_ALU_VECTOR: + switch (code) { + case F_ABS_SAT: + fp->Saturate = 1; + case F_ABS: + fp->Opcode = FP_OPCODE_ABS; + break; + + case F_FLR_SAT: + fp->Saturate = 1; + case F_FLR: + fp->Opcode = FP_OPCODE_FLR; + break; + + case F_FRC_SAT: + fp->Saturate = 1; + case F_FRC: + fp->Opcode = FP_OPCODE_FRC; + break; + + case F_LIT_SAT: + fp->Saturate = 1; + case F_LIT: + fp->Opcode = FP_OPCODE_LIT; + break; + + case F_MOV_SAT: + fp->Saturate = 1; + case F_MOV: + fp->Opcode = FP_OPCODE_MOV; + break; + } + + if (parse_masked_dst_reg + (ctx, inst, vc_head, Program, (GLint *) & fp->DstReg.File, + &fp->DstReg.Index, fp->DstReg.WriteMask)) + return 1; + + fp->SrcReg[0].Abs = GL_FALSE; + fp->SrcReg[0].NegateAbs = GL_FALSE; + if (parse_vector_src_reg + (ctx, inst, vc_head, Program, (GLint *) & fp->SrcReg[0].File, + &fp->SrcReg[0].Index, &fp->SrcReg[0].NegateBase, + swz)) + return 1; + for (b=0; b<4; b++) + fp->SrcReg[0].Swizzle[b] = swz[b]; + break; + + case F_ALU_SCALAR: + switch (code) { + case F_COS_SAT: + fp->Saturate = 1; + case F_COS: + fp->Opcode = FP_OPCODE_COS; + break; + + case F_EX2_SAT: + fp->Saturate = 1; + case F_EX2: + fp->Opcode = FP_OPCODE_EX2; + break; + + case F_LG2_SAT: + fp->Saturate = 1; + case F_LG2: + fp->Opcode = FP_OPCODE_LG2; + break; + + case F_RCP_SAT: + fp->Saturate = 1; + case F_RCP: + fp->Opcode = FP_OPCODE_RCP; + break; + + case F_RSQ_SAT: + fp->Saturate = 1; + case F_RSQ: + fp->Opcode = FP_OPCODE_RSQ; + break; + + case F_SIN_SAT: + fp->Saturate = 1; + case F_SIN: + fp->Opcode = FP_OPCODE_SIN; + break; + + case F_SCS_SAT: + fp->Saturate = 1; + case F_SCS: + fp->Opcode = FP_OPCODE_SCS; + break; + } + + if (parse_masked_dst_reg + (ctx, inst, vc_head, Program, (GLint *) & fp->DstReg.File, + &fp->DstReg.Index, fp->DstReg.WriteMask)) + return 1; + fp->SrcReg[0].Abs = GL_FALSE; + fp->SrcReg[0].NegateAbs = GL_FALSE; + if (parse_scalar_src_reg + (ctx, inst, vc_head, Program, (GLint *) & fp->SrcReg[0].File, + &fp->SrcReg[0].Index, &fp->SrcReg[0].NegateBase, + swz)) + return 1; + for (b=0; b<4; b++) + fp->SrcReg[0].Swizzle[b] = swz[b]; + break; + + case F_ALU_BINSC: + switch (code) { + case F_POW_SAT: + fp->Saturate = 1; + case F_POW: + fp->Opcode = FP_OPCODE_POW; + break; + } + + if (parse_masked_dst_reg + (ctx, inst, vc_head, Program, (GLint *) & fp->DstReg.File, + &fp->DstReg.Index, fp->DstReg.WriteMask)) + return 1; + for (a = 0; a < 2; a++) { + fp->SrcReg[a].Abs = GL_FALSE; + fp->SrcReg[a].NegateAbs = GL_FALSE; + if (parse_scalar_src_reg + (ctx, inst, vc_head, Program, (GLint *) & fp->SrcReg[a].File, + &fp->SrcReg[a].Index, &fp->SrcReg[a].NegateBase, + swz)) + return 1; + for (b=0; b<4; b++) + fp->SrcReg[a].Swizzle[b] = swz[b]; + } + break; + + + case F_ALU_BIN: + switch (code) { + case F_ADD_SAT: + fp->Saturate = 1; + case F_ADD: + fp->Opcode = FP_OPCODE_ADD; + break; + + case F_DP3_SAT: + fp->Saturate = 1; + case F_DP3: + fp->Opcode = FP_OPCODE_DP3; + break; + + case F_DP4_SAT: + fp->Saturate = 1; + case F_DP4: + fp->Opcode = FP_OPCODE_DP4; + break; + + case F_DPH_SAT: + fp->Saturate = 1; + case F_DPH: + fp->Opcode = FP_OPCODE_DPH; + break; + + case F_DST_SAT: + fp->Saturate = 1; + case F_DST: + fp->Opcode = FP_OPCODE_DST; + break; + + case F_MAX_SAT: + fp->Saturate = 1; + case F_MAX: + fp->Opcode = FP_OPCODE_MAX; + break; + + case F_MIN_SAT: + fp->Saturate = 1; + case F_MIN: + fp->Opcode = FP_OPCODE_MIN; + break; + + case F_MUL_SAT: + fp->Saturate = 1; + case F_MUL: + fp->Opcode = FP_OPCODE_MUL; + break; + + case F_SGE_SAT: + fp->Saturate = 1; + case F_SGE: + fp->Opcode = FP_OPCODE_SGE; + break; + + case F_SLT_SAT: + fp->Saturate = 1; + case F_SLT: + fp->Opcode = FP_OPCODE_SLT; + break; + + case F_SUB_SAT: + fp->Saturate = 1; + case F_SUB: + fp->Opcode = FP_OPCODE_SUB; + break; + + case F_XPD_SAT: + fp->Saturate = 1; + case F_XPD: + fp->Opcode = FP_OPCODE_X2D; + break; + } + + if (parse_masked_dst_reg + (ctx, inst, vc_head, Program, (GLint *) & fp->DstReg.File, + &fp->DstReg.Index, fp->DstReg.WriteMask)) + return 1; + for (a = 0; a < 2; a++) { + fp->SrcReg[a].Abs = GL_FALSE; + fp->SrcReg[a].NegateAbs = GL_FALSE; + if (parse_vector_src_reg + (ctx, inst, vc_head, Program, (GLint *) & fp->SrcReg[a].File, + &fp->SrcReg[a].Index, &fp->SrcReg[a].NegateBase, + swz)) + return 1; + for (b=0; b<4; b++) + fp->SrcReg[a].Swizzle[b] = swz[b]; + } + break; + + case F_ALU_TRI: + switch (code) { + case F_CMP_SAT: + fp->Saturate = 1; + case F_CMP: + fp->Opcode = FP_OPCODE_CMP; + break; + + case F_LRP_SAT: + fp->Saturate = 1; + case F_LRP: + fp->Opcode = FP_OPCODE_LRP; + break; + + case F_MAD_SAT: + fp->Saturate = 1; + case F_MAD: + fp->Opcode = FP_OPCODE_MAD; + break; + } + + if (parse_masked_dst_reg + (ctx, inst, vc_head, Program, (GLint *) & fp->DstReg.File, + &fp->DstReg.Index, fp->DstReg.WriteMask)) + return 1; + for (a = 0; a < 3; a++) { + fp->SrcReg[a].Abs = GL_FALSE; + fp->SrcReg[a].NegateAbs = GL_FALSE; + if (parse_vector_src_reg + (ctx, inst, vc_head, Program, (GLint *) & fp->SrcReg[a].File, + &fp->SrcReg[a].Index, &fp->SrcReg[a].NegateBase, + swz)) + return 1; + for (b=0; b<4; b++) + fp->SrcReg[a].Swizzle[b] = swz[b]; + } + break; + + case F_ALU_SWZ: + switch (code) { + case F_SWZ_SAT: + fp->Saturate = 1; + case F_SWZ: + fp->Opcode = FP_OPCODE_SWZ; + break; + } + if (parse_masked_dst_reg + (ctx, inst, vc_head, Program, (GLint *) & fp->DstReg.File, + &fp->DstReg.Index, fp->DstReg.WriteMask)) + return 1; + + if (parse_src_reg + (ctx, inst, vc_head, Program, (GLint *) & fp->SrcReg[0].File, + &fp->SrcReg[0].Index)) + return 1; + parse_extended_swizzle_mask (inst, swz, + &fp->SrcReg[0].NegateBase); + for (b=0; b<4; b++) + fp->SrcReg[0].Swizzle[b] = swz[b]; + break; + + case F_TEX_SAMPLE: + switch (code) { + case F_TEX_SAT: + fp->Saturate = 1; + case F_TEX: + fp->Opcode = FP_OPCODE_TEX; + break; + + case F_TXP_SAT: + fp->Saturate = 1; + case F_TXP: + fp->Opcode = FP_OPCODE_TXP; + break; + + case F_TXB_SAT: + fp->Saturate = 1; + case F_TXB: + fp->Opcode = FP_OPCODE_TXB; + break; + } + + if (parse_masked_dst_reg + (ctx, inst, vc_head, Program, (GLint *) & fp->DstReg.File, + &fp->DstReg.Index, fp->DstReg.WriteMask)) + return 1; + fp->SrcReg[0].Abs = GL_FALSE; + fp->SrcReg[0].NegateAbs = GL_FALSE; + if (parse_vector_src_reg + (ctx, inst, vc_head, Program, (GLint *) & fp->SrcReg[0].File, + &fp->SrcReg[0].Index, &fp->SrcReg[0].NegateBase, + swz)) + return 1; + for (b=0; b<4; b++) + fp->SrcReg[0].Swizzle[b] = swz[b]; + + /* texImageUnit */ + if (parse_texcoord_num (ctx, inst, Program, &texcoord)) + return 1; + fp->TexSrcUnit = texcoord; + + /* texTarget */ + switch (*(*inst)) { + case TEXTARGET_1D: + fp->TexSrcBit = TEXTURE_1D_BIT; + break; + case TEXTARGET_2D: + fp->TexSrcBit = TEXTURE_2D_BIT; + break; + case TEXTARGET_3D: + fp->TexSrcBit = TEXTURE_3D_BIT; + break; + case TEXTARGET_RECT: + fp->TexSrcBit = TEXTURE_RECT_BIT; + break; + case TEXTARGET_CUBE: + fp->TexSrcBit = TEXTURE_CUBE_BIT; + break; + } + break; + + case F_TEX_KIL: + fp->Opcode = FP_OPCODE_KIL; + fp->SrcReg[0].Abs = GL_FALSE; + fp->SrcReg[0].NegateAbs = GL_FALSE; + if (parse_vector_src_reg + (ctx, inst, vc_head, Program, (GLint *) & fp->SrcReg[0].File, + &fp->SrcReg[0].Index, &fp->SrcReg[0].NegateBase, + swz)) + return 1; + for (b=0; b<4; b++) + fp->SrcReg[0].Swizzle[b] = swz[b]; + break; + } + + return 0; +} + +/** + * This is a big mother that handles getting opcodes into the instruction + * and handling the src & dst registers for vertex program instructions + */ +static GLuint +parse_vp_instruction (GLcontext * ctx, byte ** inst, + struct var_cache **vc_head, struct arb_program *Program, + struct vp_instruction *vp) +{ + GLint a; + byte type, code; + + /* V_GEN_{ARL, VECTOR, SCALAR, BINSC, BIN, TRI, SWZ} */ + type = *(*inst)++; + + /* The actual opcode name */ + code = *(*inst)++; + + vp->SrcReg[0].RelAddr = vp->SrcReg[1].RelAddr = vp->SrcReg[2].RelAddr = 0; + + for (a = 0; a < 4; a++) { + vp->SrcReg[0].Swizzle[a] = a; + vp->SrcReg[1].Swizzle[a] = a; + vp->SrcReg[2].Swizzle[a] = a; + vp->DstReg.WriteMask[a] = 1; + } + + switch (type) { + /* XXX: */ + case V_GEN_ARL: + vp->Opcode = VP_OPCODE_ARL; + + /* Remember to set SrcReg.RelAddr; */ + + /* Get the masked address register [dst] */ + if (parse_masked_address_reg + (ctx, inst, vc_head, Program, &vp->DstReg.Index, + vp->DstReg.WriteMask)) + return 1; + vp->DstReg.File = PROGRAM_ADDRESS; + + + /* Get a scalar src register */ + if (parse_scalar_src_reg + (ctx, inst, vc_head, Program, (GLint *) & vp->SrcReg[0].File, + &vp->SrcReg[0].Index, &vp->SrcReg[0].Negate, + vp->SrcReg[0].Swizzle)) + return 1; + + break; + + case V_GEN_VECTOR: + switch (code) { + case V_ABS: + vp->Opcode = VP_OPCODE_ABS; + break; + case V_FLR: + vp->Opcode = VP_OPCODE_FLR; + break; + case V_FRC: + vp->Opcode = VP_OPCODE_FRC; + break; + case V_LIT: + vp->Opcode = VP_OPCODE_LIT; + break; + case V_MOV: + vp->Opcode = VP_OPCODE_MOV; + break; + } + if (parse_masked_dst_reg + (ctx, inst, vc_head, Program, (GLint *) & vp->DstReg.File, + &vp->DstReg.Index, vp->DstReg.WriteMask)) + return 1; + if (parse_vector_src_reg + (ctx, inst, vc_head, Program, (GLint *) & vp->SrcReg[0].File, + &vp->SrcReg[0].Index, &vp->SrcReg[0].Negate, + vp->SrcReg[0].Swizzle)) + return 1; + break; + + case V_GEN_SCALAR: + switch (code) { + case V_EX2: + vp->Opcode = VP_OPCODE_EX2; + break; + case V_EXP: + vp->Opcode = VP_OPCODE_EXP; + break; + case V_LG2: + vp->Opcode = VP_OPCODE_LG2; + break; + case V_LOG: + vp->Opcode = VP_OPCODE_LOG; + break; + case V_RCP: + vp->Opcode = VP_OPCODE_RCP; + break; + case V_RSQ: + vp->Opcode = VP_OPCODE_RSQ; + break; + } + if (parse_masked_dst_reg + (ctx, inst, vc_head, Program, (GLint *) & vp->DstReg.File, + &vp->DstReg.Index, vp->DstReg.WriteMask)) + return 1; + if (parse_scalar_src_reg + (ctx, inst, vc_head, Program, (GLint *) & vp->SrcReg[0].File, + &vp->SrcReg[0].Index, &vp->SrcReg[0].Negate, + vp->SrcReg[0].Swizzle)) + return 1; + break; + + case V_GEN_BINSC: + switch (code) { + case V_POW: + vp->Opcode = VP_OPCODE_POW; + break; + } + if (parse_masked_dst_reg + (ctx, inst, vc_head, Program, (GLint *) & vp->DstReg.File, + &vp->DstReg.Index, vp->DstReg.WriteMask)) + return 1; + for (a = 0; a < 2; a++) { + if (parse_scalar_src_reg + (ctx, inst, vc_head, Program, (GLint *) & vp->SrcReg[a].File, + &vp->SrcReg[a].Index, &vp->SrcReg[a].Negate, + vp->SrcReg[a].Swizzle)) + return 1; + } + break; + + case V_GEN_BIN: + switch (code) { + case V_ADD: + vp->Opcode = VP_OPCODE_ADD; + break; + case V_DP3: + vp->Opcode = VP_OPCODE_DP3; + break; + case V_DP4: + vp->Opcode = VP_OPCODE_DP4; + break; + case V_DPH: + vp->Opcode = VP_OPCODE_DPH; + break; + case V_DST: + vp->Opcode = VP_OPCODE_DST; + break; + case V_MAX: + vp->Opcode = VP_OPCODE_MAX; + break; + case V_MIN: + vp->Opcode = VP_OPCODE_MIN; + break; + case V_MUL: + vp->Opcode = VP_OPCODE_MUL; + break; + case V_SGE: + vp->Opcode = VP_OPCODE_SGE; + break; + case V_SLT: + vp->Opcode = VP_OPCODE_SLT; + break; + case V_SUB: + vp->Opcode = VP_OPCODE_SUB; + break; + case V_XPD: + vp->Opcode = VP_OPCODE_XPD; + break; + } + if (parse_masked_dst_reg + (ctx, inst, vc_head, Program, (GLint *) & vp->DstReg.File, + &vp->DstReg.Index, vp->DstReg.WriteMask)) + return 1; + for (a = 0; a < 2; a++) { + if (parse_vector_src_reg + (ctx, inst, vc_head, Program, (GLint *) & vp->SrcReg[a].File, + &vp->SrcReg[a].Index, &vp->SrcReg[a].Negate, + vp->SrcReg[a].Swizzle)) + return 1; + } + break; + + case V_GEN_TRI: + switch (code) { + case V_MAD: + vp->Opcode = VP_OPCODE_MAD; + break; + } + + if (parse_masked_dst_reg + (ctx, inst, vc_head, Program, (GLint *) & vp->DstReg.File, + &vp->DstReg.Index, vp->DstReg.WriteMask)) + return 1; + for (a = 0; a < 3; a++) { + if (parse_vector_src_reg + (ctx, inst, vc_head, Program, (GLint *) & vp->SrcReg[a].File, + &vp->SrcReg[a].Index, &vp->SrcReg[a].Negate, + vp->SrcReg[a].Swizzle)) + return 1; + } + break; + + case V_GEN_SWZ: + switch (code) { + case V_SWZ: + vp->Opcode = VP_OPCODE_SWZ; + break; + } + if (parse_masked_dst_reg + (ctx, inst, vc_head, Program, (GLint *) & vp->DstReg.File, + &vp->DstReg.Index, vp->DstReg.WriteMask)) + return 1; + + if (parse_src_reg + (ctx, inst, vc_head, Program, (GLint *) & vp->SrcReg[0].File, + &vp->SrcReg[0].Index)) + return 1; + parse_extended_swizzle_mask (inst, vp->SrcReg[0].Swizzle, + &vp->SrcReg[0].Negate); + break; + } + return 0; +} + +#if DEBUG_PARSING + +static GLvoid +print_state_token (GLint token) +{ + switch (token) { + case STATE_MATERIAL: + fprintf (stderr, "STATE_MATERIAL "); + break; + case STATE_LIGHT: + fprintf (stderr, "STATE_LIGHT "); + break; + + case STATE_LIGHTMODEL_AMBIENT: + fprintf (stderr, "STATE_AMBIENT "); + break; + + case STATE_LIGHTMODEL_SCENECOLOR: + fprintf (stderr, "STATE_SCENECOLOR "); + break; + + case STATE_LIGHTPROD: + fprintf (stderr, "STATE_LIGHTPROD "); + break; + + case STATE_TEXGEN: + fprintf (stderr, "STATE_TEXGEN "); + break; + + case STATE_FOG_COLOR: + fprintf (stderr, "STATE_FOG_COLOR "); + break; + + case STATE_FOG_PARAMS: + fprintf (stderr, "STATE_FOG_PARAMS "); + break; + + case STATE_CLIPPLANE: + fprintf (stderr, "STATE_CLIPPLANE "); + break; + + case STATE_POINT_SIZE: + fprintf (stderr, "STATE_POINT_SIZE "); + break; + + case STATE_POINT_ATTENUATION: + fprintf (stderr, "STATE_ATTENUATION "); + break; + + case STATE_MATRIX: + fprintf (stderr, "STATE_MATRIX "); + break; + + case STATE_MODELVIEW: + fprintf (stderr, "STATE_MODELVIEW "); + break; + + case STATE_PROJECTION: + fprintf (stderr, "STATE_PROJECTION "); + break; + + case STATE_MVP: + fprintf (stderr, "STATE_MVP "); + break; + + case STATE_TEXTURE: + fprintf (stderr, "STATE_TEXTURE "); + break; + + case STATE_PROGRAM: + fprintf (stderr, "STATE_PROGRAM "); + break; + + case STATE_MATRIX_INVERSE: + fprintf (stderr, "STATE_INVERSE "); + break; + + case STATE_MATRIX_TRANSPOSE: + fprintf (stderr, "STATE_TRANSPOSE "); + break; + + case STATE_MATRIX_INVTRANS: + fprintf (stderr, "STATE_INVTRANS "); + break; + + case STATE_AMBIENT: + fprintf (stderr, "STATE_AMBIENT "); + break; + + case STATE_DIFFUSE: + fprintf (stderr, "STATE_DIFFUSE "); + break; + + case STATE_SPECULAR: + fprintf (stderr, "STATE_SPECULAR "); + break; + + case STATE_EMISSION: + fprintf (stderr, "STATE_EMISSION "); + break; + + case STATE_SHININESS: + fprintf (stderr, "STATE_SHININESS "); + break; + + case STATE_HALF: + fprintf (stderr, "STATE_HALF "); + break; + + case STATE_POSITION: + fprintf (stderr, "STATE_POSITION "); + break; + + case STATE_ATTENUATION: + fprintf (stderr, "STATE_ATTENUATION "); + break; + + case STATE_SPOT_DIRECTION: + fprintf (stderr, "STATE_DIRECTION "); + break; + + case STATE_TEXGEN_EYE_S: + fprintf (stderr, "STATE_TEXGEN_EYE_S "); + break; + + case STATE_TEXGEN_EYE_T: + fprintf (stderr, "STATE_TEXGEN_EYE_T "); + break; + + case STATE_TEXGEN_EYE_R: + fprintf (stderr, "STATE_TEXGEN_EYE_R "); + break; + + case STATE_TEXGEN_EYE_Q: + fprintf (stderr, "STATE_TEXGEN_EYE_Q "); + break; + + case STATE_TEXGEN_OBJECT_S: + fprintf (stderr, "STATE_TEXGEN_EYE_S "); + break; + + case STATE_TEXGEN_OBJECT_T: + fprintf (stderr, "STATE_TEXGEN_OBJECT_T "); + break; + + case STATE_TEXGEN_OBJECT_R: + fprintf (stderr, "STATE_TEXGEN_OBJECT_R "); + break; + + case STATE_TEXGEN_OBJECT_Q: + fprintf (stderr, "STATE_TEXGEN_OBJECT_Q "); + break; + + case STATE_TEXENV_COLOR: + fprintf (stderr, "STATE_TEXENV_COLOR "); + break; + + case STATE_DEPTH_RANGE: + fprintf (stderr, "STATE_DEPTH_RANGE "); + break; + + case STATE_VERTEX_PROGRAM: + fprintf (stderr, "STATE_VERTEX_PROGRAM "); + break; + + case STATE_FRAGMENT_PROGRAM: + fprintf (stderr, "STATE_FRAGMENT_PROGRAM "); + break; + + case STATE_ENV: + fprintf (stderr, "STATE_ENV "); + break; + + case STATE_LOCAL: + fprintf (stderr, "STATE_LOCAL "); + break; + + } + fprintf (stderr, "[%d] ", token); +} + + + + +static GLvoid +debug_variables (GLcontext * ctx, struct var_cache *vc_head, + struct arb_program *Program) +{ + struct var_cache *vc; + GLint a, b; + + fprintf (stderr, "debug_variables, vc_head: %x\n", vc_head); + + /* First of all, print out the contents of the var_cache */ + vc = vc_head; + while (vc) { + fprintf (stderr, "[%x]\n", vc); + switch (vc->type) { + case vt_none: + fprintf (stderr, "UNDEFINED %s\n", vc->name); + break; + case vt_attrib: + fprintf (stderr, "ATTRIB %s\n", vc->name); + fprintf (stderr, " binding: 0x%x\n", vc->attrib_binding); + break; + case vt_param: + fprintf (stderr, "PARAM %s begin: %d len: %d\n", vc->name, + vc->param_binding_begin, vc->param_binding_length); + b = vc->param_binding_begin; + for (a = 0; a < vc->param_binding_length; a++) { + fprintf (stderr, "%s\n", + Program->Parameters->Parameters[a + b].Name); + if (Program->Parameters->Parameters[a + b].Type == STATE) { + print_state_token (Program->Parameters->Parameters[a + b]. + StateIndexes[0]); + print_state_token (Program->Parameters->Parameters[a + b]. + StateIndexes[1]); + print_state_token (Program->Parameters->Parameters[a + b]. + StateIndexes[2]); + print_state_token (Program->Parameters->Parameters[a + b]. + StateIndexes[3]); + print_state_token (Program->Parameters->Parameters[a + b]. + StateIndexes[4]); + print_state_token (Program->Parameters->Parameters[a + b]. + StateIndexes[5]); + } + else + fprintf (stderr, "%f %f %f %f\n", + Program->Parameters->Parameters[a + b].Values[0], + Program->Parameters->Parameters[a + b].Values[1], + Program->Parameters->Parameters[a + b].Values[2], + Program->Parameters->Parameters[a + b].Values[3]); + } + break; + case vt_temp: + fprintf (stderr, "TEMP %s\n", vc->name); + fprintf (stderr, " binding: 0x%x\n", vc->temp_binding); + break; + case vt_output: + fprintf (stderr, "OUTPUT %s\n", vc->name); + fprintf (stderr, " binding: 0x%x\n", vc->output_binding); + break; + case vt_alias: + fprintf (stderr, "ALIAS %s\n", vc->name); + fprintf (stderr, " binding: 0x%x (%s)\n", + vc->alias_binding, vc->alias_binding->name); + break; + } + vc = vc->next; + } +} + +#endif + +/** + * The main loop for parsing a fragment or vertex program + * + * \return 0 on sucess, 1 on error + */ + +static GLint +parse_arb_program (GLcontext * ctx, byte * inst, struct var_cache **vc_head, + struct arb_program *Program) +{ + GLint err = 0; + + Program->MajorVersion = (GLuint) * inst++; + Program->MinorVersion = (GLuint) * inst++; + + while (*inst != END) { + switch (*inst++) { + /* XXX: */ + case OPTION: + + if (Program->type == GL_FRAGMENT_PROGRAM_ARB) { + switch (*inst++) { + case ARB_PRECISION_HINT_FASTEST: + Program->HintPrecisionFastest = 1; + break; + + case ARB_PRECISION_HINT_NICEST: + Program->HintPrecisionNicest = 1; + break; + + case ARB_FOG_EXP: + Program->HintFogExp = 1; + break; + + case ARB_FOG_EXP2: + Program->HintFogExp2 = 1; + break; + + case ARB_FOG_LINEAR: + Program->HintFogLinear = 1; + break; + } + } + else { + switch (*inst++) { + case ARB_POSITION_INVARIANT: + Program->HintPositionInvariant = 1; + break; + } + } + break; + + case INSTRUCTION: + Program->Position = parse_position (&inst); + + if (Program->type == GL_FRAGMENT_PROGRAM_ARB) { + /* Realloc Program->FPInstructions */ + Program->FPInstructions = + (struct fp_instruction *) _mesa_realloc (Program->FPInstructions, + Program->Base.NumInstructions*sizeof(struct fp_instruction), + (Program->Base.NumInstructions+1)*sizeof (struct fp_instruction)); + + /* parse the current instruction */ + err = parse_fp_instruction (ctx, &inst, vc_head, Program, + &Program->FPInstructions[Program->Base.NumInstructions]); + + } + else { + /* Realloc Program->VPInstructions */ + Program->VPInstructions = + (struct vp_instruction *) _mesa_realloc (Program->VPInstructions, + Program->Base.NumInstructions*sizeof(struct vp_instruction), + (Program->Base.NumInstructions +1)*sizeof(struct vp_instruction)); + + /* parse the current instruction */ + err = parse_vp_instruction (ctx, &inst, vc_head, Program, + &Program->VPInstructions[Program->Base.NumInstructions]); + } + + /* increment Program->Base.NumInstructions */ + Program->Base.NumInstructions++; + break; + + case DECLARATION: + err = parse_declaration (ctx, &inst, vc_head, Program); + break; + + default: + break; + } + + if (err) + break; + } + + /* Finally, tag on an OPCODE_END instruction */ + if (Program->type == GL_FRAGMENT_PROGRAM_ARB) { + Program->FPInstructions = + (struct fp_instruction *) _mesa_realloc (Program->FPInstructions, + Program->Base.NumInstructions*sizeof(struct fp_instruction), + (Program->Base.NumInstructions+1)*sizeof(struct fp_instruction)); + + Program->FPInstructions[Program->Base.NumInstructions].Opcode = FP_OPCODE_END; + } + else { + Program->VPInstructions = + (struct vp_instruction *) _mesa_realloc (Program->VPInstructions, + Program->Base.NumInstructions*sizeof(struct vp_instruction), + (Program->Base.NumInstructions+1)*sizeof(struct vp_instruction)); + + Program->VPInstructions[Program->Base.NumInstructions].Opcode = VP_OPCODE_END; + } + + /* increment Program->Base.NumInstructions */ + Program->Base.NumInstructions++; + + return err; +} + +/** + * This kicks everything off. + * + * \param ctx - The GL Context + * \param str - The program string + * \param len - The program string length + * \param Program - The arb_program struct to return all the parsed info in + * \return 0 on sucess, 1 on error + */ +GLuint +_mesa_parse_arb_program (GLcontext * ctx, const GLubyte * str, GLsizei len, + struct arb_program * Program) +{ + GLint a, err, error_pos; + char error_msg[300]; + GLuint parsed_len; + struct var_cache *vc_head; + dict *dt; + byte *parsed, *inst; + +#if DEBUG_PARSING + fprintf (stderr, "Loading grammar text!\n"); +#endif + dt = grammar_load_from_text ((byte *) arb_grammar_text); + if (!dt) { + grammar_get_last_error ((byte *) error_msg, 300, &error_pos); + _mesa_set_program_error (ctx, error_pos, error_msg); + _mesa_error (ctx, GL_INVALID_OPERATION, + "Error loading grammer rule set"); + return 1; + } + +#if DEBUG_PARSING + printf ("Checking Grammar!\n"); +#endif + err = grammar_check (dt, str, &parsed, &parsed_len); + + + /* Syntax parse error */ + if (err == 0) { + grammar_get_last_error ((byte *) error_msg, 300, &error_pos); + _mesa_set_program_error (ctx, error_pos, error_msg); + _mesa_error (ctx, GL_INVALID_OPERATION, "Parse Error"); + + dict_destroy (&dt); + return 1; + } + +#if DEBUG_PARSING + printf ("Destroying grammer dict [parse retval: %d]\n", err); +#endif + dict_destroy (&dt); + + /* Initialize the arb_program struct */ + Program->Base.NumInstructions = + Program->Base.NumTemporaries = + Program->Base.NumParameters = + Program->Base.NumAttributes = Program->Base.NumAddressRegs = 0; + Program->Parameters = _mesa_new_parameter_list (); + Program->InputsRead = 0; + Program->OutputsWritten = 0; + Program->Position = 0; + Program->MajorVersion = Program->MinorVersion = 0; + Program->HintPrecisionFastest = + Program->HintPrecisionNicest = + Program->HintFogExp2 = + Program->HintFogExp = + Program->HintFogLinear = Program->HintPositionInvariant = 0; + for (a = 0; a < MAX_TEXTURE_IMAGE_UNITS; a++) + Program->TexturesUsed[a] = 0; + Program->NumAluInstructions = + Program->NumTexInstructions = + Program->NumTexIndirections = 0; + + Program->FPInstructions = NULL; + Program->VPInstructions = NULL; + + vc_head = NULL; + err = 0; + + /* Start examining the tokens in the array */ + inst = parsed; + + /* Check the grammer rev */ + if (*inst++ != REVISION) { + _mesa_set_program_error (ctx, 0, "Grammar version mismatch"); + _mesa_error (ctx, GL_INVALID_OPERATION, "Grammar verison mismatch"); + err = 1; + } + else { + switch (*inst++) { + case FRAGMENT_PROGRAM: + Program->type = GL_FRAGMENT_PROGRAM_ARB; + break; + + case VERTEX_PROGRAM: + Program->type = GL_VERTEX_PROGRAM_ARB; + break; + } + + err = parse_arb_program (ctx, inst, &vc_head, Program); +#if DEBUG_PARSING + fprintf (stderr, "Symantic analysis returns %d [1 is bad!]\n", err); +#endif + } + + /*debug_variables(ctx, vc_head, Program); */ + + /* We're done with the parsed binary array */ + var_cache_destroy (&vc_head); + + _mesa_free (parsed); +#if DEBUG_PARSING + printf ("_mesa_parse_arb_program() done\n"); +#endif + return err; +} diff --git a/src/mesa/main/arbparse.h b/src/mesa/main/arbparse.h new file mode 100644 index 00000000000..e6c43b9a983 --- /dev/null +++ b/src/mesa/main/arbparse.h @@ -0,0 +1,83 @@ +/* + * Mesa 3-D graphics library + * Version: 5.1 + * + * Copyright (C) 1999-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. + * + * Authors: + * Brian Paul + */ + + +#ifndef ARBPARSE_H +#define ARBPARSE_H + +#include "context.h" +#include "mtypes.h" +#include "nvvertprog.h" +#include "nvfragprog.h" + +/** + * This is basically a union of the vertex_program and fragment_program + * structs that we can use to parse the program into + * + * XXX: this should go into mtypes.h? + */ +struct arb_program +{ + GLuint type; /* FRAGMENT_PROGRAM_ARB or VERTEX_PROGRAM_ARB */ + + struct program Base; + struct program_parameter_list *Parameters; + GLuint InputsRead; + GLuint OutputsWritten; + + GLuint Position; /* Just used for error reporting while parsing */ + GLuint MajorVersion; + GLuint MinorVersion; + + /* ARB_vertex_program specifics */ + struct vp_instruction *VPInstructions; + + /* Options currently recognized by the parser */ + /* ARB_fp */ + GLboolean HintPrecisionFastest; + GLboolean HintPrecisionNicest; + GLboolean HintFogExp2; + GLboolean HintFogExp; + GLboolean HintFogLinear; + + /* ARB_fp & _vp */ + GLboolean HintPositionInvariant; + + /* ARB_fragment_program sepecifics */ + struct fp_instruction *FPInstructions; + GLuint TexturesUsed[MAX_TEXTURE_IMAGE_UNITS]; + GLuint NumAluInstructions; + GLuint NumTexInstructions; + GLuint NumTexIndirections; +}; + +extern GLuint +_mesa_parse_arb_program( GLcontext *ctx, const GLubyte *str, GLsizei len, + struct arb_program *Program ); + + +#endif diff --git a/src/mesa/main/arbparse_syn.h b/src/mesa/main/arbparse_syn.h new file mode 100644 index 00000000000..e8b9e933d29 --- /dev/null +++ b/src/mesa/main/arbparse_syn.h @@ -0,0 +1,1219 @@ +static char arb_grammar_text[] = ".syntax program;\n" +".emtcode REVISION 0x03\n" +".emtcode FRAGMENT_PROGRAM 0x01\n" +".emtcode VERTEX_PROGRAM 0x02\n" +".emtcode OPTION 0x01\n" +".emtcode INSTRUCTION 0x02\n" +".emtcode DECLARATION 0x03\n" +".emtcode END 0x04\n" +".emtcode ARB_PRECISION_HINT_FASTEST 0x01\n" +".emtcode ARB_PRECISION_HINT_NICEST 0x02\n" +".emtcode ARB_FOG_EXP 0x04\n" +".emtcode ARB_FOG_EXP2 0x08\n" +".emtcode ARB_FOG_LINEAR 0x10\n" +".emtcode ARB_POSITION_INVARIANT 0x01\n" +".emtcode F_ALU_INST 0x01\n" +".emtcode F_TEX_INST 0x02\n" +".emtcode F_ALU_VECTOR 0x01\n" +".emtcode F_ALU_SCALAR 0x02\n" +".emtcode F_ALU_BINSC 0x03\n" +".emtcode F_ALU_BIN 0x04\n" +".emtcode F_ALU_TRI 0x05\n" +".emtcode F_ALU_SWZ 0x06\n" +".emtcode F_TEX_SAMPLE 0x07\n" +".emtcode F_TEX_KIL 0x08\n" +".emtcode V_GEN_ARL 0x01\n" +".emtcode V_GEN_VECTOR 0x02\n" +".emtcode V_GEN_SCALAR 0x03\n" +".emtcode V_GEN_BINSC 0x04\n" +".emtcode V_GEN_BIN 0x05\n" +".emtcode V_GEN_TRI 0x06\n" +".emtcode V_GEN_SWZ 0x07\n" +".emtcode F_ABS 0x00\n" +".emtcode F_ABS_SAT 0x01\n" +".emtcode F_FLR 0x02\n" +".emtcode F_FLR_SAT 0x03\n" +".emtcode F_FRC 0x04\n" +".emtcode F_FRC_SAT 0x05\n" +".emtcode F_LIT 0x06\n" +".emtcode F_LIT_SAT 0x07\n" +".emtcode F_MOV 0x08\n" +".emtcode F_MOV_SAT 0x09\n" +".emtcode F_COS 0x0A\n" +".emtcode F_COS_SAT 0x0B\n" +".emtcode F_EX2 0x0C\n" +".emtcode F_EX2_SAT 0x0D\n" +".emtcode F_LG2 0x0E\n" +".emtcode F_LG2_SAT 0x0F\n" +".emtcode F_RCP 0x10\n" +".emtcode F_RCP_SAT 0x11\n" +".emtcode F_RSQ 0x12\n" +".emtcode F_RSQ_SAT 0x13\n" +".emtcode F_SIN 0x14\n" +".emtcode F_SIN_SAT 0x15\n" +".emtcode F_SCS 0x16\n" +".emtcode F_SCS_SAT 0x17\n" +".emtcode F_POW 0x18\n" +".emtcode F_POW_SAT 0x19\n" +".emtcode F_ADD 0x1A\n" +".emtcode F_ADD_SAT 0x1B\n" +".emtcode F_DP3 0x1C\n" +".emtcode F_DP3_SAT 0x1D\n" +".emtcode F_DP4 0x1E\n" +".emtcode F_DP4_SAT 0x1F\n" +".emtcode F_DPH 0x20\n" +".emtcode F_DPH_SAT 0x21\n" +".emtcode F_DST 0x22\n" +".emtcode F_DST_SAT 0x23\n" +".emtcode F_MAX 0x24\n" +".emtcode F_MAX_SAT 0x25\n" +".emtcode F_MIN 0x26\n" +".emtcode F_MIN_SAT 0x27\n" +".emtcode F_MUL 0x28\n" +".emtcode F_MUL_SAT 0x29\n" +".emtcode F_SGE 0x2A\n" +".emtcode F_SGE_SAT 0x2B\n" +".emtcode F_SLT 0x2C\n" +".emtcode F_SLT_SAT 0x2D\n" +".emtcode F_SUB 0x2E\n" +".emtcode F_SUB_SAT 0x2F\n" +".emtcode F_XPD 0x30\n" +".emtcode F_XPD_SAT 0x31\n" +".emtcode F_CMP 0x32\n" +".emtcode F_CMP_SAT 0x33\n" +".emtcode F_LRP 0x34\n" +".emtcode F_LRP_SAT 0x35\n" +".emtcode F_MAD 0x36\n" +".emtcode F_MAD_SAT 0x37\n" +".emtcode F_SWZ 0x38\n" +".emtcode F_SWZ_SAT 0x39\n" +".emtcode F_TEX 0x3A\n" +".emtcode F_TEX_SAT 0x3B\n" +".emtcode F_TXB 0x3C\n" +".emtcode F_TXB_SAT 0x3D\n" +".emtcode F_TXP 0x3E\n" +".emtcode F_TXP_SAT 0x3F\n" +".emtcode F_KIL 0x40\n" +".emtcode V_ARL 0x01\n" +".emtcode V_ABS 0x02\n" +".emtcode V_FLR 0x03\n" +".emtcode V_FRC 0x04\n" +".emtcode V_LIT 0x05\n" +".emtcode V_MOV 0x06\n" +".emtcode V_EX2 0x07\n" +".emtcode V_EXP 0x08\n" +".emtcode V_LG2 0x09\n" +".emtcode V_LOG 0x0A\n" +".emtcode V_RCP 0x0B\n" +".emtcode V_RSQ 0x0C\n" +".emtcode V_POW 0x0D\n" +".emtcode V_ADD 0x0E\n" +".emtcode V_DP3 0x0F\n" +".emtcode V_DP4 0x10\n" +".emtcode V_DPH 0x11\n" +".emtcode V_DST 0x12\n" +".emtcode V_MAX 0x13\n" +".emtcode V_MIN 0x14\n" +".emtcode V_MUL 0x15\n" +".emtcode V_SGE 0x16\n" +".emtcode V_SLT 0x17\n" +".emtcode V_SUB 0x18\n" +".emtcode V_XPD 0x19\n" +".emtcode V_MAD 0x1A\n" +".emtcode V_SWZ 0x1B\n" +".emtcode FRAGMENT_ATTRIB_COLOR 0x01\n" +".emtcode FRAGMENT_ATTRIB_TEXCOORD 0x02\n" +".emtcode FRAGMENT_ATTRIB_FOGCOORD 0x03\n" +".emtcode FRAGMENT_ATTRIB_POSITION 0x04\n" +".emtcode VERTEX_ATTRIB_POSITION 0x01\n" +".emtcode VERTEX_ATTRIB_WEIGHT 0x02\n" +".emtcode VERTEX_ATTRIB_NORMAL 0x03\n" +".emtcode VERTEX_ATTRIB_COLOR 0x04\n" +".emtcode VERTEX_ATTRIB_FOGCOORD 0x05\n" +".emtcode VERTEX_ATTRIB_TEXCOORD 0x06\n" +".emtcode VERTEX_ATTRIB_MATRIXINDEX 0x07\n" +".emtcode VERTEX_ATTRIB_GENERIC 0x08\n" +".emtcode FRAGMENT_RESULT_COLOR 0x01\n" +".emtcode FRAGMENT_RESULT_DEPTH 0x02\n" +".emtcode VERTEX_RESULT_POSITION 0x01\n" +".emtcode VERTEX_RESULT_COLOR 0x02\n" +".emtcode VERTEX_RESULT_FOGCOORD 0x03\n" +".emtcode VERTEX_RESULT_POINTSIZE 0x04\n" +".emtcode VERTEX_RESULT_TEXCOORD 0x05\n" +".emtcode TEXTARGET_1D 0x01\n" +".emtcode TEXTARGET_2D 0x02\n" +".emtcode TEXTARGET_3D 0x03\n" +".emtcode TEXTARGET_RECT 0x04\n" +".emtcode TEXTARGET_CUBE 0x05\n" +".emtcode FACE_FRONT 0x00\n" +".emtcode FACE_BACK 0x01\n" +".emtcode COLOR_PRIMARY 0x00\n" +".emtcode COLOR_SECONDARY 0x01\n" +".emtcode COMPONENT_X 0x00\n" +".emtcode COMPONENT_Y 0x01\n" +".emtcode COMPONENT_Z 0x02\n" +".emtcode COMPONENT_W 0x03\n" +".emtcode COMPONENT_0 0x04\n" +".emtcode COMPONENT_1 0x05\n" +".emtcode ARRAY_INDEX_ABSOLUTE 0x00\n" +".emtcode ARRAY_INDEX_RELATIVE 0x01\n" +".emtcode MATRIX_MODELVIEW 0x01\n" +".emtcode MATRIX_PROJECTION 0x02\n" +".emtcode MATRIX_MVP 0x03\n" +".emtcode MATRIX_TEXTURE 0x04\n" +".emtcode MATRIX_PALETTE 0x05\n" +".emtcode MATRIX_PROGRAM 0x06\n" +".emtcode MATRIX_MODIFIER_IDENTITY 0x00\n" +".emtcode MATRIX_MODIFIER_INVERSE 0x01\n" +".emtcode MATRIX_MODIFIER_TRANSPOSE 0x02\n" +".emtcode MATRIX_MODIFIER_INVTRANS 0x03\n" +".emtcode CONSTANT_SCALAR 0x01\n" +".emtcode CONSTANT_VECTOR 0x02\n" +".emtcode PROGRAM_PARAM_ENV 0x01\n" +".emtcode PROGRAM_PARAM_LOCAL 0x02\n" +".emtcode REGISTER_ATTRIB 0x01\n" +".emtcode REGISTER_PARAM 0x02\n" +".emtcode REGISTER_RESULT 0x03\n" +".emtcode REGISTER_ESTABLISHED_NAME 0x04\n" +".emtcode PARAM_NULL 0x00\n" +".emtcode PARAM_ARRAY_ELEMENT 0x01\n" +".emtcode PARAM_STATE_ELEMENT 0x02\n" +".emtcode PARAM_PROGRAM_ELEMENT 0x03\n" +".emtcode PARAM_PROGRAM_ELEMENTS 0x04\n" +".emtcode PARAM_CONSTANT 0x05\n" +".emtcode STATE_MATERIAL 0x01\n" +".emtcode STATE_LIGHT 0x02\n" +".emtcode STATE_LIGHT_MODEL 0x03\n" +".emtcode STATE_LIGHT_PROD 0x04\n" +".emtcode STATE_FOG 0x05\n" +".emtcode STATE_MATRIX_ROWS 0x06\n" +".emtcode STATE_TEX_ENV 0x07\n" +".emtcode STATE_DEPTH 0x08\n" +".emtcode STATE_TEX_GEN 0x07\n" +".emtcode STATE_CLIP_PLANE 0x08\n" +".emtcode STATE_POINT 0x09\n" +".emtcode MATERIAL_AMBIENT 0x01\n" +".emtcode MATERIAL_DIFFUSE 0x02\n" +".emtcode MATERIAL_SPECULAR 0x03\n" +".emtcode MATERIAL_EMISSION 0x04\n" +".emtcode MATERIAL_SHININESS 0x05\n" +".emtcode LIGHT_AMBIENT 0x01\n" +".emtcode LIGHT_DIFFUSE 0x02\n" +".emtcode LIGHT_SPECULAR 0x03\n" +".emtcode LIGHT_POSITION 0x04\n" +".emtcode LIGHT_ATTENUATION 0x05\n" +".emtcode LIGHT_HALF 0x06\n" +".emtcode LIGHT_SPOT_DIRECTION 0x07\n" +".emtcode LIGHT_MODEL_AMBIENT 0x01\n" +".emtcode LIGHT_MODEL_SCENECOLOR 0x02\n" +".emtcode LIGHT_PROD_AMBIENT 0x01\n" +".emtcode LIGHT_PROD_DIFFUSE 0x02\n" +".emtcode LIGHT_PROD_SPECULAR 0x03\n" +".emtcode TEX_ENV_COLOR 0x01\n" +".emtcode TEX_GEN_EYE 0x01\n" +".emtcode TEX_GEN_OBJECT 0x02\n" +".emtcode FOG_COLOR 0x01\n" +".emtcode FOG_PARAMS 0x02\n" +".emtcode DEPTH_RANGE 0x01\n" +".emtcode POINT_SIZE 0x01\n" +".emtcode POINT_ATTENUATION 0x02\n" +".emtcode ATTRIB 0x01\n" +".emtcode PARAM 0x02\n" +".emtcode TEMP 0x03\n" +".emtcode OUTPUT 0x04\n" +".emtcode ALIAS 0x05\n" +".emtcode ADDRESS 0x06\n" +".errtext UNKNOWN_PROGRAM_SIGNATURE \"1001: '$e_signature$': unknown program signature\"\n" +".errtext MISSING_END_OR_INVALID_STATEMENT \"1002: '$e_statement$': invalid statement\"\n" +".errtext CODE_AFTER_END \"1003: '$e_statement$': code after 'END' keyword\"\n" +".errtext INVALID_PROGRAM_OPTION \"1004: '$e_identifier$': invalid program option\"\n" +".errtext EXT_SWIZ_COMP_EXPECTED \"1005: extended swizzle component expected but '$e_token$' found\"\n" +".errtext TEX_TARGET_EXPECTED \"1006: texture target expected but '$e_token$' found\"\n" +".errtext TEXTURE_EXPECTED \"1007: 'texture' expected but '$e_identifier$' found\"\n" +".errtext SOURCE_REGISTER_EXPECTED \"1008: source register expected but '$e_token$' found\"\n" +".errtext DESTINATION_REGISTER_EXPECTED \"1009: destination register expected but '$e_token$' found\"\n" +".errtext INVALID_ADDRESS_COMPONENT \"1010: '$e_identifier$': invalid address component\"\n" +".errtext INVALID_ADDRESS_WRITEMASK \"1011: '$e_identifier$': invalid address writemask\"\n" +".errtext INVALID_COMPONENT \"1012: '$e_charordigit$': invalid component\"\n" +".errtext INVALID_SUFFIX \"1013: '$e_identifier$': invalid suffix\"\n" +".errtext INVALID_WRITEMASK \"1014: '$e_identifier$': invalid writemask\"\n" +".errtext FRAGMENT_EXPECTED \"1015: 'fragment' expected but '$e_identifier$' found\"\n" +".errtext VERTEX_EXPECTED \"1016: 'vertex' expected but '$e_identifier$' found\"\n" +".errtext INVALID_FRAGMENT_PROPERTY \"1017: '$e_identifier$': invalid fragment property\"\n" +".errtext INVALID_VERTEX_PROPERTY \"1018: '$e_identifier$': invalid vertex property\"\n" +".errtext INVALID_STATE_PROPERTY \"1019: '$e_identifier$': invalid state property\"\n" +".errtext INVALID_MATERIAL_PROPERTY \"1020: '$e_identifier$': invalid material property\"\n" +".errtext INVALID_LIGHT_PROPERTY \"1021: '$e_identifier$': invalid light property\"\n" +".errtext INVALID_SPOT_PROPERTY \"1022: '$e_identifier$': invalid spot property\"\n" +".errtext INVALID_LIGHTMODEL_PROPERTY \"1023: '$e_identifier$': invalid light model property\"\n" +".errtext INVALID_LIGHTPROD_PROPERTY \"1024: '$e_identifier$': invalid light product property\"\n" +".errtext INVALID_TEXENV_PROPERTY \"1025: '$e_identifier$': invalid texture environment property\"\n" +".errtext INVALID_TEXGEN_PROPERTY \"1026: '$e_identifier$': invalid texture generating property\"\n" +".errtext INVALID_TEXGEN_COORD \"1027: '$e_identifier$': invalid texture generating coord\"\n" +".errtext INVALID_FOG_PROPERTY \"1028: '$e_identifier$': invalid fog property\"\n" +".errtext INVALID_DEPTH_PROPERTY \"1029: '$e_identifier$': invalid depth property\"\n" +".errtext INVALID_CLIPPLANE_PROPERTY \"1030: '$e_identifier$': invalid clip plane property\"\n" +".errtext INVALID_POINT_PROPERTY \"1031: '$e_identifier$': invalid point property\"\n" +".errtext MATRIX_ROW_SELECTOR_OR_MODIFIER_EXPECTED \"1032: matrix row selector or modifier expected but '$e_token$' found\"\n" +".errtext INVALID_MATRIX_NAME \"1033: '$e_identifier$': invalid matrix name\"\n" +".errtext INVALID_PROGRAM_PROPERTY \"1034: '$e_identifier$': invalid program property\"\n" +".errtext RESULT_EXPECTED \"1035: 'result' expected but '$e_token$' found\"\n" +".errtext INVALID_RESULT_PROPERTY \"1036: '$e_identifier$': invalid result property\"\n" +".errtext INVALID_FACE_PROPERTY \"1037: '$e_identifier$': invalid face property\"\n" +".errtext INVALID_COLOR_PROPERTY \"1038: '$e_identifier$': invalid color property\"\n" +".errtext IDENTIFIER_EXPECTED \"1039: identifier expected but '$e_token$' found\"\n" +".errtext RESERVED_KEYWORD \"1040: use of reserved keyword as an identifier\"\n" +".errtext INTEGER_EXPECTED \"1041: integer value expected but '$e_token$' found\"\n" +".errtext MISSING_SEMICOLON \"1042: ';' expected but '$e_token$' found\"\n" +".errtext MISSING_COMMA \"1043: ',' expected but '$e_token$' found\"\n" +".errtext MISSING_LBRACKET \"1044: '[' expected but '$e_token$' found\"\n" +".errtext MISSING_RBRACKET \"1045: ']' expected but '$e_token$' found\"\n" +".errtext MISSING_DOT \"1046: '.' expected but '$e_token$' found\"\n" +".errtext MISSING_EQUAL \"1047: '=' expected but '$e_token$' found\"\n" +".errtext MISSING_LBRACE \"1048: '{' expected but '$e_token$' found\"\n" +".errtext MISSING_RBRACE \"1049: '}' expected but '$e_token$' found\"\n" +".errtext MISSING_DOTDOT \"1050: '..' expected but '$e_token$' found\"\n" +".errtext MISSING_FRACTION_OR_EXPONENT \"1051: missing fraction part or exponent\"\n" +".errtext MISSING_DOT_OR_EXPONENT \"1052: missing '.' or exponent\"\n" +".errtext EXPONENT_VALUE_EXPECTED \"1053: exponent value expected\"\n" +"program\n" +" programs .error UNKNOWN_PROGRAM_SIGNATURE .emit REVISION;\n" +"programs\n" +" frag_program_1_0 .emit FRAGMENT_PROGRAM .emit 0x01 .emit 0x00 .or\n" +" vert_program_1_0 .emit VERTEX_PROGRAM .emit 0x01 .emit 0x00;\n" +"frag_program_1_0\n" +" '!' .and '!' .and 'A' .and 'R' .and 'B' .and 'f' .and 'p' .and '1' .and '.' .and '0' .and\n" +" optional_space .and fp_optionSequence .and fp_statementSequence .and\n" +" \"END\" .error MISSING_END_OR_INVALID_STATEMENT .emit END .and optional_space .and\n" +" '\\0' .error CODE_AFTER_END;\n" +"vert_program_1_0\n" +" '!' .and '!' .and 'A' .and 'R' .and 'B' .and 'v' .and 'p' .and '1' .and '.' .and '0' .and\n" +" optional_space .and vp_optionSequence .and vp_statementSequence .and\n" +" \"END\" .error MISSING_END_OR_INVALID_STATEMENT .emit END .and optional_space .and\n" +" '\\0' .error CODE_AFTER_END;\n" +"fp_optionSequence\n" +" .loop fp_option;\n" +"vp_optionSequence\n" +" .loop vp_option;\n" +"fp_option\n" +" \"OPTION\" .emit OPTION .and space .and fp_optionString .error INVALID_PROGRAM_OPTION .and\n" +" semicolon;\n" +"vp_option\n" +" \"OPTION\" .emit OPTION .and space .and vp_optionString .error INVALID_PROGRAM_OPTION .and\n" +" semicolon;\n" +"fp_optionString\n" +" \"ARB_precision_hint_fastest\" .emit ARB_PRECISION_HINT_FASTEST .or\n" +" \"ARB_precision_hint_nicest\" .emit ARB_PRECISION_HINT_NICEST .or\n" +" \"ARB_fog_exp\" .emit ARB_FOG_EXP .or\n" +" \"ARB_fog_exp2\" .emit ARB_FOG_EXP2 .or\n" +" \"ARB_fog_linear\" .emit ARB_FOG_LINEAR;\n" +"vp_optionString\n" +" \"ARB_position_invariant\" .emit ARB_POSITION_INVARIANT;\n" +"fp_statementSequence\n" +" .loop fp_statement;\n" +"vp_statementSequence\n" +" .loop vp_statement;\n" +"fp_statement\n" +" fp_statement_1 .or fp_statement_2;\n" +"vp_statement\n" +" vp_statement_1 .or vp_statement_2;\n" +"fp_statement_1\n" +" fp_instruction .emit INSTRUCTION .emit $ .and semicolon;\n" +"fp_statement_2\n" +" fp_namingStatement .emit DECLARATION .and semicolon;\n" +"vp_statement_1\n" +" vp_instruction .emit INSTRUCTION .emit $ .and semicolon;\n" +"vp_statement_2\n" +" vp_namingStatement .emit DECLARATION .and semicolon;\n" +"fp_instruction\n" +" ALUInstruction .emit F_ALU_INST .or\n" +" TexInstruction .emit F_TEX_INST;\n" +"vp_instruction\n" +" ARL_instruction .emit V_GEN_ARL .or\n" +" vp_VECTORop_instruction .emit V_GEN_VECTOR .or\n" +" vp_SCALARop_instruction .emit V_GEN_SCALAR .or\n" +" vp_BINSCop_instruction .emit V_GEN_BINSC .or\n" +" vp_BINop_instruction .emit V_GEN_BIN .or\n" +" vp_TRIop_instruction .emit V_GEN_TRI .or\n" +" vp_SWZ_instruction .emit V_GEN_SWZ;\n" +"ALUInstruction\n" +" fp_VECTORop_instruction .emit F_ALU_VECTOR .or\n" +" fp_SCALARop_instruction .emit F_ALU_SCALAR .or\n" +" fp_BINSCop_instruction .emit F_ALU_BINSC .or\n" +" fp_BINop_instruction .emit F_ALU_BIN .or\n" +" fp_TRIop_instruction .emit F_ALU_TRI .or\n" +" fp_SWZ_instruction .emit F_ALU_SWZ;\n" +"TexInstruction\n" +" SAMPLE_instruction .emit F_TEX_SAMPLE .or\n" +" KIL_instruction .emit F_TEX_KIL;\n" +"ARL_instruction\n" +" \"ARL\" .emit V_ARL .and space .and maskedAddrReg .and comma .and vp_scalarSrcReg;\n" +"fp_VECTORop_instruction\n" +" fp_VECTORop .and space .and fp_maskedDstReg .and comma .and vectorSrcReg;\n" +"vp_VECTORop_instruction\n" +" vp_VECTORop .and space .and vp_maskedDstReg .and comma .and swizzleSrcReg;\n" +"fp_VECTORop\n" +" \"ABS\" .emit F_ABS .or \"ABS_SAT\" .emit F_ABS_SAT .or\n" +" \"FLR\" .emit F_FLR .or \"FLR_SAT\" .emit F_FLR_SAT .or\n" +" \"FRC\" .emit F_FRC .or \"FRC_SAT\" .emit F_FRC_SAT .or\n" +" \"LIT\" .emit F_LIT .or \"LIT_SAT\" .emit F_LIT_SAT .or\n" +" \"MOV\" .emit F_MOV .or \"MOV_SAT\" .emit F_MOV_SAT;\n" +"vp_VECTORop\n" +" \"ABS\" .emit V_ABS .or\n" +" \"FLR\" .emit V_FLR .or\n" +" \"FRC\" .emit V_FRC .or\n" +" \"LIT\" .emit V_LIT .or\n" +" \"MOV\" .emit V_MOV;\n" +"fp_SCALARop_instruction\n" +" fp_SCALARop .and space .and fp_maskedDstReg .and comma .and fp_scalarSrcReg;\n" +"vp_SCALARop_instruction\n" +" vp_SCALARop .and space .and vp_maskedDstReg .and comma .and vp_scalarSrcReg;\n" +"fp_SCALARop\n" +" \"COS\" .emit F_COS .or \"COS_SAT\" .emit F_COS_SAT .or\n" +" \"EX2\" .emit F_EX2 .or \"EX2_SAT\" .emit F_EX2_SAT .or\n" +" \"LG2\" .emit F_LG2 .or \"LG2_SAT\" .emit F_LG2_SAT .or\n" +" \"RCP\" .emit F_RCP .or \"RCP_SAT\" .emit F_RCP_SAT .or\n" +" \"RSQ\" .emit F_RSQ .or \"RSQ_SAT\" .emit F_RSQ_SAT .or\n" +" \"SIN\" .emit F_SIN .or \"SIN_SAT\" .emit F_SIN_SAT .or\n" +" \"SCS\" .emit F_SCS .or \"SCS_SAT\" .emit F_SCS_SAT;\n" +"vp_SCALARop\n" +" \"EX2\" .emit V_EX2 .or\n" +" \"EXP\" .emit V_EXP .or\n" +" \"LG2\" .emit V_LG2 .or\n" +" \"LOG\" .emit V_LOG .or\n" +" \"RCP\" .emit V_RCP .or\n" +" \"RSQ\" .emit V_RSQ;\n" +"fp_BINSCop_instruction\n" +" fp_BINSCop .and space .and fp_maskedDstReg .and comma .and fp_scalarSrcReg .and comma .and\n" +" fp_scalarSrcReg;\n" +"vp_BINSCop_instruction\n" +" vp_BINSCop .and space .and vp_maskedDstReg .and comma .and vp_scalarSrcReg .and comma .and\n" +" vp_scalarSrcReg;\n" +"fp_BINSCop\n" +" \"POW\" .emit F_POW .or \"POW_SAT\" .emit F_POW_SAT;\n" +"vp_BINSCop\n" +" \"POW\" .emit V_POW;\n" +"fp_BINop_instruction\n" +" fp_BINop .and space .and fp_maskedDstReg .and comma .and vectorSrcReg .and comma .and\n" +" vectorSrcReg;\n" +"vp_BINop_instruction\n" +" vp_BINop .and space .and vp_maskedDstReg .and comma .and swizzleSrcReg .and comma .and\n" +" swizzleSrcReg;\n" +"fp_BINop\n" +" \"ADD\" .emit F_ADD .or \"ADD_SAT\" .emit F_ADD_SAT .or\n" +" \"DP3\" .emit F_DP3 .or \"DP3_SAT\" .emit F_DP3_SAT .or\n" +" \"DP4\" .emit F_DP4 .or \"DP4_SAT\" .emit F_DP4_SAT .or\n" +" \"DPH\" .emit F_DPH .or \"DPH_SAT\" .emit F_DPH_SAT .or\n" +" \"DST\" .emit F_DST .or \"DST_SAT\" .emit F_DST_SAT .or\n" +" \"MAX\" .emit F_MAX .or \"MAX_SAT\" .emit F_MAX_SAT .or\n" +" \"MIN\" .emit F_MIN .or \"MIN_SAT\" .emit F_MIN_SAT .or\n" +" \"MUL\" .emit F_MUL .or \"MUL_SAT\" .emit F_MUL_SAT .or\n" +" \"SGE\" .emit F_SGE .or \"SGE_SAT\" .emit F_SGE_SAT .or\n" +" \"SLT\" .emit F_SLT .or \"SLT_SAT\" .emit F_SLT_SAT .or\n" +" \"SUB\" .emit F_SUB .or \"SUB_SAT\" .emit F_SUB_SAT .or\n" +" \"XPD\" .emit F_XPD .or \"XPD_SAT\" .emit F_XPD_SAT;\n" +"vp_BINop\n" +" \"ADD\" .emit V_ADD .or\n" +" \"DP3\" .emit V_DP3 .or\n" +" \"DP4\" .emit V_DP4 .or\n" +" \"DPH\" .emit V_DPH .or\n" +" \"DST\" .emit V_DST .or\n" +" \"MAX\" .emit V_MAX .or\n" +" \"MIN\" .emit V_MIN .or\n" +" \"MUL\" .emit V_MUL .or\n" +" \"SGE\" .emit V_SGE .or\n" +" \"SLT\" .emit V_SLT .or\n" +" \"SUB\" .emit V_SUB .or\n" +" \"XPD\" .emit V_XPD;\n" +"fp_TRIop_instruction\n" +" fp_TRIop .and space .and fp_maskedDstReg .and comma .and vectorSrcReg .and comma .and\n" +" vectorSrcReg .and comma .and vectorSrcReg;\n" +"vp_TRIop_instruction\n" +" vp_TRIop .and space .and vp_maskedDstReg .and comma .and swizzleSrcReg .and comma .and\n" +" swizzleSrcReg .and comma .and swizzleSrcReg;\n" +"fp_TRIop\n" +" \"CMP\" .emit F_CMP .or \"CMP_SAT\" .emit F_CMP_SAT .or\n" +" \"LRP\" .emit F_LRP .or \"LRP_SAT\" .emit F_LRP_SAT .or\n" +" \"MAD\" .emit F_MAD .or \"MAD_SAT\" .emit F_MAD_SAT;\n" +"vp_TRIop\n" +" \"MAD\" .emit V_MAD;\n" +"fp_SWZ_instruction\n" +" SWZop .and space .and fp_maskedDstReg .and comma .and fp_srcReg .and comma .and\n" +" fp_extendedSwizzle .error EXT_SWIZ_COMP_EXPECTED;\n" +"vp_SWZ_instruction\n" +" \"SWZ\" .emit V_SWZ .and space .and vp_maskedDstReg .and comma .and vp_srcReg .and comma .and\n" +" vp_extendedSwizzle .error EXT_SWIZ_COMP_EXPECTED;\n" +"SWZop\n" +" \"SWZ\" .emit F_SWZ .or \"SWZ_SAT\" .emit F_SWZ_SAT;\n" +"SAMPLE_instruction\n" +" SAMPLEop .and space .and fp_maskedDstReg .and comma .and vectorSrcReg .and comma .and\n" +" texImageUnit .and comma .and texTarget .error TEX_TARGET_EXPECTED;\n" +"SAMPLEop\n" +" \"TEX\" .emit F_TEX .or \"TEX_SAT\" .emit F_TEX_SAT .or\n" +" \"TXB\" .emit F_TXB .or \"TXB_SAT\" .emit F_TXB_SAT .or\n" +" \"TXP\" .emit F_TXP .or \"TXP_SAT\" .emit F_TXP_SAT;\n" +"KIL_instruction\n" +" \"KIL\" .emit F_KIL .and space .and vectorSrcReg;\n" +"texImageUnit\n" +" \"texture\" .error TEXTURE_EXPECTED .and optTexImageUnitNum;\n" +"texTarget\n" +" \"1D\" .emit TEXTARGET_1D .or\n" +" \"2D\" .emit TEXTARGET_2D .or\n" +" \"3D\" .emit TEXTARGET_3D .or\n" +" \"RECT\" .emit TEXTARGET_RECT .or\n" +" \"CUBE\" .emit TEXTARGET_CUBE;\n" +"optTexImageUnitNum\n" +" optTexImageUnitNum_1 .or .true .emit 0x00;\n" +"optTexImageUnitNum_1\n" +" lbracket_ne .and texImageUnitNum .and rbracket;\n" +"texImageUnitNum\n" +" integer;\n" +"fp_scalarSrcReg\n" +" optionalSign .and fp_srcReg .and fp_scalarSuffix;\n" +"vp_scalarSrcReg\n" +" optionalSign .and vp_srcReg .and vp_scalarSuffix;\n" +"swizzleSrcReg\n" +" optionalSign .and vp_srcReg .and swizzleSuffix;\n" +"vectorSrcReg\n" +" optionalSign .and fp_srcReg .and optionalSuffix;\n" +"fp_maskedDstReg\n" +" fp_dstReg .and fp_optionalMask;\n" +"vp_maskedDstReg\n" +" vp_dstReg .and vp_optionalMask;\n" +"maskedAddrReg\n" +" addrReg .and addrWriteMask;\n" +"fp_extendedSwizzle\n" +" xyzwExtendedSwizzle .or rgbaExtendedSwizzle;\n" +"vp_extendedSwizzle\n" +" extSwizComp .and comma .and\n" +" extSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\n" +" extSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\n" +" extSwizComp .error EXT_SWIZ_COMP_EXPECTED;\n" +"xyzwExtendedSwizzle\n" +" xyzwExtSwizComp .and comma .and\n" +" xyzwExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\n" +" xyzwExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\n" +" xyzwExtSwizComp .error EXT_SWIZ_COMP_EXPECTED;\n" +"rgbaExtendedSwizzle\n" +" rgbaExtSwizComp .and comma .and\n" +" rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\n" +" rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\n" +" rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED;\n" +"xyzwExtSwizComp\n" +" optionalSign .and xyzwExtSwizSel;\n" +"rgbaExtSwizComp\n" +" optionalSign .and rgbaExtSwizSel;\n" +"extSwizComp\n" +" optionalSign .and extSwizSel;\n" +"xyzwExtSwizSel\n" +" \"0\" .emit COMPONENT_0 .or \"1\" .emit COMPONENT_1 .or xyzwComponent_single;\n" +"rgbaExtSwizSel\n" +" \"0\" .emit COMPONENT_0 .or \"1\" .emit COMPONENT_1 .or rgbaComponent_single;\n" +"extSwizSel\n" +" \"0\" .emit COMPONENT_0 .or \"1\" .emit COMPONENT_1 .or vp_component_single;\n" +"fp_srcReg\n" +" fp_srcReg_1 .error SOURCE_REGISTER_EXPECTED;\n" +"vp_srcReg\n" +" vp_srcReg_1 .error SOURCE_REGISTER_EXPECTED;\n" +"fp_srcReg_1\n" +" fragmentAttribReg .emit REGISTER_ATTRIB .or\n" +" fp_progParamReg .emit REGISTER_PARAM .or\n" +" fp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;\n" +"vp_srcReg_1\n" +" vertexAttribReg .emit REGISTER_ATTRIB .or\n" +" vp_progParamReg .emit REGISTER_PARAM .or\n" +" vp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;\n" +"fp_dstReg\n" +" fp_dstReg_1 .error DESTINATION_REGISTER_EXPECTED;\n" +"vp_dstReg\n" +" vp_dstReg_1 .error DESTINATION_REGISTER_EXPECTED;\n" +"fp_dstReg_1\n" +" fragmentResultReg .emit REGISTER_RESULT .or\n" +" fp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;\n" +"vp_dstReg_1\n" +" vertexResultReg .emit REGISTER_RESULT .or\n" +" vp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;\n" +"fragmentAttribReg\n" +" fragAttribBinding;\n" +"vertexAttribReg\n" +" vtxAttribBinding;\n" +"fp_temporaryReg\n" +" fp_establishedName;\n" +"vp_temporaryReg\n" +" vp_establishedName;\n" +"fp_progParamReg\n" +" fp_paramSingleItemUse .or fp_progParamReg_1;\n" +"vp_progParamReg\n" +" vp_paramSingleItemUse .or vp_progParamReg_1;\n" +"fp_progParamReg_1\n" +" fp_progParamArray .emit PARAM_ARRAY_ELEMENT .and lbracket_ne .and progParamArrayAbs .and\n" +" rbracket;\n" +"vp_progParamReg_1\n" +" vp_progParamArray .emit PARAM_ARRAY_ELEMENT .and lbracket_ne .and progParamArrayMem .and\n" +" rbracket;\n" +"fp_progParamArray\n" +" fp_establishedName;\n" +"vp_progParamArray\n" +" vp_establishedName;\n" +"progParamArrayMem\n" +" progParamArrayAbs .or progParamArrayRel;\n" +"progParamArrayAbs\n" +" integer .emit ARRAY_INDEX_ABSOLUTE;\n" +"progParamArrayRel\n" +" addrReg .emit ARRAY_INDEX_RELATIVE .and addrComponent .and addrRegRelOffset;\n" +"addrRegRelOffset\n" +" addrRegRelOffset_1 .or addrRegRelOffset_2 .or .true .emit 0x00;\n" +"addrRegRelOffset_1\n" +" plus_ne .and addrRegPosOffset;\n" +"addrRegRelOffset_2\n" +" minus_ne .and addrRegNegOffset;\n" +"addrRegPosOffset\n" +" integer_0_63;\n" +"addrRegNegOffset\n" +" integer_0_64;\n" +"fragmentResultReg\n" +" fp_resultBinding;\n" +"vertexResultReg\n" +" vp_resultBinding;\n" +"addrReg\n" +" vp_establishedName;\n" +"addrComponent\n" +" dot .and \"x\" .error INVALID_ADDRESS_COMPONENT .emit COMPONENT_X .emit COMPONENT_X\n" +" .emit COMPONENT_X .emit COMPONENT_X;\n" +"addrWriteMask\n" +" dot .and \"x\" .error INVALID_ADDRESS_WRITEMASK .emit 0x08;\n" +"fp_scalarSuffix\n" +" dot .and fp_component_single .error INVALID_COMPONENT;\n" +"vp_scalarSuffix\n" +" dot .and vp_component_single .error INVALID_COMPONENT;\n" +"swizzleSuffix\n" +" swizzleSuffix_1 .or .true .emit COMPONENT_X .emit COMPONENT_Y .emit COMPONENT_Z\n" +" .emit COMPONENT_W;\n" +"swizzleSuffix_1\n" +" dot_ne .and swizzleSuffix_2 .error INVALID_SUFFIX;\n" +"swizzleSuffix_2\n" +" swizzleSuffix_3 .or swizzleSuffix_4;\n" +"swizzleSuffix_3\n" +" vp_component_multi .and vp_component_multi .and vp_component_multi .error INVALID_COMPONENT .and\n" +" vp_component_multi .error INVALID_COMPONENT;\n" +"swizzleSuffix_4\n" +" \"x\" .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .or\n" +" \"y\" .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .or\n" +" \"z\" .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .or\n" +" \"w\" .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W;\n" +"optionalSuffix\n" +" optionalSuffix_1 .or .true .emit COMPONENT_X .emit COMPONENT_Y .emit COMPONENT_Z\n" +" .emit COMPONENT_W;\n" +"optionalSuffix_1\n" +" dot_ne .and optionalSuffix_2 .error INVALID_SUFFIX;\n" +"optionalSuffix_2\n" +" optionalSuffix_3 .or optionalSuffix_4 .or optionalSuffix_5;\n" +"optionalSuffix_3\n" +" xyzwComponent_multi .and xyzwComponent_multi .and\n" +" xyzwComponent_multi .error INVALID_COMPONENT .and xyzwComponent_multi .error INVALID_COMPONENT;\n" +"optionalSuffix_4\n" +" rgbaComponent_multi .and rgbaComponent_multi .and\n" +" rgbaComponent_multi .error INVALID_COMPONENT .and rgbaComponent_multi .error INVALID_COMPONENT;\n" +"optionalSuffix_5\n" +" \"x\" .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .or\n" +" \"y\" .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .or\n" +" \"z\" .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .or\n" +" \"w\" .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .or\n" +" \"r\" .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .or\n" +" \"g\" .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .or\n" +" \"b\" .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .or\n" +" \"a\" .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W;\n" +"fp_component_single\n" +" xyzwComponent_single .or rgbaComponent_single;\n" +"vp_component_multi\n" +" 'x' .emit COMPONENT_X .or 'y' .emit COMPONENT_Y .or 'z' .emit COMPONENT_Z .or\n" +" 'w' .emit COMPONENT_W;\n" +"vp_component_single\n" +" \"x\" .emit COMPONENT_X .or \"y\" .emit COMPONENT_Y .or \"z\" .emit COMPONENT_Z .or\n" +" \"w\" .emit COMPONENT_W;\n" +"xyzwComponent_multi\n" +" 'x' .emit COMPONENT_X .or 'y' .emit COMPONENT_Y .or 'z' .emit COMPONENT_Z .or\n" +" 'w' .emit COMPONENT_W;\n" +"xyzwComponent_single\n" +" \"x\" .emit COMPONENT_X .or \"y\" .emit COMPONENT_Y .or \"z\" .emit COMPONENT_Z .or\n" +" \"w\" .emit COMPONENT_W;\n" +"rgbaComponent_multi\n" +" 'r' .emit COMPONENT_X .or 'g' .emit COMPONENT_Y .or 'b' .emit COMPONENT_Z .or\n" +" 'a' .emit COMPONENT_W;\n" +"rgbaComponent_single\n" +" \"r\" .emit COMPONENT_X .or \"g\" .emit COMPONENT_Y .or \"b\" .emit COMPONENT_Z .or\n" +" \"a\" .emit COMPONENT_W;\n" +"fp_optionalMask\n" +" xyzwMask .or rgbaMask .or .true .emit 0x0F;\n" +"vp_optionalMask\n" +" xyzwMask .or .true .emit 0x0F;\n" +"xyzwMask\n" +" dot_ne .and xyzwMask_1 .error INVALID_WRITEMASK;\n" +"xyzwMask_1\n" +" \"xyzw\" .emit 0x0F .or \"xyz\" .emit 0x0E .or \"xyw\" .emit 0x0D .or \"xy\" .emit 0x0C .or\n" +" \"xzw\" .emit 0x0B .or \"xz\" .emit 0x0A .or \"xw\" .emit 0x09 .or \"x\" .emit 0x08 .or\n" +" \"yzw\" .emit 0x07 .or \"yz\" .emit 0x06 .or \"yw\" .emit 0x05 .or \"y\" .emit 0x04 .or\n" +" \"zw\" .emit 0x03 .or \"z\" .emit 0x02 .or \"w\" .emit 0x01;\n" +"rgbaMask\n" +" dot_ne .and rgbaMask_1 .error INVALID_WRITEMASK;\n" +"rgbaMask_1\n" +" \"rgba\" .emit 0x0F .or \"rgb\" .emit 0x0E .or \"rga\" .emit 0x0D .or \"rg\" .emit 0x0C .or\n" +" \"rba\" .emit 0x0B .or \"rb\" .emit 0x0A .or \"ra\" .emit 0x09 .or \"r\" .emit 0x08 .or\n" +" \"gba\" .emit 0x07 .or \"gb\" .emit 0x06 .or \"ga\" .emit 0x05 .or \"g\" .emit 0x04 .or\n" +" \"ba\" .emit 0x03 .or \"b\" .emit 0x02 .or \"a\" .emit 0x01;\n" +"fp_namingStatement\n" +" fp_ATTRIB_statement .emit ATTRIB .or\n" +" fp_PARAM_statement .emit PARAM .or\n" +" fp_TEMP_statement .emit TEMP .or\n" +" fp_OUTPUT_statement .emit OUTPUT .or\n" +" fp_ALIAS_statement .emit ALIAS;\n" +"vp_namingStatement\n" +" vp_ATTRIB_statement .emit ATTRIB .or\n" +" vp_PARAM_statement .emit PARAM .or\n" +" vp_TEMP_statement .emit TEMP .or\n" +" ADDRESS_statement .emit ADDRESS .or\n" +" vp_OUTPUT_statement .emit OUTPUT .or\n" +" vp_ALIAS_statement .emit ALIAS;\n" +"fp_ATTRIB_statement\n" +" \"ATTRIB\" .and space .and fp_establishName .and equal .and\n" +" fragAttribBinding .error FRAGMENT_EXPECTED;\n" +"vp_ATTRIB_statement\n" +" \"ATTRIB\" .and space .and vp_establishName .and equal .and\n" +" vtxAttribBinding .error VERTEX_EXPECTED;\n" +"fragAttribBinding\n" +" \"fragment\" .and dot .and fragAttribItem .error INVALID_FRAGMENT_PROPERTY;\n" +"vtxAttribBinding\n" +" \"vertex\" .and dot .and vtxAttribItem .error INVALID_VERTEX_PROPERTY;\n" +"fragAttribItem\n" +" fragAttribItem_1 .emit FRAGMENT_ATTRIB_COLOR .or\n" +" fragAttribItem_2 .emit FRAGMENT_ATTRIB_TEXCOORD .or\n" +" \"fogcoord\" .emit FRAGMENT_ATTRIB_FOGCOORD .or\n" +" \"position\" .emit FRAGMENT_ATTRIB_POSITION;\n" +"fragAttribItem_1\n" +" \"color\" .and optColorType;\n" +"fragAttribItem_2\n" +" \"texcoord\" .and optTexCoordNum;\n" +"vtxAttribItem\n" +" \"position\" .emit VERTEX_ATTRIB_POSITION .or\n" +" vtxAttribItem_1 .emit VERTEX_ATTRIB_WEIGHT .or\n" +" \"normal\" .emit VERTEX_ATTRIB_NORMAL .or\n" +" vtxAttribItem_2 .emit VERTEX_ATTRIB_COLOR .or\n" +" \"fogcoord\" .emit VERTEX_ATTRIB_FOGCOORD .or\n" +" vtxAttribItem_3 .emit VERTEX_ATTRIB_TEXCOORD .or\n" +" vtxAttribItem_4 .emit VERTEX_ATTRIB_MATRIXINDEX .or\n" +" vtxAttribItem_5 .emit VERTEX_ATTRIB_GENERIC;\n" +"vtxAttribItem_1\n" +" \"weight\" .and vtxOptWeightNum;\n" +"vtxAttribItem_2\n" +" \"color\" .and optColorType;\n" +"vtxAttribItem_3\n" +" \"texcoord\" .and optTexCoordNum;\n" +"vtxAttribItem_4\n" +" \"matrixindex\" .and lbracket .and vtxWeightNum .and rbracket;\n" +"vtxAttribItem_5\n" +" \"attrib\" .and lbracket .and vtxAttribNum .and rbracket;\n" +"vtxAttribNum\n" +" integer;\n" +"vtxOptWeightNum\n" +" vtxOptWeightNum_1 .or .true .emit 0x00;\n" +"vtxOptWeightNum_1\n" +" lbracket_ne .and vtxWeightNum .and rbracket;\n" +"vtxWeightNum\n" +" integer;\n" +"fp_PARAM_statement\n" +" fp_PARAM_multipleStmt .or fp_PARAM_singleStmt;\n" +"vp_PARAM_statement\n" +" vp_PARAM_multipleStmt .or vp_PARAM_singleStmt;\n" +"fp_PARAM_singleStmt\n" +" \"PARAM\" .and space .and fp_establishName .and .true .emit 0x00 .and fp_paramSingleInit .and\n" +" .true .emit PARAM_NULL;\n" +"vp_PARAM_singleStmt\n" +" \"PARAM\" .and space .and vp_establishName .and .true .emit 0x00 .and vp_paramSingleInit .and\n" +" .true .emit PARAM_NULL;\n" +"fp_PARAM_multipleStmt\n" +" \"PARAM\" .and space .and fp_establishName .and lbracket_ne .and optArraySize .and rbracket .and\n" +" fp_paramMultipleInit .and .true .emit PARAM_NULL;\n" +"vp_PARAM_multipleStmt\n" +" \"PARAM\" .and space .and vp_establishName .and lbracket_ne .and optArraySize .and rbracket .and\n" +" vp_paramMultipleInit .and .true .emit PARAM_NULL;\n" +"optArraySize\n" +" optional_integer;\n" +"fp_paramSingleInit\n" +" equal .and fp_paramSingleItemDecl;\n" +"vp_paramSingleInit\n" +" equal .and vp_paramSingleItemDecl;\n" +"fp_paramMultipleInit\n" +" equal .and lbrace .and fp_paramMultInitList .and rbrace;\n" +"vp_paramMultipleInit\n" +" equal .and lbrace .and vp_paramMultInitList .and rbrace;\n" +"fp_paramMultInitList\n" +" fp_paramMultInitList_1 .or fp_paramMultipleItem;\n" +"vp_paramMultInitList\n" +" vp_paramMultInitList_1 .or vp_paramMultipleItem;\n" +"fp_paramMultInitList_1\n" +" fp_paramMultipleItem .and comma_ne .and fp_paramMultInitList;\n" +"vp_paramMultInitList_1\n" +" vp_paramMultipleItem .and comma_ne .and vp_paramMultInitList;\n" +"fp_paramSingleItemDecl\n" +" fp_stateSingleItem .emit PARAM_STATE_ELEMENT .or\n" +" programSingleItem .emit PARAM_PROGRAM_ELEMENT .or\n" +" paramConstDecl .emit PARAM_CONSTANT;\n" +"vp_paramSingleItemDecl\n" +" vp_stateSingleItem .emit PARAM_STATE_ELEMENT .or\n" +" programSingleItem .emit PARAM_PROGRAM_ELEMENT .or\n" +" paramConstDecl .emit PARAM_CONSTANT;\n" +"fp_paramSingleItemUse\n" +" fp_stateSingleItem .emit PARAM_STATE_ELEMENT .or\n" +" programSingleItem .emit PARAM_PROGRAM_ELEMENT .or\n" +" paramConstUse .emit PARAM_CONSTANT;\n" +"vp_paramSingleItemUse\n" +" vp_stateSingleItem .emit PARAM_STATE_ELEMENT .or\n" +" programSingleItem .emit PARAM_PROGRAM_ELEMENT .or\n" +" paramConstUse .emit PARAM_CONSTANT;\n" +"fp_paramMultipleItem\n" +" fp_stateMultipleItem .emit PARAM_STATE_ELEMENT .or\n" +" programMultipleItem .emit PARAM_PROGRAM_ELEMENT .or\n" +" paramConstDecl .emit PARAM_CONSTANT;\n" +"vp_paramMultipleItem\n" +" vp_stateMultipleItem .emit PARAM_STATE_ELEMENT .or\n" +" programMultipleItem .emit PARAM_PROGRAM_ELEMENT .or\n" +" paramConstDecl .emit PARAM_CONSTANT;\n" +"fp_stateMultipleItem\n" +" stateMultipleItem_1 .or fp_stateSingleItem;\n" +"vp_stateMultipleItem\n" +" stateMultipleItem_1 .or vp_stateSingleItem;\n" +"stateMultipleItem_1\n" +" \"state\" .and dot .and stateMatrixRows .emit STATE_MATRIX_ROWS;\n" +"fp_stateSingleItem\n" +" \"state\" .and dot .and fp_stateSingleItem_1 .error INVALID_STATE_PROPERTY;\n" +"vp_stateSingleItem\n" +" \"state\" .and dot .and vp_stateSingleItem_1 .error INVALID_STATE_PROPERTY;\n" +"fp_stateSingleItem_1\n" +" stateSingleItem_1 .or stateSingleItem_2 .or stateSingleItem_3 .or stateSingleItem_4 .or\n" +" stateSingleItem_5 .or stateSingleItem_7 .or stateSingleItem_8 .or stateSingleItem_11;\n" +"vp_stateSingleItem_1\n" +" stateSingleItem_1 .or stateSingleItem_2 .or stateSingleItem_3 .or stateSingleItem_4 .or\n" +" stateSingleItem_6 .or stateSingleItem_7 .or stateSingleItem_9 .or stateSingleItem_10 .or\n" +" stateSingleItem_11;\n" +"stateSingleItem_1\n" +" stateMaterialItem .emit STATE_MATERIAL;\n" +"stateSingleItem_2\n" +" stateLightItem .emit STATE_LIGHT;\n" +"stateSingleItem_3\n" +" stateLightModelItem .emit STATE_LIGHT_MODEL;\n" +"stateSingleItem_4\n" +" stateLightProdItem .emit STATE_LIGHT_PROD;\n" +"stateSingleItem_5\n" +" stateTexEnvItem .emit STATE_TEX_ENV;\n" +"stateSingleItem_6\n" +" stateTexGenItem .emit STATE_TEX_GEN;\n" +"stateSingleItem_7\n" +" stateFogItem .emit STATE_FOG;\n" +"stateSingleItem_8\n" +" stateDepthItem .emit STATE_DEPTH;\n" +"stateSingleItem_9\n" +" stateClipPlaneItem .emit STATE_CLIP_PLANE;\n" +"stateSingleItem_10\n" +" statePointItem .emit STATE_POINT;\n" +"stateSingleItem_11\n" +" stateMatrixRow .emit STATE_MATRIX_ROWS;\n" +"stateMaterialItem\n" +" \"material\" .and optFaceType .and dot .and stateMatProperty .error INVALID_MATERIAL_PROPERTY;\n" +"stateMatProperty\n" +" \"ambient\" .emit MATERIAL_AMBIENT .or\n" +" \"diffuse\" .emit MATERIAL_DIFFUSE .or\n" +" \"specular\" .emit MATERIAL_SPECULAR .or\n" +" \"emission\" .emit MATERIAL_EMISSION .or\n" +" \"shininess\" .emit MATERIAL_SHININESS;\n" +"stateLightItem\n" +" \"light\" .and lbracket .and stateLightNumber .and rbracket .and dot .and\n" +" stateLightProperty .error INVALID_LIGHT_PROPERTY;\n" +"stateLightProperty\n" +" \"ambient\" .emit LIGHT_AMBIENT .or\n" +" \"diffuse\" .emit LIGHT_DIFFUSE .or\n" +" \"specular\" .emit LIGHT_SPECULAR .or\n" +" \"position\" .emit LIGHT_POSITION .or\n" +" \"attenuation\" .emit LIGHT_ATTENUATION .or\n" +" stateLightProperty_1 .emit LIGHT_SPOT_DIRECTION .or\n" +" \"half\" .emit LIGHT_HALF;\n" +"stateLightProperty_1\n" +" \"spot\" .and dot .and stateSpotProperty .error INVALID_SPOT_PROPERTY;\n" +"stateSpotProperty\n" +" \"direction\";\n" +"stateLightModelItem\n" +" \"lightmodel\" .and stateLModProperty .error INVALID_LIGHTMODEL_PROPERTY;\n" +"stateLModProperty\n" +" stateLModProperty_1 .or stateLModProperty_2;\n" +"stateLModProperty_1\n" +" dot .and \"ambient\" .emit LIGHT_MODEL_AMBIENT;\n" +"stateLModProperty_2\n" +" optFaceType .and dot .and \"scenecolor\" .emit LIGHT_MODEL_SCENECOLOR;\n" +"stateLightProdItem\n" +" \"lightprod\" .and lbracket .and stateLightNumber .and rbracket .and optFaceType .and dot .and\n" +" stateLProdProperty .error INVALID_LIGHTPROD_PROPERTY;\n" +"stateLProdProperty\n" +" \"ambient\" .emit LIGHT_PROD_AMBIENT .or\n" +" \"diffuse\" .emit LIGHT_PROD_DIFFUSE .or\n" +" \"specular\" .emit LIGHT_PROD_SPECULAR;\n" +"stateLightNumber\n" +" integer;\n" +"stateTexEnvItem\n" +" \"texenv\" .and optLegacyTexUnitNum .and dot .and\n" +" stateTexEnvProperty .error INVALID_TEXENV_PROPERTY;\n" +"stateTexEnvProperty\n" +" \"color\" .emit TEX_ENV_COLOR;\n" +"optLegacyTexUnitNum\n" +" lbracket_ne .and legacyTexUnitNum .and rbracket;\n" +"legacyTexUnitNum\n" +" integer;\n" +"stateTexGenItem\n" +" \"texgen\" .and optTexCoordNum .and dot .and stateTexGenType .error INVALID_TEXGEN_PROPERTY .and\n" +" dot .and stateTexGenCoord .error INVALID_TEXGEN_COORD;\n" +"stateTexGenType\n" +" \"eye\" .emit TEX_GEN_EYE .or\n" +" \"object\" .emit TEX_GEN_OBJECT;\n" +"stateTexGenCoord\n" +" \"s\" .emit COMPONENT_X .or\n" +" \"t\" .emit COMPONENT_Y .or\n" +" \"r\" .emit COMPONENT_Z .or\n" +" \"q\" .emit COMPONENT_W;\n" +"stateFogItem\n" +" \"fog\" .and dot .and stateFogProperty .error INVALID_FOG_PROPERTY;\n" +"stateFogProperty\n" +" \"color\" .emit FOG_COLOR .or\n" +" \"params\" .emit FOG_PARAMS;\n" +"stateDepthItem\n" +" \"depth\" .and dot .and stateDepthProperty .error INVALID_DEPTH_PROPERTY;\n" +"stateDepthProperty\n" +" \"range\" .emit DEPTH_RANGE;\n" +"stateClipPlaneItem\n" +" \"clip\" .and lbracket .and stateClipPlaneNum .and rbracket .and dot .and\n" +" \"plane\" .error INVALID_CLIPPLANE_PROPERTY;\n" +"stateClipPlaneNum\n" +" integer;\n" +"statePointItem\n" +" \"point\" .and dot .and statePointProperty .error INVALID_POINT_PROPERTY;\n" +"statePointProperty\n" +" \"size\" .emit POINT_SIZE .or\n" +" \"attenuation\" .emit POINT_ATTENUATION;\n" +"stateMatrixRow\n" +" stateMatrixItem .and dot .and \"row\" .error MATRIX_ROW_SELECTOR_OR_MODIFIER_EXPECTED .and\n" +" lbracket .and stateMatrixRowNum .and rbracket .emit 0x0;\n" +"stateMatrixRows\n" +" stateMatrixItem .and optMatrixRows;\n" +"optMatrixRows\n" +" optMatrixRows_1 .or .true .emit 0x0 .emit '3' .emit 0x0 .emit $;\n" +"optMatrixRows_1\n" +" dot_ne .and \"row\" .error MATRIX_ROW_SELECTOR_OR_MODIFIER_EXPECTED .and lbracket .and\n" +" stateMatrixRowNum .and dotdot .and stateMatrixRowNum .and rbracket;\n" +"stateMatrixItem\n" +" \"matrix\" .and dot .and stateMatrixName .error INVALID_MATRIX_NAME .and stateOptMatModifier;\n" +"stateOptMatModifier\n" +" stateOptMatModifier_1 .or .true .emit MATRIX_MODIFIER_IDENTITY;\n" +"stateOptMatModifier_1\n" +" dot_ne .and stateMatModifier;\n" +"stateMatModifier\n" +" \"inverse\" .emit MATRIX_MODIFIER_INVERSE .or\n" +" \"transpose\" .emit MATRIX_MODIFIER_TRANSPOSE .or\n" +" \"invtrans\" .emit MATRIX_MODIFIER_INVTRANS;\n" +"stateMatrixRowNum\n" +" integer_0_3;\n" +"stateMatrixName\n" +" stateMatrixName_1_1 .emit MATRIX_MODELVIEW .or\n" +" \"projection\" .emit MATRIX_PROJECTION .or\n" +" \"mvp\" .emit MATRIX_MVP .or\n" +" stateMatrixName_1_2 .emit MATRIX_TEXTURE .or\n" +" stateMatrixName_1_3 .emit MATRIX_PALETTE .or\n" +" stateMatrixName_1_4 .emit MATRIX_PROGRAM;\n" +"stateMatrixName_1_1\n" +" \"modelview\" .and stateOptModMatNum;\n" +"stateMatrixName_1_2\n" +" \"texture\" .and optTexCoordNum;\n" +"stateMatrixName_1_3\n" +" \"palette\" .and lbracket .and statePaletteMatNum .and rbracket;\n" +"stateMatrixName_1_4\n" +" \"program\" .and lbracket .and stateProgramMatNum .and rbracket;\n" +"stateOptModMatNum\n" +" stateOptModMatNum_1 .or .true .emit 0x00;\n" +"stateOptModMatNum_1\n" +" lbracket_ne .and stateModMatNum .and rbracket;\n" +"stateModMatNum\n" +" integer;\n" +"optTexCoordNum\n" +" optTexCoordNum_1 .or .true .emit 0x00;\n" +"optTexCoordNum_1\n" +" lbracket_ne .and texCoordNum .and rbracket;\n" +"texCoordNum\n" +" integer;\n" +"statePaletteMatNum\n" +" integer;\n" +"stateProgramMatNum\n" +" integer;\n" +"programSingleItem\n" +" \"program\" .and dot .and programSingleItem_1 .error INVALID_PROGRAM_PROPERTY;\n" +"programSingleItem_1\n" +" progEnvParam .or progLocalParam;\n" +"programMultipleItem\n" +" \"program\" .and dot .and programMultipleItem_1 .error INVALID_PROGRAM_PROPERTY;\n" +"programMultipleItem_1\n" +" progEnvParams .or progLocalParams;\n" +"progEnvParams\n" +" \"env\" .emit PROGRAM_PARAM_ENV .and lbracket .and progEnvParamNums .and rbracket;\n" +"progEnvParamNums\n" +" progEnvParamNums_1 .or progEnvParamNums_2;\n" +"progEnvParamNums_1\n" +" progEnvParamNum .and dotdot_ne .and progEnvParamNum;\n" +"progEnvParamNums_2\n" +" progEnvParamNum .and .true .emit 0x00;\n" +"progEnvParam\n" +" \"env\" .emit PROGRAM_PARAM_ENV .and lbracket .and progEnvParamNum .and rbracket;\n" +"progLocalParams\n" +" \"local\" .emit PROGRAM_PARAM_LOCAL .and lbracket .and progLocalParamNums .and rbracket;\n" +"progLocalParamNums\n" +" progLocalParamNums_1 .or progLocalParamNums_2;\n" +"progLocalParamNums_1\n" +" progLocalParamNum .and dotdot_ne .and progLocalParamNum;\n" +"progLocalParamNums_2\n" +" progLocalParamNum .and .true .emit 0x00;\n" +"progLocalParam\n" +" \"local\" .emit PROGRAM_PARAM_LOCAL .and lbracket .and progLocalParamNum .and rbracket;\n" +"progEnvParamNum\n" +" integer;\n" +"progLocalParamNum\n" +" integer;\n" +"paramConstDecl\n" +" paramConstScalarDecl .emit CONSTANT_SCALAR .or paramConstVector .emit CONSTANT_VECTOR;\n" +"paramConstUse\n" +" paramConstScalarUse .emit CONSTANT_SCALAR .or paramConstVector .emit CONSTANT_VECTOR;\n" +"paramConstScalarDecl\n" +" signedFloatConstant;\n" +"paramConstScalarUse\n" +" floatConstant;\n" +"paramConstVector\n" +" paramConstVector_4 .emit 0x04 .or paramConstVector_3 .emit 0x03 .or\n" +" paramConstVector_2 .emit 0x02 .or paramConstVector_1 .emit 0x01;\n" +"paramConstVector_1\n" +" lbrace_ne .and signedFloatConstant .and rbrace;\n" +"paramConstVector_2\n" +" lbrace_ne .and signedFloatConstant .and comma_ne .and signedFloatConstant .and rbrace;\n" +"paramConstVector_3\n" +" lbrace_ne .and signedFloatConstant .and comma_ne .and signedFloatConstant .and comma_ne .and\n" +" signedFloatConstant .and rbrace;\n" +"paramConstVector_4\n" +" lbrace_ne .and signedFloatConstant .and comma_ne .and signedFloatConstant .and comma_ne .and\n" +" signedFloatConstant .and comma_ne .and signedFloatConstant .and rbrace;\n" +"signedFloatConstant\n" +" optionalSign .and floatConstant;\n" +"floatConstant\n" +" float;\n" +"optionalSign\n" +" optional_sign_ne;\n" +"fp_TEMP_statement\n" +" \"TEMP\" .and space .and fp_varNameList .and .true .emit 0x00;\n" +"vp_TEMP_statement\n" +" \"TEMP\" .and space .and vp_varNameList .and .true .emit 0x00;\n" +"ADDRESS_statement\n" +" \"ADDRESS\" .and space .and vp_varNameList .and .true .emit 0x00;\n" +"fp_varNameList\n" +" fp_varNameList_1 .or fp_establishName;\n" +"vp_varNameList\n" +" vp_varNameList_1 .or vp_establishName;\n" +"fp_varNameList_1\n" +" fp_establishName .and comma_ne .and fp_varNameList;\n" +"vp_varNameList_1\n" +" vp_establishName .and comma_ne .and vp_varNameList;\n" +"fp_OUTPUT_statement\n" +" \"OUTPUT\" .and space .and fp_establishName .and equal .and\n" +" fp_resultBinding .error RESULT_EXPECTED;\n" +"vp_OUTPUT_statement\n" +" \"OUTPUT\" .and space .and vp_establishName .and equal .and\n" +" vp_resultBinding .error RESULT_EXPECTED;\n" +"fp_resultBinding\n" +" \"result\" .and dot .and fp_resultBinding_1 .error INVALID_RESULT_PROPERTY;\n" +"vp_resultBinding\n" +" \"result\" .and dot .and vp_resultBinding_1 .error INVALID_RESULT_PROPERTY;\n" +"fp_resultBinding_1\n" +" \"color\" .emit FRAGMENT_RESULT_COLOR .or\n" +" \"depth\" .emit FRAGMENT_RESULT_DEPTH;\n" +"vp_resultBinding_1\n" +" \"position\" .emit VERTEX_RESULT_POSITION .or\n" +" resultColBinding .emit VERTEX_RESULT_COLOR .or\n" +" \"fogcoord\" .emit VERTEX_RESULT_FOGCOORD .or\n" +" \"pointsize\" .emit VERTEX_RESULT_POINTSIZE .or\n" +" vp_resultBinding_2 .emit VERTEX_RESULT_TEXCOORD;\n" +"vp_resultBinding_2\n" +" \"texcoord\" .and optTexCoordNum;\n" +"resultColBinding\n" +" \"color\" .and optFaceType .and optColorType;\n" +"optFaceType\n" +" FaceType .or .true .emit FACE_FRONT;\n" +"FaceType\n" +" dot_ne .and FaceProperty;\n" +"FaceProperty\n" +" \"front\" .emit FACE_FRONT .or \"back\" .emit FACE_BACK;\n" +"optColorType\n" +" ColorType .or .true .emit COLOR_PRIMARY;\n" +"ColorType\n" +" dot_ne .and ColorProperty .error INVALID_COLOR_PROPERTY;\n" +"ColorProperty\n" +" \"primary\" .emit COLOR_PRIMARY .or \"secondary\" .emit COLOR_SECONDARY;\n" +"fp_ALIAS_statement\n" +" \"ALIAS\" .and space .and fp_establishName .and equal .and fp_establishedName;\n" +"vp_ALIAS_statement\n" +" \"ALIAS\" .and space .and vp_establishName .and equal .and vp_establishedName;\n" +"fp_establishName\n" +" fp_identifier;\n" +"vp_establishName\n" +" vp_identifier;\n" +"fp_establishedName\n" +" fp_identifier;\n" +"vp_establishedName\n" +" vp_identifier;\n" +"fp_identifier\n" +" fp_not_reserved_identifier .and identifier_ne .error IDENTIFIER_EXPECTED;\n" +"vp_identifier\n" +" vp_not_reserved_identifier .and identifier_ne .error IDENTIFIER_EXPECTED;\n" +"fp_not_reserved_identifier\n" +" fp_not_reserved_identifier_1 .or .true;\n" +"fp_not_reserved_identifier_1\n" +" fp_reserved_identifier .and .false .error RESERVED_KEYWORD;\n" +"vp_not_reserved_identifier\n" +" vp_not_reserved_identifier_1 .or .true;\n" +"vp_not_reserved_identifier_1\n" +" vp_reserved_identifier .and .false .error RESERVED_KEYWORD;\n" +"fp_reserved_identifier\n" +" \"ABS\" .or \"ABS_SAT\" .or \"ADD\" .or \"ADD_SAT\" .or \"ALIAS\" .or \"ATTRIB\" .or \"CMP\" .or \"CMP_SAT\" .or\n" +" \"COS\" .or \"COS_SAT\" .or \"DP3\" .or \"DP3_SAT\" .or \"DP4\" .or \"DP4_SAT\" .or \"DPH\" .or \"DPH_SAT\" .or\n" +" \"DST\" .or \"DST_SAT\" .or \"END\" .or \"EX2\" .or \"EX2_SAT\" .or \"FLR\" .or \"FLR_SAT\" .or \"FRC\" .or\n" +" \"FRC_SAT\" .or \"KIL\" .or \"LG2\" .or \"LG2_SAT\" .or \"LIT\" .or \"LIT_SAT\" .or \"LRP\" .or \"LRP_SAT\" .or\n" +" \"MAD\" .or \"MAD_SAT\" .or \"MAX\" .or \"MAX_SAT\" .or \"MIN\" .or \"MIN_SAT\" .or \"MOV\" .or \"MOV_SAT\" .or\n" +" \"MUL\" .or \"MUL_SAT\" .or \"OPTION\" .or \"OUTPUT\" .or \"PARAM\" .or \"POW\" .or \"POW_SAT\" .or \"RCP\" .or\n" +" \"RCP_SAT\" .or \"RSQ\" .or \"RSQ_SAT\" .or \"SIN\" .or \"SIN_SAT\" .or \"SCS\" .or \"SCS_SAT\" .or \"SGE\" .or\n" +" \"SGE_SAT\" .or \"SLT\" .or \"SLT_SAT\" .or \"SUB\" .or \"SUB_SAT\" .or \"SWZ\" .or \"SWZ_SAT\" .or \"TEMP\" .or\n" +" \"TEX\" .or \"TEX_SAT\" .or \"TXB\" .or \"TXB_SAT\" .or \"TXP\" .or \"TXP_SAT\" .or \"XPD\" .or \"XPD_SAT\" .or\n" +" \"fragment\" .or \"program\" .or \"result\" .or \"state\" .or \"texture\";\n" +"vp_reserved_identifier\n" +" \"ABS\" .or \"ADD\" .or \"ADDRESS\" .or \"ALIAS\" .or \"ARL\" .or \"ATTRIB\" .or \"DP3\" .or \"DP4\" .or\n" +" \"DPH\" .or \"DST\" .or \"END\" .or \"EX2\" .or \"EXP\" .or \"FLR\" .or \"FRC\" .or \"LG2\" .or \"LIT\" .or\n" +" \"LOG\" .or \"MAD\" .or \"MAX\" .or \"MIN\" .or \"MOV\" .or \"MUL\" .or \"OPTION\" .or \"OUTPUT\" .or\n" +" \"PARAM\" .or \"POW\" .or \"RCP\" .or \"RSQ\" .or \"SGE\" .or \"SLT\" .or \"SUB\" .or \"SWZ\" .or \"TEMP\" .or\n" +" \"XPD\" .or \"program\" .or \"result\" .or \"state\" .or \"vertex\";\n" +"integer\n" +" integer_ne .error INTEGER_EXPECTED;\n" +"integer_0_3\n" +" integer;\n" +"integer_0_63\n" +" integer;\n" +"integer_0_64\n" +" integer;\n" +"optional_space\n" +" space .or .true;\n" +"space\n" +" single_space .and .loop single_space;\n" +"single_space\n" +" white_char .or comment_block;\n" +"white_char\n" +" ' ' .or '\\t' .or '\\n' .or '\\r';\n" +"comment_block\n" +" '#' .and .loop comment_char .and new_line;\n" +"comment_char\n" +" '\\x0E'-'\\xFF' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';\n" +"new_line\n" +" '\\n' .or crlf .or '\\0';\n" +"crlf\n" +" '\\r' .and '\\n';\n" +"semicolon\n" +" optional_space .and ';' .error MISSING_SEMICOLON .and optional_space;\n" +"comma\n" +" optional_space .and ',' .error MISSING_COMMA .and optional_space;\n" +"comma_ne\n" +" optional_space .and ',' .and optional_space;\n" +"lbracket\n" +" optional_space .and '[' .error MISSING_LBRACKET .and optional_space;\n" +"lbracket_ne\n" +" optional_space .and '[' .and optional_space;\n" +"rbracket\n" +" optional_space .and ']' .error MISSING_RBRACKET .and optional_space;\n" +"dot\n" +" optional_space .and '.' .error MISSING_DOT .and optional_space;\n" +"dot_ne\n" +" optional_space .and '.' .and optional_space;\n" +"equal\n" +" optional_space .and '=' .error MISSING_EQUAL .and optional_space;\n" +"lbrace\n" +" optional_space .and '{' .error MISSING_LBRACE .and optional_space;\n" +"lbrace_ne\n" +" optional_space .and '{' .and optional_space;\n" +"rbrace\n" +" optional_space .and '}' .error MISSING_RBRACE .and optional_space;\n" +"dotdot\n" +" optional_space .and '.' .and '.' .error MISSING_DOTDOT .and optional_space;\n" +"dotdot_ne\n" +" optional_space .and '.' .and '.' .and optional_space;\n" +"float\n" +" float_1 .or float_2;\n" +"float_1\n" +" '.' .emit 0x00 .and integer_ne .error MISSING_FRACTION_OR_EXPONENT .and optional_exponent;\n" +"float_2\n" +" integer_ne .and float_3 .error MISSING_DOT_OR_EXPONENT;\n" +"float_3\n" +" float_4 .or float_5;\n" +"float_4\n" +" '.' .and optional_integer .and optional_exponent;\n" +"float_5\n" +" exponent .emit 0x00;\n" +"integer_ne\n" +" integer_ne_1 .and .true .emit 0x00 .emit $;\n" +"integer_ne_1\n" +" digit10 .emit * .and .loop digit10 .emit *;\n" +"optional_integer\n" +" integer_ne .or .true .emit 0x00;\n" +"optional_exponent\n" +" exponent .or .true .emit '1' .emit 0x00 .emit $;\n" +"exponent\n" +" exponent_1 .and optional_sign_ne .and integer_ne .error EXPONENT_VALUE_EXPECTED;\n" +"exponent_1\n" +" 'e' .or 'E';\n" +"optional_sign_ne\n" +" minus_ne .or plus_ne .or .true;\n" +"plus_ne\n" +" optional_space .and '+' .and optional_space;\n" +"minus_ne\n" +" optional_space .and '-' .emit '-' .and optional_space;\n" +"identifier_ne\n" +" first_idchar .emit * .and .loop follow_idchar .emit * .and .true .emit 0x00 .emit $;\n" +"follow_idchar\n" +" first_idchar .or digit10;\n" +"first_idchar\n" +" 'a'-'z' .or 'A'-'Z' .or '_' .or '$';\n" +"digit10\n" +" '0'-'9';\n" +".string __string_filter;\n" +"__string_filter\n" +" .loop __identifier_char;\n" +"__identifier_char\n" +" 'a'-'z' .or 'A'-'Z' .or '_' .or '$' .or '0'-'9';\n" +"e_signature\n" +" e_signature_char .and .loop e_signature_char;\n" +"e_signature_char\n" +" '!' .or '.' .or 'A'-'Z' .or 'a'-'z' .or '0'-'9';\n" +"e_statement\n" +" .loop e_statement_not_term;\n" +"e_statement_not_term\n" +" '\\x3C'-'\\xFF' .or '\\x0E'-'\\x3A' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';\n" +"e_identifier\n" +" e_identifier_first .and .loop e_identifier_next;\n" +"e_identifier_first\n" +" 'a'-'z' .or 'A'-'Z' .or '_' .or '$';\n" +"e_identifier_next\n" +" e_identifier_first .or '0'-'9';\n" +"e_token\n" +" e_identifier .or e_token_number .or '[' .or ']' .or '.' .or '{' .or '}' .or '=' .or '+' .or\n" +" '-' .or ',' .or ';';\n" +"e_token_number\n" +" e_token_digit .and .loop e_token_digit;\n" +"e_token_digit\n" +" '0'-'9';\n" +"e_charordigit\n" +" 'A'-'Z' .or 'a'-'z' .or '0'-'9';\n" +""; diff --git a/src/mesa/main/arbprogram.c b/src/mesa/main/arbprogram.c index 8ebae9d7da7..56aa6152630 100644 --- a/src/mesa/main/arbprogram.c +++ b/src/mesa/main/arbprogram.c @@ -44,7 +44,7 @@ #include "nvvertprog.h" -void +void GLAPIENTRY _mesa_EnableVertexAttribArrayARB(GLuint index) { GET_CURRENT_CONTEXT(ctx); @@ -62,7 +62,7 @@ _mesa_EnableVertexAttribArrayARB(GLuint index) } -void +void GLAPIENTRY _mesa_DisableVertexAttribArrayARB(GLuint index) { GET_CURRENT_CONTEXT(ctx); @@ -80,7 +80,7 @@ _mesa_DisableVertexAttribArrayARB(GLuint index) } -void +void GLAPIENTRY _mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params) { GLfloat fparams[4]; @@ -99,7 +99,7 @@ _mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params) } -void +void GLAPIENTRY _mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params) { GET_CURRENT_CONTEXT(ctx); @@ -143,7 +143,7 @@ _mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params) } -void +void GLAPIENTRY _mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params) { GLfloat fparams[4]; @@ -162,7 +162,7 @@ _mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params) } -void +void GLAPIENTRY _mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer) { GET_CURRENT_CONTEXT(ctx); @@ -178,11 +178,11 @@ _mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer) return; } - *pointer = ctx->Array.VertexAttrib[index].Ptr;; + *pointer = (GLvoid *) ctx->Array.VertexAttrib[index].Ptr;; } -void +void GLAPIENTRY _mesa_ProgramStringARB(GLenum target, GLenum format, GLsizei len, const GLvoid *string) { @@ -215,7 +215,7 @@ _mesa_ProgramStringARB(GLenum target, GLenum format, GLsizei len, } -void +void GLAPIENTRY _mesa_ProgramEnvParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { @@ -224,7 +224,7 @@ _mesa_ProgramEnvParameter4dARB(GLenum target, GLuint index, } -void +void GLAPIENTRY _mesa_ProgramEnvParameter4dvARB(GLenum target, GLuint index, const GLdouble *params) { @@ -234,7 +234,7 @@ _mesa_ProgramEnvParameter4dvARB(GLenum target, GLuint index, } -void +void GLAPIENTRY _mesa_ProgramEnvParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { @@ -264,7 +264,7 @@ _mesa_ProgramEnvParameter4fARB(GLenum target, GLuint index, } -void +void GLAPIENTRY _mesa_ProgramEnvParameter4fvARB(GLenum target, GLuint index, const GLfloat *params) { @@ -273,7 +273,7 @@ _mesa_ProgramEnvParameter4fvARB(GLenum target, GLuint index, } -void +void GLAPIENTRY _mesa_GetProgramEnvParameterdvARB(GLenum target, GLuint index, GLdouble *params) { @@ -290,7 +290,7 @@ _mesa_GetProgramEnvParameterdvARB(GLenum target, GLuint index, } -void +void GLAPIENTRY _mesa_GetProgramEnvParameterfvARB(GLenum target, GLuint index, GLfloat *params) { @@ -325,7 +325,7 @@ _mesa_GetProgramEnvParameterfvARB(GLenum target, GLuint index, /** * Note, this function is also used by the GL_NV_fragment_program extension. */ -void +void GLAPIENTRY _mesa_ProgramLocalParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { @@ -367,7 +367,7 @@ _mesa_ProgramLocalParameter4fARB(GLenum target, GLuint index, /** * Note, this function is also used by the GL_NV_fragment_program extension. */ -void +void GLAPIENTRY _mesa_ProgramLocalParameter4fvARB(GLenum target, GLuint index, const GLfloat *params) { @@ -379,7 +379,7 @@ _mesa_ProgramLocalParameter4fvARB(GLenum target, GLuint index, /** * Note, this function is also used by the GL_NV_fragment_program extension. */ -void +void GLAPIENTRY _mesa_ProgramLocalParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) @@ -392,7 +392,7 @@ _mesa_ProgramLocalParameter4dARB(GLenum target, GLuint index, /** * Note, this function is also used by the GL_NV_fragment_program extension. */ -void +void GLAPIENTRY _mesa_ProgramLocalParameter4dvARB(GLenum target, GLuint index, const GLdouble *params) { @@ -405,7 +405,7 @@ _mesa_ProgramLocalParameter4dvARB(GLenum target, GLuint index, /** * Note, this function is also used by the GL_NV_fragment_program extension. */ -void +void GLAPIENTRY _mesa_GetProgramLocalParameterfvARB(GLenum target, GLuint index, GLfloat *params) { @@ -450,7 +450,7 @@ _mesa_GetProgramLocalParameterfvARB(GLenum target, GLuint index, /** * Note, this function is also used by the GL_NV_fragment_program extension. */ -void +void GLAPIENTRY _mesa_GetProgramLocalParameterdvARB(GLenum target, GLuint index, GLdouble *params) { @@ -463,7 +463,7 @@ _mesa_GetProgramLocalParameterdvARB(GLenum target, GLuint index, } -void +void GLAPIENTRY _mesa_GetProgramivARB(GLenum target, GLenum pname, GLint *params) { struct program *prog; @@ -670,7 +670,7 @@ _mesa_GetProgramivARB(GLenum target, GLenum pname, GLint *params) } -void +void GLAPIENTRY _mesa_GetProgramStringARB(GLenum target, GLenum pname, GLvoid *string) { struct program *prog; diff --git a/src/mesa/main/arbprogram.h b/src/mesa/main/arbprogram.h index 8bfb180bac1..e1b99ab686f 100644 --- a/src/mesa/main/arbprogram.h +++ b/src/mesa/main/arbprogram.h @@ -27,101 +27,101 @@ #define ARBPROGRAM_H -extern void +extern void GLAPIENTRY _mesa_EnableVertexAttribArrayARB(GLuint index); -extern void +extern void GLAPIENTRY _mesa_DisableVertexAttribArrayARB(GLuint index); -extern void +extern void GLAPIENTRY _mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params); -extern void +extern void GLAPIENTRY _mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params); -extern void +extern void GLAPIENTRY _mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params); -extern void +extern void GLAPIENTRY _mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer); -extern void +extern void GLAPIENTRY _mesa_ProgramStringARB(GLenum target, GLenum format, GLsizei len, const GLvoid *string); -extern void +extern void GLAPIENTRY _mesa_ProgramEnvParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -extern void +extern void GLAPIENTRY _mesa_ProgramEnvParameter4dvARB(GLenum target, GLuint index, const GLdouble *params); -extern void +extern void GLAPIENTRY _mesa_ProgramEnvParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern void +extern void GLAPIENTRY _mesa_ProgramEnvParameter4fvARB(GLenum target, GLuint index, const GLfloat *params); -extern void +extern void GLAPIENTRY _mesa_ProgramLocalParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -extern void +extern void GLAPIENTRY _mesa_ProgramLocalParameter4dvARB(GLenum target, GLuint index, const GLdouble *params); -extern void +extern void GLAPIENTRY _mesa_ProgramLocalParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern void +extern void GLAPIENTRY _mesa_ProgramLocalParameter4fvARB(GLenum target, GLuint index, const GLfloat *params); -extern void +extern void GLAPIENTRY _mesa_GetProgramEnvParameterdvARB(GLenum target, GLuint index, GLdouble *params); -extern void +extern void GLAPIENTRY _mesa_GetProgramEnvParameterfvARB(GLenum target, GLuint index, GLfloat *params); -extern void +extern void GLAPIENTRY _mesa_GetProgramLocalParameterdvARB(GLenum target, GLuint index, GLdouble *params); -extern void +extern void GLAPIENTRY _mesa_GetProgramLocalParameterfvARB(GLenum target, GLuint index, GLfloat *params); -extern void +extern void GLAPIENTRY _mesa_GetProgramivARB(GLenum target, GLenum pname, GLint *params); -extern void +extern void GLAPIENTRY _mesa_GetProgramStringARB(GLenum target, GLenum pname, GLvoid *string); diff --git a/src/mesa/main/arbvertparse.c b/src/mesa/main/arbvertparse.c index 74922692318..0df17f370af 100644 --- a/src/mesa/main/arbvertparse.c +++ b/src/mesa/main/arbvertparse.c @@ -22,6 +22,8 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#define DEBUG_VP 0 + /** * \file arbvertparse.c * ARB_vertex_program parser. @@ -38,6594 +40,171 @@ #include "nvvertparse.h" #include "nvvertprog.h" -#include "arbvertparse.h" - -/** - * Overview: - * - * This is a simple top-down predictive parser. In a nutshell, there are two key - * elements to a predictive parser. First, is the 'look ahead' symbol. This is simply - * the next token in the input stream. The other component is a stack of symbols. - * - * Given the grammar, we can derive a look ahead table. This is just a 2D array, - * where one axis is the non-terminal on top of the stack and the other axis is - * the look ahead. Each entry in the array is the production to apply when the pair - * of stack symbol & look ahead is encountered. If no production is listed at - * a given entry in the table, a parse error occurs if this combination - * is seen. - * - * Since we want to drive the parsing from a couple of huge tables, we have to - * save some information later on for processing (e.g. for code generation). - * For this, we explicitly recreate the parse tree representing the derivation. - * We can then make several passes over the parse tree to perform all additional - * processing, and we can be sure the the parse is valid. - * - * The stack is initialized by pushing the start symbol onto it. The look ahead - * symbol is initially the first token in the program string. - * - * If there is a non-terminal symbol on top of the stack, the look ahead table - * is consulted to find if a production exists for the top of the stack - * and the look ahead. - * - * When we find a matching production, we pop the non-terminal off the top of - * the stack (the LHS of the production), and push the tokens on the RHS of - * the production onto the stack. Note that we store a pointer to the parse_tree_node - * containing the LHS token on the stack. This way, we can setup the children in - * the parse tree as we apply the production. - * - * If there is a terminal symbol on top of the stack, we compare it with the - * look ahead symbol. If they match, or we don't care about the value of the - * terminal (e.g. we know its an integer, but don't necessairly care what - * integer), the terminal symbol is popped off the stack and the look ahead - * is advanced. - * - * There are a few special nasty cases of productions for which we make special - * cases. These aren't found in the production/look-ahead tables, but listed - * out explicitly. - * - * After the parse tree has been constructed, we make several recusive passes - * over it to perform various tasks. - * - * The first pass is made to clean up the state bindings. This is done in - * parse_tree_fold_bindings(). The goal is to reduce the big mess of a parse tree - * created by strings such as: - * - * result.color.secondary - * - * and roll them up into one token and fill out some information in a symbol table. - * In this case, the token at the root of the derivation becomes BINDING_TOKEN, - * and the token attribute is an index into the binding table where this state - * is held. - * - * The next two passes go about associating variables with BINDING_TOKENs. This - * takes care of the cases like: - * - * OUTPUT foo = result.color.secondary; - * - * by inserting the index in the binding table for result.color.secondary into - * the attr field in the identifier table where the 'foo' variable sits. - * The second such pass deals with setting up arrays of program parameters, - * while the first only deals with scalars. - * - * We then examine all the information on variables and state that we have - * gathered, and layout which 'register' each variable or bit-of-state should use. - * - * - * Finally, we make a recursive pass of the parse tree and generate opcodes - * for Mesa to interpret while executing the program. - * - * It should be noted that each input/stack token has two parts, an 'identifier' - * and an 'attribute'. The identifier tells what class the token is, e.g. INTEGER_TOKEN, - * or NT_PROGRAM_SINGLE_ITEM_TOKEN. For some tokens, e.g. INTEGER_TOKEN, ID_TOKEN, - * FLOAT_TOKEN, or BINDING_TOKEN, the attribute for the token is an index into a table - * giving various properties about the token. - * - */ - -/** - * Here are all of the structs used to hold parse state and symbol - * tables used. - * - * All strings which are not reserved words, floats, ints, or misc - * puncuation (ie .) are considered to be [potential] identifiers. - * When we encounter such a string while lex'ing, insert it into - * the id symbol table, shown below. - * - * Sometime later, we'll initialize the variable types for identifiers - * which really are variables. This gets shoved into the 'type' field. - * - * For variables, we'll need additional info (e.g. state it is bound to, - * variable we're aliased to, etc). This is stored in the 'attr' field. - * - For alias variables, the attr is the idx in the id table of - * the variable we are bound to. - * - For other variables, we need a whole mess of info. This can be - * found in the binding symbol table, below. In this case, the - * attr field is the idx into the binding table that describes us. - * - For uninitialized ids, attr is -1. - * - * The data field holds the string of the id. - * - * len is the number of identifiers in the table. - */ -typedef struct st_id_table -{ - GLint len; - GLint *type; - GLint *attr; - GLubyte **data; -} -id_table; - -/** - * For PARAM arrays, we need to record the contents for use when - * laying out registers and loading state. - * - * len is the number of arrays in the table. - * - * num_elements[i] is the number of items in array i. In other words, this - * is the number of registers it would require when allocating. - * - * data[i][n] is the state bound to element n in array i. It is an idx into - * the binding table - */ -typedef struct st_array_table -{ - GLint len; - GLint *num_elements; - GLint **data; -} -array_table; - -/** - * For holding all of the data used to describe an identifier, we have the catch - * all binding symbol table. - * - * len is the number of bound items; - * - * type[i] tells what we are binding too, e.g. ATTRIB_POSITION, FOG_COLOR, or CONSTANT - * - * offset[i] gives the matrix number for matrix bindings, e.g. MATRIXROWS_MODELVIEW. - * Alternativly, it gives the number of the first parameter for PROGRAM_ENV_* and - * PROGRAM_LOCAL_*. - * - * num_rows[i] gives the number of rows for multiple matrix rows, or the number - * of parameters in a env/local array. - * - * consts gives the 4-GLfloat constant value for bindings of type CONSTANT - * - * reg_num gives the register number which this binding is held in. - */ -typedef struct st_binding_table -{ - GLint len; - GLint *type; - GLint *offset; - GLint *row; - GLint *num_rows; - GLfloat **consts; - GLint *reg_num; -} -binding_table; - -/** - * Integers and floats are stored here. - */ -typedef struct st_int_table -{ - GLint len; - GLint *data; -} -int_table; - -typedef struct st_float_table -{ - GLint len; - GLdouble *data; -} -float_table; - -/** - * To avoid writing tons of mindless parser code, the parsing is driven by - * a few big tables of rules, plus a few special cases. However, this means - * that we have to do all of our analysis outside of the parsing step. - * - * So, the parser will contruct a parse tree describing the program string - * which we can then operate on to do things like code generation. - * - * This struct represents a node in the parse tree. - * - * If tok is a non-terminal token, tok_attr is not relevant. - * If tok is BINDING_TOKEN, tok_attr is the index into the binding table. - * if tok is INTEGER_TOKEN or FLOAT_TOKEN, tok_attr is the index in the integer/GLfloat table - * - * prod_applied is the production number applied to this token in the derivation of - * the program string. See arbvp_grammar.txt for a listing of the productions, and - * their numbers. - */ -typedef struct st_parse_tree_node -{ - GLint tok, tok_attr, is_terminal; - GLint prod_applied; - struct st_parse_tree_node *children[4]; -} -parse_tree_node; - -/** This stores tokens that we lex out - */ -typedef struct st_token_list -{ - GLint tok, tok_attr; - parse_tree_node *pt; - - struct st_token_list *next; -} -token_list; - -/** - * This holds all of the productions in the grammar. - * - * lhs is a non-terminal token, e.g. NT_PROGRAM_TOKEN. - * rhs is either NULL_TOKEN, another non-terminal token, or a terminal token. - * In some cases, we need the RHS to be a certain value, e.g. for the dst reg write masks. - * For this, key is used to specify the string. If we don't care about the key, just - * specify "". - * Int/floats are slightly different, "-1" specifies 'we don't care'. - * - * lhs is not very useful here, but is is convient for sanity sake when specifing productions. - */ -typedef struct st_prod_table -{ - GLint lhs; - GLint rhs[4]; - char *key[4]; -} -prod_table; - -/** - * This holds the look ahead table to drive the parser. We examine the token on - * the top of the stack, as well as the next token in the input stream (the look ahead). - * We then match this against the table, and apply the approprate production. If nothing - * matches, we have a parse error. - * - * Here, LHS is the (non-terminal) token to match against the top of the stack. - * - * la is the token to match against the look ahead. - * - * If la is ID_TOKEN, we have to match a given keyword (e.g. 'ambient'). This is specified in - * la_kw. - * - * prod_idx is the idx into the prod_table of the production that we are to apply if this - * rule matches. - */ -typedef struct st_look_ahead_table -{ - GLint lhs; - GLint la; - char *la_kw; - GLint prod_idx; -} -look_ahead_table; - -/** - * This is the general catch-all for the parse state - */ -typedef struct st_parse_state -{ - char *str; - GLint len; - - /* lex stuff ------ */ - GLint start_pos, curr_pos; - GLint curr_state; - /* ---------------- */ - - id_table idents; - int_table ints; - float_table floats; - binding_table binds; - array_table arrays; - - token_list *stack_head, *stack_free_list; - - parse_tree_node *pt_head; -} -parse_state; - -/* local prototypes */ -static GLint float_table_add(float_table * tab, const char *str, GLint start, - GLint end); -static GLint int_table_add(int_table * tab, const char *str, GLint start, - GLint end); -static GLint id_table_add(id_table * tab, const char *str, GLint start, - GLint end); -static void parse_tree_free_children(parse_tree_node * ptn); - -/** - * Here we have a ton of defined terms that we use to identify productions, - * terminals, and nonterminals. - */ - -/** - * Terminal tokens - */ -#define EOF_TOKEN 0 -#define ID_TOKEN 1 -#define ABS_TOKEN 2 -#define ADD_TOKEN 3 -#define ADDRESS_TOKEN 4 -#define ALIAS_TOKEN 5 -#define ARL_TOKEN 6 -#define ATTRIB_TOKEN 7 - -#define DP3_TOKEN 8 -#define DP4_TOKEN 9 -#define DPH_TOKEN 10 -#define DST_TOKEN 11 - -#define END_TOKEN 12 -#define EX2_TOKEN 13 -#define EXP_TOKEN 14 - -#define FLR_TOKEN 15 -#define FRC_TOKEN 16 - -#define LG2_TOKEN 17 -#define LIT_TOKEN 18 -#define LOG_TOKEN 19 - -#define MAD_TOKEN 20 -#define MAX_TOKEN 21 -#define MIN_TOKEN 22 -#define MOV_TOKEN 23 -#define MUL_TOKEN 24 - -#define OPTION_TOKEN 25 -#define OUTPUT_TOKEN 26 - -#define PARAM_TOKEN 27 -#define POW_TOKEN 28 - -#define RCP_TOKEN 29 -#define RSQ_TOKEN 30 - -#define SGE_TOKEN 31 -#define SLT_TOKEN 32 -#define SUB_TOKEN 33 -#define SWZ_TOKEN 34 - -#define TEMP_TOKEN 35 - -#define XPD_TOKEN 36 - -#define SEMICOLON_TOKEN 37 -#define COMMA_TOKEN 38 -#define PLUS_TOKEN 39 -#define MINUS_TOKEN 40 -#define PERIOD_TOKEN 41 -#define DOTDOT_TOKEN 42 -#define LBRACKET_TOKEN 43 -#define RBRACKET_TOKEN 44 -#define LBRACE_TOKEN 45 -#define RBRACE_TOKEN 46 -#define EQUAL_TOKEN 47 - -#define INTEGER_TOKEN 48 -#define FLOAT_TOKEN 49 - -#define PROGRAM_TOKEN 50 -#define RESULT_TOKEN 51 -#define STATE_TOKEN 52 -#define VERTEX_TOKEN 53 - -#define NULL_TOKEN 54 - -#define BINDING_TOKEN 55 - -/** - * Non-terminal tokens - */ -#define NT_PROGRAM_TOKEN 100 -#define NT_OPTION_SEQUENCE_TOKEN 101 -#define NT_OPTION_SEQUENCE2_TOKEN 102 -#define NT_OPTION_TOKEN 103 -#define NT_STATEMENT_SEQUENCE_TOKEN 104 -#define NT_STATEMENT_SEQUENCE2_TOKEN 105 -#define NT_STATEMENT_TOKEN 106 - -#define NT_INSTRUCTION_TOKEN 107 -#define NT_ARL_INSTRUCTION_TOKEN 108 -#define NT_VECTOROP_INSTRUCTION_TOKEN 109 -#define NT_VECTOROP_TOKEN 110 -#define NT_SCALAROP_INSTRUCTION_TOKEN 111 -#define NT_SCALAROP_TOKEN 112 -#define NT_BINSCOP_INSTRUCTION_TOKEN 113 -#define NT_BINSCOP_INSTRUCTION2_TOKEN 114 -#define NT_BINSCOP_TOKEN 115 -#define NT_BINOP_INSTRUCTION_TOKEN 116 -#define NT_BINOP_INSTRUCTION2_TOKEN 117 -#define NT_BINOP_TOKEN 118 -#define NT_TRIOP_INSTRUCTION_TOKEN 119 -#define NT_TRIOP_INSTRUCTION2_TOKEN 120 -#define NT_TRIOP_INSTRUCTION3_TOKEN 121 -#define NT_TRIOP_TOKEN 122 -#define NT_SWZ_INSTRUCTION_TOKEN 123 -#define NT_SWZ_INSTRUCTION2_TOKEN 124 - -#define NT_SCALAR_SRC_REG_TOKEN 130 -#define NT_SWIZZLE_SRC_REG_TOKEN 131 -#define NT_MASKED_DST_REG_TOKEN 132 -#define NT_MASKED_ADDR_REG_TOKEN 133 -#define NT_EXTENDED_SWIZZLE_TOKEN 134 -#define NT_EXTENDED_SWIZZLE2_TOKEN 135 -#define NT_EXT_SWIZ_COMP_TOKEN 136 -#define NT_EXT_SWIZ_SEL_TOKEN 137 -#define NT_SRC_REG_TOKEN 138 -#define NT_DST_REG_TOKEN 139 -#define NT_VERTEX_ATTRIB_REG_TOKEN 140 - -#define NT_TEMPORARY_REG_TOKEN 150 -#define NT_PROG_PARAM_REG_TOKEN 151 -#define NT_PROG_PARAM_SINGLE_TOKEN 152 -#define NT_PROG_PARAM_ARRAY_TOKEN 153 -#define NT_PROG_PARAM_ARRAY_MEM_TOKEN 154 -#define NT_PROG_PARAM_ARRAY_ABS_TOKEN 155 -#define NT_PROG_PARAM_ARRAY_REL_TOKEN 156 - -#define NT_ADDR_REG_REL_OFFSET_TOKEN 157 -#define NT_ADDR_REG_POS_OFFSET_TOKEN 158 -#define NT_ADDR_REG_NEG_OFFSET_TOKEN 159 - -#define NT_VERTEX_RESULT_REG_TOKEN 160 -#define NT_ADDR_REG_TOKEN 161 -#define NT_ADDR_COMPONENT_TOKEN 162 -#define NT_ADDR_WRITE_MASK_TOKEN 163 -#define NT_SCALAR_SUFFIX_TOKEN 164 -#define NT_SWIZZLE_SUFFIX_TOKEN 165 - -#define NT_COMPONENT_TOKEN 166 -#define NT_OPTIONAL_MASK_TOKEN 167 -#define NT_OPTIONAL_MASK2_TOKEN 168 -#define NT_NAMING_STATEMENT_TOKEN 169 - -#define NT_ATTRIB_STATEMENT_TOKEN 170 -#define NT_VTX_ATTRIB_BINDING_TOKEN 171 -#define NT_VTX_ATTRIB_ITEM_TOKEN 172 -#define NT_VTX_ATTRIB_NUM_TOKEN 173 -#define NT_VTX_OPT_WEIGHT_NUM_TOKEN 174 -#define NT_VTX_WEIGHT_NUM_TOKEN 175 -#define NT_PARAM_STATEMENT_TOKEN 176 -#define NT_PARAM_STATEMENT2_TOKEN 177 -#define NT_OPT_ARRAY_SIZE_TOKEN 178 -#define NT_PARAM_SINGLE_INIT_TOKEN 179 -#define NT_PARAM_MULTIPLE_INIT_TOKEN 180 -#define NT_PARAM_MULT_INIT_LIST_TOKEN 181 -#define NT_PARAM_MULT_INIT_LIST2_TOKEN 182 -#define NT_PARAM_SINGLE_ITEM_DECL_TOKEN 183 -#define NT_PARAM_SINGLE_ITEM_USE_TOKEN 184 -#define NT_PARAM_MULTIPLE_ITEM_TOKEN 185 -#define NT_STATE_MULTIPLE_ITEM_TOKEN 186 -#define NT_STATE_MULTIPLE_ITEM2_TOKEN 187 -#define NT_FOO_TOKEN 188 -#define NT_FOO2_TOKEN 189 -#define NT_FOO3_TOKEN 190 -#define NT_FOO35_TOKEN 191 -#define NT_FOO4_TOKEN 192 -#define NT_STATE_SINGLE_ITEM_TOKEN 193 -#define NT_STATE_SINGLE_ITEM2_TOKEN 194 -#define NT_STATE_MATERIAL_ITEM_TOKEN 195 -#define NT_STATE_MATERIAL_ITEM2_TOKEN 196 -#define NT_STATE_MAT_PROPERTY_TOKEN 197 -#define NT_STATE_LIGHT_ITEM_TOKEN 198 -#define NT_STATE_LIGHT_ITEM2_TOKEN 199 -#define NT_STATE_LIGHT_PROPERTY_TOKEN 200 -#define NT_STATE_SPOT_PROPERTY_TOKEN 201 -#define NT_STATE_LIGHT_MODEL_ITEM_TOKEN 202 -#define NT_STATE_LMOD_PROPERTY_TOKEN 203 -#define NT_STATE_LMOD_PROPERTY2_TOKEN 204 - -#define NT_STATE_LIGHT_PROD_ITEM_TOKEN 207 -#define NT_STATE_LIGHT_PROD_ITEM15_TOKEN 208 -#define NT_STATE_LIGHT_PROD_ITEM2_TOKEN 209 -#define NT_STATE_LPROD_PROPERTY_TOKEN 210 -#define NT_STATE_LIGHT_NUMBER_TOKEN 211 -#define NT_STATE_TEX_GEN_ITEM_TOKEN 212 -#define NT_STATE_TEX_GEN_ITEM2_TOKEN 213 -#define NT_STATE_TEX_GEN_TYPE_TOKEN 214 -#define NT_STATE_TEX_GEN_COORD_TOKEN 215 -#define NT_STATE_FOG_ITEM_TOKEN 216 -#define NT_STATE_FOG_PROPERTY_TOKEN 217 - -#define NT_STATE_CLIP_PLANE_ITEM_TOKEN 218 -#define NT_STATE_CLIP_PLANE_ITEM2_TOKEN 219 -#define NT_STATE_CLIP_PLANE_NUM_TOKEN 220 -#define NT_STATE_POINT_ITEM_TOKEN 221 -#define NT_STATE_POINT_PROPERTY_TOKEN 222 -#define NT_STATE_MATRIX_ROW_TOKEN 223 -#define NT_STATE_MATRIX_ROW15_TOKEN 224 -#define NT_STATE_MATRIX_ROW2_TOKEN 225 -#define NT_STATE_MATRIX_ROW3_TOKEN 226 -#define NT_STATE_MAT_MODIFIER_TOKEN 227 -#define NT_STATE_MATRIX_ROW_NUM_TOKEN 228 -#define NT_STATE_MATRIX_NAME_TOKEN 229 -#define NT_STATE_OPT_MOD_MAT_NUM_TOKEN 230 -#define NT_STATE_MOD_MAT_NUM_TOKEN 231 -#define NT_STATE_PALETTE_MAT_NUM_TOKEN 232 -#define NT_STATE_PROGRAM_MAT_NUM_TOKEN 233 - -#define NT_PROGRAM_SINGLE_ITEM_TOKEN 234 -#define NT_PROGRAM_SINGLE_ITEM2_TOKEN 235 -#define NT_PROGRAM_MULTIPLE_ITEM_TOKEN 236 -#define NT_PROGRAM_MULTIPLE_ITEM2_TOKEN 237 -#define NT_PROG_ENV_PARAMS_TOKEN 238 -#define NT_PROG_ENV_PARAM_NUMS_TOKEN 239 -#define NT_PROG_ENV_PARAM_NUMS2_TOKEN 240 -#define NT_PROG_ENV_PARAM_TOKEN 250 -#define NT_PROG_LOCAL_PARAMS_TOKEN 251 -#define NT_PROG_LOCAL_PARAM_NUMS_TOKEN 252 -#define NT_PROG_LOCAL_PARAM_NUMS2_TOKEN 253 -#define NT_PROG_LOCAL_PARAM_TOKEN 254 -#define NT_PROG_ENV_PARAM_NUM_TOKEN 255 -#define NT_PROG_LOCAL_PARAM_NUM_TOKEN 256 - -#define NT_PARAM_CONST_DECL_TOKEN 257 -#define NT_PARAM_CONST_USE_TOKEN 258 -#define NT_PARAM_CONST_SCALAR_DECL_TOKEN 259 -#define NT_PARAM_CONST_SCALAR_USE_TOKEN 260 -#define NT_PARAM_CONST_VECTOR_TOKEN 261 -#define NT_PARAM_CONST_VECTOR2_TOKEN 262 -#define NT_PARAM_CONST_VECTOR3_TOKEN 263 -#define NT_PARAM_CONST_VECTOR4_TOKEN 264 - -#define NT_SIGNED_FLOAT_CONSTANT_TOKEN 265 -#define NT_FLOAT_CONSTANT_TOKEN 266 -#define NT_OPTIONAL_SIGN_TOKEN 267 - -#define NT_TEMP_STATEMENT_TOKEN 268 -#define NT_ADDRESS_STATEMENT_TOKEN 269 -#define NT_VAR_NAME_LIST_TOKEN 270 -#define NT_OUTPUT_STATEMENT_TOKEN 271 -#define NT_RESULT_BINDING_TOKEN 272 -#define NT_RESULT_BINDING2_TOKEN 273 -#define NT_RESULT_COL_BINDING_TOKEN 274 -#define NT_RESULT_COL_BINDING2_TOKEN 275 -#define NT_RESULT_COL_BINDING3_TOKEN 276 -#define NT_RESULT_COL_BINDING4_TOKEN 277 -#define NT_RESULT_COL_BINDING5_TOKEN 278 - -#define NT_OPT_FACE_TYPE2_TOKEN 279 -#define NT_OPT_COLOR_TYPE_TOKEN 280 -#define NT_OPT_COLOR_TYPE2_TOKEN 281 -#define NT_OPT_TEX_COORD_NUM_TOKEN 282 -#define NT_TEX_COORD_NUM_TOKEN 283 - -#define NT_ALIAS_STATEMENT_TOKEN 284 -#define NT_ESTABLISH_NAME_TOKEN 285 -#define NT_ESTABLISHED_NAME_TOKEN 286 - -#define NT_SWIZZLE_SUFFIX2_TOKEN 287 -#define NT_COMPONENT4_TOKEN 288 - -/** - * FSA States for lex - * - * XXX: These can be turned into enums - */ -#define STATE_BASE 0 -#define STATE_IDENT 1 - -#define STATE_A 2 -#define STATE_AB 3 -#define STATE_ABS 4 -#define STATE_AD 5 -#define STATE_ADD 6 -#define STATE_ADDR 7 -#define STATE_ADDRE 8 -#define STATE_ADDRES 9 -#define STATE_ADDRESS 10 -#define STATE_AL 11 -#define STATE_ALI 12 -#define STATE_ALIA 13 -#define STATE_ALIAS 14 -#define STATE_AR 15 -#define STATE_ARL 16 -#define STATE_AT 17 -#define STATE_ATT 18 -#define STATE_ATTR 19 -#define STATE_ATTRI 20 -#define STATE_ATTRIB 21 - -#define STATE_D 22 -#define STATE_DP 23 -#define STATE_DP3 24 -#define STATE_DP4 25 -#define STATE_DPH 26 -#define STATE_DS 27 -#define STATE_DST 28 - -#define STATE_E 29 -#define STATE_EN 30 -#define STATE_END 31 -#define STATE_EX 32 -#define STATE_EX2 33 -#define STATE_EXP 34 - -#define STATE_F 35 -#define STATE_FL 36 -#define STATE_FLR 37 -#define STATE_FR 38 -#define STATE_FRC 39 - -#define STATE_L 40 -#define STATE_LG 41 -#define STATE_LG2 42 -#define STATE_LI 43 -#define STATE_LIT 44 -#define STATE_LO 45 -#define STATE_LOG 46 - -#define STATE_M 47 -#define STATE_MA 48 -#define STATE_MAD 49 -#define STATE_MAX 50 -#define STATE_MI 51 -#define STATE_MIN 52 -#define STATE_MO 53 -#define STATE_MOV 54 -#define STATE_MU 55 -#define STATE_MUL 56 - -#define STATE_O 57 -#define STATE_OP 58 -#define STATE_OPT 59 -#define STATE_OPTI 60 -#define STATE_OPTIO 61 -#define STATE_OPTION 62 -#define STATE_OU 63 -#define STATE_OUT 64 -#define STATE_OUTP 65 -#define STATE_OUTPU 66 -#define STATE_OUTPUT 67 - -#define STATE_P 68 -#define STATE_PA 69 -#define STATE_PAR 70 -#define STATE_PARA 71 -#define STATE_PARAM 72 -#define STATE_PO 73 -#define STATE_POW 74 - -#define STATE_R 75 -#define STATE_RC 76 -#define STATE_RCP 77 -#define STATE_RS 78 -#define STATE_RSQ 79 - -#define STATE_S 80 -#define STATE_SG 81 -#define STATE_SGE 82 -#define STATE_SL 83 -#define STATE_SLT 84 -#define STATE_SU 85 -#define STATE_SUB 86 -#define STATE_SW 87 -#define STATE_SWZ 88 - -#define STATE_T 89 -#define STATE_TE 90 -#define STATE_TEM 91 -#define STATE_TEMP 92 - -#define STATE_X 93 -#define STATE_XP 94 -#define STATE_XPD 95 - -#define STATE_N1 96 -#define STATE_N2 97 -#define STATE_N3 98 -#define STATE_N4 99 -#define STATE_N5 100 -#define STATE_N6 101 -#define STATE_N7 102 - -#define STATE_COMMENT 103 - -/* LC == lower case, as in 'program' */ -#define STATE_LC_P 104 -#define STATE_LC_PR 105 -#define STATE_LC_PRO 106 -#define STATE_LC_PROG 107 -#define STATE_LC_PROGR 108 -#define STATE_LC_PROGRA 109 - -#define STATE_LC_R 110 -#define STATE_LC_RE 111 -#define STATE_LC_RES 112 -#define STATE_LC_RESU 113 -#define STATE_LC_RESUL 114 -#define STATE_LC_RESULT 115 - -#define STATE_LC_S 116 -#define STATE_LC_ST 117 -#define STATE_LC_STA 118 -#define STATE_LC_STAT 119 -#define STATE_LC_STATE 120 - -#define STATE_LC_V 121 -#define STATE_LC_VE 122 -#define STATE_LC_VER 123 -#define STATE_LC_VERT 124 -#define STATE_LC_VERTE 125 -#define STATE_LC_VERTEX 126 -#define STATE_LC_PROGRAM 127 - -/** - * Error codes - */ -#define ARB_VP_ERROR -1 -#define ARB_VP_SUCESS 0 - -/** - * Variable types - */ -#define TYPE_NONE 0 -#define TYPE_ATTRIB 1 -#define TYPE_PARAM 2 -#define TYPE_PARAM_SINGLE 3 -#define TYPE_PARAM_ARRAY 4 -#define TYPE_TEMP 5 -#define TYPE_ADDRESS 6 -#define TYPE_OUTPUT 7 -#define TYPE_ALIAS 8 - -/** - * Vertex Attrib Bindings - */ -#define ATTRIB_POSITION 1 -#define ATTRIB_WEIGHT 2 -#define ATTRIB_NORMAL 3 -#define ATTRIB_COLOR_PRIMARY 4 -#define ATTRIB_COLOR_SECONDARY 5 -#define ATTRIB_FOGCOORD 6 -#define ATTRIB_TEXCOORD 7 -#define ATTRIB_MATRIXINDEX 8 -#define ATTRIB_ATTRIB 9 - -/** - * Result Bindings - */ -#define RESULT_POSITION 10 -#define RESULT_FOGCOORD 11 -#define RESULT_POINTSIZE 12 -#define RESULT_COLOR_FRONT_PRIMARY 13 -#define RESULT_COLOR_FRONT_SECONDARY 14 -#define RESULT_COLOR_BACK_PRIMARY 15 -#define RESULT_COLOR_BACK_SECONDARY 16 -#define RESULT_TEXCOORD 17 - -/** - * Material Property Bindings - */ -#define MATERIAL_FRONT_AMBIENT 18 -#define MATERIAL_FRONT_DIFFUSE 19 -#define MATERIAL_FRONT_SPECULAR 20 -#define MATERIAL_FRONT_EMISSION 21 -#define MATERIAL_FRONT_SHININESS 22 -#define MATERIAL_BACK_AMBIENT 23 -#define MATERIAL_BACK_DIFFUSE 24 -#define MATERIAL_BACK_SPECULAR 25 -#define MATERIAL_BACK_EMISSION 26 -#define MATERIAL_BACK_SHININESS 27 - -/** - * Light Property Bindings - */ -#define LIGHT_AMBIENT 28 -#define LIGHT_DIFFUSE 29 -#define LIGHT_SPECULAR 30 -#define LIGHT_POSITION 31 -#define LIGHT_ATTENUATION 32 -#define LIGHT_SPOT_DIRECTION 33 -#define LIGHT_HALF 34 -#define LIGHTMODEL_AMBIENT 35 -#define LIGHTMODEL_FRONT_SCENECOLOR 36 -#define LIGHTMODEL_BACK_SCENECOLOR 37 -#define LIGHTPROD_FRONT_AMBIENT 38 -#define LIGHTPROD_FRONT_DIFFUSE 39 -#define LIGHTPROD_FRONT_SPECULAR 40 -#define LIGHTPROD_BACK_AMBIENT 41 -#define LIGHTPROD_BACK_DIFFUSE 42 -#define LIGHTPROD_BACK_SPECULAR 43 - -/** - * Texgen Property Bindings - */ -#define TEXGEN_EYE_S 44 -#define TEXGEN_EYE_T 45 -#define TEXGEN_EYE_R 46 -#define TEXGEN_EYE_Q 47 -#define TEXGEN_OBJECT_S 48 -#define TEXGEN_OBJECT_T 49 -#define TEXGEN_OBJECT_R 50 -#define TEXGEN_OBJECT_Q 51 - -/** - * Fog Property Bindings - */ -#define FOG_COLOR 52 -#define FOG_PARAMS 53 - -/** - * Clip Property Bindings - */ -#define CLIP_PLANE 54 - -/** - * Point Property Bindings - */ -#define POINT_SIZE 55 -#define POINT_ATTENUATION 56 - -/** - * Matrix Row Property Bindings - */ -#define MATRIXROW_MODELVIEW 57 -#define MATRIXROW_MODELVIEW_INVERSE 58 -#define MATRIXROW_MODELVIEW_INVTRANS 59 -#define MATRIXROW_MODELVIEW_TRANSPOSE 60 -#define MATRIXROW_PROJECTION 61 -#define MATRIXROW_PROJECTION_INVERSE 62 -#define MATRIXROW_PROJECTION_INVTRANS 63 -#define MATRIXROW_PROJECTION_TRANSPOSE 64 -#define MATRIXROW_MVP 65 -#define MATRIXROW_MVP_INVERSE 66 -#define MATRIXROW_MVP_INVTRANS 67 -#define MATRIXROW_MVP_TRANSPOSE 68 -#define MATRIXROW_TEXTURE 69 -#define MATRIXROW_TEXTURE_INVERSE 70 -#define MATRIXROW_TEXTURE_INVTRANS 71 -#define MATRIXROW_TEXTURE_TRANSPOSE 72 -#define MATRIXROW_PALETTE 73 -#define MATRIXROW_PALETTE_INVERSE 74 -#define MATRIXROW_PALETTE_INVTRANS 75 -#define MATRIXROW_PALETTE_TRANSPOSE 76 -#define MATRIXROW_PROGRAM 77 -#define MATRIXROW_PROGRAM_INVERSE 78 -#define MATRIXROW_PROGRAM_INVTRANS 79 -#define MATRIXROW_PROGRAM_TRANSPOSE 80 - -#define MATRIXROWS_MODELVIEW 81 -#define MATRIXROWS_MODELVIEW_INVERSE 82 -#define MATRIXROWS_MODELVIEW_INVTRANS 83 -#define MATRIXROWS_MODELVIEW_TRANSPOSE 84 -#define MATRIXROWS_PROJECTION 85 -#define MATRIXROWS_PROJECTION_INVERSE 86 -#define MATRIXROWS_PROJECTION_INVTRANS 87 -#define MATRIXROWS_PROJECTION_TRANSPOSE 88 -#define MATRIXROWS_MVP 89 -#define MATRIXROWS_MVP_INVERSE 90 -#define MATRIXROWS_MVP_INVTRANS 91 -#define MATRIXROWS_MVP_TRANSPOSE 92 -#define MATRIXROWS_TEXTURE 93 -#define MATRIXROWS_TEXTURE_INVERSE 94 -#define MATRIXROWS_TEXTURE_INVTRANS 95 -#define MATRIXROWS_TEXTURE_TRANSPOSE 96 -#define MATRIXROWS_PALETTE 97 -#define MATRIXROWS_PALETTE_INVERSE 98 -#define MATRIXROWS_PALETTE_INVTRANS 99 -#define MATRIXROWS_PALETTE_TRANSPOSE 100 -#define MATRIXROWS_PROGRAM 101 -#define MATRIXROWS_PROGRAM_INVERSE 102 -#define MATRIXROWS_PROGRAM_INVTRANS 103 -#define MATRIXROWS_PROGRAM_TRANSPOSE 104 - -#define PROGRAM_ENV_SINGLE 105 -#define PROGRAM_LOCAL_SINGLE 106 -#define PROGRAM_ENV_MULTI 107 -#define PROGRAM_LOCAL_MULTI 108 - -#define CONSTANT 109 - - - - -#define IS_WHITESPACE(c) (c == ' ') || (c == '\t') || (c == '\n') -#define IS_IDCHAR(c) ((c >= 'A') && (c <= 'Z')) || \ - ((c >= 'a') && (c <= 'z')) || \ - (c == '_') || (c == '$') -#define IS_DIGIT(c) (c >= '0') && (c <= '9') -#define IS_CD(c) (IS_DIGIT(c)) || (IS_IDCHAR(c)) - -#define ADV_TO_STATE(state) s->curr_state = state; s->curr_pos++; - -#define ADV_OR_FALLBACK(c, state) if (curr == c) { \ - ADV_TO_STATE(state); \ - } else {\ - if (IS_CD(curr)) { \ - ADV_TO_STATE(STATE_IDENT); \ - } else \ - s->curr_state = 1;\ - } - -#define FINISH(tok) *token = tok; s->start_pos = s->curr_pos; s->curr_state = STATE_BASE; return ARB_VP_SUCESS; -#define ADV_AND_FINISH(tok) *token = tok; s->start_pos = s->curr_pos+1; s->curr_pos++; \ - s->curr_state = STATE_BASE; return ARB_VP_SUCESS; - -#define FINISH_OR_FALLBACK(tok) if (IS_CD(curr)) {\ - ADV_TO_STATE(STATE_IDENT); \ - } else { \ - FINISH(tok)\ - } - -#define NO_KW {"", "", "", ""} -#define NULL2 NULL_TOKEN, NULL_TOKEN -#define NULL3 NULL_TOKEN, NULL2 -#define NULL4 NULL2, NULL2 - -/* This uglyness is the production table. See the prod_table struct definition for a description */ -prod_table ptab[] = { - {NT_PROGRAM_TOKEN, - {NT_OPTION_SEQUENCE_TOKEN, NT_STATEMENT_SEQUENCE_TOKEN, END_TOKEN, NULL_TOKEN}, NO_KW}, - {NT_OPTION_SEQUENCE_TOKEN, {NT_OPTION_SEQUENCE2_TOKEN, NULL3}, NO_KW}, - {NT_OPTION_SEQUENCE2_TOKEN, {NT_OPTION_TOKEN, NT_OPTION_SEQUENCE2_TOKEN, NULL2}, NO_KW}, - {NT_OPTION_SEQUENCE2_TOKEN, {NULL4}, NO_KW}, - {NT_OPTION_TOKEN, {OPTION_TOKEN, ID_TOKEN, SEMICOLON_TOKEN, NULL_TOKEN}, NO_KW}, - - - /* 5: */ - {NT_STATEMENT_SEQUENCE_TOKEN, {NT_STATEMENT_SEQUENCE2_TOKEN, NULL3}, NO_KW}, - {NT_STATEMENT_SEQUENCE2_TOKEN, {NT_STATEMENT_TOKEN, NT_STATEMENT_SEQUENCE2_TOKEN, NULL2}, NO_KW}, - {NT_STATEMENT_SEQUENCE2_TOKEN, {NULL4}, NO_KW}, - {NT_STATEMENT_TOKEN, {NT_INSTRUCTION_TOKEN, SEMICOLON_TOKEN, NULL2}, NO_KW}, - {NT_STATEMENT_TOKEN, {NT_NAMING_STATEMENT_TOKEN, SEMICOLON_TOKEN, NULL2}, NO_KW}, - - /* 10: */ - {NT_INSTRUCTION_TOKEN, {NT_ARL_INSTRUCTION_TOKEN, NULL3}, NO_KW}, - {NT_INSTRUCTION_TOKEN, {NT_VECTOROP_INSTRUCTION_TOKEN, NULL3}, NO_KW}, - {NT_INSTRUCTION_TOKEN, {NT_SCALAROP_INSTRUCTION_TOKEN, NULL3}, NO_KW}, - {NT_INSTRUCTION_TOKEN, {NT_BINSCOP_INSTRUCTION_TOKEN, NULL3}, NO_KW}, - {NT_INSTRUCTION_TOKEN, {NT_BINOP_INSTRUCTION_TOKEN, NULL3}, NO_KW}, - - /* 15: */ - {NT_INSTRUCTION_TOKEN, {NT_TRIOP_INSTRUCTION_TOKEN, NULL3}, NO_KW}, - {NT_INSTRUCTION_TOKEN, {NT_SWZ_INSTRUCTION_TOKEN, NULL3}, NO_KW}, - {NT_ARL_INSTRUCTION_TOKEN, {ARL_TOKEN, NT_MASKED_ADDR_REG_TOKEN, - COMMA_TOKEN, NT_SCALAR_SRC_REG_TOKEN}, NO_KW}, - {NT_VECTOROP_INSTRUCTION_TOKEN, {NT_VECTOROP_TOKEN, NT_MASKED_DST_REG_TOKEN, COMMA_TOKEN, - NT_SWIZZLE_SRC_REG_TOKEN}, NO_KW}, - {NT_VECTOROP_TOKEN, {ABS_TOKEN, NULL3}, NO_KW}, - - /* 20: */ - {NT_VECTOROP_TOKEN, {FLR_TOKEN, NULL3}, NO_KW}, - {NT_VECTOROP_TOKEN, {FRC_TOKEN, NULL3}, NO_KW}, - {NT_VECTOROP_TOKEN, {LIT_TOKEN, NULL3}, NO_KW}, - {NT_VECTOROP_TOKEN, {MOV_TOKEN, NULL3}, NO_KW}, - {NT_SCALAROP_INSTRUCTION_TOKEN, {NT_SCALAROP_TOKEN, NT_MASKED_DST_REG_TOKEN, COMMA_TOKEN, - NT_SCALAR_SRC_REG_TOKEN}, NO_KW}, - - /* 25: */ - {NT_SCALAROP_TOKEN, {EX2_TOKEN, NULL3}, NO_KW}, - {NT_SCALAROP_TOKEN, {EXP_TOKEN, NULL3}, NO_KW}, - {NT_SCALAROP_TOKEN, {LG2_TOKEN, NULL3}, NO_KW}, - {NT_SCALAROP_TOKEN, {LOG_TOKEN, NULL3}, NO_KW}, - {NT_SCALAROP_TOKEN, {RCP_TOKEN, NULL3}, NO_KW}, - - /* 30: */ - {NT_SCALAROP_TOKEN, {RSQ_TOKEN, NULL3}, NO_KW}, - {NT_BINSCOP_INSTRUCTION_TOKEN, - {NT_BINSCOP_TOKEN, NT_MASKED_DST_REG_TOKEN, NT_BINSCOP_INSTRUCTION2_TOKEN, - NULL_TOKEN}, NO_KW}, - {NT_BINSCOP_INSTRUCTION2_TOKEN, - {COMMA_TOKEN, NT_SCALAR_SRC_REG_TOKEN, COMMA_TOKEN, - NT_SCALAR_SRC_REG_TOKEN}, NO_KW}, - {NT_BINSCOP_TOKEN, {POW_TOKEN, NULL3}, NO_KW}, - {NT_BINOP_INSTRUCTION_TOKEN, - {NT_BINOP_TOKEN, NT_MASKED_DST_REG_TOKEN, NT_BINOP_INSTRUCTION2_TOKEN, - NULL_TOKEN}, NO_KW}, - - /* 35: */ - {NT_BINOP_INSTRUCTION2_TOKEN, - {COMMA_TOKEN, NT_SWIZZLE_SRC_REG_TOKEN, COMMA_TOKEN, - NT_SWIZZLE_SRC_REG_TOKEN}, NO_KW}, - {NT_BINOP_TOKEN, {ADD_TOKEN, NULL3}, NO_KW}, - {NT_BINOP_TOKEN, {DP3_TOKEN, NULL3}, NO_KW}, - {NT_BINOP_TOKEN, {DP4_TOKEN, NULL3}, NO_KW}, - {NT_BINOP_TOKEN, {DPH_TOKEN, NULL3}, NO_KW}, - - /* 40: */ - {NT_BINOP_TOKEN, {DST_TOKEN, NULL3}, NO_KW}, - {NT_BINOP_TOKEN, {MAX_TOKEN, NULL3}, NO_KW}, - {NT_BINOP_TOKEN, {MIN_TOKEN, NULL3}, NO_KW}, - {NT_BINOP_TOKEN, {MUL_TOKEN, NULL3}, NO_KW}, - {NT_BINOP_TOKEN, {SGE_TOKEN, NULL3}, NO_KW}, - - /* 45: */ - {NT_BINOP_TOKEN, {SLT_TOKEN, NULL3}, NO_KW}, - {NT_BINOP_TOKEN, {SUB_TOKEN, NULL3}, NO_KW}, - {NT_BINOP_TOKEN, {XPD_TOKEN, NULL3}, NO_KW}, - {NT_TRIOP_INSTRUCTION_TOKEN, - {NT_TRIOP_TOKEN, NT_MASKED_DST_REG_TOKEN, NT_TRIOP_INSTRUCTION2_TOKEN, - NULL_TOKEN}, NO_KW}, - {NT_TRIOP_INSTRUCTION2_TOKEN, - {COMMA_TOKEN, NT_SWIZZLE_SRC_REG_TOKEN, NT_TRIOP_INSTRUCTION3_TOKEN, - NULL_TOKEN}, NO_KW}, - - /* 50: */ - {NT_TRIOP_INSTRUCTION3_TOKEN, - {COMMA_TOKEN, NT_SWIZZLE_SRC_REG_TOKEN, COMMA_TOKEN, - NT_SWIZZLE_SRC_REG_TOKEN}, NO_KW}, - {NT_TRIOP_TOKEN, {MAD_TOKEN, NULL3}, NO_KW}, - {NT_SWZ_INSTRUCTION_TOKEN, - {SWZ_TOKEN, NT_MASKED_DST_REG_TOKEN, NT_SWZ_INSTRUCTION2_TOKEN, - NULL_TOKEN}, NO_KW}, - {NT_SWZ_INSTRUCTION2_TOKEN, - {COMMA_TOKEN, NT_SRC_REG_TOKEN, COMMA_TOKEN, NT_EXTENDED_SWIZZLE_TOKEN}, - NO_KW}, - {NT_SCALAR_SRC_REG_TOKEN, - {NT_OPTIONAL_SIGN_TOKEN, NT_SRC_REG_TOKEN, NT_SCALAR_SUFFIX_TOKEN, - NULL_TOKEN}, NO_KW}, - - /* 55 */ - {NT_SWIZZLE_SRC_REG_TOKEN, - {NT_OPTIONAL_SIGN_TOKEN, NT_SRC_REG_TOKEN, NT_SWIZZLE_SUFFIX_TOKEN, - NULL_TOKEN}, NO_KW}, - {NT_MASKED_DST_REG_TOKEN, - {NT_DST_REG_TOKEN, NT_OPTIONAL_MASK_TOKEN, NULL2}, NO_KW}, - {NT_MASKED_ADDR_REG_TOKEN, - {NT_ADDR_REG_TOKEN, NT_ADDR_WRITE_MASK_TOKEN, NULL2}, NO_KW}, - {NT_EXTENDED_SWIZZLE_TOKEN, - {NT_EXT_SWIZ_COMP_TOKEN, COMMA_TOKEN, NT_EXT_SWIZ_COMP_TOKEN, - NT_EXTENDED_SWIZZLE2_TOKEN}, NO_KW}, - {NT_EXTENDED_SWIZZLE2_TOKEN, - {COMMA_TOKEN, NT_EXT_SWIZ_COMP_TOKEN, COMMA_TOKEN, - NT_EXT_SWIZ_COMP_TOKEN}, NO_KW}, - - /* 60 */ - {NT_EXT_SWIZ_COMP_TOKEN,{NT_OPTIONAL_SIGN_TOKEN, NT_EXT_SWIZ_SEL_TOKEN, NULL2}, - NO_KW}, - {NT_EXT_SWIZ_SEL_TOKEN, {INTEGER_TOKEN, NULL3}, {"0", "", "", ""}}, - {NT_EXT_SWIZ_SEL_TOKEN, {INTEGER_TOKEN, NULL3}, {"1", "", "", ""}}, - {NT_EXT_SWIZ_SEL_TOKEN, {NT_COMPONENT_TOKEN, NULL3}, NO_KW}, - {NT_SRC_REG_TOKEN, {NT_VERTEX_ATTRIB_REG_TOKEN, NULL3}, NO_KW}, - - /* 65: */ - {NT_SRC_REG_TOKEN, {NT_TEMPORARY_REG_TOKEN, NULL3}, NO_KW}, - {NT_SRC_REG_TOKEN, {NT_PROG_PARAM_REG_TOKEN, NULL3}, NO_KW}, - {NT_DST_REG_TOKEN, {NT_TEMPORARY_REG_TOKEN, NULL3}, NO_KW}, - {NT_DST_REG_TOKEN, {NT_VERTEX_RESULT_REG_TOKEN, NULL3}, NO_KW}, - {NT_VERTEX_ATTRIB_REG_TOKEN, {NT_ESTABLISHED_NAME_TOKEN, NULL3}, NO_KW}, - - /* 70: */ - {NT_VERTEX_ATTRIB_REG_TOKEN, {NT_VTX_ATTRIB_BINDING_TOKEN, NULL3}, NO_KW}, - {NT_TEMPORARY_REG_TOKEN, {NT_ESTABLISHED_NAME_TOKEN, NULL3}, NO_KW}, - {NT_PROG_PARAM_REG_TOKEN, {NT_PROG_PARAM_SINGLE_TOKEN, NULL3}, NO_KW}, - {NT_PROG_PARAM_REG_TOKEN, - {NT_PROG_PARAM_ARRAY_TOKEN, LBRACKET_TOKEN, NT_PROG_PARAM_ARRAY_MEM_TOKEN, - RBRACKET_TOKEN}, NO_KW}, - {NT_PROG_PARAM_REG_TOKEN, {NT_PARAM_SINGLE_ITEM_USE_TOKEN, NULL3}, NO_KW}, - - /* 75: */ - {NT_PROG_PARAM_SINGLE_TOKEN, {NT_ESTABLISHED_NAME_TOKEN, NULL3}, NO_KW}, - {NT_PROG_PARAM_ARRAY_TOKEN, {NT_ESTABLISHED_NAME_TOKEN, NULL3}, NO_KW}, - {NT_PROG_PARAM_ARRAY_MEM_TOKEN, {NT_PROG_PARAM_ARRAY_ABS_TOKEN, NULL3}, NO_KW}, - {NT_PROG_PARAM_ARRAY_MEM_TOKEN, {NT_PROG_PARAM_ARRAY_REL_TOKEN, NULL3}, NO_KW}, - /* -1 matches all */ - {NT_PROG_PARAM_ARRAY_ABS_TOKEN, {INTEGER_TOKEN, NULL3}, {"-1", "", "", ""}}, - - - /* 80: */ - {NT_PROG_PARAM_ARRAY_REL_TOKEN, - {NT_ADDR_REG_TOKEN, NT_ADDR_COMPONENT_TOKEN, NT_ADDR_REG_REL_OFFSET_TOKEN, - NULL_TOKEN}, NO_KW}, - {NT_ADDR_REG_REL_OFFSET_TOKEN, {NULL4}, NO_KW}, - {NT_ADDR_REG_REL_OFFSET_TOKEN, - {PLUS_TOKEN, NT_ADDR_REG_POS_OFFSET_TOKEN, NULL2}, NO_KW}, - {NT_ADDR_REG_REL_OFFSET_TOKEN, - {MINUS_TOKEN, NT_ADDR_REG_NEG_OFFSET_TOKEN, NULL2}, NO_KW}, - {NT_ADDR_REG_POS_OFFSET_TOKEN, {INTEGER_TOKEN, NULL3}, {"-1", "", "", ""}}, - - /* 85: */ - {NT_ADDR_REG_NEG_OFFSET_TOKEN, {INTEGER_TOKEN, NULL3}, {"-1", "", "", ""}}, - {NT_VERTEX_RESULT_REG_TOKEN, {NT_ESTABLISHED_NAME_TOKEN, NULL3}, NO_KW}, - {NT_VERTEX_RESULT_REG_TOKEN, {NT_RESULT_BINDING_TOKEN, NULL3}, NO_KW}, - {NT_ADDR_REG_TOKEN, {NT_ESTABLISHED_NAME_TOKEN, NULL3}, NO_KW}, - {NT_ADDR_COMPONENT_TOKEN, {PERIOD_TOKEN, ID_TOKEN, NULL2}, {"", "x", "", ""}}, - - /* 90: */ - {NT_ADDR_WRITE_MASK_TOKEN, {PERIOD_TOKEN, ID_TOKEN, NULL2}, {"", "x", "", ""}}, - {NT_SCALAR_SUFFIX_TOKEN, {PERIOD_TOKEN, NT_COMPONENT_TOKEN, NULL2}, {"", "x", "", ""}}, - {NT_SWIZZLE_SUFFIX_TOKEN, {NULL4}, NO_KW}, - {NT_COMPONENT_TOKEN, {ID_TOKEN, NULL3}, {"x", "", "", ""}}, - {NT_COMPONENT_TOKEN, {ID_TOKEN, NULL3}, {"y", "", "", ""}}, - - /* 95: */ - {NT_COMPONENT_TOKEN, {ID_TOKEN, NULL3}, {"z", "", "", ""}}, - {NT_COMPONENT_TOKEN, {ID_TOKEN, NULL3}, {"w", "", "", ""}}, - {NT_OPTIONAL_MASK_TOKEN, {PERIOD_TOKEN, NT_OPTIONAL_MASK2_TOKEN, NULL2}, NO_KW}, - {NT_OPTIONAL_MASK_TOKEN, {NULL4}, NO_KW}, - {NT_OPTIONAL_MASK2_TOKEN, {ID_TOKEN, NULL3}, {"x", "", "", ""}}, - - /* 100: */ - {NT_OPTIONAL_MASK2_TOKEN, {ID_TOKEN, NULL3}, {"y", "", "", ""}}, - {NT_OPTIONAL_MASK2_TOKEN, {ID_TOKEN, NULL3}, {"xy", "", "", ""}}, - {NT_OPTIONAL_MASK2_TOKEN, {ID_TOKEN, NULL3}, {"z", "", "", ""}}, - {NT_OPTIONAL_MASK2_TOKEN, {ID_TOKEN, NULL3}, {"xz", "", "", ""}}, - {NT_OPTIONAL_MASK2_TOKEN, {ID_TOKEN, NULL3}, {"yz", "", "", ""}}, - - /* 105: */ - {NT_OPTIONAL_MASK2_TOKEN, {ID_TOKEN, NULL3}, {"xyz", "", "", ""}}, - {NT_OPTIONAL_MASK2_TOKEN, {ID_TOKEN, NULL3}, {"w", "", "", ""}}, - {NT_OPTIONAL_MASK2_TOKEN, {ID_TOKEN, NULL3}, {"xw", "", "", ""}}, - {NT_OPTIONAL_MASK2_TOKEN, {ID_TOKEN, NULL3}, {"yw", "", "", ""}}, - {NT_OPTIONAL_MASK2_TOKEN, {ID_TOKEN, NULL3}, {"xyw", "", "", ""}}, - - /* 110: */ - {NT_OPTIONAL_MASK2_TOKEN, {ID_TOKEN, NULL3}, {"zw", "", "", ""}}, - {NT_OPTIONAL_MASK2_TOKEN, {ID_TOKEN, NULL3}, {"xzw", "", "", ""}}, - {NT_OPTIONAL_MASK2_TOKEN, {ID_TOKEN, NULL3}, {"yzw", "", "", ""}}, - {NT_OPTIONAL_MASK2_TOKEN, {ID_TOKEN, NULL3}, {"xyzw", "", "", ""}}, - {NT_NAMING_STATEMENT_TOKEN, {NT_ATTRIB_STATEMENT_TOKEN, NULL3}, NO_KW}, - - /* 115: */ - {NT_NAMING_STATEMENT_TOKEN, {NT_PARAM_STATEMENT_TOKEN, NULL3}, NO_KW}, - {NT_NAMING_STATEMENT_TOKEN, {NT_TEMP_STATEMENT_TOKEN, NULL3}, NO_KW}, - {NT_NAMING_STATEMENT_TOKEN, {NT_ADDRESS_STATEMENT_TOKEN, NULL3}, NO_KW}, - {NT_NAMING_STATEMENT_TOKEN, {NT_OUTPUT_STATEMENT_TOKEN, NULL3}, NO_KW}, - {NT_NAMING_STATEMENT_TOKEN, {NT_ALIAS_STATEMENT_TOKEN, NULL3}, NO_KW}, - - /* 120: */ - {NT_ATTRIB_STATEMENT_TOKEN, - {ATTRIB_TOKEN, NT_ESTABLISH_NAME_TOKEN, EQUAL_TOKEN, NT_VTX_ATTRIB_BINDING_TOKEN}, NO_KW}, - {NT_VTX_ATTRIB_BINDING_TOKEN, - {VERTEX_TOKEN, PERIOD_TOKEN, NT_VTX_ATTRIB_ITEM_TOKEN, NULL_TOKEN}, NO_KW}, - {NT_VTX_ATTRIB_ITEM_TOKEN, {ID_TOKEN, NULL3}, {"position", "", "", ""}}, - {NT_VTX_ATTRIB_ITEM_TOKEN, {ID_TOKEN, NT_VTX_OPT_WEIGHT_NUM_TOKEN, NULL2},{"weight", "", "", ""}}, - {NT_VTX_ATTRIB_ITEM_TOKEN, {ID_TOKEN, NULL3}, {"normal", "", "", ""}}, - - /* 125: */ - {NT_VTX_ATTRIB_ITEM_TOKEN, {ID_TOKEN, NT_OPT_COLOR_TYPE_TOKEN, NULL2}, - {"color", "", "", ""}}, - {NT_VTX_ATTRIB_ITEM_TOKEN, {ID_TOKEN, NULL3}, {"fogcoord", "", "", ""}}, - {NT_VTX_ATTRIB_ITEM_TOKEN, {ID_TOKEN, NT_OPT_TEX_COORD_NUM_TOKEN, NULL2}, - {"texcoord", "", "", ""}}, - {NT_VTX_ATTRIB_ITEM_TOKEN, - {ID_TOKEN, LBRACKET_TOKEN, NT_VTX_WEIGHT_NUM_TOKEN, RBRACKET_TOKEN}, - {"matrixindex", "", "", ""}}, - {NT_VTX_ATTRIB_ITEM_TOKEN, - {ID_TOKEN, LBRACKET_TOKEN, NT_VTX_ATTRIB_NUM_TOKEN, RBRACKET_TOKEN}, - {"attrib", "", "", ""}}, - - /* 130: */ - {NT_VTX_ATTRIB_NUM_TOKEN, {INTEGER_TOKEN, NULL3}, {"-1", "", "", ""}}, - {NT_VTX_OPT_WEIGHT_NUM_TOKEN, {NULL4}, NO_KW}, - {NT_VTX_OPT_WEIGHT_NUM_TOKEN, {LBRACKET_TOKEN, NT_VTX_WEIGHT_NUM_TOKEN, RBRACKET_TOKEN, NULL_TOKEN}, - NO_KW}, - {NT_VTX_WEIGHT_NUM_TOKEN, {INTEGER_TOKEN, NULL3}, {"-1", "", "", ""}}, - {NT_PARAM_STATEMENT_TOKEN, - {PARAM_TOKEN, NT_ESTABLISH_NAME_TOKEN, NT_PARAM_STATEMENT2_TOKEN, - NULL_TOKEN}, NO_KW}, - - /* 135: */ - {NT_PARAM_STATEMENT2_TOKEN, {NT_PARAM_SINGLE_INIT_TOKEN, NULL3}, NO_KW}, - {NT_PARAM_STATEMENT2_TOKEN, {LBRACKET_TOKEN, NT_OPT_ARRAY_SIZE_TOKEN, RBRACKET_TOKEN, - NT_PARAM_MULTIPLE_INIT_TOKEN}, NO_KW}, - {NT_OPT_ARRAY_SIZE_TOKEN, {NULL4}, NO_KW}, - {NT_OPT_ARRAY_SIZE_TOKEN, {INTEGER_TOKEN, NULL3}, {"-1", "", "", ""}}, - {NT_PARAM_SINGLE_INIT_TOKEN, {EQUAL_TOKEN, NT_PARAM_SINGLE_ITEM_DECL_TOKEN, NULL2}, - NO_KW}, - - - /* 140: */ - {NT_PARAM_MULTIPLE_INIT_TOKEN, - {EQUAL_TOKEN, LBRACE_TOKEN, NT_PARAM_MULT_INIT_LIST_TOKEN, RBRACE_TOKEN}, - NO_KW}, - {NT_PARAM_MULT_INIT_LIST_TOKEN, - {NT_PARAM_MULTIPLE_ITEM_TOKEN, NT_PARAM_MULT_INIT_LIST2_TOKEN, NULL2}, - NO_KW}, - {NT_PARAM_MULT_INIT_LIST2_TOKEN, - {COMMA_TOKEN, NT_PARAM_MULT_INIT_LIST_TOKEN, NULL2}, - NO_KW}, - {NT_PARAM_MULT_INIT_LIST2_TOKEN, {NULL4}, NO_KW}, - {NT_PARAM_SINGLE_ITEM_DECL_TOKEN, {NT_STATE_SINGLE_ITEM_TOKEN, NULL3}, - NO_KW}, - - /* 145: */ - {NT_PARAM_SINGLE_ITEM_DECL_TOKEN, {NT_PROGRAM_SINGLE_ITEM_TOKEN, NULL3}, NO_KW}, - {NT_PARAM_SINGLE_ITEM_DECL_TOKEN, {NT_PARAM_CONST_DECL_TOKEN, NULL3}, NO_KW}, - {NT_PARAM_SINGLE_ITEM_USE_TOKEN, {NT_STATE_SINGLE_ITEM_TOKEN, NULL3}, NO_KW}, - {NT_PARAM_SINGLE_ITEM_USE_TOKEN, {NT_PROGRAM_SINGLE_ITEM_TOKEN, NULL3}, NO_KW}, - {NT_PARAM_SINGLE_ITEM_USE_TOKEN, {NT_PARAM_CONST_USE_TOKEN, NULL3}, NO_KW}, - - /* 150: */ - {NT_PARAM_MULTIPLE_ITEM_TOKEN, {NT_STATE_MULTIPLE_ITEM_TOKEN, NULL3}, NO_KW}, - {NT_PARAM_MULTIPLE_ITEM_TOKEN, {NT_PROGRAM_MULTIPLE_ITEM_TOKEN, NULL3}, NO_KW}, - {NT_PARAM_MULTIPLE_ITEM_TOKEN, {NT_PARAM_CONST_DECL_TOKEN, NULL3}, NO_KW}, - {NT_STATE_MULTIPLE_ITEM_TOKEN, - {STATE_TOKEN, PERIOD_TOKEN, NT_STATE_MULTIPLE_ITEM2_TOKEN, NULL_TOKEN}, - NO_KW}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, {NT_STATE_MATERIAL_ITEM_TOKEN, NULL3}, NO_KW}, - - /* 155: */ - {NT_STATE_MULTIPLE_ITEM2_TOKEN, {NT_STATE_LIGHT_ITEM_TOKEN, NULL3}, NO_KW}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, {NT_STATE_LIGHT_MODEL_ITEM_TOKEN, NULL3}, NO_KW}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, {NT_STATE_LIGHT_PROD_ITEM_TOKEN, NULL3}, NO_KW}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, {NT_STATE_TEX_GEN_ITEM_TOKEN, NULL3}, NO_KW}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, {NT_STATE_FOG_ITEM_TOKEN, NULL3}, NO_KW}, - - /* 160: */ - {NT_STATE_MULTIPLE_ITEM2_TOKEN, {NT_STATE_CLIP_PLANE_ITEM_TOKEN, NULL3}, NO_KW}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, {NT_STATE_POINT_ITEM_TOKEN, NULL3}, NO_KW}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, - {ID_TOKEN, PERIOD_TOKEN, NT_STATE_MATRIX_NAME_TOKEN, NT_FOO_TOKEN}, - {"matrix", "", "", ""}}, - {NT_FOO_TOKEN, {PERIOD_TOKEN, NT_FOO2_TOKEN, NULL2}, NO_KW}, - {NT_FOO2_TOKEN, {NT_STATE_MAT_MODIFIER_TOKEN, NT_FOO3_TOKEN, NULL2}, NO_KW}, - - /* 165: */ - {NT_FOO2_TOKEN, {ID_TOKEN, LBRACKET_TOKEN, NT_STATE_MATRIX_ROW_NUM_TOKEN, NT_FOO4_TOKEN}, - {"row", "", "", ""}}, - {NT_FOO3_TOKEN, {NULL4}, NO_KW}, - {NT_FOO3_TOKEN, {PERIOD_TOKEN, ID_TOKEN, LBRACKET_TOKEN, NT_FOO35_TOKEN}, - {"", "row", "", ""}}, - {NT_FOO35_TOKEN, {NT_STATE_MATRIX_ROW_NUM_TOKEN, NT_FOO4_TOKEN, NULL2}, - NO_KW}, - {NT_FOO4_TOKEN, {RBRACKET_TOKEN, NULL3}, NO_KW}, - - /* 170: */ - {NT_FOO4_TOKEN, {DOTDOT_TOKEN, NT_STATE_MATRIX_ROW_NUM_TOKEN, RBRACKET_TOKEN, NULL_TOKEN}, - NO_KW}, - {NT_STATE_SINGLE_ITEM_TOKEN, - {STATE_TOKEN, PERIOD_TOKEN, NT_STATE_SINGLE_ITEM2_TOKEN, NULL_TOKEN}, - NO_KW}, - {NT_STATE_SINGLE_ITEM2_TOKEN, {NT_STATE_MATERIAL_ITEM_TOKEN, NULL3}, - NO_KW}, - {NT_STATE_SINGLE_ITEM2_TOKEN, {NT_STATE_LIGHT_ITEM_TOKEN, NULL3}, - NO_KW}, - {NT_STATE_SINGLE_ITEM2_TOKEN, {NT_STATE_LIGHT_MODEL_ITEM_TOKEN, NULL3}, - NO_KW}, - - /* 175: */ - {NT_STATE_SINGLE_ITEM2_TOKEN, {NT_STATE_LIGHT_PROD_ITEM_TOKEN, NULL3}, NO_KW}, - {NT_STATE_SINGLE_ITEM2_TOKEN, {NT_STATE_TEX_GEN_ITEM_TOKEN, NULL3}, NO_KW}, - {NT_STATE_SINGLE_ITEM2_TOKEN, {NT_STATE_FOG_ITEM_TOKEN, NULL3}, NO_KW}, - {NT_STATE_SINGLE_ITEM2_TOKEN, {NT_STATE_CLIP_PLANE_ITEM_TOKEN, NULL3}, NO_KW}, - {NT_STATE_SINGLE_ITEM2_TOKEN, {NT_STATE_POINT_ITEM_TOKEN, NULL3}, NO_KW}, - - /* 180: */ - {NT_STATE_SINGLE_ITEM2_TOKEN, {NT_STATE_MATRIX_ROW_TOKEN, NULL3}, NO_KW}, - {NT_STATE_MATERIAL_ITEM_TOKEN, - {ID_TOKEN, PERIOD_TOKEN, NT_STATE_MATERIAL_ITEM2_TOKEN, NULL_TOKEN}, - {"material", "", "", ""}}, - {NT_STATE_MATERIAL_ITEM2_TOKEN, {NT_STATE_MAT_PROPERTY_TOKEN, NULL3}, - NO_KW}, - {NT_STATE_MATERIAL_ITEM2_TOKEN, - {PERIOD_TOKEN, NT_OPT_FACE_TYPE2_TOKEN, PERIOD_TOKEN, - NT_STATE_MAT_PROPERTY_TOKEN}, NO_KW}, - {NT_STATE_MAT_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"ambient", "", "", ""}}, - - /* 185 */ - {NT_STATE_MAT_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"diffuse", "", "", ""}}, - {NT_STATE_MAT_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"specular", "", "", ""}}, - {NT_STATE_MAT_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"emission", "", "", ""}}, - {NT_STATE_MAT_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"shininess", "", "", ""}}, - {NT_STATE_LIGHT_ITEM_TOKEN, - {ID_TOKEN, LBRACKET_TOKEN, NT_STATE_LIGHT_NUMBER_TOKEN, - NT_STATE_LIGHT_ITEM2_TOKEN}, {"light", "", "", ""}}, - - /* 190: */ - {NT_STATE_LIGHT_ITEM2_TOKEN, {RBRACKET_TOKEN, PERIOD_TOKEN, NT_STATE_LIGHT_PROPERTY_TOKEN, NULL_TOKEN}, - NO_KW}, - {NT_STATE_LIGHT_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"ambient", "", "", ""}}, - {NT_STATE_LIGHT_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"diffuse", "", "", ""}}, - {NT_STATE_LIGHT_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"specular", "", "", ""}}, - {NT_STATE_LIGHT_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"position", "", "", ""}}, - - /* 195: */ - {NT_STATE_LIGHT_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"attenuation", "", "", ""}}, - {NT_STATE_LIGHT_PROPERTY_TOKEN, - {ID_TOKEN, PERIOD_TOKEN, NT_STATE_SPOT_PROPERTY_TOKEN, NULL_TOKEN}, - {"spot", "", "", ""}}, - {NT_STATE_LIGHT_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"half", "", "", ""}}, - {NT_STATE_SPOT_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"direction", "", "", ""}}, - {NT_STATE_LIGHT_MODEL_ITEM_TOKEN, - {ID_TOKEN, NT_STATE_LMOD_PROPERTY_TOKEN, NULL2}, {"lightmodel", "", "", ""}}, - - /* 200: */ - {NT_STATE_LMOD_PROPERTY_TOKEN, {PERIOD_TOKEN, NT_STATE_LMOD_PROPERTY2_TOKEN, NULL2}, NO_KW}, - {NT_STATE_LMOD_PROPERTY2_TOKEN, {ID_TOKEN, NULL3}, {"ambient", "", "", ""}}, - {NT_STATE_LMOD_PROPERTY2_TOKEN, {ID_TOKEN, NULL3}, {"scenecolor", "", "", ""}}, - {NT_STATE_LMOD_PROPERTY2_TOKEN, - {NT_OPT_FACE_TYPE2_TOKEN, PERIOD_TOKEN, ID_TOKEN, NULL_TOKEN}, - {"scenecolor", "", "", ""}}, - {NT_STATE_LIGHT_PROD_ITEM_TOKEN, - {ID_TOKEN, LBRACKET_TOKEN, NT_STATE_LIGHT_NUMBER_TOKEN, - NT_STATE_LIGHT_PROD_ITEM15_TOKEN}, {"lightprod", "", "", ""}}, - - /* 205: */ - {NT_STATE_LIGHT_PROD_ITEM15_TOKEN, - {RBRACKET_TOKEN, PERIOD_TOKEN, NT_STATE_LIGHT_PROD_ITEM2_TOKEN, NULL_TOKEN}, NO_KW}, - {NT_STATE_LIGHT_PROD_ITEM2_TOKEN, {NT_STATE_LPROD_PROPERTY_TOKEN, NULL3}, NO_KW}, - {NT_STATE_LIGHT_PROD_ITEM2_TOKEN, - {NT_OPT_FACE_TYPE2_TOKEN, PERIOD_TOKEN, NT_STATE_LPROD_PROPERTY_TOKEN, NULL_TOKEN}, NO_KW}, - {NT_STATE_LPROD_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"diffuse", "", "", ""}}, - {NT_STATE_LPROD_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"ambient", "", "", ""}}, - - /* 210: */ - {NT_STATE_LPROD_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"specular", "", "", ""}}, - {NT_STATE_LIGHT_NUMBER_TOKEN, {INTEGER_TOKEN, NULL3}, {"-1", "", "", ""}}, - {NT_STATE_TEX_GEN_ITEM_TOKEN, {ID_TOKEN, NT_OPT_TEX_COORD_NUM_TOKEN, - NT_STATE_TEX_GEN_ITEM2_TOKEN, NULL_TOKEN}, {"texgen", "", "", ""}}, - {NT_STATE_TEX_GEN_ITEM2_TOKEN,{PERIOD_TOKEN, NT_STATE_TEX_GEN_TYPE_TOKEN, PERIOD_TOKEN, - NT_STATE_TEX_GEN_COORD_TOKEN}, NO_KW}, - {NT_STATE_TEX_GEN_TYPE_TOKEN, {ID_TOKEN, NULL3}, {"eye", "", "", ""}}, - - /* 215: */ - {NT_STATE_TEX_GEN_TYPE_TOKEN, {ID_TOKEN, NULL3}, {"object", "", "", ""}}, - {NT_STATE_TEX_GEN_COORD_TOKEN, {ID_TOKEN, NULL3}, {"s", "", "", ""}}, - {NT_STATE_TEX_GEN_COORD_TOKEN, {ID_TOKEN, NULL3}, {"t", "", "", ""}}, - {NT_STATE_TEX_GEN_COORD_TOKEN, {ID_TOKEN, NULL3}, {"r", "", "", ""}}, - {NT_STATE_TEX_GEN_COORD_TOKEN, {ID_TOKEN, NULL3}, {"q", "", "", ""}}, - - /* 220: */ - {NT_STATE_FOG_ITEM_TOKEN, {ID_TOKEN, PERIOD_TOKEN, NT_STATE_FOG_PROPERTY_TOKEN, NULL_TOKEN}, - {"fog", "","",""}}, - {NT_STATE_FOG_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"color", "", "", ""}}, - {NT_STATE_FOG_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"params", "", "", ""}}, - {NT_STATE_CLIP_PLANE_ITEM_TOKEN, - {ID_TOKEN, LBRACKET_TOKEN, NT_STATE_CLIP_PLANE_NUM_TOKEN, - NT_STATE_CLIP_PLANE_ITEM2_TOKEN}, {"clip", "", "", ""}}, - {NT_STATE_CLIP_PLANE_ITEM2_TOKEN, - {RBRACKET_TOKEN, PERIOD_TOKEN, ID_TOKEN, NULL_TOKEN}, - {"", "", "plane", ""}}, - - /* 225: */ - {NT_STATE_CLIP_PLANE_NUM_TOKEN,{INTEGER_TOKEN, NULL3}, {"-1", "", "", ""}}, - {NT_STATE_POINT_ITEM_TOKEN, {ID_TOKEN, PERIOD_TOKEN, NT_STATE_POINT_PROPERTY_TOKEN, NULL_TOKEN}, - {"point", "", "", ""}}, - {NT_STATE_POINT_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"size", "", "", ""}}, - {NT_STATE_POINT_PROPERTY_TOKEN, {ID_TOKEN, NULL3}, {"attenuation", "", "", ""}}, - {NT_STATE_MATRIX_ROW_TOKEN, {ID_TOKEN, PERIOD_TOKEN, NT_STATE_MATRIX_NAME_TOKEN, - NT_STATE_MATRIX_ROW15_TOKEN}, {"matrix", "", "", ""}}, - - /* 230: */ - {NT_STATE_MATRIX_ROW15_TOKEN, {PERIOD_TOKEN, NT_STATE_MATRIX_ROW2_TOKEN, NULL2}, NO_KW}, - {NT_STATE_MATRIX_ROW2_TOKEN, {ID_TOKEN, LBRACKET_TOKEN, - NT_STATE_MATRIX_ROW_NUM_TOKEN, RBRACKET_TOKEN}, - {"row", "", "", ""}}, - {NT_STATE_MATRIX_ROW2_TOKEN, {NT_STATE_MAT_MODIFIER_TOKEN, PERIOD_TOKEN, ID_TOKEN, - NT_STATE_MATRIX_ROW3_TOKEN}, - {"", "", "row", ""}}, - {NT_STATE_MATRIX_ROW3_TOKEN, {LBRACKET_TOKEN, NT_STATE_MATRIX_ROW_NUM_TOKEN, RBRACKET_TOKEN, - NULL_TOKEN}, NO_KW}, - {NT_STATE_MAT_MODIFIER_TOKEN, {ID_TOKEN, NULL3}, {"inverse", "", "", ""}}, - - /* 235: */ - {NT_STATE_MAT_MODIFIER_TOKEN, {ID_TOKEN, NULL3}, {"transpose", "", "", ""}}, - {NT_STATE_MAT_MODIFIER_TOKEN, {ID_TOKEN, NULL3}, {"invtrans", "", "", ""}}, - {NT_STATE_MATRIX_ROW_NUM_TOKEN, {INTEGER_TOKEN, NULL3}, {"-1", "", "", ""}}, - {NT_STATE_MATRIX_NAME_TOKEN, {ID_TOKEN, NT_STATE_OPT_MOD_MAT_NUM_TOKEN, NULL2}, - {"modelview", "", "", ""}}, - {NT_STATE_MATRIX_NAME_TOKEN, {ID_TOKEN, NULL3}, {"projection", "", "", ""}}, - - /* 240: */ - {NT_STATE_MATRIX_NAME_TOKEN, {ID_TOKEN, NULL3}, {"mvp", "", "", ""}}, - {NT_STATE_MATRIX_NAME_TOKEN, {ID_TOKEN, NT_OPT_TEX_COORD_NUM_TOKEN, NULL2}, - {"texture", "", "", ""}}, - {NT_STATE_MATRIX_NAME_TOKEN, {ID_TOKEN, LBRACKET_TOKEN, NT_STATE_PALETTE_MAT_NUM_TOKEN, - RBRACKET_TOKEN}, {"palette", "", "", ""}}, - {NT_STATE_MATRIX_NAME_TOKEN, {PROGRAM_TOKEN, LBRACKET_TOKEN, NT_STATE_PROGRAM_MAT_NUM_TOKEN, - RBRACKET_TOKEN}, NO_KW}, - {NT_STATE_OPT_MOD_MAT_NUM_TOKEN, {NULL4}, NO_KW}, - - /* 245: */ - {NT_STATE_OPT_MOD_MAT_NUM_TOKEN, - {LBRACKET_TOKEN, NT_STATE_MOD_MAT_NUM_TOKEN, RBRACKET_TOKEN, NULL_TOKEN}, NO_KW}, - {NT_STATE_MOD_MAT_NUM_TOKEN, {INTEGER_TOKEN, NULL3}, {"-1", "", "", ""}}, - {NT_STATE_PALETTE_MAT_NUM_TOKEN, {INTEGER_TOKEN, NULL3}, {"-1", "", "", ""}}, - {NT_STATE_PROGRAM_MAT_NUM_TOKEN, {INTEGER_TOKEN, NULL3}, {"-1", "", "", ""}}, - {NT_PROGRAM_SINGLE_ITEM_TOKEN, - {PROGRAM_TOKEN, PERIOD_TOKEN, NT_PROGRAM_SINGLE_ITEM2_TOKEN, NULL_TOKEN}, NO_KW}, - - /* 250: */ - {NT_PROGRAM_SINGLE_ITEM2_TOKEN, {NT_PROG_ENV_PARAM_TOKEN, NULL3}, NO_KW}, - {NT_PROGRAM_SINGLE_ITEM2_TOKEN, {NT_PROG_LOCAL_PARAM_TOKEN, NULL3}, NO_KW}, - {NT_PROGRAM_MULTIPLE_ITEM_TOKEN, - {PROGRAM_TOKEN, PERIOD_TOKEN, NT_PROGRAM_MULTIPLE_ITEM2_TOKEN, NULL_TOKEN}, NO_KW}, - {NT_PROGRAM_MULTIPLE_ITEM2_TOKEN, {NT_PROG_ENV_PARAMS_TOKEN, NULL3}, NO_KW}, - {NT_PROGRAM_MULTIPLE_ITEM2_TOKEN, {NT_PROG_LOCAL_PARAMS_TOKEN, NULL3}, NO_KW}, - - /* 255: */ - {NT_PROG_ENV_PARAMS_TOKEN, {ID_TOKEN, LBRACKET_TOKEN, NT_PROG_ENV_PARAM_NUMS_TOKEN, RBRACKET_TOKEN}, - {"env", "", "", ""}}, - {NT_PROG_ENV_PARAM_NUMS_TOKEN, {NT_PROG_ENV_PARAM_NUM_TOKEN, NT_PROG_ENV_PARAM_NUMS2_TOKEN, NULL2}, - NO_KW}, - {NT_PROG_ENV_PARAM_NUMS2_TOKEN, {DOTDOT_TOKEN, NT_PROG_ENV_PARAM_NUM_TOKEN, NULL2}, NO_KW}, - {NT_PROG_ENV_PARAM_NUMS2_TOKEN, {NULL4}, NO_KW}, - {NT_PROG_ENV_PARAM_TOKEN, - {ID_TOKEN, LBRACKET_TOKEN, NT_PROG_ENV_PARAM_NUM_TOKEN, RBRACKET_TOKEN}, - {"env", "", "", ""}}, - - /* 260: */ - {NT_PROG_LOCAL_PARAMS_TOKEN, {ID_TOKEN, LBRACKET_TOKEN, NT_PROG_LOCAL_PARAM_NUMS_TOKEN, - RBRACKET_TOKEN}, {"local", "", "", ""}}, - {NT_PROG_LOCAL_PARAM_NUMS_TOKEN, - {NT_PROG_LOCAL_PARAM_NUM_TOKEN, NT_PROG_LOCAL_PARAM_NUMS2_TOKEN, NULL2}, - NO_KW}, - {NT_PROG_LOCAL_PARAM_NUMS2_TOKEN, {DOTDOT_TOKEN, NT_PROG_LOCAL_PARAM_NUM_TOKEN, NULL2}, NO_KW}, - {NT_PROG_LOCAL_PARAM_NUMS2_TOKEN, {NULL4}, NO_KW}, - {NT_PROG_LOCAL_PARAM_TOKEN, {ID_TOKEN, LBRACKET_TOKEN, NT_PROG_LOCAL_PARAM_NUM_TOKEN, RBRACKET_TOKEN}, - {"local", "", "", ""}}, - - /* 265: */ - {NT_PROG_ENV_PARAM_NUM_TOKEN, {INTEGER_TOKEN, NULL3}, {"-1", "", "", ""}}, - {NT_PROG_LOCAL_PARAM_NUM_TOKEN, {INTEGER_TOKEN, NULL3}, {"-1", "", "", ""}}, - {NT_PARAM_CONST_DECL_TOKEN, {NT_PARAM_CONST_SCALAR_DECL_TOKEN, NULL3}, NO_KW}, - {NT_PARAM_CONST_DECL_TOKEN, {NT_PARAM_CONST_VECTOR_TOKEN, NULL3}, NO_KW}, - {NT_PARAM_CONST_USE_TOKEN, {NT_PARAM_CONST_SCALAR_USE_TOKEN, NULL3}, NO_KW}, - - /* 270: */ - {NT_PARAM_CONST_USE_TOKEN, {NT_PARAM_CONST_VECTOR_TOKEN, NULL3}, NO_KW}, - {NT_PARAM_CONST_SCALAR_DECL_TOKEN, {NT_SIGNED_FLOAT_CONSTANT_TOKEN, NULL3}, NO_KW}, - {NT_PARAM_CONST_SCALAR_USE_TOKEN, {FLOAT_TOKEN, NULL3}, {"-1", "", "", ""}}, - {NT_PARAM_CONST_VECTOR_TOKEN, {LBRACE_TOKEN, NT_SIGNED_FLOAT_CONSTANT_TOKEN, - NT_PARAM_CONST_VECTOR2_TOKEN, NULL_TOKEN}, NO_KW}, - {NT_PARAM_CONST_VECTOR2_TOKEN,{RBRACE_TOKEN, NULL3}, NO_KW}, - - /* 275: */ - {NT_PARAM_CONST_VECTOR2_TOKEN, {COMMA_TOKEN, NT_SIGNED_FLOAT_CONSTANT_TOKEN, - NT_PARAM_CONST_VECTOR3_TOKEN, NULL_TOKEN}, NO_KW}, - {NT_PARAM_CONST_VECTOR3_TOKEN, {RBRACE_TOKEN, NULL3}, NO_KW}, - {NT_PARAM_CONST_VECTOR3_TOKEN, {COMMA_TOKEN, NT_SIGNED_FLOAT_CONSTANT_TOKEN, - NT_PARAM_CONST_VECTOR4_TOKEN, NULL_TOKEN}, NO_KW}, - {NT_PARAM_CONST_VECTOR4_TOKEN, {RBRACE_TOKEN, NULL3}, NO_KW}, - {NT_PARAM_CONST_VECTOR4_TOKEN, {COMMA_TOKEN, NT_SIGNED_FLOAT_CONSTANT_TOKEN, - RBRACE_TOKEN, NULL_TOKEN}, NO_KW}, - - /* 280: */ - {NT_SIGNED_FLOAT_CONSTANT_TOKEN, {NT_OPTIONAL_SIGN_TOKEN, FLOAT_TOKEN, NULL2}, - {"", "-1", "", ""}}, - {NT_OPTIONAL_SIGN_TOKEN, {NULL4}, NO_KW}, - {NT_OPTIONAL_SIGN_TOKEN, {MINUS_TOKEN, NULL3}, NO_KW}, - {NT_OPTIONAL_SIGN_TOKEN, {PLUS_TOKEN, NULL3}, NO_KW}, - {NT_TEMP_STATEMENT_TOKEN, {TEMP_TOKEN, NT_VAR_NAME_LIST_TOKEN, NULL2}, - NO_KW}, - - /* 285: */ - {NT_ADDRESS_STATEMENT_TOKEN, {ADDRESS_TOKEN, NT_VAR_NAME_LIST_TOKEN, NULL2}, NO_KW}, - {NT_VAR_NAME_LIST_TOKEN, {NT_ESTABLISH_NAME_TOKEN, NULL3}, NO_KW}, - {NT_VAR_NAME_LIST_TOKEN, {NT_ESTABLISH_NAME_TOKEN, COMMA_TOKEN, NT_VAR_NAME_LIST_TOKEN, - NULL_TOKEN}, NO_KW}, - {NT_OUTPUT_STATEMENT_TOKEN, {OUTPUT_TOKEN, NT_ESTABLISH_NAME_TOKEN, EQUAL_TOKEN, - NT_RESULT_BINDING_TOKEN}, NO_KW}, - {NT_RESULT_BINDING_TOKEN, {RESULT_TOKEN, PERIOD_TOKEN, NT_RESULT_BINDING2_TOKEN, NULL_TOKEN}, - NO_KW}, - - /* 290: */ - {NT_RESULT_BINDING2_TOKEN, {ID_TOKEN, NULL3}, {"position", "", "", ""}}, - {NT_RESULT_BINDING2_TOKEN, {ID_TOKEN, NULL3}, {"fogcoord", "", "", ""}}, - {NT_RESULT_BINDING2_TOKEN, {ID_TOKEN, NULL3}, {"pointsize", "", "", ""}}, - {NT_RESULT_BINDING2_TOKEN, {NT_RESULT_COL_BINDING_TOKEN, NULL3}, NO_KW}, - {NT_RESULT_BINDING2_TOKEN, {ID_TOKEN, NT_OPT_TEX_COORD_NUM_TOKEN, NULL2}, - {"texcoord", "", "", ""}}, - - /* 295: */ - {NT_RESULT_COL_BINDING_TOKEN, {ID_TOKEN, NT_RESULT_COL_BINDING2_TOKEN, NULL2}, {"color", "", "", ""}}, - {NT_RESULT_COL_BINDING2_TOKEN, {NULL4}, NO_KW}, - {NT_RESULT_COL_BINDING2_TOKEN, {PERIOD_TOKEN, NT_RESULT_COL_BINDING3_TOKEN, NULL2}, NO_KW}, - {NT_RESULT_COL_BINDING3_TOKEN, {ID_TOKEN, NT_RESULT_COL_BINDING4_TOKEN, NULL2}, {"front", "", "", ""}}, - {NT_RESULT_COL_BINDING3_TOKEN, {ID_TOKEN, NT_RESULT_COL_BINDING4_TOKEN, NULL2}, {"back", "", "", ""}}, - - /* 300: */ - {NT_RESULT_COL_BINDING4_TOKEN, {NULL4}, NO_KW}, - {NT_RESULT_COL_BINDING4_TOKEN, {PERIOD_TOKEN, NT_RESULT_COL_BINDING5_TOKEN, NULL2}, NO_KW}, - {NT_RESULT_COL_BINDING5_TOKEN, {ID_TOKEN, NULL3}, {"primary", "", "", ""}}, - {NT_RESULT_COL_BINDING5_TOKEN, {ID_TOKEN, NULL3}, {"secondary", "", "", ""}}, - {NT_OPT_FACE_TYPE2_TOKEN, {ID_TOKEN, NULL3}, {"front", "", "", ""}}, - - /* 305: */ - {NT_OPT_FACE_TYPE2_TOKEN, {ID_TOKEN, NULL3}, {"back", "", "", ""}}, - {NT_OPT_COLOR_TYPE_TOKEN, {PERIOD_TOKEN, NT_OPT_COLOR_TYPE2_TOKEN, NULL2}, NO_KW}, - {NT_OPT_COLOR_TYPE_TOKEN, {NULL4}, NO_KW}, - {NT_OPT_COLOR_TYPE2_TOKEN, {ID_TOKEN, NULL3}, {"primary", "", "", ""}}, - {NT_OPT_COLOR_TYPE2_TOKEN, {ID_TOKEN, NULL3}, {"secondary", "", "", ""}}, - - /* 310: */ - {NT_OPT_TEX_COORD_NUM_TOKEN, {NULL4}, NO_KW}, - {NT_OPT_TEX_COORD_NUM_TOKEN, - {LBRACKET_TOKEN, NT_TEX_COORD_NUM_TOKEN, RBRACKET_TOKEN, NULL_TOKEN}, NO_KW}, - {NT_TEX_COORD_NUM_TOKEN, {INTEGER_TOKEN, NULL3}, {"-1", "", "", ""}}, - {NT_ALIAS_STATEMENT_TOKEN, {ALIAS_TOKEN, NT_ESTABLISH_NAME_TOKEN, EQUAL_TOKEN, - NT_ESTABLISHED_NAME_TOKEN}, NO_KW}, - {NT_ESTABLISH_NAME_TOKEN, {ID_TOKEN, NULL3}, {"-1", "", "", ""}}, - - /* 315: */ - {NT_ESTABLISHED_NAME_TOKEN, {ID_TOKEN, NULL3}, {"-1", "", "", ""}}, - {NT_FOO_TOKEN, {NULL4}, NO_KW}, - {NT_SWIZZLE_SUFFIX_TOKEN, {PERIOD_TOKEN, NT_SWIZZLE_SUFFIX2_TOKEN, NULL2}, - NO_KW}, - {NT_SWIZZLE_SUFFIX2_TOKEN, {NT_COMPONENT_TOKEN, NULL3}, NO_KW}, - {NT_SWIZZLE_SUFFIX2_TOKEN, {NT_COMPONENT4_TOKEN, NULL3}, NO_KW}, -}; - -/* This is the look ahead table. See the look_ahead_table struct def for a description */ -look_ahead_table latab[] = { - {NT_PROGRAM_TOKEN, ABS_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, ADD_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, ADDRESS_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, ALIAS_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, ARL_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, ATTRIB_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, DP3_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, DP4_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, DPH_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, DST_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, END_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, EOF_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, EX2_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, EXP_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, FLR_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, FRC_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, LIT_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, LG2_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, LOG_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, MAD_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, MAX_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, MIN_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, MOV_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, MUL_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, OPTION_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, OUTPUT_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, PARAM_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, POW_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, RCP_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, RSQ_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, SGE_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, SLT_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, SUB_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, SWZ_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, XPD_TOKEN, "", 0}, - {NT_PROGRAM_TOKEN, TEMP_TOKEN, "", 0}, - - {NT_OPTION_SEQUENCE_TOKEN, ABS_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, ADD_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, ADDRESS_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, ALIAS_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, ARL_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, ATTRIB_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, DP3_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, DP4_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, DPH_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, DST_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, END_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, EX2_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, EXP_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, FLR_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, FRC_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, LIT_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, LG2_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, LOG_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, MAD_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, MAX_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, MIN_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, MOV_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, MUL_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, OPTION_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, OUTPUT_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, PARAM_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, POW_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, RCP_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, RSQ_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, SGE_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, SLT_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, SUB_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, SWZ_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, XPD_TOKEN, "", 1}, - {NT_OPTION_SEQUENCE_TOKEN, TEMP_TOKEN, "", 1}, - - {NT_OPTION_SEQUENCE2_TOKEN, OPTION_TOKEN, "", 2}, - - {NT_OPTION_SEQUENCE2_TOKEN, ABS_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, ADD_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, ADDRESS_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, ALIAS_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, ARL_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, ATTRIB_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, DP3_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, DP4_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, DPH_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, DST_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, END_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, EX2_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, EXP_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, FLR_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, FRC_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, LIT_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, LG2_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, LOG_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, MAD_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, MAX_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, MIN_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, MOV_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, MUL_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, OUTPUT_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, PARAM_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, POW_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, RCP_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, RSQ_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, SGE_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, SLT_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, SUB_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, SWZ_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, XPD_TOKEN, "", 3}, - {NT_OPTION_SEQUENCE2_TOKEN, TEMP_TOKEN, "", 3}, - - {NT_OPTION_TOKEN, OPTION_TOKEN, "", 4}, - - {NT_STATEMENT_SEQUENCE_TOKEN, ABS_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, ADD_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, ADDRESS_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, ALIAS_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, ARL_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, ATTRIB_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, DP3_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, DP4_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, DPH_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, DST_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, END_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, EX2_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, EXP_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, FLR_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, FRC_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, LIT_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, LG2_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, LOG_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, MAD_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, MAX_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, MIN_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, MOV_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, MUL_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, OUTPUT_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, PARAM_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, POW_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, RCP_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, RSQ_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, SGE_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, SLT_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, SUB_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, SWZ_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, XPD_TOKEN, "", 5}, - {NT_STATEMENT_SEQUENCE_TOKEN, TEMP_TOKEN, "", 5}, - - {NT_STATEMENT_SEQUENCE2_TOKEN, ABS_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, ADD_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, ADDRESS_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, ALIAS_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, ARL_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, ATTRIB_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, DP3_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, DP4_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, DPH_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, DST_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, EX2_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, EXP_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, FLR_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, FRC_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, LIT_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, LG2_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, LOG_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, MAD_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, MAX_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, MIN_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, MOV_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, MUL_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, OUTPUT_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, PARAM_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, POW_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, RCP_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, RSQ_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, SGE_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, SLT_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, SUB_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, SWZ_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, XPD_TOKEN, "", 6}, - {NT_STATEMENT_SEQUENCE2_TOKEN, TEMP_TOKEN, "", 6}, - - {NT_STATEMENT_SEQUENCE2_TOKEN, END_TOKEN, "", 7}, - - - {NT_STATEMENT_TOKEN, ABS_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, ADD_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, ARL_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, DP3_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, DP4_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, DPH_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, DST_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, EX2_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, EXP_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, FLR_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, FRC_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, LIT_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, LG2_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, LOG_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, MAD_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, MAX_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, MIN_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, MOV_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, MUL_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, POW_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, RCP_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, RSQ_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, SGE_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, SLT_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, SUB_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, SWZ_TOKEN, "", 8}, - {NT_STATEMENT_TOKEN, XPD_TOKEN, "", 8}, - - {NT_STATEMENT_TOKEN, ADDRESS_TOKEN, "", 9}, - {NT_STATEMENT_TOKEN, ALIAS_TOKEN, "", 9}, - {NT_STATEMENT_TOKEN, ATTRIB_TOKEN, "", 9}, - {NT_STATEMENT_TOKEN, OUTPUT_TOKEN, "", 9}, - {NT_STATEMENT_TOKEN, PARAM_TOKEN, "", 9}, - {NT_STATEMENT_TOKEN, TEMP_TOKEN, "", 9}, - - {NT_INSTRUCTION_TOKEN, ARL_TOKEN, "", 10}, - - {NT_INSTRUCTION_TOKEN, ABS_TOKEN, "", 11}, - {NT_INSTRUCTION_TOKEN, FLR_TOKEN, "", 11}, - {NT_INSTRUCTION_TOKEN, FRC_TOKEN, "", 11}, - {NT_INSTRUCTION_TOKEN, LIT_TOKEN, "", 11}, - {NT_INSTRUCTION_TOKEN, MOV_TOKEN, "", 11}, - - {NT_INSTRUCTION_TOKEN, EX2_TOKEN, "", 12}, - {NT_INSTRUCTION_TOKEN, EXP_TOKEN, "", 12}, - {NT_INSTRUCTION_TOKEN, LG2_TOKEN, "", 12}, - {NT_INSTRUCTION_TOKEN, LOG_TOKEN, "", 12}, - {NT_INSTRUCTION_TOKEN, RCP_TOKEN, "", 12}, - {NT_INSTRUCTION_TOKEN, RSQ_TOKEN, "", 12}, - - {NT_INSTRUCTION_TOKEN, POW_TOKEN, "", 13}, - - {NT_INSTRUCTION_TOKEN, ADD_TOKEN, "", 14}, - {NT_INSTRUCTION_TOKEN, DP3_TOKEN, "", 14}, - {NT_INSTRUCTION_TOKEN, DP4_TOKEN, "", 14}, - {NT_INSTRUCTION_TOKEN, DPH_TOKEN, "", 14}, - {NT_INSTRUCTION_TOKEN, DST_TOKEN, "", 14}, - {NT_INSTRUCTION_TOKEN, MAX_TOKEN, "", 14}, - {NT_INSTRUCTION_TOKEN, MIN_TOKEN, "", 14}, - {NT_INSTRUCTION_TOKEN, MUL_TOKEN, "", 14}, - {NT_INSTRUCTION_TOKEN, SGE_TOKEN, "", 14}, - {NT_INSTRUCTION_TOKEN, SLT_TOKEN, "", 14}, - {NT_INSTRUCTION_TOKEN, SUB_TOKEN, "", 14}, - {NT_INSTRUCTION_TOKEN, XPD_TOKEN, "", 14}, - - {NT_INSTRUCTION_TOKEN, MAD_TOKEN, "", 15}, - - {NT_INSTRUCTION_TOKEN, SWZ_TOKEN, "", 16}, - - {NT_ARL_INSTRUCTION_TOKEN, ARL_TOKEN, "", 17}, - - {NT_VECTOROP_INSTRUCTION_TOKEN, ABS_TOKEN, "", 18}, - {NT_VECTOROP_INSTRUCTION_TOKEN, FLR_TOKEN, "", 18}, - {NT_VECTOROP_INSTRUCTION_TOKEN, FRC_TOKEN, "", 18}, - {NT_VECTOROP_INSTRUCTION_TOKEN, LIT_TOKEN, "", 18}, - {NT_VECTOROP_INSTRUCTION_TOKEN, MOV_TOKEN, "", 18}, - - {NT_VECTOROP_TOKEN, ABS_TOKEN, "", 19}, - - {NT_VECTOROP_TOKEN, FLR_TOKEN, "", 20}, - - {NT_VECTOROP_TOKEN, FRC_TOKEN, "", 21}, - - {NT_VECTOROP_TOKEN, LIT_TOKEN, "", 22}, - - {NT_VECTOROP_TOKEN, MOV_TOKEN, "", 23}, - - {NT_SCALAROP_INSTRUCTION_TOKEN, EX2_TOKEN, "", 24}, - {NT_SCALAROP_INSTRUCTION_TOKEN, EXP_TOKEN, "", 24}, - {NT_SCALAROP_INSTRUCTION_TOKEN, LG2_TOKEN, "", 24}, - {NT_SCALAROP_INSTRUCTION_TOKEN, LOG_TOKEN, "", 24}, - {NT_SCALAROP_INSTRUCTION_TOKEN, RCP_TOKEN, "", 24}, - {NT_SCALAROP_INSTRUCTION_TOKEN, RSQ_TOKEN, "", 24}, - - {NT_SCALAROP_TOKEN, EX2_TOKEN, "", 25}, - - {NT_SCALAROP_TOKEN, EXP_TOKEN, "", 26}, - - {NT_SCALAROP_TOKEN, LG2_TOKEN, "", 27}, - - {NT_SCALAROP_TOKEN, LOG_TOKEN, "", 28}, - - {NT_SCALAROP_TOKEN, RCP_TOKEN, "", 29}, - - {NT_SCALAROP_TOKEN, RSQ_TOKEN, "", 30}, - - {NT_BINSCOP_INSTRUCTION_TOKEN, POW_TOKEN, "", 31}, - - {NT_BINSCOP_INSTRUCTION2_TOKEN, COMMA_TOKEN, "", 32}, - - {NT_BINSCOP_TOKEN, POW_TOKEN, "", 33}, - - {NT_BINOP_INSTRUCTION_TOKEN, ADD_TOKEN, "", 34}, - {NT_BINOP_INSTRUCTION_TOKEN, DP3_TOKEN, "", 34}, - {NT_BINOP_INSTRUCTION_TOKEN, DP4_TOKEN, "", 34}, - {NT_BINOP_INSTRUCTION_TOKEN, DPH_TOKEN, "", 34}, - {NT_BINOP_INSTRUCTION_TOKEN, DST_TOKEN, "", 34}, - {NT_BINOP_INSTRUCTION_TOKEN, MAX_TOKEN, "", 34}, - {NT_BINOP_INSTRUCTION_TOKEN, MIN_TOKEN, "", 34}, - {NT_BINOP_INSTRUCTION_TOKEN, MUL_TOKEN, "", 34}, - {NT_BINOP_INSTRUCTION_TOKEN, SGE_TOKEN, "", 34}, - {NT_BINOP_INSTRUCTION_TOKEN, SLT_TOKEN, "", 34}, - {NT_BINOP_INSTRUCTION_TOKEN, SUB_TOKEN, "", 34}, - {NT_BINOP_INSTRUCTION_TOKEN, XPD_TOKEN, "", 34}, - - {NT_BINOP_INSTRUCTION2_TOKEN, COMMA_TOKEN, "", 35}, - - {NT_BINOP_TOKEN, ADD_TOKEN, "", 36}, - {NT_BINOP_TOKEN, DP3_TOKEN, "", 37}, - {NT_BINOP_TOKEN, DP4_TOKEN, "", 38}, - {NT_BINOP_TOKEN, DPH_TOKEN, "", 39}, - {NT_BINOP_TOKEN, DST_TOKEN, "", 40}, - {NT_BINOP_TOKEN, MAX_TOKEN, "", 41}, - {NT_BINOP_TOKEN, MIN_TOKEN, "", 42}, - {NT_BINOP_TOKEN, MUL_TOKEN, "", 43}, - {NT_BINOP_TOKEN, SGE_TOKEN, "", 44}, - {NT_BINOP_TOKEN, SLT_TOKEN, "", 45}, - {NT_BINOP_TOKEN, SUB_TOKEN, "", 46}, - {NT_BINOP_TOKEN, XPD_TOKEN, "", 47}, - - {NT_TRIOP_INSTRUCTION_TOKEN, MAD_TOKEN, "", 48}, - {NT_TRIOP_INSTRUCTION2_TOKEN, COMMA_TOKEN, "", 49}, - {NT_TRIOP_INSTRUCTION3_TOKEN, COMMA_TOKEN, "", 50}, - - {NT_TRIOP_TOKEN, MAD_TOKEN, "", 51}, - {NT_SWZ_INSTRUCTION_TOKEN, SWZ_TOKEN, "", 52}, - {NT_SWZ_INSTRUCTION2_TOKEN, COMMA_TOKEN, "", 53}, - - {NT_SCALAR_SRC_REG_TOKEN, PLUS_TOKEN, "", 54}, - {NT_SCALAR_SRC_REG_TOKEN, MINUS_TOKEN, "", 54}, - {NT_SCALAR_SRC_REG_TOKEN, VERTEX_TOKEN, "", 54}, - {NT_SCALAR_SRC_REG_TOKEN, STATE_TOKEN, "", 54}, - {NT_SCALAR_SRC_REG_TOKEN, PROGRAM_TOKEN, "", 54}, - {NT_SCALAR_SRC_REG_TOKEN, LBRACE_TOKEN, "", 54}, - {NT_SCALAR_SRC_REG_TOKEN, FLOAT_TOKEN, "-1", 54}, - {NT_SCALAR_SRC_REG_TOKEN, INTEGER_TOKEN, "-1", 54}, - {NT_SCALAR_SRC_REG_TOKEN, ID_TOKEN, "-1", 54}, - - {NT_SWIZZLE_SRC_REG_TOKEN, PLUS_TOKEN, "", 55}, - {NT_SWIZZLE_SRC_REG_TOKEN, MINUS_TOKEN, "", 55}, - {NT_SWIZZLE_SRC_REG_TOKEN, VERTEX_TOKEN, "", 55}, - {NT_SWIZZLE_SRC_REG_TOKEN, STATE_TOKEN, "", 55}, - {NT_SWIZZLE_SRC_REG_TOKEN, PROGRAM_TOKEN, "", 55}, - {NT_SWIZZLE_SRC_REG_TOKEN, LBRACE_TOKEN, "", 55}, - {NT_SWIZZLE_SRC_REG_TOKEN, FLOAT_TOKEN, "-1", 55}, - {NT_SWIZZLE_SRC_REG_TOKEN, INTEGER_TOKEN, "-1", 55}, - {NT_SWIZZLE_SRC_REG_TOKEN, ID_TOKEN, "-1", 55}, - - {NT_MASKED_DST_REG_TOKEN, ID_TOKEN, "-1", 56}, - {NT_MASKED_DST_REG_TOKEN, RESULT_TOKEN, "", 56}, - {NT_MASKED_ADDR_REG_TOKEN, ID_TOKEN, "-1", 57}, - - {NT_EXTENDED_SWIZZLE_TOKEN, PLUS_TOKEN, "", 58}, - {NT_EXTENDED_SWIZZLE_TOKEN, MINUS_TOKEN, "", 58}, - {NT_EXTENDED_SWIZZLE_TOKEN, INTEGER_TOKEN, "0", 58}, - {NT_EXTENDED_SWIZZLE_TOKEN, INTEGER_TOKEN, "1", 58}, - {NT_EXTENDED_SWIZZLE_TOKEN, ID_TOKEN, "x", 58}, - {NT_EXTENDED_SWIZZLE_TOKEN, ID_TOKEN, "y", 58}, - {NT_EXTENDED_SWIZZLE_TOKEN, ID_TOKEN, "z", 58}, - {NT_EXTENDED_SWIZZLE_TOKEN, ID_TOKEN, "w", 58}, - - {NT_EXTENDED_SWIZZLE2_TOKEN, COMMA_TOKEN, "", 59}, - - {NT_EXT_SWIZ_COMP_TOKEN, PLUS_TOKEN, "", 60}, - {NT_EXT_SWIZ_COMP_TOKEN, MINUS_TOKEN, "", 60}, - {NT_EXT_SWIZ_COMP_TOKEN, INTEGER_TOKEN, "0", 60}, - {NT_EXT_SWIZ_COMP_TOKEN, INTEGER_TOKEN, "1", 60}, - {NT_EXT_SWIZ_COMP_TOKEN, ID_TOKEN, "x", 60}, - {NT_EXT_SWIZ_COMP_TOKEN, ID_TOKEN, "y", 60}, - {NT_EXT_SWIZ_COMP_TOKEN, ID_TOKEN, "z", 60}, - {NT_EXT_SWIZ_COMP_TOKEN, ID_TOKEN, "w", 60}, - - {NT_EXT_SWIZ_SEL_TOKEN, INTEGER_TOKEN, "0", 61}, - {NT_EXT_SWIZ_SEL_TOKEN, INTEGER_TOKEN, "1", 62}, - {NT_EXT_SWIZ_SEL_TOKEN, ID_TOKEN, "x", 63}, - {NT_EXT_SWIZ_SEL_TOKEN, ID_TOKEN, "y", 63}, - {NT_EXT_SWIZ_SEL_TOKEN, ID_TOKEN, "z", 63}, - {NT_EXT_SWIZ_SEL_TOKEN, ID_TOKEN, "w", 63}, +#include "arbparse.h" - /* Special case for 64 - 68 */ - {NT_DST_REG_TOKEN, RESULT_TOKEN, "", 68}, - {NT_VERTEX_ATTRIB_REG_TOKEN, ID_TOKEN, "-1", 69}, - {NT_VERTEX_ATTRIB_REG_TOKEN, VERTEX_TOKEN, "", 70}, - {NT_TEMPORARY_REG_TOKEN, ID_TOKEN, "-1", 71}, - - /* Special case for 72 - 73 */ - - {NT_PROG_PARAM_REG_TOKEN, STATE_TOKEN, "", 74}, - {NT_PROG_PARAM_REG_TOKEN, PROGRAM_TOKEN, "", 74}, - {NT_PROG_PARAM_REG_TOKEN, LBRACE_TOKEN, "", 74}, - {NT_PROG_PARAM_REG_TOKEN, FLOAT_TOKEN, "-1", 74}, - - {NT_PROG_PARAM_SINGLE_TOKEN, ID_TOKEN, "-1", 75}, - {NT_PROG_PARAM_ARRAY_TOKEN, ID_TOKEN, "-1", 76}, - {NT_PROG_PARAM_ARRAY_MEM_TOKEN, INTEGER_TOKEN, "-1", 77}, - {NT_PROG_PARAM_ARRAY_MEM_TOKEN, ID_TOKEN, "-1", 78}, - {NT_PROG_PARAM_ARRAY_ABS_TOKEN, INTEGER_TOKEN, "-1", 79}, - {NT_PROG_PARAM_ARRAY_REL_TOKEN, ID_TOKEN, "-1", 80}, - - {NT_ADDR_REG_REL_OFFSET_TOKEN, RBRACKET_TOKEN, "", 81}, - {NT_ADDR_REG_REL_OFFSET_TOKEN, PLUS_TOKEN, "", 82}, - {NT_ADDR_REG_REL_OFFSET_TOKEN, MINUS_TOKEN, "", 83}, - {NT_ADDR_REG_POS_OFFSET_TOKEN, INTEGER_TOKEN, "-1", 84}, - {NT_ADDR_REG_NEG_OFFSET_TOKEN, INTEGER_TOKEN, "-1", 85}, - - - {NT_VERTEX_RESULT_REG_TOKEN, ID_TOKEN, "-1", 86}, - {NT_VERTEX_RESULT_REG_TOKEN, RESULT_TOKEN, "", 87}, - {NT_ADDR_REG_TOKEN, ID_TOKEN, "-1", 88}, - {NT_ADDR_COMPONENT_TOKEN, PERIOD_TOKEN, "", 89}, - {NT_ADDR_WRITE_MASK_TOKEN, PERIOD_TOKEN, "", 90}, - - {NT_SCALAR_SUFFIX_TOKEN, PERIOD_TOKEN, "", 91}, - - {NT_SWIZZLE_SUFFIX_TOKEN, COMMA_TOKEN, "", 92}, - {NT_SWIZZLE_SUFFIX_TOKEN, SEMICOLON_TOKEN, "", 92}, - {NT_SWIZZLE_SUFFIX_TOKEN, PERIOD_TOKEN, "", 317}, - - {NT_COMPONENT_TOKEN, ID_TOKEN, "x", 93}, - {NT_COMPONENT_TOKEN, ID_TOKEN, "y", 94}, - {NT_COMPONENT_TOKEN, ID_TOKEN, "z", 95}, - {NT_COMPONENT_TOKEN, ID_TOKEN, "w", 96}, - - {NT_OPTIONAL_MASK_TOKEN, PERIOD_TOKEN, "", 97}, - {NT_OPTIONAL_MASK_TOKEN, COMMA_TOKEN, "", 98}, - - {NT_OPTIONAL_MASK2_TOKEN, ID_TOKEN, "x", 99}, - {NT_OPTIONAL_MASK2_TOKEN, ID_TOKEN, "y", 100}, - {NT_OPTIONAL_MASK2_TOKEN, ID_TOKEN, "xy", 101}, - {NT_OPTIONAL_MASK2_TOKEN, ID_TOKEN, "z", 102}, - {NT_OPTIONAL_MASK2_TOKEN, ID_TOKEN, "xz", 103}, - {NT_OPTIONAL_MASK2_TOKEN, ID_TOKEN, "yz", 104}, - {NT_OPTIONAL_MASK2_TOKEN, ID_TOKEN, "xyz", 105}, - {NT_OPTIONAL_MASK2_TOKEN, ID_TOKEN, "w", 106}, - {NT_OPTIONAL_MASK2_TOKEN, ID_TOKEN, "xw", 107}, - {NT_OPTIONAL_MASK2_TOKEN, ID_TOKEN, "yw", 108}, - {NT_OPTIONAL_MASK2_TOKEN, ID_TOKEN, "xyw", 109}, - {NT_OPTIONAL_MASK2_TOKEN, ID_TOKEN, "zw", 110}, - {NT_OPTIONAL_MASK2_TOKEN, ID_TOKEN, "xzw", 111}, - {NT_OPTIONAL_MASK2_TOKEN, ID_TOKEN, "yzw", 112}, - {NT_OPTIONAL_MASK2_TOKEN, ID_TOKEN, "xyzw", 113}, - - - {NT_NAMING_STATEMENT_TOKEN, ATTRIB_TOKEN, "", 114}, - {NT_NAMING_STATEMENT_TOKEN, PARAM_TOKEN, "", 115}, - {NT_NAMING_STATEMENT_TOKEN, TEMP_TOKEN, "", 116}, - {NT_NAMING_STATEMENT_TOKEN, ADDRESS_TOKEN, "", 117}, - {NT_NAMING_STATEMENT_TOKEN, OUTPUT_TOKEN, "", 118}, - {NT_NAMING_STATEMENT_TOKEN, ALIAS_TOKEN, "", 119}, - - {NT_ATTRIB_STATEMENT_TOKEN, ATTRIB_TOKEN, "", 120}, - {NT_VTX_ATTRIB_BINDING_TOKEN, VERTEX_TOKEN, "", 121}, - - {NT_VTX_ATTRIB_ITEM_TOKEN, ID_TOKEN, "position", 122}, - {NT_VTX_ATTRIB_ITEM_TOKEN, ID_TOKEN, "weight", 123}, - {NT_VTX_ATTRIB_ITEM_TOKEN, ID_TOKEN, "normal", 124}, - {NT_VTX_ATTRIB_ITEM_TOKEN, ID_TOKEN, "color", 125}, - {NT_VTX_ATTRIB_ITEM_TOKEN, ID_TOKEN, "fogcoord", 126}, - {NT_VTX_ATTRIB_ITEM_TOKEN, ID_TOKEN, "texcoord", 127}, - {NT_VTX_ATTRIB_ITEM_TOKEN, ID_TOKEN, "matrixindex", 128}, - {NT_VTX_ATTRIB_ITEM_TOKEN, ID_TOKEN, "attrib", 129}, - - {NT_VTX_ATTRIB_NUM_TOKEN, INTEGER_TOKEN, "-1", 130}, - {NT_VTX_OPT_WEIGHT_NUM_TOKEN, SEMICOLON_TOKEN, "", 131}, - {NT_VTX_OPT_WEIGHT_NUM_TOKEN, COMMA_TOKEN, "", 131}, - {NT_VTX_OPT_WEIGHT_NUM_TOKEN, PERIOD_TOKEN, "", 131}, - {NT_VTX_OPT_WEIGHT_NUM_TOKEN, LBRACKET_TOKEN, "", 132}, - - {NT_VTX_WEIGHT_NUM_TOKEN, INTEGER_TOKEN, "-1", 133}, - {NT_PARAM_STATEMENT_TOKEN, PARAM_TOKEN, "", 134}, - {NT_PARAM_STATEMENT2_TOKEN, EQUAL_TOKEN, "", 135}, - {NT_PARAM_STATEMENT2_TOKEN, LBRACKET_TOKEN, "", 136}, - - {NT_OPT_ARRAY_SIZE_TOKEN, RBRACKET_TOKEN, "", 137}, - {NT_OPT_ARRAY_SIZE_TOKEN, INTEGER_TOKEN, "-1", 138}, - - {NT_PARAM_SINGLE_INIT_TOKEN, EQUAL_TOKEN, "", 139}, - {NT_PARAM_MULTIPLE_INIT_TOKEN, EQUAL_TOKEN, "", 140}, - - {NT_PARAM_MULT_INIT_LIST_TOKEN, STATE_TOKEN, "", 141}, - {NT_PARAM_MULT_INIT_LIST_TOKEN, PROGRAM_TOKEN, "", 141}, - {NT_PARAM_MULT_INIT_LIST_TOKEN, PLUS_TOKEN, "", 141}, - {NT_PARAM_MULT_INIT_LIST_TOKEN, MINUS_TOKEN, "", 141}, - {NT_PARAM_MULT_INIT_LIST_TOKEN, FLOAT_TOKEN, "-1", 141}, - {NT_PARAM_MULT_INIT_LIST_TOKEN, INTEGER_TOKEN, "-1", 141}, - {NT_PARAM_MULT_INIT_LIST_TOKEN, LBRACE_TOKEN, "", 141}, - - - {NT_PARAM_MULT_INIT_LIST2_TOKEN, COMMA_TOKEN, "", 142}, - {NT_PARAM_MULT_INIT_LIST2_TOKEN, RBRACE_TOKEN, "", 143}, - - - {NT_PARAM_SINGLE_ITEM_DECL_TOKEN, STATE_TOKEN, "", 144}, - {NT_PARAM_SINGLE_ITEM_DECL_TOKEN, PROGRAM_TOKEN, "", 145}, - {NT_PARAM_SINGLE_ITEM_DECL_TOKEN, PLUS_TOKEN, "", 146}, - {NT_PARAM_SINGLE_ITEM_DECL_TOKEN, MINUS_TOKEN, "", 146}, - {NT_PARAM_SINGLE_ITEM_DECL_TOKEN, FLOAT_TOKEN, "-1", 146}, - {NT_PARAM_SINGLE_ITEM_DECL_TOKEN, INTEGER_TOKEN, "-1", 146}, - {NT_PARAM_SINGLE_ITEM_DECL_TOKEN, LBRACE_TOKEN, "", 146}, - - - {NT_PARAM_SINGLE_ITEM_USE_TOKEN, STATE_TOKEN, "", 147}, - {NT_PARAM_SINGLE_ITEM_USE_TOKEN, PROGRAM_TOKEN, "", 148}, - {NT_PARAM_SINGLE_ITEM_USE_TOKEN, LBRACE_TOKEN, "", 149}, - {NT_PARAM_SINGLE_ITEM_USE_TOKEN, FLOAT_TOKEN, "-1", 149}, - {NT_PARAM_SINGLE_ITEM_USE_TOKEN, INTEGER_TOKEN, "-1", 149}, - - {NT_PARAM_MULTIPLE_ITEM_TOKEN, STATE_TOKEN, "", 150}, - {NT_PARAM_MULTIPLE_ITEM_TOKEN, PROGRAM_TOKEN, "", 151}, - {NT_PARAM_MULTIPLE_ITEM_TOKEN, PLUS_TOKEN, "", 152}, - {NT_PARAM_MULTIPLE_ITEM_TOKEN, MINUS_TOKEN, "", 152}, - {NT_PARAM_MULTIPLE_ITEM_TOKEN, FLOAT_TOKEN, "-1", 152}, - {NT_PARAM_MULTIPLE_ITEM_TOKEN, INTEGER_TOKEN, "-1", 152}, - {NT_PARAM_MULTIPLE_ITEM_TOKEN, LBRACE_TOKEN, "", 152}, - - {NT_STATE_MULTIPLE_ITEM_TOKEN, STATE_TOKEN, "", 153}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, ID_TOKEN, "material", 154}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, ID_TOKEN, "light", 155}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, ID_TOKEN, "lightmodel", 156}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, ID_TOKEN, "lightprod", 157}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, ID_TOKEN, "texgen", 158}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, ID_TOKEN, "fog", 159}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, ID_TOKEN, "clip", 160}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, ID_TOKEN, "point", 161}, - {NT_STATE_MULTIPLE_ITEM2_TOKEN, ID_TOKEN, "matrix", 162}, - - {NT_FOO_TOKEN, PERIOD_TOKEN, "", 163}, - {NT_FOO_TOKEN, COMMA_TOKEN, "", 316}, - {NT_FOO_TOKEN, RBRACE_TOKEN, "", 316}, - {NT_FOO2_TOKEN, ID_TOKEN, "inverse", 164}, - {NT_FOO2_TOKEN, ID_TOKEN, "transpose", 164}, - {NT_FOO2_TOKEN, ID_TOKEN, "invtrans", 164}, - {NT_FOO2_TOKEN, ID_TOKEN, "row", 165}, - {NT_FOO3_TOKEN, COMMA_TOKEN, "", 166}, - {NT_FOO3_TOKEN, RBRACE_TOKEN, "", 166}, - {NT_FOO3_TOKEN, PERIOD_TOKEN, "", 167}, - - {NT_FOO35_TOKEN, INTEGER_TOKEN, "-1", 168}, - {NT_FOO4_TOKEN, RBRACKET_TOKEN, "", 169}, - {NT_FOO4_TOKEN, DOTDOT_TOKEN, "", 170}, - - {NT_STATE_SINGLE_ITEM_TOKEN, STATE_TOKEN, "", 171}, - {NT_STATE_SINGLE_ITEM2_TOKEN, ID_TOKEN, "material", 172}, - {NT_STATE_SINGLE_ITEM2_TOKEN, ID_TOKEN, "light", 173}, - {NT_STATE_SINGLE_ITEM2_TOKEN, ID_TOKEN, "lightmodel", 174}, - {NT_STATE_SINGLE_ITEM2_TOKEN, ID_TOKEN, "lightprod", 175}, - {NT_STATE_SINGLE_ITEM2_TOKEN, ID_TOKEN, "texgen", 176}, - {NT_STATE_SINGLE_ITEM2_TOKEN, ID_TOKEN, "fog", 177}, - {NT_STATE_SINGLE_ITEM2_TOKEN, ID_TOKEN, "clip", 178}, - {NT_STATE_SINGLE_ITEM2_TOKEN, ID_TOKEN, "point", 179}, - {NT_STATE_SINGLE_ITEM2_TOKEN, ID_TOKEN, "matrix", 180}, - - - {NT_STATE_MATERIAL_ITEM_TOKEN, ID_TOKEN, "material", 181}, - {NT_STATE_MATERIAL_ITEM2_TOKEN, ID_TOKEN, "ambient", 182}, - {NT_STATE_MATERIAL_ITEM2_TOKEN, ID_TOKEN, "diffuse", 182}, - {NT_STATE_MATERIAL_ITEM2_TOKEN, ID_TOKEN, "specular", 182}, - {NT_STATE_MATERIAL_ITEM2_TOKEN, ID_TOKEN, "emission", 182}, - {NT_STATE_MATERIAL_ITEM2_TOKEN, ID_TOKEN, "shininess", 182}, - - {NT_STATE_MATERIAL_ITEM2_TOKEN, PERIOD_TOKEN, "", 183}, - {NT_STATE_MAT_PROPERTY_TOKEN, ID_TOKEN, "ambient", 184}, - {NT_STATE_MAT_PROPERTY_TOKEN, ID_TOKEN, "diffuse", 185}, - {NT_STATE_MAT_PROPERTY_TOKEN, ID_TOKEN, "specular", 186}, - {NT_STATE_MAT_PROPERTY_TOKEN, ID_TOKEN, "emission", 187}, - {NT_STATE_MAT_PROPERTY_TOKEN, ID_TOKEN, "shininess", 188}, - - - {NT_STATE_LIGHT_ITEM_TOKEN, ID_TOKEN, "light", 189}, - {NT_STATE_LIGHT_ITEM2_TOKEN, RBRACKET_TOKEN, "", 190}, - - - {NT_STATE_LIGHT_PROPERTY_TOKEN, ID_TOKEN, "ambient", 191}, - {NT_STATE_LIGHT_PROPERTY_TOKEN, ID_TOKEN, "diffuse", 192}, - {NT_STATE_LIGHT_PROPERTY_TOKEN, ID_TOKEN, "specular", 193}, - {NT_STATE_LIGHT_PROPERTY_TOKEN, ID_TOKEN, "position", 194}, - {NT_STATE_LIGHT_PROPERTY_TOKEN, ID_TOKEN, "attenuation", 195}, - {NT_STATE_LIGHT_PROPERTY_TOKEN, ID_TOKEN, "spot", 196}, - {NT_STATE_LIGHT_PROPERTY_TOKEN, ID_TOKEN, "half", 197}, - - {NT_STATE_SPOT_PROPERTY_TOKEN, ID_TOKEN, "direction", 198}, - {NT_STATE_LIGHT_MODEL_ITEM_TOKEN, ID_TOKEN, "lightmodel", 199}, - - - {NT_STATE_LMOD_PROPERTY_TOKEN, PERIOD_TOKEN, "", 200}, - {NT_STATE_LMOD_PROPERTY2_TOKEN, ID_TOKEN, "ambient", 201}, - {NT_STATE_LMOD_PROPERTY2_TOKEN, ID_TOKEN, "scenecolor", 202}, - {NT_STATE_LMOD_PROPERTY2_TOKEN, ID_TOKEN, "front", 203}, - {NT_STATE_LMOD_PROPERTY2_TOKEN, ID_TOKEN, "back", 203}, - - - {NT_STATE_LIGHT_PROD_ITEM_TOKEN, ID_TOKEN, "lightprod", 204}, - {NT_STATE_LIGHT_PROD_ITEM15_TOKEN, RBRACKET_TOKEN, "", 205}, - {NT_STATE_LIGHT_PROD_ITEM2_TOKEN, ID_TOKEN, "ambient", 206}, - {NT_STATE_LIGHT_PROD_ITEM2_TOKEN, ID_TOKEN, "diffuse", 206}, - {NT_STATE_LIGHT_PROD_ITEM2_TOKEN, ID_TOKEN, "specular", 206}, - {NT_STATE_LIGHT_PROD_ITEM2_TOKEN, ID_TOKEN, "front", 207}, - {NT_STATE_LIGHT_PROD_ITEM2_TOKEN, ID_TOKEN, "back", 207}, - - {NT_STATE_LPROD_PROPERTY_TOKEN, ID_TOKEN, "ambient", 208}, - {NT_STATE_LPROD_PROPERTY_TOKEN, ID_TOKEN, "diffuse", 209}, - {NT_STATE_LPROD_PROPERTY_TOKEN, ID_TOKEN, "specular", 210}, - - {NT_STATE_LIGHT_NUMBER_TOKEN, INTEGER_TOKEN, "-1", 211}, - {NT_STATE_TEX_GEN_ITEM_TOKEN, ID_TOKEN, "texgen", 212}, - {NT_STATE_TEX_GEN_ITEM2_TOKEN, PERIOD_TOKEN, "", 213}, - {NT_STATE_TEX_GEN_TYPE_TOKEN, ID_TOKEN, "eye", 214}, - {NT_STATE_TEX_GEN_TYPE_TOKEN, ID_TOKEN, "object", 215}, - - - {NT_STATE_TEX_GEN_COORD_TOKEN, ID_TOKEN, "s", 216}, - {NT_STATE_TEX_GEN_COORD_TOKEN, ID_TOKEN, "t", 217}, - {NT_STATE_TEX_GEN_COORD_TOKEN, ID_TOKEN, "r", 218}, - {NT_STATE_TEX_GEN_COORD_TOKEN, ID_TOKEN, "q", 219}, - - {NT_STATE_FOG_ITEM_TOKEN, ID_TOKEN, "fog", 220}, - - {NT_STATE_FOG_PROPERTY_TOKEN, ID_TOKEN, "color", 221}, - {NT_STATE_FOG_PROPERTY_TOKEN, ID_TOKEN, "params", 222}, - - {NT_STATE_CLIP_PLANE_ITEM_TOKEN, ID_TOKEN, "clip", 223}, - {NT_STATE_CLIP_PLANE_ITEM2_TOKEN, RBRACKET_TOKEN, "", 224}, - {NT_STATE_CLIP_PLANE_NUM_TOKEN, INTEGER_TOKEN, "-1", 225}, - {NT_STATE_POINT_ITEM_TOKEN, ID_TOKEN, "point", 226}, - {NT_STATE_POINT_PROPERTY_TOKEN, ID_TOKEN, "size", 227}, - {NT_STATE_POINT_PROPERTY_TOKEN, ID_TOKEN, "attenuation", 228}, - - - {NT_STATE_MATRIX_ROW_TOKEN, ID_TOKEN, "matrix", 229}, - {NT_STATE_MATRIX_ROW15_TOKEN, PERIOD_TOKEN, "", 230}, - {NT_STATE_MATRIX_ROW2_TOKEN, ID_TOKEN, "row", 231}, - {NT_STATE_MATRIX_ROW2_TOKEN, ID_TOKEN, "inverse", 232}, - {NT_STATE_MATRIX_ROW2_TOKEN, ID_TOKEN, "transpose", 232}, - {NT_STATE_MATRIX_ROW2_TOKEN, ID_TOKEN, "invtrans", 232}, - {NT_STATE_MATRIX_ROW3_TOKEN, LBRACKET_TOKEN, "", 233}, - - {NT_STATE_MAT_MODIFIER_TOKEN, ID_TOKEN, "inverse", 234}, - {NT_STATE_MAT_MODIFIER_TOKEN, ID_TOKEN, "transpose", 235}, - {NT_STATE_MAT_MODIFIER_TOKEN, ID_TOKEN, "invtrans", 236}, - {NT_STATE_MATRIX_ROW_NUM_TOKEN, INTEGER_TOKEN, "-1", 237}, - - - {NT_STATE_MATRIX_NAME_TOKEN, ID_TOKEN, "modelview", 238}, - {NT_STATE_MATRIX_NAME_TOKEN, ID_TOKEN, "projection", 239}, - {NT_STATE_MATRIX_NAME_TOKEN, ID_TOKEN, "mvp", 240}, - {NT_STATE_MATRIX_NAME_TOKEN, ID_TOKEN, "texture", 241}, - {NT_STATE_MATRIX_NAME_TOKEN, ID_TOKEN, "palette", 242}, - {NT_STATE_MATRIX_NAME_TOKEN, PROGRAM_TOKEN, "", 243}, - - {NT_STATE_OPT_MOD_MAT_NUM_TOKEN, PERIOD_TOKEN, "", 244}, - {NT_STATE_OPT_MOD_MAT_NUM_TOKEN, COMMA_TOKEN, "", 244}, - {NT_STATE_OPT_MOD_MAT_NUM_TOKEN, RBRACE_TOKEN, "", 244}, - {NT_STATE_OPT_MOD_MAT_NUM_TOKEN, LBRACKET_TOKEN, "", 245}, - - {NT_STATE_MOD_MAT_NUM_TOKEN, INTEGER_TOKEN, "-1", 246}, - {NT_STATE_PALETTE_MAT_NUM_TOKEN, INTEGER_TOKEN, "-1", 247}, - {NT_STATE_PROGRAM_MAT_NUM_TOKEN, INTEGER_TOKEN, "-1", 248}, - - {NT_PROGRAM_SINGLE_ITEM_TOKEN, PROGRAM_TOKEN, "", 249}, - {NT_PROGRAM_SINGLE_ITEM2_TOKEN, ID_TOKEN, "env", 250}, - {NT_PROGRAM_SINGLE_ITEM2_TOKEN, ID_TOKEN, "local", 251}, - - - {NT_PROGRAM_MULTIPLE_ITEM_TOKEN, PROGRAM_TOKEN, "", 252}, - {NT_PROGRAM_MULTIPLE_ITEM2_TOKEN, ID_TOKEN, "env", 253}, - {NT_PROGRAM_MULTIPLE_ITEM2_TOKEN, ID_TOKEN, "local", 254}, - {NT_PROG_ENV_PARAMS_TOKEN, ID_TOKEN, "env", 255}, - {NT_PROG_ENV_PARAM_NUMS_TOKEN, INTEGER_TOKEN, "-1", 256}, - {NT_PROG_ENV_PARAM_NUMS2_TOKEN, DOTDOT_TOKEN, "", 257}, - {NT_PROG_ENV_PARAM_NUMS2_TOKEN, RBRACKET_TOKEN, "", 258}, - {NT_PROG_ENV_PARAM_TOKEN, ID_TOKEN, "env", 259}, - - {NT_PROG_LOCAL_PARAMS_TOKEN, ID_TOKEN, "local", 260}, - {NT_PROG_LOCAL_PARAM_NUMS_TOKEN, INTEGER_TOKEN, "-1", 261}, - {NT_PROG_LOCAL_PARAM_NUMS2_TOKEN, DOTDOT_TOKEN, "", 262}, - {NT_PROG_LOCAL_PARAM_NUMS2_TOKEN, RBRACKET_TOKEN, "", 263}, - {NT_PROG_LOCAL_PARAM_TOKEN, ID_TOKEN, "local", 264}, - {NT_PROG_ENV_PARAM_NUM_TOKEN, INTEGER_TOKEN, "-1", 265}, - {NT_PROG_LOCAL_PARAM_NUM_TOKEN, INTEGER_TOKEN, "-1", 266}, - {NT_PARAM_CONST_DECL_TOKEN, PLUS_TOKEN, "", 267}, - {NT_PARAM_CONST_DECL_TOKEN, MINUS_TOKEN, "", 267}, - {NT_PARAM_CONST_DECL_TOKEN, FLOAT_TOKEN, "-1", 267}, - {NT_PARAM_CONST_DECL_TOKEN, INTEGER_TOKEN, "-1", 267}, - {NT_PARAM_CONST_DECL_TOKEN, LBRACE_TOKEN, "", 268}, - - {NT_PARAM_CONST_USE_TOKEN, FLOAT_TOKEN, "-1", 269}, - {NT_PARAM_CONST_USE_TOKEN, INTEGER_TOKEN, "-1", 269}, - {NT_PARAM_CONST_USE_TOKEN, LBRACE_TOKEN, "", 270}, - - - {NT_PARAM_CONST_SCALAR_DECL_TOKEN, PLUS_TOKEN, "", 271}, - {NT_PARAM_CONST_SCALAR_DECL_TOKEN, MINUS_TOKEN, "", 271}, - {NT_PARAM_CONST_SCALAR_DECL_TOKEN, FLOAT_TOKEN, "-1", 271}, - {NT_PARAM_CONST_SCALAR_DECL_TOKEN, INTEGER_TOKEN, "-1", 271}, - - {NT_PARAM_CONST_SCALAR_USE_TOKEN, FLOAT_TOKEN, "-1", 272}, - {NT_PARAM_CONST_SCALAR_USE_TOKEN, INTEGER_TOKEN, "-1", 272}, - {NT_PARAM_CONST_VECTOR_TOKEN, LBRACE_TOKEN, "", 273}, - {NT_PARAM_CONST_VECTOR2_TOKEN, RBRACE_TOKEN, "", 274}, - {NT_PARAM_CONST_VECTOR2_TOKEN, COMMA_TOKEN, "", 275}, - {NT_PARAM_CONST_VECTOR3_TOKEN, RBRACE_TOKEN, "", 276}, - {NT_PARAM_CONST_VECTOR3_TOKEN, COMMA_TOKEN, "", 277}, - {NT_PARAM_CONST_VECTOR4_TOKEN, RBRACE_TOKEN, "", 278}, - {NT_PARAM_CONST_VECTOR4_TOKEN, COMMA_TOKEN, "", 279}, - - {NT_SIGNED_FLOAT_CONSTANT_TOKEN, PLUS_TOKEN, "", 280}, - {NT_SIGNED_FLOAT_CONSTANT_TOKEN, MINUS_TOKEN, "", 280}, - {NT_SIGNED_FLOAT_CONSTANT_TOKEN, FLOAT_TOKEN, "-1", 280}, - {NT_SIGNED_FLOAT_CONSTANT_TOKEN, INTEGER_TOKEN, "-1", 280}, - - {NT_OPTIONAL_SIGN_TOKEN, FLOAT_TOKEN, "-1", 281}, - {NT_OPTIONAL_SIGN_TOKEN, INTEGER_TOKEN, "0", 281}, - {NT_OPTIONAL_SIGN_TOKEN, INTEGER_TOKEN, "1", 281}, - {NT_OPTIONAL_SIGN_TOKEN, INTEGER_TOKEN, "-1", 281}, - {NT_OPTIONAL_SIGN_TOKEN, ID_TOKEN, "-1", 281}, - {NT_OPTIONAL_SIGN_TOKEN, STATE_TOKEN, "", 281}, - {NT_OPTIONAL_SIGN_TOKEN, PROGRAM_TOKEN, "", 281}, - {NT_OPTIONAL_SIGN_TOKEN, VERTEX_TOKEN, "", 281}, - {NT_OPTIONAL_SIGN_TOKEN, LBRACE_TOKEN, "", 281}, - - - {NT_OPTIONAL_SIGN_TOKEN, MINUS_TOKEN, "", 282}, - {NT_OPTIONAL_SIGN_TOKEN, PLUS_TOKEN, "", 283}, - - {NT_TEMP_STATEMENT_TOKEN, TEMP_TOKEN, "", 284}, - {NT_ADDRESS_STATEMENT_TOKEN, ADDRESS_TOKEN, "", 285}, - - /* Special case 286-7 */ - - {NT_OUTPUT_STATEMENT_TOKEN, OUTPUT_TOKEN, "", 288}, - {NT_RESULT_BINDING_TOKEN, RESULT_TOKEN, "", 289}, - {NT_RESULT_BINDING2_TOKEN, ID_TOKEN, "position", 290}, - {NT_RESULT_BINDING2_TOKEN, ID_TOKEN, "fogcoord", 291}, - {NT_RESULT_BINDING2_TOKEN, ID_TOKEN, "pointsize", 292}, - {NT_RESULT_BINDING2_TOKEN, ID_TOKEN, "color", 293}, - {NT_RESULT_BINDING2_TOKEN, ID_TOKEN, "texcoord", 294}, - - {NT_RESULT_COL_BINDING_TOKEN, ID_TOKEN, "color", 295}, - - /* Special case 296-7 */ - - {NT_RESULT_COL_BINDING3_TOKEN, ID_TOKEN, "front", 298}, - {NT_RESULT_COL_BINDING3_TOKEN, ID_TOKEN, "back", 299}, - - /* Special case 300-301 */ - - {NT_RESULT_COL_BINDING5_TOKEN, ID_TOKEN, "primary", 302}, - {NT_RESULT_COL_BINDING5_TOKEN, ID_TOKEN, "secondary", 303}, - {NT_OPT_FACE_TYPE2_TOKEN, ID_TOKEN, "front", 304}, - {NT_OPT_FACE_TYPE2_TOKEN, ID_TOKEN, "back", 305}, - - /* Special case 306-7 */ - - {NT_OPT_COLOR_TYPE2_TOKEN, ID_TOKEN, "primary", 308}, - {NT_OPT_COLOR_TYPE2_TOKEN, ID_TOKEN, "secondary", 309}, - - {NT_OPT_TEX_COORD_NUM_TOKEN, PERIOD_TOKEN, "", 310}, - {NT_OPT_TEX_COORD_NUM_TOKEN, SEMICOLON_TOKEN, "", 310}, - {NT_OPT_TEX_COORD_NUM_TOKEN, COMMA_TOKEN, "", 310}, - {NT_OPT_TEX_COORD_NUM_TOKEN, RBRACE_TOKEN, "", 310}, - {NT_OPT_TEX_COORD_NUM_TOKEN, LBRACKET_TOKEN, "", 311}, - - {NT_TEX_COORD_NUM_TOKEN, INTEGER_TOKEN, "-1", 312}, - - /* Special case for 313 to get aliasing correct */ - - {NT_ESTABLISH_NAME_TOKEN, ID_TOKEN, "-1", 314}, - {NT_ESTABLISHED_NAME_TOKEN, ID_TOKEN, "-1", 315}, - - /* Special case for 318-9 */ -}; - -static GLint nprods = sizeof(ptab) / sizeof(prod_table); -static GLint nlas = sizeof(latab) / sizeof(look_ahead_table); - -/** - * This is a gigantic FSA to recognize the keywords put forth in the - * GL_ARB_vertex_program spec. - * - * All other tokens are deemed 'identifiers', and shoved into the - * identifier symbol table (as opposed to the GLint and GLfloat symbol tables) - * - * \param s The parse state - * \param token The next token seen is returned in this value - * \param token_attr The token attribute for the next token is returned here. This - * is the index into the approprate symbol table if token is INTEGER_TOKEN, - * FLOAT_TOKEN, or ID_TOKEN - * - * \return ARB_VP_ERROR on lex error, ARB_VP_SUCESS on sucess - */ -static GLint -get_next_token(parse_state * s, GLint * token, GLint * token_attr) -{ - GLubyte curr; - - while (s->start_pos < s->len) { - curr = s->str[s->curr_pos]; - - switch (s->curr_state) { - /* Default state */ - case STATE_BASE: - if (IS_WHITESPACE(curr)) { - s->start_pos++; - s->curr_pos++; - } - else { - if (IS_IDCHAR(curr)) { - switch (curr) { - case 'A': - ADV_TO_STATE(STATE_A); - break; - - case 'D': - ADV_TO_STATE(STATE_D); - break; - - case 'E': - ADV_TO_STATE(STATE_E); - break; - - case 'F': - ADV_TO_STATE(STATE_F); - break; - - case 'L': - ADV_TO_STATE(STATE_L); - break; - - case 'M': - ADV_TO_STATE(STATE_M); - break; - - case 'O': - ADV_TO_STATE(STATE_O); - break; - - case 'P': - ADV_TO_STATE(STATE_P); - break; - - case 'R': - ADV_TO_STATE(STATE_R); - break; - - case 'S': - ADV_TO_STATE(STATE_S); - break; - - case 'T': - ADV_TO_STATE(STATE_T); - break; - - case 'X': - ADV_TO_STATE(STATE_X); - break; - - case 'p': - ADV_TO_STATE(STATE_LC_P); - break; - - case 'r': - ADV_TO_STATE(STATE_LC_R); - break; - - case 's': - ADV_TO_STATE(STATE_LC_S); - break; - - case 'v': - ADV_TO_STATE(STATE_LC_V); - break; - - default: - s->curr_state = 1; - s->start_pos = s->curr_pos; - s->curr_pos++; - } - } - else if (IS_DIGIT(curr)) { - ADV_TO_STATE(STATE_N4); - } - else { - switch (curr) { - case '#': - ADV_TO_STATE(STATE_COMMENT); - break; - case ';': - ADV_AND_FINISH(SEMICOLON_TOKEN); - break; - case ',': - ADV_AND_FINISH(COMMA_TOKEN); - break; - case '+': - ADV_AND_FINISH(PLUS_TOKEN); - break; - case '-': - ADV_AND_FINISH(MINUS_TOKEN); - break; - case '[': - ADV_AND_FINISH(LBRACKET_TOKEN); - break; - case ']': - ADV_AND_FINISH(RBRACKET_TOKEN); - break; - case '{': - ADV_AND_FINISH(LBRACE_TOKEN); - break; - case '}': - ADV_AND_FINISH(RBRACE_TOKEN); - break; - case '=': - ADV_AND_FINISH(EQUAL_TOKEN); - break; - - case '.': - ADV_TO_STATE(STATE_N1); - break; - - default: - return ARB_VP_ERROR; - break; - } - } - } - break; - - - /* Main identifier state */ - case STATE_IDENT: - if (IS_CD(curr)) { - s->curr_pos++; - } - else { - *token = ID_TOKEN; - *token_attr = - id_table_add(&s->idents, s->str, s->start_pos, s->curr_pos); - - s->curr_state = 0; - s->start_pos = s->curr_pos; - return ARB_VP_SUCESS; - } - break; - - /* ----------------------------------------------------- - * Beginning of the A* keywords - */ - case STATE_A: - if (IS_CD(curr)) { - switch (curr) { - case 'B': - ADV_TO_STATE(STATE_AB); - break; - case 'D': - ADV_TO_STATE(STATE_AD); - break; - case 'L': - ADV_TO_STATE(STATE_AL); - break; - case 'R': - ADV_TO_STATE(STATE_AR); - break; - case 'T': - ADV_TO_STATE(STATE_AT); - break; - default: - ADV_TO_STATE(STATE_IDENT); - break; - } - } - else { - s->curr_state = 1; - } - break; - - case STATE_AB: - ADV_OR_FALLBACK('S', STATE_ABS); - break; - - case STATE_ABS: - FINISH_OR_FALLBACK(ABS_TOKEN); - break; - - case STATE_AD: - ADV_OR_FALLBACK('D', STATE_ADD); - break; - - case STATE_ADD: - if (curr == 'R') { - ADV_TO_STATE(STATE_ADDR); - } - else if (IS_CD(curr)) { - ADV_TO_STATE(STATE_IDENT); - } - else { - FINISH(ADD_TOKEN); - } - break; - - case STATE_ADDR: - ADV_OR_FALLBACK('E', STATE_ADDRE); - break; - - case STATE_ADDRE: - ADV_OR_FALLBACK('S', STATE_ADDRES); - break; - - case STATE_ADDRES: - ADV_OR_FALLBACK('S', STATE_ADDRESS); - break; - - case STATE_ADDRESS: - FINISH_OR_FALLBACK(ADDRESS_TOKEN); - break; - - case STATE_AL: - ADV_OR_FALLBACK('I', STATE_ALI); - break; - - case STATE_ALI: - ADV_OR_FALLBACK('A', STATE_ALIA); - break; - - case STATE_ALIA: - ADV_OR_FALLBACK('S', STATE_ALIAS); - break; - - case STATE_ALIAS: - FINISH_OR_FALLBACK(ALIAS_TOKEN); - break; - - case STATE_AR: - ADV_OR_FALLBACK('L', STATE_ARL); - break; - - case STATE_ARL: - FINISH_OR_FALLBACK(ARL_TOKEN); - break; - - case STATE_AT: - ADV_OR_FALLBACK('T', STATE_ATT); - break; - - case STATE_ATT: - ADV_OR_FALLBACK('R', STATE_ATTR); - break; - - case STATE_ATTR: - ADV_OR_FALLBACK('I', STATE_ATTRI); - break; - - case STATE_ATTRI: - ADV_OR_FALLBACK('B', STATE_ATTRIB); - break; - - case STATE_ATTRIB: - FINISH_OR_FALLBACK(ATTRIB_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the D* keywords - */ - case STATE_D: - if (IS_CD(curr)) { - switch (curr) { - case 'P': - ADV_TO_STATE(STATE_DP); - break; - case 'S': - ADV_TO_STATE(STATE_DS); - break; - default: - ADV_TO_STATE(STATE_IDENT); - break; - } - } - else { - s->curr_state = 1; - } - break; - - case STATE_DP: - if (IS_CD(curr)) { - switch (curr) { - case '3': - ADV_TO_STATE(STATE_DP3); - break; - case '4': - ADV_TO_STATE(STATE_DP4); - break; - case 'H': - ADV_TO_STATE(STATE_DPH); - break; - default: - ADV_TO_STATE(STATE_IDENT); - break; - } - } - else { - s->curr_state = 1; - } - break; - - case STATE_DP3: - FINISH_OR_FALLBACK(DP3_TOKEN); - break; - - case STATE_DP4: - FINISH_OR_FALLBACK(DP4_TOKEN); - break; - - case STATE_DPH: - FINISH_OR_FALLBACK(DPH_TOKEN); - break; - - case STATE_DS: - ADV_OR_FALLBACK('T', STATE_DST); - break; - - case STATE_DST: - FINISH_OR_FALLBACK(DST_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the E* keywords - */ - case STATE_E: - if (IS_CD(curr)) { - switch (curr) { - case 'N': - ADV_TO_STATE(STATE_EN); - break; - case 'X': - ADV_TO_STATE(STATE_EX); - break; - default: - ADV_TO_STATE(STATE_IDENT); - break; - } - } - else { - s->curr_state = 1; - } - break; - - case STATE_EN: - ADV_OR_FALLBACK('D', STATE_END); - break; - - case STATE_END: - FINISH_OR_FALLBACK(END_TOKEN); - break; - - case STATE_EX: - if (IS_CD(curr)) { - switch (curr) { - case '2': - ADV_TO_STATE(STATE_EX2); - break; - case 'P': - ADV_TO_STATE(STATE_EXP); - break; - default: - ADV_TO_STATE(STATE_IDENT); - break; - } - } - else { - s->curr_state = 1; - } - break; - - case STATE_EX2: - FINISH_OR_FALLBACK(EX2_TOKEN); - break; - - case STATE_EXP: - FINISH_OR_FALLBACK(EXP_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the F* keywords - */ - case STATE_F: - if (IS_CD(curr)) { - switch (curr) { - case 'L': - ADV_TO_STATE(STATE_FL); - break; - case 'R': - ADV_TO_STATE(STATE_FR); - break; - default: - ADV_TO_STATE(STATE_IDENT); - break; - } - } - else { - s->curr_state = 1; - } - break; - - case STATE_FL: - ADV_OR_FALLBACK('R', STATE_FLR); - break; - - case STATE_FLR: - FINISH_OR_FALLBACK(FLR_TOKEN); - break; - - case STATE_FR: - ADV_OR_FALLBACK('C', STATE_FRC); - break; - - case STATE_FRC: - FINISH_OR_FALLBACK(FRC_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the L* keywords - */ - case STATE_L: - if (IS_CD(curr)) { - switch (curr) { - case 'G': - ADV_TO_STATE(STATE_LG); - break; - case 'I': - ADV_TO_STATE(STATE_LI); - break; - case 'O': - ADV_TO_STATE(STATE_LO); - break; - default: - ADV_TO_STATE(STATE_IDENT); - break; - } - } - else { - s->curr_state = 1; - } - break; - - case STATE_LG: - ADV_OR_FALLBACK('2', STATE_LG2); - break; - - case STATE_LG2: - FINISH_OR_FALLBACK(LG2_TOKEN); - break; - - case STATE_LI: - ADV_OR_FALLBACK('T', STATE_LIT); - break; - - case STATE_LIT: - FINISH_OR_FALLBACK(LIT_TOKEN); - break; - - case STATE_LO: - ADV_OR_FALLBACK('G', STATE_LOG); - break; - - case STATE_LOG: - FINISH_OR_FALLBACK(LOG_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the M* keywords - */ - case STATE_M: - if (IS_CD(curr)) { - switch (curr) { - case 'A': - ADV_TO_STATE(STATE_MA); - break; - case 'I': - ADV_TO_STATE(STATE_MI); - break; - case 'O': - ADV_TO_STATE(STATE_MO); - break; - case 'U': - ADV_TO_STATE(STATE_MU); - break; - default: - ADV_TO_STATE(STATE_IDENT); - break; - } - } - else { - s->curr_state = 1; - } - break; - - case STATE_MA: - if (IS_CD(curr)) { - switch (curr) { - case 'D': - ADV_TO_STATE(STATE_MAD); - break; - case 'X': - ADV_TO_STATE(STATE_MAX); - break; - default: - ADV_TO_STATE(STATE_IDENT); - break; - } - } - else { - s->curr_state = 1; - } - break; - - case STATE_MAD: - FINISH_OR_FALLBACK(MAD_TOKEN); - break; - - case STATE_MAX: - FINISH_OR_FALLBACK(MAX_TOKEN); - break; - - case STATE_MI: - ADV_OR_FALLBACK('N', STATE_MIN); - break; - - case STATE_MIN: - FINISH_OR_FALLBACK(MIN_TOKEN); - break; - - case STATE_MO: - ADV_OR_FALLBACK('V', STATE_MOV); - break; - - case STATE_MOV: - FINISH_OR_FALLBACK(MOV_TOKEN); - break; - - case STATE_MU: - ADV_OR_FALLBACK('L', STATE_MUL); - break; - - case STATE_MUL: - FINISH_OR_FALLBACK(MUL_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the O* keywords - */ - case STATE_O: - if (IS_CD(curr)) { - switch (curr) { - case 'P': - ADV_TO_STATE(STATE_OP); - break; - case 'U': - ADV_TO_STATE(STATE_OU); - break; - default: - ADV_TO_STATE(STATE_IDENT); - break; - } - } - else { - s->curr_state = 1; - } - break; - - case STATE_OP: - ADV_OR_FALLBACK('T', STATE_OPT); - break; - - case STATE_OPT: - ADV_OR_FALLBACK('I', STATE_OPTI); - break; - - case STATE_OPTI: - ADV_OR_FALLBACK('O', STATE_OPTIO); - break; - - case STATE_OPTIO: - ADV_OR_FALLBACK('N', STATE_OPTION); - break; - - case STATE_OPTION: - FINISH_OR_FALLBACK(OPTION_TOKEN); - break; - - case STATE_OU: - ADV_OR_FALLBACK('T', STATE_OUT); - break; - - case STATE_OUT: - ADV_OR_FALLBACK('P', STATE_OUTP); - break; - - case STATE_OUTP: - ADV_OR_FALLBACK('U', STATE_OUTPU); - break; - - case STATE_OUTPU: - ADV_OR_FALLBACK('T', STATE_OUTPUT); - break; - - case STATE_OUTPUT: - FINISH_OR_FALLBACK(OUTPUT_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the P* keywords - */ - case STATE_P: - if (IS_CD(curr)) { - switch (curr) { - case 'A': - ADV_TO_STATE(STATE_PA); - break; - case 'O': - ADV_TO_STATE(STATE_PO); - break; - default: - ADV_TO_STATE(STATE_IDENT); - break; - } - } - else { - s->curr_state = 1; - } - break; - - case STATE_PA: - ADV_OR_FALLBACK('R', STATE_PAR); - break; - - case STATE_PAR: - ADV_OR_FALLBACK('A', STATE_PARA); - break; - - case STATE_PARA: - ADV_OR_FALLBACK('M', STATE_PARAM); - break; - - case STATE_PARAM: - FINISH_OR_FALLBACK(PARAM_TOKEN); - break; - - case STATE_PO: - ADV_OR_FALLBACK('W', STATE_POW); - break; - - case STATE_POW: - FINISH_OR_FALLBACK(POW_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the R* keywords - */ - case STATE_R: - if (IS_CD(curr)) { - switch (curr) { - case 'C': - ADV_TO_STATE(STATE_RC); - break; - case 'S': - ADV_TO_STATE(STATE_RS); - break; - default: - ADV_TO_STATE(STATE_IDENT); - break; - } - } - else { - s->curr_state = 1; - } - break; - - case STATE_RC: - ADV_OR_FALLBACK('P', STATE_RCP); - break; - - case STATE_RCP: - FINISH_OR_FALLBACK(RCP_TOKEN); - break; - - case STATE_RS: - ADV_OR_FALLBACK('Q', STATE_RSQ); - break; - - case STATE_RSQ: - FINISH_OR_FALLBACK(RSQ_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the S* keywords - */ - case STATE_S: - if (IS_CD(curr)) { - switch (curr) { - case 'G': - ADV_TO_STATE(STATE_SG); - break; - case 'L': - ADV_TO_STATE(STATE_SL); - break; - case 'U': - ADV_TO_STATE(STATE_SU); - break; - case 'W': - ADV_TO_STATE(STATE_SW); - break; - default: - ADV_TO_STATE(STATE_IDENT); - break; - } - } - else { - s->curr_state = 1; - } - break; - - case STATE_SG: - ADV_OR_FALLBACK('E', STATE_SGE); - break; - - case STATE_SGE: - FINISH_OR_FALLBACK(SGE_TOKEN); - break; - - case STATE_SL: - ADV_OR_FALLBACK('T', STATE_SLT); - break; - - case STATE_SLT: - FINISH_OR_FALLBACK(SLT_TOKEN); - break; - - case STATE_SU: - ADV_OR_FALLBACK('B', STATE_SUB); - break; - - case STATE_SUB: - FINISH_OR_FALLBACK(SUB_TOKEN); - break; - - case STATE_SW: - ADV_OR_FALLBACK('Z', STATE_SWZ); - break; - - case STATE_SWZ: - FINISH_OR_FALLBACK(SWZ_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the T* keywords - */ - case STATE_T: - ADV_OR_FALLBACK('E', STATE_TE); - break; - - case STATE_TE: - ADV_OR_FALLBACK('M', STATE_TEM); - break; - - case STATE_TEM: - ADV_OR_FALLBACK('P', STATE_TEMP); - break; - - case STATE_TEMP: - FINISH_OR_FALLBACK(TEMP_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the X* keywords - */ - case STATE_X: - ADV_OR_FALLBACK('P', STATE_XP); - break; - - case STATE_XP: - ADV_OR_FALLBACK('D', STATE_XPD); - break; - - case STATE_XPD: - FINISH_OR_FALLBACK(XPD_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the p* keywords - */ - case STATE_LC_P: - ADV_OR_FALLBACK('r', STATE_LC_PR); - break; - - case STATE_LC_PR: - ADV_OR_FALLBACK('o', STATE_LC_PRO); - break; - - case STATE_LC_PRO: - ADV_OR_FALLBACK('g', STATE_LC_PROG); - break; - - case STATE_LC_PROG: - ADV_OR_FALLBACK('r', STATE_LC_PROGR); - break; - - case STATE_LC_PROGR: - ADV_OR_FALLBACK('a', STATE_LC_PROGRA); - break; - - case STATE_LC_PROGRA: - ADV_OR_FALLBACK('m', STATE_LC_PROGRAM); - break; - - case STATE_LC_PROGRAM: - FINISH_OR_FALLBACK(PROGRAM_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the r* keywords - */ - case STATE_LC_R: - ADV_OR_FALLBACK('e', STATE_LC_RE); - break; - - case STATE_LC_RE: - ADV_OR_FALLBACK('s', STATE_LC_RES); - break; - - case STATE_LC_RES: - ADV_OR_FALLBACK('u', STATE_LC_RESU); - break; - - case STATE_LC_RESU: - ADV_OR_FALLBACK('l', STATE_LC_RESUL); - break; - - case STATE_LC_RESUL: - ADV_OR_FALLBACK('t', STATE_LC_RESULT); - break; - - case STATE_LC_RESULT: - FINISH_OR_FALLBACK(RESULT_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the s* keywords - */ - case STATE_LC_S: - ADV_OR_FALLBACK('t', STATE_LC_ST); - break; - - case STATE_LC_ST: - ADV_OR_FALLBACK('a', STATE_LC_STA); - break; - - case STATE_LC_STA: - ADV_OR_FALLBACK('t', STATE_LC_STAT); - break; - - case STATE_LC_STAT: - ADV_OR_FALLBACK('e', STATE_LC_STATE); - break; - - case STATE_LC_STATE: - FINISH_OR_FALLBACK(STATE_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the v* keywords - */ - case STATE_LC_V: - ADV_OR_FALLBACK('e', STATE_LC_VE); - break; - - case STATE_LC_VE: - ADV_OR_FALLBACK('r', STATE_LC_VER); - break; - - case STATE_LC_VER: - ADV_OR_FALLBACK('t', STATE_LC_VERT); - break; - - case STATE_LC_VERT: - ADV_OR_FALLBACK('e', STATE_LC_VERTE); - break; - - case STATE_LC_VERTE: - ADV_OR_FALLBACK('x', STATE_LC_VERTEX); - break; - - case STATE_LC_VERTEX: - FINISH_OR_FALLBACK(VERTEX_TOKEN); - break; - - /* ----------------------------------------------------- - * Beginning of the number & comment FSAs - */ - case STATE_N1: - if (curr == '.') { - ADV_TO_STATE(STATE_N2); - } - else if (IS_DIGIT(curr)) { - ADV_TO_STATE(STATE_N3); - } - else { - /*ADV_AND_FINISH(PERIOD_TOKEN); */ - FINISH(PERIOD_TOKEN); - } - break; - - case STATE_N2: -#if 1 - /*ADV_AND_FINISH(DOTDOT_TOKEN);*/ - FINISH(DOTDOT_TOKEN); -#else - FINISH(PERIOD_TOKEN); -#endif - break; - - case STATE_N3: - if (IS_DIGIT(curr)) { - ADV_TO_STATE(STATE_N3); - } - else if ((curr == 'E') || (curr == 'e')) { - ADV_TO_STATE(STATE_N5); - } - else if (curr == '.') { - /* Blech! we have something like 1.. -> have to backup */ - s->curr_pos -= 1; - *token_attr = - int_table_add(&s->ints, s->str, s->start_pos, s->curr_pos); - FINISH(INTEGER_TOKEN); - } - else { - *token_attr = - float_table_add(&s->floats, s->str, s->start_pos, s->curr_pos); - /*ADV_AND_FINISH(FLOAT_TOKEN);*/ - FINISH(FLOAT_TOKEN); - } - break; - - case STATE_N4: - if (IS_DIGIT(curr)) { - ADV_TO_STATE(STATE_N4); - } - else if ((curr == 'E') || (curr == 'e')) { - ADV_TO_STATE(STATE_N5); - } - else if (curr == '.') { - ADV_TO_STATE(STATE_N3); - } - else { - *token_attr = - int_table_add(&s->ints, s->str, s->start_pos, s->curr_pos); - /*ADV_AND_FINISH(INTEGER_TOKEN);*/ - FINISH(INTEGER_TOKEN); - } - break; - - case STATE_N5: - if (IS_DIGIT(curr)) { - ADV_TO_STATE(STATE_N6); - } - else if ((curr == '+') || (curr == '-')) { - ADV_TO_STATE(STATE_N7) - } - else { - return ARB_VP_ERROR; - } - break; - - case STATE_N6: - if (IS_DIGIT(curr)) { - ADV_TO_STATE(STATE_N6); - } - else { - *token_attr = - float_table_add(&s->floats, s->str, s->start_pos, s->curr_pos); - /*ADV_AND_FINISH(FLOAT_TOKEN);*/ - FINISH(FLOAT_TOKEN); - } - break; - - case STATE_N7: - if (IS_DIGIT(curr)) { - ADV_TO_STATE(STATE_N6); - } - else { - return ARB_VP_ERROR; - } - - break; - - case STATE_COMMENT: - if ((curr == '\n') || (curr == '\r')) { - s->start_pos = s->curr_pos + 1; - s->curr_pos++; - s->curr_state = 0; - } - else { - ADV_TO_STATE(STATE_COMMENT); - } - } - } - - *token = EOF_TOKEN; - return ARB_VP_SUCESS; -} - -/** - * This does the same as get_next_token(), but it does not advance the - * position pointers (Err, rather it does, but then it resets them) - * - * \param s The parse state - * \param token The next token seen is returned in this value - * \param token_attr The token attribute for the next token is returned here. This - * is the index into the approprate symbol table if token is INTEGER_TOKEN, - * FLOAT_TOKEN, or ID_TOKEN - * \param how_many How many tokens to peek ahead - * - * \return ARB_VP_ERROR on lex error, ARB_VP_SUCESS on sucess - */ -static GLint -peek_next_token(parse_state * s, GLint * token, GLint * token_attr, - GLint how_many) -{ - GLint tmp_state = s->curr_state; - GLint tmp_sp = s->start_pos; - GLint tmp_cp = s->curr_pos; - GLint a, retval; - - for (a = 0; a < how_many; a++) { - retval = get_next_token(s, token, token_attr); - - if (retval == ARB_VP_ERROR) - return retval; - } - - s->curr_state = tmp_state; - s->start_pos = tmp_sp; - s->curr_pos = tmp_cp; - - return retval; -} - -/** - * Print out the value of a token - */ -static void -debug_token(parse_state * state, GLint t, GLint ta) -{ - switch (t) { - case EOF_TOKEN: - printf("EOF\n"); - break; - case ID_TOKEN: - printf("|%s| ", state->idents.data[ta]); - break; - case INTEGER_TOKEN: - printf("|%d| ", state->ints.data[ta]); - break; - case FLOAT_TOKEN: - printf("|%f| ", state->floats.data[ta]); - break; - - case ABS_TOKEN: - printf("ABS "); - break; - case ADD_TOKEN: - printf("ADD "); - break; - case ADDRESS_TOKEN: - printf("ADDRESS "); - break; - case ALIAS_TOKEN: - printf("ALIAS "); - break; - case ARL_TOKEN: - printf("ARL "); - break; - case ATTRIB_TOKEN: - printf("ATTRIB "); - break; - - case DP3_TOKEN: - printf("DP3 "); - break; - case DP4_TOKEN: - printf("DP4 "); - break; - case DPH_TOKEN: - printf("DPH "); - break; - case DST_TOKEN: - printf("DST "); - break; - - case END_TOKEN: - printf("END "); - break; - case EX2_TOKEN: - printf("EX2 "); - break; - case EXP_TOKEN: - printf("EXP "); - break; - - case FLR_TOKEN: - printf("FLR "); - break; - case FRC_TOKEN: - printf("FRC "); - break; - - case LG2_TOKEN: - printf("LG2 "); - break; - case LIT_TOKEN: - printf("LIT "); - break; - case LOG_TOKEN: - printf("LOG "); - break; - - case MAD_TOKEN: - printf("MAD "); - break; - case MAX_TOKEN: - printf("MAX "); - break; - case MIN_TOKEN: - printf("MIN "); - break; - case MOV_TOKEN: - printf("MOV "); - break; - case MUL_TOKEN: - printf("MUL "); - break; - - case OPTION_TOKEN: - printf("OPTION "); - break; - case OUTPUT_TOKEN: - printf("OUTPUT "); - break; - - case PARAM_TOKEN: - printf("PARAM "); - break; - case POW_TOKEN: - printf("POW "); - break; - - case RCP_TOKEN: - printf("RCP "); - break; - case RSQ_TOKEN: - printf("RSQ "); - break; - - case SGE_TOKEN: - printf("SGE "); - break; - case SLT_TOKEN: - printf("SLT "); - break; - case SUB_TOKEN: - printf("SUB "); - break; - case SWZ_TOKEN: - printf("SWZ "); - break; - - case TEMP_TOKEN: - printf("TEMP "); - break; - - case XPD_TOKEN: - printf("XPD "); - break; - - case SEMICOLON_TOKEN: - printf("; "); - break; - case COMMA_TOKEN: - printf(", "); - break; - case PLUS_TOKEN: - printf("+ "); - break; - case MINUS_TOKEN: - printf("- "); - break; - case PERIOD_TOKEN: - printf(". "); - break; - case DOTDOT_TOKEN: - printf(".. "); - break; - case LBRACKET_TOKEN: - printf("[ "); - break; - case RBRACKET_TOKEN: - printf("] "); - break; - case LBRACE_TOKEN: - printf("{ "); - break; - case RBRACE_TOKEN: - printf("} "); - break; - case EQUAL_TOKEN: - printf("= "); - break; - - case PROGRAM_TOKEN: - printf("program "); - break; - case RESULT_TOKEN: - printf("result "); - break; - case STATE_TOKEN: - printf("state "); - break; - case VERTEX_TOKEN: - printf("vertex "); - break; - default: - printf("Unknown token type %d\n", t); - } -} - -/** - * Setup the state used by the parser / lex - * - * \param str The program string, with the !!ARBvp1.0 token stripped off - * \param len The lenght of the given string - * - * \return A parse_state struct to keep track of all the things we need while parsing - */ -static parse_state * -parse_state_init(GLubyte * str, GLint len) -{ - parse_state *s = (parse_state *) _mesa_malloc(sizeof(parse_state)); - - s->str = _mesa_strdup((char *) str); - s->len = len; - s->curr_pos = 0; - s->start_pos = 0; - - s->curr_state = 0; - - s->idents.len = 0; - s->idents.data = NULL; - - s->ints.len = 0; - s->ints.data = NULL; - - s->floats.len = 0; - s->floats.data = NULL; - printf("%s\n", s->str); - - s->binds.len = 0; - s->binds.type = NULL; - s->binds.offset = NULL; - s->binds.row = NULL; - s->binds.consts = NULL; - - s->arrays.len = 0; - s->arrays.num_elements = NULL; - s->arrays.data = NULL; - - s->stack_head = NULL; - s->stack_free_list = NULL; - - s->pt_head = NULL; - - return s; -} - -/** - * This frees all the things we hold while parsing. - * - * \param s The struct created by parse_state_init() - */ -static void -parse_state_cleanup(parse_state * s) -{ - GLint a; - token_list *tl, *next; - - /* Free our copy of the string [Mesa has its own] */ - _mesa_free(s->str); - - /* Free all the tables ident, int, float, bind, mat */ - _mesa_free(s->idents.type); - _mesa_free(s->idents.attr); - for (a = 0; a < s->idents.len; a++) - _mesa_free(s->idents.data[a]); - - _mesa_free(s->ints.data); - _mesa_free(s->floats.data); - - _mesa_free(s->arrays.num_elements); - for (a = 0; a < s->arrays.len; a++) - _mesa_free(s->arrays.data[a]); - - _mesa_free(s->binds.type); - _mesa_free(s->binds.offset); - _mesa_free(s->binds.row); - _mesa_free(s->binds.num_rows); - _mesa_free(s->binds.reg_num); -#if 0 - for (a = 0; a < s->binds.len; a++) { - printf("6: %d/%d\n", a, s->binds.len - 1); - _mesa_free(s->binds.consts[a]); - } -#endif - - /* Free the stack */ - tl = s->stack_head; - while (tl) { - next = tl->next; - free(tl); - tl = next; - } - tl = s->stack_free_list; - while (tl) { - next = tl->next; - free(tl); - tl = next; - } - printf("freed stack free list\n"); - -#if 0 - /* Free the parse tree */ - parse_tree_free_children(s->pt_head); - printf("freed parse_tree\n"); -#endif - free(s); - printf("freed state\n"); -} - -/** - * Alloc a new node for a parse tree. - * - * \return An empty node to fill and stick into the parse tree - */ -static parse_tree_node * -parse_tree_node_init(void) -{ - GLint a; - parse_tree_node *pt; - - pt = (parse_tree_node *) _mesa_malloc(sizeof(parse_tree_node)); - pt->tok = -1; - pt->tok_attr = -1; - pt->is_terminal = 0; - pt->prod_applied = -1; - - for (a = 0; a < 4; a++) - pt->children[a] = NULL; - - return pt; -} - -/** - * We maintain a stack of nonterminals used for predictive parsing. To keep - * from thrashing malloc/free, we keep a free list of token_list structs - * to be used for this stack. This function is called to refill the free - * list, when we try to grab a new token_list struct, and find that there are none - * available - * - * \param s The parse state - */ -static void -_fill_free_list(parse_state * s) -{ - GLint a; - token_list *tl; - - if (s->stack_free_list) - return; - - for (a = 0; a < 20; a++) { - tl = (token_list *) _mesa_malloc(sizeof(token_list)); - - tl->next = s->stack_free_list; - s->stack_free_list = tl; - } -} - -/** - * Peek at the head of the nonterminal stack, - * - * \param s The parse state - * \param token Return for the nonterminal token on the top of the stack - * \param token_attr Return for the the token attribute on the top of the stack - * - * \return ARB_VP_ERROR on an empty stack [not necessarily a bad thing], else ARB_VP_SUCESS - */ -static GLint -_stack_peek(parse_state * s, GLint * token, GLint * token_attr) -{ - if (!s->stack_head) { - fprintf(stderr, "ACK! Empty stack on peek!\n"); - return ARB_VP_ERROR; - } - - *token = s->stack_head->tok; - *token_attr = s->stack_head->tok_attr; - - return ARB_VP_SUCESS; -} - -/** - * Remove the token at the head of the nonterminal stack - * \param s The parse state - * \param token Return for the nonterminal token on the top of the stack - * \param token_attr Return for the the token attribute on the top of the stack - * \param ptn Return for a pointer to the place in the parse tree where - * the token lives - * - * \return ARB_VP_ERROR on an empty stack [not necessarily a bad thing], else ARB_VP_SUCESS - */ -static GLint -_stack_pop(parse_state * s, GLint * token, GLint * token_attr, - parse_tree_node ** ptn) -{ - token_list *tl; - - if (!s->stack_head) { - fprintf(stderr, "ACK! Empty stack!\n"); - return ARB_VP_ERROR; - } - - *token = s->stack_head->tok; - *token_attr = s->stack_head->tok_attr; - if (ptn) - *ptn = s->stack_head->pt; - tl = s->stack_head; - - s->stack_head = tl->next; - tl->next = s->stack_free_list; - s->stack_free_list = tl; - - return ARB_VP_SUCESS; -} - -/** - * Put a token, its attribute, and the the parse tree node where the token is stored, onto - * the parse stack. - * - * \param s The parse state - * \param token Return for the nonterminal token on the top of the stack - * \param token_attr Return for the the token attribute on the top of the stack - * \param ptn Return for a pointer to the place in the parse tree where - * the token lives - * - * \return ARB_VP_ERROR on out of memory while allocing more storage for the stack, - * else ARB_VP_SUCESS - */ -static GLint -_stack_push(parse_state * s, GLint token, GLint token_attr, - parse_tree_node * ptn) -{ - token_list *tl; - - if (!s->stack_free_list) { - _fill_free_list(s); - if (!s->stack_free_list) { - fprintf(stderr, "ACK! Error filling stack free list\n"); - return ARB_VP_ERROR; - } - } - - tl = s->stack_free_list; - - s->stack_free_list = tl->next; - - tl->tok = token; - tl->tok_attr = token_attr; - tl->pt = ptn; - tl->next = s->stack_head; - - s->stack_head = tl; - - return ARB_VP_SUCESS; -} - -/** - * Allocate a new entry in the array table - * - * \param tab The array table to add a new element too - * - * \return The index into the array table where the new element is. - */ -static GLint -array_table_new(array_table * tab) -{ - GLint idx; - if (tab->len == 0) { - tab->num_elements = (GLint *) _mesa_malloc(sizeof(GLint)); - tab->data = (GLint **) _mesa_malloc(sizeof(GLint *)); - idx = 0; - } - else { - tab->num_elements = - (GLint *) _mesa_realloc(tab->num_elements, tab->len * sizeof(GLint), - (tab->len + 1) * sizeof(GLint)); - tab->data = - (GLint **) _mesa_realloc(tab->data, tab->len * sizeof(GLint *), - (tab->len + 1) * sizeof(GLint *)); - idx = tab->len; - } - - tab->len++; - tab->num_elements[idx] = 0; - tab->data[idx] = NULL; - - return idx; -} - -/** - * Add a new element to a array in a array table - * - * \param tab The array table - * \param idx The index into the array table of the array we want to append an item onto - * \param data The program parameter that goes into the idx-th array - */ -static void -array_table_add_data(array_table * tab, GLint idx, GLint data) -{ - if ((idx < 0) || (idx >= tab->len)) { - printf("Bad matrix index %d!\n", idx); - return; - } - - if (tab->data[idx] == NULL) { - tab->data[idx] = (GLint *) _mesa_malloc(sizeof(GLint)); - } - else { - tab->data[idx] = - (GLint *) _mesa_realloc(tab->data[idx], - tab->num_elements[idx] * sizeof(GLint), - (tab->num_elements[idx] + - 1) * sizeof(GLint)); - } - - tab->data[idx][tab->num_elements[idx]] = data; - tab->num_elements[idx]++; -} - - -/** - * This adds a new entry into the binding table. - * - * \param tab The binding table - * \param type The type of the state - * \param offset For matrix bindings, e.g. MATRIXROWS_MODELVIEW, this gives the matrix number. - * For PROGRAM_ENV_* and PROGRAM_LOCAL_* bindings, this gives the number of the first parameter - * - * \param row For MATRIXROWS bindings, this is the first row in the matrix we're bound to - * \param nrows For MATRIXROWS bindings, this is the number of rows of the matrix we have. - * For PROGRAM_ENV/LOCAL bindings, this is the number of parameters in the array we're bound to - * \param values For CONSTANT bindings, these are the constant values we're bound to - * \return The index into the binding table where this state is bound - */ -static GLint -binding_table_add(binding_table * tab, GLint type, GLint offset, GLint row, - GLint nrows, GLfloat * values) -{ - GLint key, a; - - key = tab->len; - - /* test for existance */ - for (a = 0; a < tab->len; a++) { - if ((tab->type[a] == type) && (tab->offset[a] == offset) - && (tab->row[a] == row) && (tab->num_rows[a] == nrows) && - (fabs(tab->consts[a][0] - values[0]) < .0001) && - (fabs(tab->consts[a][1] - values[1]) < .0001) && - (fabs(tab->consts[a][2] - values[2]) < .0001) && - (fabs(tab->consts[a][3] - values[3]) < .0001)) - return a; - } - - if (tab->len == 0) { - tab->type = (GLint *) _mesa_malloc(sizeof(GLint)); - tab->offset = (GLint *) _mesa_malloc(sizeof(GLint)); - tab->row = (GLint *) _mesa_malloc(sizeof(GLint)); - tab->num_rows = (GLint *) _mesa_malloc(sizeof(GLint)); - tab->consts = (GLfloat **) _mesa_malloc(sizeof(GLfloat *)); - tab->consts[0] = (GLfloat *) _mesa_malloc(4 * sizeof(GLfloat)); - tab->reg_num = (GLint *) _mesa_malloc(sizeof(GLint)); - } - else { - tab->type = - (GLint *) _mesa_realloc(tab->type, tab->len * sizeof(GLint), - (tab->len + 1) * sizeof(GLint)); - tab->offset = - (GLint *) _mesa_realloc(tab->offset, tab->len * sizeof(GLint), - (tab->len + 1) * sizeof(GLint)); - tab->row = - (GLint *) _mesa_realloc(tab->row, tab->len * sizeof(GLint), - (tab->len + 1) * sizeof(GLint)); - tab->num_rows = - (GLint *) _mesa_realloc(tab->num_rows, tab->len * sizeof(GLint), - (tab->len + 1) * sizeof(GLint)); - tab->consts = - (GLfloat **) _mesa_realloc(tab->consts, tab->len * sizeof(GLfloat), - (tab->len + 1) * sizeof(GLfloat *)); - tab->consts[tab->len] = (GLfloat *) _mesa_malloc(4 * sizeof(GLfloat)); - tab->reg_num = - (GLint *) _mesa_realloc(tab->reg_num, tab->len * sizeof(GLint), - (tab->len + 1) * sizeof(GLint)); - } - - tab->type[key] = type; - tab->offset[key] = offset; - tab->row[key] = row; /*key;*/ - tab->num_rows[key] = nrows; - tab->reg_num[key] = 0; - _mesa_memcpy(tab->consts[key], values, 4 * sizeof(GLfloat)); - tab->len++; - - return key; -} - -/** - * Given a string and a start/end point, add a string into the float - * symbol table (and convert it into a float) - * - * If we already have this GLfloat in the table, don't bother - * adding another, just return the key to the existing one - * - * \param tab The float table - * \param str The string containing the float - * \param start The starting position of the float in str - * \param end The ending position of the float in str - * - * \return The index of the float, after we insert it, in the float table - */ -static GLint -float_table_add(float_table *tab, const char *str, GLint start, GLint end) -{ - GLint key, a; - GLubyte *newstr; - - key = tab->len; - - newstr = (GLubyte *) _mesa_malloc(end - start + 2); - _mesa_memset(newstr, 0, end - start + 2); - _mesa_memcpy(newstr, str + start, end - start); - - /* test for existance */ - for (a = 0; a < tab->len; a++) { - if (tab->data[a] == atof((char *) newstr)) { - _mesa_free(newstr); - return a; - } - } - - if (tab->len == 0) { - tab->data = (GLdouble *) _mesa_malloc(sizeof(GLdouble)); - } - else { - tab->data = - (GLdouble *) _mesa_realloc(tab->data, tab->len * sizeof(GLdouble), - (tab->len + 1) * sizeof(GLdouble)); - } - - tab->data[key] = atof((char *) newstr); - tab->len++; - - _mesa_free(newstr); - return key; -} - -/** - * Given a string and a start/end point, add a string into the int - * symbol table (and convert it into a int) - * - * If we already have this int in the table, don't bother - * adding another, just return the key to the existing one - * - * \param tab The int table - * \param str The string containing the int - * \param start The starting position of the int in str - * \param end The ending position of the int in str - * - * \return The index of the int, after we insert it, in the int table - */ -static GLint -int_table_add(int_table * tab, const char *str, GLint start, GLint end) -{ - GLint key, a; - char *newstr; - - key = tab->len; - - newstr = (char *) _mesa_malloc(end - start + 2); - _mesa_memset(newstr, 0, end - start + 2); - _mesa_memcpy(newstr, str + start, end - start); - - for (a = 0; a < tab->len; a++) { - if (tab->data[a] == _mesa_atoi(newstr)) { - _mesa_free(newstr); - return a; - } - } - - if (tab->len == 0) { - tab->data = (GLint *) _mesa_malloc(sizeof(GLint)); - } - else { - tab->data = - (GLint *) _mesa_realloc(tab->data, tab->len * sizeof(GLint), - (tab->len + 1) * sizeof(GLint)); - } - - tab->data[key] = _mesa_atoi(newstr); - tab->len++; - - _mesa_free(newstr); - return key; -} - -/** - * Insert an identifier into the identifier symbol table - * - * If we already have this id in the table, don't bother - * adding another, just return the key to the existing one - * - * If we already have this id in the table, and it has been - * initialized to an ALIAS, return what the alias points - * to, not the alias var - * - * \param tab The ID table - * \param str The string containing the id - * \param start The position in str where the id begins - * \param end The position in str where the id ends - * - * \return either: - * 1) The index into the id table where the id is - * 2) The index into the id table where the alias of id, if we already have id - * in the table, and it has been initialized to type ALIAS - */ -static GLint -id_table_add(id_table * tab, const char * str, GLint start, GLint end) -{ - GLint key, a; - GLubyte *newstr; - - key = tab->len; - - if (tab->len == 0) { - tab->data = (GLubyte **) _mesa_malloc(sizeof(GLubyte *)); - tab->type = (GLint *) _mesa_malloc(sizeof(GLint)); - tab->attr = (GLint *) _mesa_malloc(sizeof(GLint)); - } - else { - tab->data = - (GLubyte **) _mesa_realloc(tab->data, tab->len * sizeof(GLubyte *), - (tab->len + 1) * sizeof(GLubyte *)); - tab->type = - (GLint *) _mesa_realloc(tab->type, tab->len * sizeof(GLint), - (tab->len + 1) * sizeof(GLint)); - tab->attr = - (GLint *) _mesa_realloc(tab->attr, tab->len * sizeof(GLint), - (tab->len + 1) * sizeof(GLint)); - } - - /*tab->type[key] = TYPE_NONE;*/ - - newstr = (GLubyte *) _mesa_malloc((end - start + 2) * sizeof(GLubyte)); - _mesa_memset(newstr, 0, end - start + 2); - _mesa_memcpy(newstr, str + start, end - start); - - for (a = 0; a < tab->len; a++) { - /* aha! we found it in the table */ - if (!_mesa_strcmp((char *) tab->data[a], (char *) newstr)) { - _mesa_free(newstr); - - key = a; - while ((tab->type[key] == TYPE_ALIAS) && (tab->attr[key] != -1)) { - printf("----------- %s is an alias, renaming to %s\n", - tab->data[key], tab->data[tab->attr[key]]); - key = tab->attr[key]; - } - - return key; - } - } - - /* oh, we really have a new id */ - tab->data[key] = newstr; - tab->type[key] = TYPE_NONE; - tab->attr[key] = -1; - tab->len++; - - return key; -} - -/*#define SHOW_STEPS 1*/ - - -/** - * Apply the specified production number to the parse state. This handles - * looking at the production table and sticking new tokens onto the - * parse stack. - * - * It also handles the construction of the parse tree - * - * \param s The parse state - * \param num The production number to apply [the idx in the production table] - * - */ -static void -apply_production(parse_state * s, int num) -{ - GLint a, str_key, stack_tok, stack_tok_attr; - GLint tok, nnptr = 0; - parse_tree_node *ptn; - parse_tree_node *pt_ptr_new[4]; - - (void) _stack_pop(s, &stack_tok, &stack_tok_attr, &ptn); - /*printf("apply prod %d\n", num); */ - - ptn->prod_applied = num; - for (a = 3; a >= 0; a--) { - str_key = 0; - tok = ptab[num].rhs[a]; - - if (tok == NULL_TOKEN) - continue; - - /* If we are pushing an identifier or a number, we need to translate the string literal - * in the production table into an entry in the approprate symbol table - */ - if (tok == ID_TOKEN) { - str_key = id_table_add(&s->idents, ptab[num].key[a], 0, - _mesa_strlen(ptab[num].key[a])); - } - else if (tok == INTEGER_TOKEN) { - str_key = int_table_add(&s->ints, ptab[num].key[a], 0, - _mesa_strlen(ptab[num].key[a])); - } - else if (tok == FLOAT_TOKEN) { - str_key = float_table_add(&s->floats, ptab[num].key[a], 0, - _mesa_strlen(ptab[num].key[a])); - } - - /* "-1" is a wildcard flag, accept any id/float/int */ - if ((!_mesa_strcmp(ptab[num].key[a], "-1")) && - ((tok == FLOAT_TOKEN) || (tok == INTEGER_TOKEN) - || (tok == ID_TOKEN))) { - pt_ptr_new[nnptr] = parse_tree_node_init(); - pt_ptr_new[nnptr]->is_terminal = 0; - pt_ptr_new[nnptr]->tok = tok; - pt_ptr_new[nnptr]->tok_attr = str_key; - nnptr++; - _stack_push(s, ptab[num].rhs[a], str_key, pt_ptr_new[nnptr - 1]); - } - else if (tok >= NT_PROGRAM_TOKEN) { - pt_ptr_new[nnptr] = parse_tree_node_init(); - pt_ptr_new[nnptr]->is_terminal = 0; - pt_ptr_new[nnptr]->tok = tok; - nnptr++; - _stack_push(s, ptab[num].rhs[a], str_key, pt_ptr_new[nnptr - 1]); - } - else - _stack_push(s, ptab[num].rhs[a], str_key, NULL); - } - - tok = 0; - if (ptn) { - /*printf("%x %d:[%x %x %x %x]\n", ptn, nnptr, pt_ptr_new[0], pt_ptr_new[1], pt_ptr_new[2], pt_ptr_new[3]); */ - - for (a = nnptr - 1; a >= 0; a--) { - ptn->children[tok] = pt_ptr_new[a]; - /*printf("%x->children[%d] = %x\n", ptn, tok, pt_ptr_new[a]); */ - tok++; - } - } -} - -/** - * Here we initialize a bunch of variables to a given type (e.g. TEMP). - * - * We stick the variable type into the 0-th element in the var_queue array, followed by var_queue_size - * indicies into the identifier table which designate the variables we are to init. - * - * \param s The parse state - * \param var_queue The queue of variables to initialize. The first element in the array is variable - * type. It is followed by var_queue_size indicies into the identifier table - * who we are supposed to init to type var_queue[0]. - * \param var_queue_size The number of variables listed in var_queue[]. - * - * \return ARB_VP_ERROR if we have already initilized a variable in var_queue, otherwise - * ARB_VP_SUCESS - */ -static GLint -init_vars(parse_state * s, GLint * var_queue, GLint var_queue_size) +static GLvoid +debug_vp_inst(GLint num, struct vp_instruction *vp) { GLint a; - a = 1; - while (a < var_queue_size) { - /* Make sure we haven't already init'd this var. This will - * catch multiple definations of the same symbol - */ - if (s->idents.type[var_queue[a]] != TYPE_NONE) { - printf("%s already init'd! (%d)\n", s->idents.data[var_queue[a]], - s->idents.type[var_queue[a]]); - return ARB_VP_ERROR; - } - - s->idents.type[var_queue[a]] = var_queue[0]; - s->idents.attr[var_queue[a]] = -1; - a++; - } - - return ARB_VP_SUCESS; -} - -/** - * The main parsing loop. This applies productions and builds the parse tree. - * - * \param s The parse state - * - * \return ARB_VP_ERROR on a parse error, else ARB_VP_SUCESS - */ -static GLint -parse(parse_state * s) -{ - GLint input_tok, input_tok_attr; - GLint stack_tok, stack_tok_attr; - GLint peek_tok, peek_tok_attr, ret; - GLint idx, str_key; - GLint var_queue_size = 0; - GLint *var_queue; - parse_tree_node *ptn, *ptn2; - - /* This should be MAX_VAR + 1 */ - var_queue = (GLint *) _mesa_malloc(1000 * sizeof(int)); - - s->stack_head = NULL; - - /* init the system by pushing the start symbol onto the stack */ - ptn = parse_tree_node_init(); - ptn->is_terminal = 0; - ptn->tok = NT_PROGRAM_TOKEN; - s->pt_head = ptn; - _stack_push(s, NT_PROGRAM_TOKEN, 0, ptn); - - /* and get the first token */ - if (get_next_token(s, &input_tok, &input_tok_attr) == ARB_VP_ERROR) { - fprintf(stderr, "LEX ERROR!!\n"); - return ARB_VP_ERROR; - } - - while (1) { - GLint la, is_nonterm; - - /* If the stack is empty, and we've eaten all the input, we're done */ - if ((_stack_peek(s, &stack_tok, &stack_tok_attr) == ARB_VP_ERROR) && - (input_tok == EOF_TOKEN)) - break; - -#ifdef SHOW_STEPS - printf("stack: %d input: ", stack_tok); - debug_token(s, input_tok, input_tok_attr); - printf("\n"); -#endif - - /* We [may] have a non-terminal on top of the stack, apply - * productions! - */ - switch (stack_tok) { - /* Special case non-terminals */ - - /* productions 64-66 */ - case NT_SRC_REG_TOKEN: - if ((input_tok == VERTEX_TOKEN) || - ((input_tok == ID_TOKEN) - && (s->idents.type[input_tok_attr] == TYPE_ATTRIB))) { - apply_production(s, 64); - } - else - if ((input_tok == ID_TOKEN) - && (s->idents.type[input_tok_attr] == TYPE_TEMP)) { - apply_production(s, 65); - } - else - if ((input_tok == STATE_TOKEN) || - (input_tok == PROGRAM_TOKEN) || - (input_tok == LBRACE_TOKEN) || - (input_tok == FLOAT_TOKEN) || - (input_tok == INTEGER_TOKEN) || - ((input_tok == ID_TOKEN) - && (s->idents.type[input_tok_attr] == TYPE_PARAM_SINGLE)) - || ((input_tok == ID_TOKEN) - && (s->idents.type[input_tok_attr] == - TYPE_PARAM_ARRAY))) { - apply_production(s, 66); - } - else { - return ARB_VP_ERROR; - } - break; - - /* productions 67-68 */ - case NT_DST_REG_TOKEN: - /* We can only write to result.*, TEMP vars, or OUTPUT vars */ - if (input_tok == RESULT_TOKEN) { - apply_production(s, 68); - } - else if (input_tok == ID_TOKEN) { - if (s->idents.type[input_tok_attr] == TYPE_TEMP) { - apply_production(s, 67); - } - else if (s->idents.type[input_tok_attr] == TYPE_OUTPUT) { - apply_production(s, 68); - } - else { - return ARB_VP_ERROR; - } - } - else { - return ARB_VP_ERROR; - } - break; - - /* productions 72-4 */ - case NT_PROG_PARAM_REG_TOKEN: - if ((input_tok == ID_TOKEN) - && (s->idents.type[input_tok_attr] == TYPE_PARAM_SINGLE)) { - apply_production(s, 72); - } - else - if ((input_tok == ID_TOKEN) - && (s->idents.type[input_tok_attr] == TYPE_PARAM_ARRAY)) { - apply_production(s, 73); - } - else - if ((input_tok == STATE_TOKEN) || - (input_tok == PROGRAM_TOKEN) || - (input_tok == FLOAT_TOKEN) || - (input_tok == INTEGER_TOKEN) || (input_tok == LBRACE_TOKEN)) { - apply_production(s, 74); - } - else { - return ARB_VP_ERROR; - } - break; - - /* productions 286-7 */ - case NT_VAR_NAME_LIST_TOKEN: - ret = peek_next_token(s, &peek_tok, &peek_tok_attr, 1); - - var_queue[var_queue_size] = input_tok_attr; - var_queue_size++; + for (a=0; a<num; a++) { + switch (vp[a].Opcode) { + case VP_OPCODE_MOV: + fprintf(stderr, "VP_OPCODE_MOV"); break; - if ((ret == ARB_VP_ERROR) || (peek_tok != COMMA_TOKEN)) { - apply_production(s, 286); + case VP_OPCODE_LIT: + fprintf(stderr, "VP_OPCODE_LIT"); break; - /* Dump the var_queue & assign types */ - if (init_vars(s, var_queue, var_queue_size) == ARB_VP_ERROR) - return ARB_VP_ERROR; - } - else { - apply_production(s, 287); - } - break; + case VP_OPCODE_RCP: + fprintf(stderr, "VP_OPCODE_RCP"); break; - /* productions 296-7 */ - case NT_RESULT_COL_BINDING2_TOKEN: - if ((input_tok == SEMICOLON_TOKEN) || (input_tok == COMMA_TOKEN)) { - apply_production(s, 296); - } - else if (input_tok == PERIOD_TOKEN) { - ret = peek_next_token(s, &peek_tok, &peek_tok_attr, 1); - if ((peek_tok == ID_TOKEN) && - ((!_mesa_strcmp((char *) s->idents.data[peek_tok_attr], "back")) || - (!_mesa_strcmp((char *) s->idents.data[peek_tok_attr], "front")))) { - apply_production(s, 297); - } - else { - apply_production(s, 296); - } - } - else { - return ARB_VP_ERROR; - } - break; + case VP_OPCODE_RSQ: + fprintf(stderr, "VP_OPCODE_RSQ"); break; - /* productions 300-1 */ - case NT_RESULT_COL_BINDING4_TOKEN: - if ((input_tok == SEMICOLON_TOKEN) || (input_tok == COMMA_TOKEN)) { - apply_production(s, 300); - } - else if (input_tok == PERIOD_TOKEN) { - ret = peek_next_token(s, &peek_tok, &peek_tok_attr, 1); - if ((ret == ARB_VP_SUCESS) && (peek_tok == ID_TOKEN) && - ((!_mesa_strcmp((char *) s->idents.data[peek_tok_attr], "primary")) || - (!_mesa_strcmp((char *) s->idents.data[peek_tok_attr], "secondary")))) - { - apply_production(s, 301); - } - else { - apply_production(s, 300); - } - } - else { - return ARB_VP_ERROR; - } - break; + case VP_OPCODE_EXP: + fprintf(stderr, "VP_OPCODE_EXP"); break; - /* productions 306-7 */ - case NT_OPT_COLOR_TYPE_TOKEN: - if ((input_tok == SEMICOLON_TOKEN) || (input_tok == COMMA_TOKEN)) { - apply_production(s, 307); - } - else if (input_tok == PERIOD_TOKEN) { - ret = peek_next_token(s, &peek_tok, &peek_tok_attr, 1); - if ((ret == ARB_VP_SUCESS) && (peek_tok == ID_TOKEN) && - ((!_mesa_strcmp((char *) s->idents.data[peek_tok_attr], "primary")) || - (!_mesa_strcmp((char *) s->idents.data[peek_tok_attr], "secondary")))) - { - apply_production(s, 306); - } - else { - apply_production(s, 307); - } - } - else { - return ARB_VP_ERROR; - } - break; + case VP_OPCODE_LOG: + fprintf(stderr, "VP_OPCODE_LOG"); break; - /* production 313 -- Do this so we can mangle IDs as they are - * added into the ID table for the lex - */ - case NT_ALIAS_STATEMENT_TOKEN: - if (input_tok == ALIAS_TOKEN) { - GLint alias_to; + case VP_OPCODE_MUL: + fprintf(stderr, "VP_OPCODE_MUL"); break; - apply_production(s, 313); + case VP_OPCODE_ADD: + fprintf(stderr, "VP_OPCODE_ADD"); break; + + case VP_OPCODE_DP3: + fprintf(stderr, "VP_OPCODE_DP3"); break; - /* stack ALIAS */ - var_queue_size = 1; - var_queue[0] = TYPE_ALIAS; - ret = peek_next_token(s, &peek_tok, &peek_tok_attr, 1); - var_queue[var_queue_size] = peek_tok_attr; - var_queue_size++; + case VP_OPCODE_DP4: + fprintf(stderr, "VP_OPCODE_DP4"); break; - if (init_vars(s, var_queue, var_queue_size) == ARB_VP_ERROR) - return ARB_VP_ERROR; + case VP_OPCODE_DST: + fprintf(stderr, "VP_OPCODE_DST"); break; - /* Now, peek ahead and see what we are aliasing _to_ */ - alias_to = peek_tok_attr; - ret = peek_next_token(s, &peek_tok, &peek_tok_attr, 3); - if (ret == ARB_VP_SUCESS) { - s->idents.attr[alias_to] = peek_tok_attr; - } - else - return ARB_VP_ERROR; - } - else { - return ARB_VP_ERROR; - } - break; + case VP_OPCODE_MIN: + fprintf(stderr, "VP_OPCODE_MIN"); break; - /* productions 314 (ESTABLISH_NAME) duplicates are caught by the ID symbol table */ + case VP_OPCODE_MAX: + fprintf(stderr, "VP_OPCODE_MAX"); break; - /* productions 315 */ - case NT_ESTABLISHED_NAME_TOKEN: - if (input_tok == ID_TOKEN) { - if (s->idents.type[input_tok_attr] == TYPE_NONE) { - printf("Trying to use variable %s before initializing!\n", - s->idents.data[input_tok_attr]); - return ARB_VP_ERROR; - } - else { - apply_production(s, 315); - } - } - else { - return ARB_VP_ERROR; - } - break; + case VP_OPCODE_SLT: + fprintf(stderr, "VP_OPCODE_SLT"); break; + case VP_OPCODE_SGE: + fprintf(stderr, "VP_OPCODE_SGE"); break; - /* productions 318-9 */ - case NT_SWIZZLE_SUFFIX2_TOKEN: - if (_mesa_strlen((char *) s->idents.data[input_tok_attr]) == 1) { - apply_production(s, 318); - } - else if (_mesa_strlen((char *) s->idents.data[input_tok_attr]) == 4) { - apply_production(s, 319); - } - else { - return ARB_VP_ERROR; - } - break; + case VP_OPCODE_MAD: + fprintf(stderr, "VP_OPCODE_MAD"); break; - /* 4-component swizzle mask -- this is a total hack */ -#define IS_SWZ_CMP(foo) ((foo == 'x') || (foo == 'y') || (foo == 'z') || (foo == 'w')) - case NT_COMPONENT4_TOKEN: - { - GLubyte *str = s->idents.data[input_tok_attr]; + case VP_OPCODE_ARL: + fprintf(stderr, "VP_OPCODE_ARL"); break; - if (IS_SWZ_CMP(str[0]) && IS_SWZ_CMP(str[1]) && IS_SWZ_CMP(str[2]) - && IS_SWZ_CMP(str[3])) { - _stack_pop(s, &stack_tok, &stack_tok_attr, &ptn); - /* _stack_push(s, input_tok, input_tok_attr, NULL);*/ + case VP_OPCODE_DPH: + fprintf(stderr, "VP_OPCODE_DPH"); break; - ptn2 = parse_tree_node_init(); - ptn2->tok = input_tok; - ptn2->tok_attr = input_tok_attr; - ptn2->is_terminal = 1; - ptn->children[0] = ptn2; - _stack_push(s, input_tok, input_tok_attr, ptn2); - } - else { - return ARB_VP_ERROR; - } - } - break; + case VP_OPCODE_RCC: + fprintf(stderr, "VP_OPCODE_RCC"); break; - /* Handle general non-terminals using tables, and terminals */ - default: - is_nonterm = 0; - for (la = 0; la < nlas; la++) { - if (latab[la].lhs != stack_tok) - continue; + case VP_OPCODE_SUB: + fprintf(stderr, "VP_OPCODE_SUB"); break; - if (latab[la].la != input_tok) - continue; + case VP_OPCODE_ABS: + fprintf(stderr, "VP_OPCODE_ABS"); break; - if (input_tok == ID_TOKEN) { - str_key = - id_table_add(&s->idents, latab[la].la_kw, 0, - _mesa_strlen(latab[la].la_kw)); - if ((str_key != input_tok_attr) - && (_mesa_strcmp(latab[la].la_kw, "-1"))) - continue; - } - else if (input_tok == INTEGER_TOKEN) { - if ((s->ints.data[input_tok_attr] != - _mesa_atoi(latab[la].la_kw)) - && (_mesa_atoi(latab[la].la_kw) != -1)) { - continue; - } - } - else if (input_tok == FLOAT_TOKEN) { - if ((s->floats.data[input_tok_attr] != atof(latab[la].la_kw)) - && (atof(latab[la].la_kw) != -1)) - continue; - } - idx = latab[la].prod_idx; + case VP_OPCODE_FLR: + fprintf(stderr, "VP_OPCODE_FLR"); break; - /* Here we stack identifiers onto the var_queue */ - switch (idx) { - /* setup ATTRIB */ - case 120: - var_queue_size = 1; - var_queue[0] = TYPE_ATTRIB; - ret = peek_next_token(s, &peek_tok, &peek_tok_attr, 1); - var_queue[var_queue_size] = peek_tok_attr; - var_queue_size++; + case VP_OPCODE_FRC: + fprintf(stderr, "VP_OPCODE_FRC"); break; - if (init_vars(s, var_queue, var_queue_size) == ARB_VP_ERROR) - return ARB_VP_ERROR; - break; + case VP_OPCODE_EX2: + fprintf(stderr, "VP_OPCODE_EX2"); break; - /* stack PARAM */ - case 134: - var_queue_size = 1; - var_queue[0] = TYPE_PARAM; + case VP_OPCODE_LG2: + fprintf(stderr, "VP_OPCODE_LG2"); break; - ret = peek_next_token(s, &peek_tok, &peek_tok_attr, 1); - var_queue[var_queue_size] = peek_tok_attr; - var_queue_size++; + case VP_OPCODE_POW: + fprintf(stderr, "VP_OPCODE_POW"); break; - break; + case VP_OPCODE_XPD: + fprintf(stderr, "VP_OPCODE_XPD"); break; - case 135: - var_queue[0] = TYPE_PARAM_SINGLE; - - if (init_vars(s, var_queue, var_queue_size) == ARB_VP_ERROR) - return ARB_VP_ERROR; - break; - - case 136: - var_queue[0] = TYPE_PARAM_ARRAY; - - if (init_vars(s, var_queue, var_queue_size) == ARB_VP_ERROR) - return ARB_VP_ERROR; - break; - - /* stack TEMP */ - case 284: - var_queue_size = 1; - var_queue[0] = TYPE_TEMP; - break; - - /* stack ADDRESS */ - case 285: - var_queue_size = 1; - var_queue[0] = TYPE_ADDRESS; - break; - - /* stack OUTPUT */ - case 288: - var_queue_size = 1; - var_queue[0] = TYPE_OUTPUT; - ret = peek_next_token(s, &peek_tok, &peek_tok_attr, 1); - var_queue[var_queue_size] = peek_tok_attr; - var_queue_size++; - - if (init_vars(s, var_queue, var_queue_size) == ARB_VP_ERROR) - return ARB_VP_ERROR; - break; - - - /* stack opts for varNameList -- see above */ - - } - - /* finally.. we match! apply the production */ - if ((idx < 0) || (idx >= nprods)) { - fprintf(stderr, - "Prod IDX of %d in look ahead table [%d] is horked!\n", - idx, la); - exit(1); - } - - apply_production(s, idx); - is_nonterm = 1; - break; - } - - if (!is_nonterm) { - if ((stack_tok == EOF_TOKEN) && (s->stack_head == NULL)) - return ARB_VP_SUCESS; - - if ((input_tok == stack_tok) || - ((stack_tok == FLOAT_TOKEN) - && (input_tok == INTEGER_TOKEN))) { - /* XXX: Need to check values for int/id/GLfloat tokens here -- yes! */ - - _stack_pop(s, &stack_tok, &stack_tok_attr, &ptn); - if ((ptn) - && ((stack_tok == FLOAT_TOKEN) - || (stack_tok == INTEGER_TOKEN) - || (stack_tok == ID_TOKEN))) { - ptn->is_terminal = 1; - ptn->tok = input_tok; - ptn->tok_attr = input_tok_attr; - } - - if (get_next_token(s, &input_tok, &input_tok_attr) == - ARB_VP_ERROR) { - fprintf(stderr, "PARSE ERROR!!\n"); - return ARB_VP_ERROR; - } - } - else { - fprintf(stderr, "PARSE ERROR!\n"); - return ARB_VP_ERROR; - } - } - break; + case VP_OPCODE_SWZ: + fprintf(stderr, "VP_OPCODE_SWZ"); break; + + case VP_OPCODE_END: + fprintf(stderr, "VP_OPCODE_END"); break; } - } - - return ARB_VP_SUCESS; - - -} - -/** - * Print out the parse tree from a given point. Just for debugging. - * - * \param s The parse state - * \param ptn The root to start printing from - */ -static void -print_parse_tree(parse_state * s, parse_tree_node * ptn) -{ - GLint a; - - /* If we're terminal, prGLint and exit */ - if (ptn->is_terminal) { - debug_token(s, ptn->tok, ptn->tok_attr); - printf("\n"); - return; - } - - /* Else, recurse on all our children */ - for (a = 0; a < 4; a++) { - if (!ptn->children[a]) - return; - - print_parse_tree(s, ptn->children[a]); - } -} - -/** - * Free all of the children of a given parse tree node. - * - * \param ptn The root node whose children we recursively free - */ -static void -parse_tree_free_children(parse_tree_node * ptn) -{ - GLint a; - if (!ptn) - return; - if (!ptn->children[0]) - return; + fprintf(stderr, " D(0x%x:%d:%d%d%d%d) ", vp[a].DstReg.File, vp[a].DstReg.Index, + vp[a].DstReg.WriteMask[0], + vp[a].DstReg.WriteMask[1], + vp[a].DstReg.WriteMask[2], + vp[a].DstReg.WriteMask[3]); + + fprintf(stderr, "S1(0x%x:%d:%d%d%d%d) ", vp[a].SrcReg[0].File, vp[a].SrcReg[0].Index, + vp[a].SrcReg[0].Swizzle[0], + vp[a].SrcReg[0].Swizzle[1], + vp[a].SrcReg[0].Swizzle[2], + vp[a].SrcReg[0].Swizzle[3]); - for (a = 0; a < 4; a++) { - if (ptn->children[a]) { - parse_tree_free_children(ptn->children[a]); - _mesa_free(ptn->children[a]); - ptn->children[a] = NULL; - } - } -} + fprintf(stderr, "S2(0x%x:%d:%d%d%d%d) ", vp[a].SrcReg[1].File, vp[a].SrcReg[1].Index, + vp[a].SrcReg[1].Swizzle[0], + vp[a].SrcReg[1].Swizzle[1], + vp[a].SrcReg[1].Swizzle[2], + vp[a].SrcReg[1].Swizzle[3]); -/** - * Given the name of a matrix, and a modifier, expand into a binding type. - * - * names: 0 -- modelview - * 1 -- projection - * 2 -- mvp - * 3 -- texture - * 4 -- palette - * 5 -- program - * - * mods: 0 -- normal - * 1 -- inverse - * 2 -- invtrans - * 3 -- transpose - * - * \param name The number of the matrix type - * \param mod The number of the matrix modifier - * - * \return The binding state corresponding to name & mod - */ -static GLint -name_and_mod_to_matrixrows(GLint name, GLint mod) -{ - switch (name) { - case 0: /* modelview */ - switch (mod) { - case 0: - return MATRIXROWS_MODELVIEW; - case 1: - return MATRIXROWS_MODELVIEW_INVERSE; - case 2: - return MATRIXROWS_MODELVIEW_INVTRANS; - case 3: - return MATRIXROWS_MODELVIEW_TRANSPOSE; - } - break; - case 1: /* projection */ - switch (mod) { - case 0: - return MATRIXROWS_PROJECTION; - case 1: - return MATRIXROWS_PROJECTION_INVERSE; - case 2: - return MATRIXROWS_PROJECTION_INVTRANS; - case 3: - return MATRIXROWS_PROJECTION_TRANSPOSE; - } - - break; - case 2: /* mvp */ - switch (mod) { - case 0: - return MATRIXROWS_MVP; - case 1: - return MATRIXROWS_MVP_INVERSE; - case 2: - return MATRIXROWS_MVP_INVTRANS; - case 3: - return MATRIXROWS_MVP_TRANSPOSE; - } + fprintf(stderr, "S3(0x%x:%d:%d%d%d%d)", vp[a].SrcReg[2].File, vp[a].SrcReg[2].Index, + vp[a].SrcReg[2].Swizzle[0], + vp[a].SrcReg[2].Swizzle[1], + vp[a].SrcReg[2].Swizzle[2], + vp[a].SrcReg[2].Swizzle[3]); - break; - case 3: /* texture */ - switch (mod) { - case 0: - return MATRIXROWS_TEXTURE; - case 1: - return MATRIXROWS_TEXTURE_INVERSE; - case 2: - return MATRIXROWS_TEXTURE_INVTRANS; - case 3: - return MATRIXROWS_TEXTURE_TRANSPOSE; - } - break; - case 4: /* palette */ - switch (mod) { - case 0: - return MATRIXROWS_PALETTE; - case 1: - return MATRIXROWS_PALETTE_INVERSE; - case 2: - return MATRIXROWS_PALETTE_INVTRANS; - case 3: - return MATRIXROWS_PALETTE_TRANSPOSE; - } - break; - case 5: /* program */ - switch (mod) { - case 0: - return MATRIXROWS_PROGRAM; - case 1: - return MATRIXROWS_PROGRAM_INVERSE; - case 2: - return MATRIXROWS_PROGRAM_INVTRANS; - case 3: - return MATRIXROWS_PROGRAM_TRANSPOSE; - } - break; + fprintf(stderr, "\n"); } - - return 0; } -/** - * This takes a node in the parse tree for an OPTIONAL_MASK token - * being derived into a write mask for a register. - * - * This will expand the production number into a 4-component - * write mask. - * - * \param mask_node The parse tree node for the optional_mask non-termina - * \param mask 4-component write mask - */ -static void -get_optional_mask(parse_tree_node * mask_node, GLint * mask) -{ - if (mask_node->prod_applied == 97) { - switch (mask_node->children[0]->prod_applied) { - case 99: /* x */ - mask[0] = 1; - mask[1] = 0; - mask[2] = 0; - mask[3] = 0; - break; - - case 100: /* y */ - mask[0] = 0; - mask[1] = 1; - mask[2] = 0; - mask[3] = 0; - break; - - case 101: /* xy */ - mask[0] = 1; - mask[1] = 1; - mask[2] = 0; - mask[3] = 0; - break; - - case 102: /* z */ - mask[0] = 0; - mask[1] = 0; - mask[2] = 1; - mask[3] = 0; - break; - - case 103: /* xz */ - mask[0] = 1; - mask[1] = 0; - mask[2] = 1; - mask[3] = 0; - break; - - case 104: /* yz */ - mask[0] = 0; - mask[1] = 1; - mask[2] = 1; - mask[3] = 0; - break; - - case 105: /* xyz */ - mask[0] = 1; - mask[1] = 1; - mask[2] = 1; - mask[3] = 0; - break; - - case 106: /* w */ - mask[0] = 0; - mask[1] = 0; - mask[2] = 0; - mask[3] = 1; - break; - - case 107: /* xw */ - mask[0] = 1; - mask[1] = 0; - mask[2] = 0; - mask[3] = 1; - break; - - case 108: /* yw */ - mask[0] = 0; - mask[1] = 1; - mask[2] = 0; - mask[3] = 1; - break; - case 109: /* xyw */ - mask[0] = 1; - mask[1] = 1; - mask[2] = 0; - mask[3] = 1; - break; - - case 110: /* zw */ - mask[0] = 0; - mask[1] = 0; - mask[2] = 1; - mask[3] = 1; - break; - - case 111: /* xzw */ - mask[0] = 1; - mask[1] = 0; - mask[2] = 1; - mask[3] = 1; - break; - - case 112: /* yzw */ - mask[0] = 0; - mask[1] = 1; - mask[2] = 1; - mask[3] = 1; - break; - - case 113: /* xyzw */ - mask[0] = 1; - mask[1] = 1; - mask[2] = 1; - mask[3] = 1; - break; - } - } -} - -/** - * Given a MASKED_DST_REG token in a parse tree node, figure out what - * register number and write mask the production results in. - * - * \param s The parse state - * \param mdr The parse tree node - * \param dest The destination register number - * \param dest_mask The 4-component write mask - */ -static void -get_masked_dst_reg(parse_state * s, parse_tree_node * mdr, GLint * dest, - GLint * dest_mask) -{ - GLint a; - - /* dest is a TEMP variable */ - if (mdr->children[0]->prod_applied == 67) { - a = mdr->children[0]->children[0]->children[0]->children[0]->tok_attr; - *dest = s->binds.reg_num[s->idents.attr[a]]; - printf("dst reg: %d (%s)\n", *dest, s->idents.data[a]); - } - else { - /* dest is a result variable */ - if (mdr->children[0]->children[0]->prod_applied == 86) { - a = mdr->children[0]->children[0]->children[0]->children[0]-> - tok_attr; - *dest = s->binds.reg_num[s->idents.attr[a]]; - printf("dest reg: %d (%s)\n", *dest, s->idents.data[a]); - } - /* dest is an implicit binding to result/output state */ - else { - a = mdr->children[0]->children[0]->children[0]->tok_attr; - *dest = s->binds.reg_num[a]; - printf("dst: %d\n", *dest); - } - } - - /* mdr->children[1] is the write mask */ - get_optional_mask(mdr->children[1], dest_mask); -} - - -/** - * Given a parse tree node with a swizzled src token, figure out the swizzle - * mask. - * - * \param s The parse state - * \param ssr The parse tree node - * \param swz The 4-component swizzle, 0 - x, 1 - y, 2 - z, 3 - w - */ -static void -get_src_swizzle(parse_state * s, parse_tree_node * ssr, GLint * swz) -{ - GLint a; - GLubyte *c; - - if (ssr->prod_applied == 317) { - if (ssr->children[0]->prod_applied == 318) { /* single component */ - switch (ssr->children[0]->children[0]->prod_applied) { - case 93: /* x */ - for (a = 0; a < 4; a++) - swz[a] = 0; - break; - - case 94: /* y */ - for (a = 0; a < 4; a++) - swz[a] = 1; - break; - - case 95: /* z */ - for (a = 0; a < 4; a++) - swz[a] = 2; - break; - - case 96: /* w */ - for (a = 0; a < 4; a++) - swz[a] = 3; - break; - } - } - else { /* 4-component */ - - c = s->idents.data[ssr->children[0]->children[0]->children[0]-> - tok_attr]; - for (a = 0; a < 4; a++) { - switch (c[a]) { - case 'x': - swz[a] = 0; - break; - case 'y': - swz[a] = 1; - break; - case 'z': - swz[a] = 2; - break; - case 'w': - swz[a] = 3; - break; - } - } - } - } -} - - -/** - * Given a parse tree node for a src register with an optional sign, figure out - * what register the src maps to, and what the sign is - * - * \param s The parse state - * \param ssr The parse tree node to work from - * \param sign The sign (1 or -1) - * \param ssrc The src register number - */ -static void -get_optional_sign_and_src_reg(parse_state * s, parse_tree_node * ssr, - int *sign, int *ssrc) -{ - GLint a; - - /* ssr->children[0] is the optionalSign */ - if (ssr->children[0]->prod_applied == 282) { /* - */ - *sign = -1; - } - - /* ssr->children[1] is the srcReg */ - - /* The src is a vertex attrib */ - if (ssr->children[1]->prod_applied == 64) { - if (ssr->children[1]->children[0]->prod_applied == 69) { /* variable */ - a = ssr->children[1]->children[0]->children[0]->children[0]-> - tok_attr; - *ssrc = s->binds.reg_num[s->idents.attr[a]]; - printf("src reg: %d (%s)\n", *ssrc, s->idents.data[a]); - } - else { /* implicit binding */ - - a = ssr->children[1]->children[0]->children[0]->tok_attr; - *ssrc = s->binds.reg_num[a]; - printf("src reg: %d %d (implicit binding)\n", - *ssrc, s->binds.type[a]); - } - } - else - /* The src is a temp variable */ - if (ssr->children[1]->prod_applied == 65) { - a = ssr->children[1]->children[0]->children[0]->children[0]->tok_attr; - *ssrc = s->binds.reg_num[s->idents.attr[a]]; - printf("src reg: %d (%s)\n", *ssrc, s->idents.data[a]); - } - /* The src is a param */ - else { - /* We have a single item */ - if (ssr->children[1]->children[0]->prod_applied == 72) { - a = ssr->children[1]->children[0]->children[0]->children[0]-> - children[0]->tok_attr; - *ssrc = s->binds.reg_num[s->idents.attr[a]]; - printf("src reg: %d (%s)\n", *ssrc, s->idents.data[a]); - } - else - /* We have an array of items */ - if (ssr->children[1]->children[0]->prod_applied == 73) { - a = ssr->children[1]->children[0]->children[0]->children[0]-> - children[0]->tok_attr; - *ssrc = s->binds.reg_num[s->idents.attr[a]]; - - /* We have an absolute offset into the array */ - if (ssr->children[1]->children[0]->children[1]->prod_applied == 77) { - /* Ok, are array will be layed out fully in registers, so we can compute the reg */ - printf("array base: %s\n", s->idents.data[a]); - a = ssr->children[1]->children[0]->children[1]->children[0]-> - children[0]->tok_attr; - printf("array absolute offset: %d\n", s->ints.data[a]); - *ssrc += s->ints.data[a]; - } - /* Otherwise, we have to grab the offset register */ - else { /* progParamArrayRel */ - - /* XXX: We don't know the offset, so we have to grab the offset register # */ - } - } - /* Otherwise, we have an implicit binding */ - else { /* paramSingleItemUse */ - - if (ssr->children[1]->children[0]->children[0]->prod_applied == 148) { /* programSingleItem */ - a = ssr->children[1]->children[0]->children[0]->children[0]-> - tok_attr; - } - else { - a = ssr->children[1]->children[0]->children[0]->children[0]-> - children[0]->tok_attr; - } - *ssrc = s->binds.reg_num[a]; - printf("src reg: %d %d (implicit binding)\n", *ssrc, - s->binds.type[a]); - } - } -} - - -/** - * Figure out what register a src reg is in, as well as the swizzle mask and the - * sign - * - * \param s The parse state - * \param ssr The swizzeled src reg parse tree node - * \param sign The return value for the sign {1, -1} - * \param ssrc The return value for the register number - * \param swz The 4-component swizzle mask - */ -static void -get_swizzle_src_reg(parse_state * s, parse_tree_node * ssr, GLint * sign, - GLint * ssrc, GLint * swz) -{ - get_optional_sign_and_src_reg(s, ssr, sign, ssrc); - - /* ssr->children[2] is the swizzleSuffix */ - get_src_swizzle(s, ssr->children[2], swz); -} - -/** - * Just like get_swizzle_src_reg, but find the scalar value to use from the register instead - * of the swizzle mask - * - * \param s The parse state - * \param ssr The swizzeled src reg parse tree node - * \param sign The return value for the sign {1, -1} - * \param ssrc The return value for the register number - * \param scalar The 1-component scalar number - */ -static void -get_scalar_src_reg(parse_state * s, parse_tree_node * ssr, GLint * sign, - GLint * ssrc, GLint * scalar) -{ - get_optional_sign_and_src_reg(s, ssr, sign, ssrc); - - /* sn->children[2] is a scalarSuffix */ - switch (ssr->children[2]->children[0]->prod_applied) { - case 93: - *scalar = 0; - break; - case 94: - *scalar = 1; - break; - case 95: - *scalar = 2; - break; - case 96: - *scalar = 3; - break; - } -} - -/** - * Recursivly traverse the parse tree and generate Mesa opcodes - * - * \param s The parse state - * \param ptn The parse tree node to process - */ -static void -parse_tree_generate_opcodes(parse_state * s, parse_tree_node * ptn) -{ - GLint a; - GLint opcode, dst, src[3]; - GLint dst_mask[4], src_swz[3][4], src_scalar[2], src_sign[3]; - parse_tree_node *dn, *sn[3]; - - src_sign[0] = src_sign[1] = src_sign[2] = 1; - for (a = 0; a < 4; a++) { - src_swz[0][a] = a; - src_swz[1][a] = a; - src_swz[2][a] = a; - } - src_scalar[0] = src_scalar[1] = src_scalar[2] = 0; - dst_mask[0] = dst_mask[1] = dst_mask[2] = dst_mask[3] = 1; - - switch (ptn->prod_applied) { - case 17: /* ARL */ - opcode = VP_OPCODE_ARL; - - dn = ptn->children[0]; - sn[0] = ptn->children[1]; - - /* dn is a maskedAddrReg */ - /* dn->children[0] is an addrReg */ - /* dn->children[1] is an addrWriteMask */ - /* XXX: do this.. */ - break; - - case 18: /* VECTORop */ - switch (ptn->children[0]->prod_applied) { - case 19: /* ABS */ - opcode = VP_OPCODE_ABS; - break; - case 20: /* FLR */ - opcode = VP_OPCODE_FLR; - break; - case 21: /* FRC */ - opcode = VP_OPCODE_FRC; - break; - case 22: /* LIT */ - opcode = VP_OPCODE_LIT; - break; - case 23: /* MOV */ - opcode = VP_OPCODE_MOV; - break; - } - printf("opcode: %d\n", opcode); - - /* dn is a maskedDstReg */ - dn = ptn->children[1]; - - /* sn is a swizzleSrcReg */ - sn[0] = ptn->children[2]; - - get_masked_dst_reg(s, dn, &dst, dst_mask); - printf("dst: %d mask: %d %d %d %d\n", dst, dst_mask[0], dst_mask[1], - dst_mask[2], dst_mask[3]); - - get_swizzle_src_reg(s, sn[0], &src_sign[0], &src[0], src_swz[0]); - - printf("src sign: %d reg: %d swz: %d %d %d %d\n", - src_sign[0], src[0], src_swz[0][0], src_swz[0][1], src_swz[0][2], - src_swz[0][3]); - break; - - case 24: /* SCALARop */ - switch (ptn->children[0]->prod_applied) { - case 25: /* EX2 */ - opcode = VP_OPCODE_EX2; - break; - case 26: /* EXP */ - opcode = VP_OPCODE_EXP; - break; - case 27: /* LG2 */ - opcode = VP_OPCODE_LG2; - break; - case 28: /* LOG */ - opcode = VP_OPCODE_LOG; - break; - case 29: /* RCP */ - opcode = VP_OPCODE_RCP; - break; - case 30: /* RSQ */ - opcode = VP_OPCODE_RSQ; - break; - } - - printf("opcode: %d\n", opcode); - /* dn is a maskedDstReg */ - dn = ptn->children[1]; - - get_masked_dst_reg(s, dn, &dst, dst_mask); - printf("dst: %d mask: %d %d %d %d\n", dst, dst_mask[0], dst_mask[1], - dst_mask[2], dst_mask[3]); - - /* sn is a scalarSrcReg */ - sn[0] = ptn->children[2]; - - get_scalar_src_reg(s, sn[0], &src_sign[0], &src[0], &src_scalar[0]); - printf("src sign: %d reg: %d scalar: %d\n", src_sign[0], src[0], - src_scalar[0]); - break; - - case 31: /* BINSC */ - opcode = VP_OPCODE_POW; - - printf("opcode: %d\n", opcode); - /* maskedDstReg */ - dn = ptn->children[1]; - get_masked_dst_reg(s, dn, &dst, dst_mask); - printf("dst: %d mask: %d %d %d %d\n", dst, dst_mask[0], dst_mask[1], - dst_mask[2], dst_mask[3]); - - /* sn are scalarSrcReg's */ - sn[0] = ptn->children[2]->children[0]; - sn[1] = ptn->children[2]->children[1]; - - get_scalar_src_reg(s, sn[0], &src_sign[0], &src[0], &src_scalar[0]); - get_scalar_src_reg(s, sn[1], &src_sign[1], &src[1], &src_scalar[1]); - - printf("src0 sign: %d reg: %d scalar: %d\n", src_sign[0], src[0], - src_scalar[0]); - printf("src1 sign: %d reg: %d scalar: %d\n", src_sign[1], src[1], - src_scalar[1]); - break; - - - case 34: /* BIN */ - switch (ptn->children[0]->prod_applied) { - case 36: /* ADD */ - opcode = VP_OPCODE_ADD; - break; - case 37: /* DP3 */ - opcode = VP_OPCODE_DP3; - break; - case 38: /* DP4 */ - opcode = VP_OPCODE_DP4; - break; - case 39: /* DPH */ - opcode = VP_OPCODE_DPH; - break; - case 40: /* DST */ - opcode = VP_OPCODE_DST; - break; - case 41: /* MAX */ - opcode = VP_OPCODE_MAX; - break; - case 42: /* MIN */ - opcode = VP_OPCODE_MIN; - break; - case 43: /* MUL */ - opcode = VP_OPCODE_MUL; - break; - case 44: /* SGE */ - opcode = VP_OPCODE_SGE; - break; - case 45: /* SLT */ - opcode = VP_OPCODE_SLT; - break; - case 46: /* SUB */ - opcode = VP_OPCODE_SUB; - break; - case 47: /* XPD */ - opcode = VP_OPCODE_XPD; - break; - } - - printf("opcode: %d\n", opcode); - - /* maskedDstReg */ - dn = ptn->children[1]; - get_masked_dst_reg(s, dn, &dst, dst_mask); - printf("dst: %d mask: %d %d %d %d\n", dst, dst_mask[0], dst_mask[1], - dst_mask[2], dst_mask[3]); - - /* sn are scalarSrcReg's */ - sn[0] = ptn->children[2]->children[0]; - sn[1] = ptn->children[2]->children[1]; - - get_swizzle_src_reg(s, sn[0], &src_sign[0], &src[0], src_swz[0]); - get_swizzle_src_reg(s, sn[1], &src_sign[1], &src[1], src_swz[1]); - - printf("src0 sign: %d reg: %d swz: %d %d %d %d\n", - src_sign[0], src[0], src_swz[0][0], src_swz[0][1], src_swz[0][2], - src_swz[0][3]); - printf("src1 sign: %d reg: %d swz: %d %d %d %d\n", src_sign[1], src[1], - src_swz[1][0], src_swz[1][1], src_swz[1][2], src_swz[1][3]); - break; - - case 48: /* TRI */ - opcode = VP_OPCODE_MAD; - - printf("opcode: %d\n", opcode); - - /* maskedDstReg */ - dn = ptn->children[1]; - get_masked_dst_reg(s, dn, &dst, dst_mask); - printf("dst: %d mask: %d %d %d %d\n", dst, dst_mask[0], dst_mask[1], - dst_mask[2], dst_mask[3]); - - /* sn are scalarSrcReg's */ - sn[0] = ptn->children[2]->children[0]; - sn[1] = ptn->children[2]->children[1]->children[0]; - sn[2] = ptn->children[2]->children[1]->children[1]; - - get_swizzle_src_reg(s, sn[0], &src_sign[0], &src[0], src_swz[0]); - get_swizzle_src_reg(s, sn[1], &src_sign[1], &src[1], src_swz[1]); - get_swizzle_src_reg(s, sn[2], &src_sign[2], &src[2], src_swz[2]); - - printf("src0 sign: %d reg: %d swz: %d %d %d %d\n", - src_sign[0], src[0], src_swz[0][0], src_swz[0][1], src_swz[0][2], - src_swz[0][3]); - printf("src1 sign: %d reg: %d swz: %d %d %d %d\n", src_sign[1], src[1], - src_swz[1][0], src_swz[1][1], src_swz[1][2], src_swz[1][3]); - printf("src2 sign: %d reg: %d swz: %d %d %d %d\n", src_sign[2], src[2], - src_swz[2][0], src_swz[2][1], src_swz[2][2], src_swz[2][3]); - - } - - for (a = 0; a < 4; a++) { - if (!ptn->children[a]) - return; - parse_tree_generate_opcodes(s, ptn->children[a]); - } -} - -/** - * When we go to examine the parse tree to generate opcodes, things are not exactly pretty to deal with. - * Parameters, constants, matricies, attribute bindings, and the like are represented by large numbers - * of nodes. - * - * In order to keep the code generation code cleaner, we make a recursive pass over the parse tree and 'roll up' these deep - * derivations of the attribs, and replace them with a single token, BINDING_TOKEN. The token attribute for - * BINDING_TOKEN is a index in the 'binding table' where all the relavant info on the chunk of state is stored, - * e.g its type. - * - * For example, the string 'vertex.color.secondary' is represented by 4 productions, and 4 nodes in the parse - * tree. The token at the root of this derivation is NT_VTX_ATTRIB_BINDING_TOKEN. After this folding, - * the token at the root is BINDING_TOKEN, and s->binds[token_attr_at_the_root].type = ATTRIB_COLOR_SECONDARY. - * - * \param s The parse state - * \param ptn The root parse tree node to start folding bindings - */ -static void -parse_tree_fold_bindings(parse_state * s, parse_tree_node * ptn) -{ - GLint a, b; - GLint eat_children, bind_type, bind_idx, bind_row, bind_nrows; - GLfloat bind_vals[4]; - parse_tree_node *ptmp; - - eat_children = 0; - bind_row = 0; - bind_nrows = 1; - bind_vals[0] = bind_vals[1] = bind_vals[2] = bind_vals[3] = 0.0f; - switch (ptn->prod_applied) { - /* vertex */ - case 121: - eat_children = 1; - bind_idx = 0; - switch (ptn->children[0]->prod_applied) { - case 122: /* position */ - bind_type = ATTRIB_POSITION; - break; - case 123: /* weight */ - bind_type = ATTRIB_WEIGHT; - if (ptn->children[0]->children[0]->prod_applied == 132) { - bind_idx = - s->ints.data[ptn->children[0]->children[0]->children[0]-> - children[0]->tok_attr]; - } - break; - case 124: /* normal */ - bind_type = ATTRIB_NORMAL; - break; - case 125: /* color */ - bind_type = ATTRIB_COLOR_PRIMARY; - if (ptn->children[0]->children[0]->prod_applied == 306) { - if (ptn->children[0]->children[0]->children[0]->prod_applied == - 309) - bind_type = ATTRIB_COLOR_SECONDARY; - } - break; - case 126: /* fogcoord */ - bind_type = ATTRIB_FOGCOORD; - break; - case 127: /* texcoord */ - bind_type = ATTRIB_TEXCOORD; - if (ptn->children[0]->children[0]->prod_applied == 311) { - bind_idx = - s->ints.data[ptn->children[0]->children[0]->children[0]-> - children[0]->tok_attr]; - } - break; - case 128: /* matrixindex */ - bind_type = ATTRIB_MATRIXINDEX; - bind_idx = - s->ints.data[ptn->children[0]->children[0]->children[0]-> - tok_attr]; - break; - case 129: /* attrib */ - bind_type = ATTRIB_ATTRIB; - bind_idx = - s->ints.data[ptn->children[0]->children[0]->children[0]-> - tok_attr]; - break; - } - break; - - /* state */ - case 154: - case 172: /* material */ - eat_children = 2; - bind_idx = 0; - ptmp = ptn->children[0]->children[0]; - - a = 0; - if (ptmp->prod_applied == 182) { - a = 1; - b = 0; - } - else - if ((ptmp->prod_applied == 183) - && (ptmp->children[0]->prod_applied == 305)) { - a = 1; - b = 1; - } - - /* no explicit face, or explicit front */ - if (a) { - switch (ptmp->children[b]->prod_applied) { - case 184: /* ambient */ - bind_type = MATERIAL_FRONT_AMBIENT; - break; - case 185: /* diffuse */ - bind_type = MATERIAL_FRONT_DIFFUSE; - break; - case 186: /* specular */ - bind_type = MATERIAL_FRONT_SPECULAR; - break; - case 187: /* emission */ - bind_type = MATERIAL_FRONT_EMISSION; - break; - case 188: /* shininess */ - bind_type = MATERIAL_FRONT_SHININESS; - break; - } - } - /* has explicit back face */ - else { - switch (ptmp->children[1]->prod_applied) { - case 184: /* ambient */ - bind_type = MATERIAL_BACK_AMBIENT; - break; - case 185: /* diffuse */ - bind_type = MATERIAL_BACK_DIFFUSE; - break; - case 186: /* specular */ - bind_type = MATERIAL_BACK_SPECULAR; - break; - case 187: /* emission */ - bind_type = MATERIAL_BACK_EMISSION; - break; - case 188: /* shininess */ - bind_type = MATERIAL_BACK_SHININESS; - break; - } - } - break; - case 155: - case 173: /* light */ - eat_children = 2; - bind_idx = 0; - printf("FOLDING LIGHT!\n"); - ptmp = ptn->children[0]; - bind_idx = s->ints.data[ptmp->children[0]->children[0]->tok_attr]; - switch (ptmp->children[1]->children[0]->prod_applied) { - case 191: /* ambient */ - bind_type = LIGHT_AMBIENT; - break; - case 192: /* diffuse */ - bind_type = LIGHT_DIFFUSE; - break; - case 193: /* specular */ - bind_type = LIGHT_SPECULAR; - break; - case 194: /* position */ - bind_type = LIGHT_POSITION; - break; - case 195: /* attenuation */ - bind_type = LIGHT_ATTENUATION; - break; - case 196: /* spot */ - bind_type = LIGHT_SPOT_DIRECTION; - break; - case 197: /* half */ - bind_type = LIGHT_HALF; - break; - } - break; - - case 156: - case 174: /* lightmodel */ - eat_children = 2; - bind_idx = 0; - - ptmp = ptn->children[0]; - switch (ptmp->prod_applied) { - case 201: /* ambient */ - bind_type = LIGHTMODEL_AMBIENT; - break; - case 202: /* scenecolor */ - bind_type = LIGHTMODEL_FRONT_SCENECOLOR; - break; - case 203: /* foo.scenecolor */ - if (ptmp->children[0]->prod_applied == 304) - bind_type = LIGHTMODEL_FRONT_SCENECOLOR; - else - bind_type = LIGHTMODEL_BACK_SCENECOLOR; - } - break; - case 157: - case 175: /* lightprod */ - eat_children = 2; - bind_idx = 0; - - ptmp = ptn->children[0]; - bind_idx = s->ints.data[ptmp->children[0]->children[0]->tok_attr]; - /* No explicit face */ - if (ptmp->children[1]->children[0]->prod_applied == 206) { - a = 1; /* front */ - b = 0; /* 0-th child */ - } - else - if ((ptmp->children[1]->children[0]->prod_applied == 207) && - (ptmp->children[1]->children[0]->children[0]->prod_applied == - 304)) { - a = 1; /* front */ - b = 1; /* 1-th child */ - } - else { - a = 0; - b = 1; - } - if (a) { - switch (ptmp->children[1]->children[0]->children[b]->prod_applied) { - case 208: /* ambient */ - bind_type = LIGHTPROD_FRONT_AMBIENT; - break; - case 209: /* diffuse */ - bind_type = LIGHTPROD_FRONT_DIFFUSE; - break; - case 210: /* specular */ - bind_type = LIGHTPROD_FRONT_SPECULAR; - break; - } - } - else { - switch (ptmp->children[1]->children[0]->children[b]->prod_applied) { - case 208: /* ambient */ - bind_type = LIGHTPROD_BACK_AMBIENT; - break; - case 209: /* diffuse */ - bind_type = LIGHTPROD_BACK_DIFFUSE; - break; - case 210: /* specular */ - bind_type = LIGHTPROD_BACK_SPECULAR; - break; - } - } - break; - case 158: - case 176: /* texgen */ - eat_children = 2; - bind_idx = 0; - - ptmp = ptn->children[0]; - if (ptmp->children[0]->prod_applied == 311) - bind_idx = - s->ints.data[ptmp->children[0]->children[0]->children[0]-> - tok_attr]; - ptmp = ptn->children[0]->children[1]; - if (ptmp->children[0]->prod_applied == 214) - a = 1; /* eye */ - else - a = 0; /* object */ - b = ptmp->children[1]->prod_applied - 216; - if (a == 1) { - switch (b) { - case 0: - bind_type = TEXGEN_EYE_S; - break; - case 1: - bind_type = TEXGEN_EYE_T; - break; - case 2: - bind_type = TEXGEN_EYE_R; - break; - case 3: - bind_type = TEXGEN_EYE_Q; - break; - } - } - else { - switch (b) { - case 0: - bind_type = TEXGEN_OBJECT_S; - break; - case 1: - bind_type = TEXGEN_OBJECT_T; - break; - case 2: - bind_type = TEXGEN_OBJECT_R; - break; - case 3: - bind_type = TEXGEN_OBJECT_Q; - break; - } - } - break; - case 159: - case 177: /* fog */ - eat_children = 2; - bind_idx = 0; - - ptmp = ptn->children[0]; - if (ptmp->children[0]->prod_applied == 221) - bind_type = FOG_COLOR; - else - bind_type = FOG_PARAMS; - break; - case 160: - case 178: /* clip */ - eat_children = 2; - bind_idx = 0; - - ptmp = ptn->children[0]; - bind_idx = s->ints.data[ptmp->children[0]->children[0]->tok_attr]; - bind_type = CLIP_PLANE; - break; - case 161: - case 179: /* point */ - eat_children = 2; - bind_idx = 0; - - ptmp = ptn->children[0]; - if (ptmp->children[0]->prod_applied == 227) - bind_type = POINT_SIZE; - else - bind_type = POINT_ATTENUATION; - break; - - case 162: /* matrix rows/whole matrix */ - eat_children = 2; - bind_idx = 0; - { - parse_tree_node *mname; - GLint mod = 0; - GLint name = 0; - - mname = ptn->children[0]; - switch (mname->prod_applied) { - case 238: /* modelview */ - name = 0; - if (mname->children[0]->prod_applied == 245) - bind_idx = - s->ints.data[mname->children[0]->children[0]->children[0]-> - tok_attr]; - break; - case 239: /* projection */ - name = 1; - break; - case 240: /* mvp */ - name = 2; - break; - case 241: /* texture */ - if (mname->children[0]->prod_applied == 311) - bind_idx = - s->ints.data[mname->children[0]->children[0]->children[0]-> - tok_attr]; - name = 3; - break; - case 242: /* palette */ - bind_idx = - s->ints.data[mname->children[0]->children[0]->tok_attr]; - name = 4; - break; - case 243: /* program */ - bind_idx = - s->ints.data[mname->children[0]->children[0]->tok_attr]; - name = 5; - break; - } - - ptmp = ptn->children[1]; - if (ptmp->prod_applied == 316) { - bind_type = name_and_mod_to_matrixrows(name, mod); - bind_row = 0; - bind_nrows = 4; - } - else { - if (ptmp->children[0]->prod_applied == 164) { - switch (ptmp->children[0]->children[0]->prod_applied) { - case 234: /* inverse */ - mod = 1; - break; - case 235: /* transpose */ - mod = 3; - break; - case 236: /* invtrans */ - mod = 2; - break; - } - if (ptmp->children[0]->children[1]->prod_applied == 166) { - bind_type = name_and_mod_to_matrixrows(name, mod); - bind_row = 0; - bind_nrows = 4; - } - else { /* prod 167 */ - - bind_type = name_and_mod_to_matrixrows(name, mod); - bind_row = - s->ints.data[ptmp->children[0]->children[1]-> - children[0]->children[0]->children[0]-> - tok_attr]; - if (ptmp->children[0]->children[1]->children[0]-> - children[1]->prod_applied == 169) - bind_nrows = 1; - else { - bind_nrows = - s->ints.data[ptmp->children[0]->children[1]-> - children[0]->children[1]->children[0]-> - children[0]->tok_attr] - bind_row + 1; - } - } - } - else { /* prod 165 */ - - bind_type = name_and_mod_to_matrixrows(name, mod); - - bind_row = - s->ints.data[ptmp->children[0]->children[0]->children[0]-> - tok_attr]; - if (ptmp->children[0]->children[1]->prod_applied == 169) - bind_nrows = 1; - else - bind_nrows = - s->ints.data[ptmp->children[0]->children[1]-> - children[0]->children[0]->tok_attr] - - bind_row + 1; - } - } - } - - printf("folding matrixrows: %d %d %d %d\n", bind_type, bind_idx, - bind_row, bind_nrows); - break; - - case 180: /* matrix row */ - eat_children = 2; - bind_idx = 0; - - { - GLint mod; - parse_tree_node *mname, *mrow; - - ptmp = ptn->children[0]; - mname = ptmp->children[0]; - mod = 0; - if (ptmp->children[1]->children[0]->prod_applied == 232) { - mrow = - ptmp->children[1]->children[0]->children[1]->children[0]-> - children[0]; - switch (ptmp->children[1]->children[0]->children[0]->prod_applied) { - case 234: - mod = 1; /* inverse */ - break; - case 235: - mod = 2; /* transpose */ - break; - case 236: - mod = 3; /* invtrans */ - break; - } - } - else { - mrow = ptmp->children[1]->children[0]->children[0]->children[0]; - } - bind_row = s->ints.data[mrow->tok_attr]; - - switch (mname->prod_applied) { - case 238: /* modelview */ - if (mname->children[0]->prod_applied == 245) { - bind_idx = - s->ints.data[mname->children[0]->children[0]->children[0]-> - tok_attr]; - } - switch (mod) { - case 0: - bind_type = MATRIXROW_MODELVIEW; - break; - case 1: - bind_type = MATRIXROW_MODELVIEW_INVERSE; - break; - case 2: - bind_type = MATRIXROW_MODELVIEW_TRANSPOSE; - break; - case 3: - bind_type = MATRIXROW_MODELVIEW_INVTRANS; - } - break; - - case 239: /* projection */ - switch (mod) { - case 0: - bind_type = MATRIXROW_PROJECTION; - break; - case 1: - bind_type = MATRIXROW_PROJECTION_INVERSE; - break; - case 2: - bind_type = MATRIXROW_PROJECTION_TRANSPOSE; - break; - case 3: - bind_type = MATRIXROW_PROJECTION_INVTRANS; - } - break; - - case 240: /* mvp */ - switch (mod) { - case 0: - bind_type = MATRIXROW_MVP; - break; - case 1: - bind_type = MATRIXROW_MVP_INVERSE; - break; - case 2: - bind_type = MATRIXROW_MVP_TRANSPOSE; - break; - case 3: - bind_type = MATRIXROW_MVP_INVTRANS; - } - break; - - case 241: /* texture */ - if (mname->children[0]->prod_applied == 311) { - bind_idx = - s->ints.data[mname->children[0]->children[0]->children[0]-> - tok_attr]; - } - switch (mod) { - case 0: - bind_type = MATRIXROW_TEXTURE; - break; - case 1: - bind_type = MATRIXROW_TEXTURE_INVERSE; - break; - case 2: - bind_type = MATRIXROW_TEXTURE_TRANSPOSE; - break; - case 3: - bind_type = MATRIXROW_TEXTURE_INVTRANS; - } - break; - - case 242: /* palette */ - bind_idx = - s->ints.data[mname->children[0]->children[0]->tok_attr]; - switch (mod) { - case 0: - bind_type = MATRIXROW_PALETTE; - break; - case 1: - bind_type = MATRIXROW_PALETTE_INVERSE; - break; - case 2: - bind_type = MATRIXROW_PALETTE_TRANSPOSE; - break; - case 3: - bind_type = MATRIXROW_PALETTE_INVTRANS; - } - break; - - case 243: /* program */ - bind_idx = - s->ints.data[mname->children[0]->children[0]->tok_attr]; - switch (mod) { - case 0: - bind_type = MATRIXROW_PROGRAM; - break; - case 1: - bind_type = MATRIXROW_PROGRAM_INVERSE; - break; - case 2: - bind_type = MATRIXROW_PROGRAM_TRANSPOSE; - break; - case 3: - bind_type = MATRIXROW_PROGRAM_INVTRANS; - } - break; - } - } - break; - - /* program (single) */ - case 249: - eat_children = 1; - bind_idx = 0; - switch (ptn->children[0]->prod_applied) { - case 250: /* env */ - bind_type = PROGRAM_ENV_SINGLE; - break; - case 251: /* local */ - bind_type = PROGRAM_LOCAL_SINGLE; - break; - } - bind_idx = - s->ints.data[ptn->children[0]->children[0]->children[0]-> - children[0]->tok_attr]; - break; - - /* program (multi) */ - case 252: - eat_children = 1; - bind_idx = 0; - switch (ptn->children[0]->prod_applied) { - case 253: /* env */ - case 254: /* local */ - if (ptn->children[0]->prod_applied == 253) - bind_type = PROGRAM_ENV_MULTI; - else - bind_type = PROGRAM_LOCAL_MULTI; - - ptmp = ptn->children[0]->children[0]->children[0]; - bind_idx = bind_row = - s->ints.data[ptmp->children[0]->children[0]->tok_attr]; - bind_nrows = 1; - - ptmp = ptn->children[0]->children[0]->children[0]->children[1]; - if ((ptmp->prod_applied == 257) || (ptmp->prod_applied == 262)) - bind_nrows = - s->ints.data[ptmp->children[0]->children[0]->tok_attr] - - bind_idx; - break; - } - break; - -#define FOLD_FLOAT_CONSTANT(float_ptr, bind_vals_idx, sign) \ - if (float_ptr->tok == 49) /* GLfloat */ {\ - bind_vals[bind_vals_idx] = sign * (GLfloat) s->floats.data[float_ptr->tok_attr];\ - }\ - else /* GLint */ {\ - bind_vals[bind_vals_idx] = sign * s->ints.data[float_ptr->tok_attr];\ - } - -#define FOLD_SIGNED_FLOAT_CONSTANT(sf_ptr, bind_vals_idx) \ - {\ - GLfloat __mul = 1.0F;\ - if (sf_ptr->children[0]->prod_applied == 282) \ - __mul = -1.0F;\ - FOLD_FLOAT_CONSTANT(sf_ptr->children[1], bind_vals_idx, __mul);\ - } - - /* const scalar decl */ - case 271: - eat_children = 1; - bind_idx = 0; - bind_type = CONSTANT; - - FOLD_SIGNED_FLOAT_CONSTANT(ptn->children[0], 0); -#if 0 - { - GLfloat mul = 1.; - if (ptn->children[0]->children[0]->prod_applied == 282) { - mul = -1; - } - - FOLD_FLOAT_CONSTANT(ptn->children[0]->children[1], 0, mul); - } -#endif - break; - - /* const vector */ - case 273: - eat_children = 1; - bind_idx = 0; - bind_type = CONSTANT; - - FOLD_SIGNED_FLOAT_CONSTANT(ptn->children[0], 0); - if (ptn->children[1]->prod_applied == 275) { - FOLD_SIGNED_FLOAT_CONSTANT(ptn->children[1]->children[0], 1); - if (ptn->children[1]->children[1]->prod_applied == 277) { - FOLD_SIGNED_FLOAT_CONSTANT(ptn->children[1]->children[1]-> - children[0], 2); - if (ptn->children[1]->children[1]->children[1]->prod_applied == - 279) { - FOLD_SIGNED_FLOAT_CONSTANT(ptn->children[1]->children[1]-> - children[1]->children[0], 3); - } - } - } - break; - - /* result */ - case 289: - eat_children = 1; - bind_idx = 0; - switch (ptn->children[0]->prod_applied) { - case 290: /* position */ - bind_type = RESULT_POSITION; - break; - case 291: /* fogcoord */ - bind_type = RESULT_FOGCOORD; - break; - case 292: /* pointsize */ - bind_type = RESULT_POINTSIZE; - break; - case 293: /* color */ - bind_type = RESULT_COLOR_FRONT_PRIMARY; - ptmp = ptn->children[0]->children[0]->children[0]; - if (ptmp->prod_applied == 297) { - if (ptmp->children[0]->prod_applied == 298) { /* front */ - if (ptmp->children[0]->children[0]->prod_applied == 301) { - if (ptmp->children[0]->children[0]->children[0]->prod_applied == 303) /* secondary */ - bind_type = RESULT_COLOR_FRONT_SECONDARY; - } - } - else { /* back */ - - bind_type = RESULT_COLOR_BACK_PRIMARY; - if (ptmp->children[0]->children[0]->prod_applied == 301) { - if (ptmp->children[0]->children[0]->children[0]->prod_applied == 303) /* secondary */ - bind_type = RESULT_COLOR_BACK_SECONDARY; - } - - } - } - break; - case 294: /* texcoord */ - bind_type = RESULT_TEXCOORD; - if (ptn->children[0]->children[0]->prod_applied == 311) { - bind_idx = - s->ints.data[ptn->children[0]->children[0]->children[0]-> - children[0]->tok_attr]; - } - break; - } - break; - } - - /* Mmmmm... baaaaby */ - if (eat_children) { - if (eat_children == 2) - parse_tree_free_children(ptn->children[0]); - else - parse_tree_free_children(ptn); - - /* Insert the binding into the binding table */ - ptn->tok = BINDING_TOKEN; - ptn->tok_attr = - binding_table_add(&s->binds, bind_type, bind_idx, bind_row, - bind_nrows, bind_vals); - - printf("Got binding %d %d %d %d at pos %d in bind tab [%f %f %f %f]\n", - bind_type, bind_idx, bind_row, bind_nrows, ptn->tok_attr, - bind_vals[0], bind_vals[1], bind_vals[2], bind_vals[3]); - } - - - for (a = 0; a < 4; a++) { - if (!ptn->children[a]) - return; - - parse_tree_fold_bindings(s, ptn->children[a]); - } -} - -/** - * After we have figured out what mess of parse tree actually represents GL state (or constants, or - * whatnot), we have to line up variables with the state. For example, a line something like - * - * OUTPUT foo = result.position; - * - * We would have 'foo' in the identifier table at some position foo_idx, and 'result.position' in the - * binding table at some position res_pos_idx. To set things up such that 'foo' is associated with - * the result position state, we need to set ident[foo_idx].attr = res_pos_idx so we can generate - * opcodes without going bonkers. - * - * This function works on OUTPUT, ATTRIB, and PARAM single bindings. PARAM array bindings are handled in - * parse_tree_assign_param_arrays(). - * - * \param s The parse state - * \param ptn The root of the parse tree from which to start lining up state and variables - */ -static void -parse_tree_assign_bindings(parse_state * s, parse_tree_node * ptn) -{ - GLint a; - parse_tree_node *var_name, *attr_item; - - /* OUTPUT, ATTRIB */ - if ((ptn->prod_applied == 288) || (ptn->prod_applied == 120)) { - var_name = ptn->children[0]->children[0]; - attr_item = ptn->children[1]; - - if (attr_item->tok != BINDING_TOKEN) { - fprintf(stderr, - "sanity check: trying to bind an output variable to something funky!\n"); - return; - } - - s->idents.attr[var_name->tok_attr] = attr_item->tok_attr; - printf("result: %s bound to %d\n", s->idents.data[var_name->tok_attr], - s->binds.type[s->idents.attr[var_name->tok_attr]]); - return; - } - - /* stateSingleItemDecl */ - if (ptn->prod_applied == 134) { - var_name = ptn->children[0]->children[0]; - if (ptn->children[1]->prod_applied == 135) { - if (ptn->children[1]->children[0]->prod_applied == 139) { - if (ptn->children[1]->children[0]->children[0]->prod_applied == - 144) - attr_item = - ptn->children[1]->children[0]->children[0]->children[0]-> - children[0]; - else if (ptn->children[1]->children[0]->children[0]-> - prod_applied == 145) - attr_item = - ptn->children[1]->children[0]->children[0]->children[0]; - else - attr_item = - ptn->children[1]->children[0]->children[0]->children[0]-> - children[0]; - - if (attr_item->tok != BINDING_TOKEN) { - fprintf(stderr, - "sanity check: trying to bind an param variable (%s) to something funky! [%d]\n", - s->idents.data[var_name->tok_attr], attr_item->tok); - exit(1); - } - - s->idents.attr[var_name->tok_attr] = attr_item->tok_attr; - printf("result: %s bound to %d\n", - s->idents.data[var_name->tok_attr], - s->binds.type[s->idents.attr[var_name->tok_attr]]); - return; - } - } - - } - - /* else, recurse on all our children */ - for (a = 0; a < 4; a++) { - if (!ptn->children[a]) - return; - - parse_tree_assign_bindings(s, ptn->children[a]); - } - -} - -/** - * This handles lining up PARAM arrays with variables, much like parse_tree_assign_bindings(). - * - * In parse_tree_assign_bindings, we set the identifier attr to the index into the binding table of - * the bound state. - * - * Here, instead, we allocate a slot in the 'array table' to stick the bound state into. Instead - * of an index into the binding table, the identifier attr now holds the index into the array table. - * - * \param s The parse state - * \param pnt The root parse tree node to handle arrays from - * - */ -static void -parse_tree_assign_param_arrays(parse_state * s, parse_tree_node * ptn) -{ - GLint a, is_mult, array_len; - parse_tree_node *var_name, *binding, *arraysize, *ptmp; - - /* If we're a param */ - if (ptn->prod_applied == 134) { - /* establish name */ - var_name = ptn->children[0]; - - /* param_statement2 */ - binding = ptn->children[1]; - if (binding->prod_applied == 136) { - /* optarraysize */ - arraysize = binding->children[0]; - - is_mult = 0; - - /* foo[3] */ - if (arraysize->prod_applied == 138) { - debug_token(s, var_name->children[0]->tok, - var_name->children[0]->tok_attr); - debug_token(s, arraysize->children[0]->tok, - arraysize->children[0]->tok_attr); - printf("\n"); - is_mult = 1; - } - else - /* foo[] */ - if (arraysize->prod_applied == 137) { - arraysize = NULL; - printf("How do I init a PARAM array like foo[]?? \n"); - is_mult = 1; - } - - if (!is_mult) - return; - - s->idents.attr[var_name->tok_attr] = array_table_new(&s->arrays); - - binding = binding->children[1]->children[0]; - ptmp = binding->children[0]; - array_len = 0; - - if (ptmp->prod_applied == 150) { /* state */ - printf("matrix 0 [state]:\n"); - printf("%d %d\n", ptmp->children[0]->children[0]->tok, - ptmp->children[0]->children[0]->tok_attr); - array_table_add_data(&s->arrays, - s->idents.attr[var_name->tok_attr], - ptmp->children[0]->children[0]->tok_attr); - array_len += - s->binds.num_rows[ptmp->children[0]->children[0]->tok_attr]; - } - else if (ptmp->prod_applied == 151) { /* program */ - printf("matrix 0 [program]:\n"); - printf("%d %d\n", ptmp->children[0]->tok, - ptmp->children[0]->tok_attr); - array_table_add_data(&s->arrays, - s->idents.attr[var_name->tok_attr], - ptmp->children[0]->tok_attr); - array_len += s->binds.num_rows[ptmp->children[0]->tok_attr]; - } - else { /* constant */ - - printf("matrix 0 [constant]:\n"); - printf("%d %d\n", ptmp->children[0]->children[0]->tok, - ptmp->children[0]->children[0]->tok_attr); - array_table_add_data(&s->arrays, - s->idents.attr[var_name->tok_attr], - ptmp->children[0]->children[0]->tok_attr); - array_len += - s->binds.num_rows[ptmp->children[0]->children[0]->tok_attr]; - } - binding = binding->children[1]; - - while (binding->prod_applied != 143) { - ptmp = binding->children[0]->children[0]; - printf("mat: %d\n", ptmp->prod_applied); - if (ptmp->prod_applied == 150) { /* state */ - printf("matrix %d:\n", array_len); - printf("%d %d\n", ptmp->children[0]->children[0]->tok, - ptmp->children[0]->children[0]->tok_attr); - array_table_add_data(&s->arrays, - s->idents.attr[var_name->tok_attr], - ptmp->children[0]->children[0]->tok_attr); - array_len += - s->binds.num_rows[ptmp->children[0]->children[0]->tok_attr]; - } - else if (ptmp->prod_applied == 151) { /* program */ - printf("matrix %d [program]:\n", array_len); - printf("%d %d\n", ptmp->children[0]->tok, - ptmp->children[0]->tok_attr); - array_table_add_data(&s->arrays, - s->idents.attr[var_name->tok_attr], - ptmp->children[0]->tok_attr); - array_len += s->binds.num_rows[ptmp->children[0]->tok_attr]; - } - else { /* constant */ - - printf("matrix %d [constant]:\n", array_len); - printf("%d %d\n", ptmp->children[0]->children[0]->tok, - ptmp->children[0]->children[0]->tok_attr); - array_table_add_data(&s->arrays, - s->idents.attr[var_name->tok_attr], - ptmp->children[0]->children[0]->tok_attr); - array_len += - s->binds.num_rows[ptmp->children[0]->children[0]->tok_attr]; - } - binding = binding->children[0]->children[1]; - } - - /* XXX: have to compare the requested size, and the actual - * size, and fix up any inconsistancies - */ - if (arraysize) { - printf("matrix wants to get %d rows\n", - s->ints.data[arraysize->children[0]->tok_attr]); - } - printf("matrix num rows: %d\n", array_len); - } - - return; - } - - /* Else, recurse on all our children */ - for (a = 0; a < 4; a++) { - if (!ptn->children[a]) - return; - - parse_tree_assign_param_arrays(s, ptn->children[a]); - } - -} - -/* XXX: This needs to be written properly. */ -/** - * Here we allocate 'registers' for all of the various variables and bound state. - * - * The 'register' number is given by the reg_num field in the binding table. Note that this field - * is not stored in the identifier table. If it were, we would need a different mechanism for handling - * implicit bindings. - * - * However, after some discussion with Brian, implicit bindings may be handled by grabbing state - * directly from Mesa's state structs. This might be a little hairy here, maybe not.. Implicit - * bindings are those in the binding table that are not pointed to by any ident.attr or array.data - * - * This should also do various error checking, like the multiple vertex attrib error, or 'too many bindings' - * error. - * - * \param s The parse state - */ -static void -assign_regs(parse_state * s) -{ - GLint a; - GLfloat foo[4]; - - for (a = 0; a < s->idents.len; a++) { - if (s->idents.type[a] == TYPE_TEMP) { - s->idents.attr[a] = - binding_table_add(&s->binds, TYPE_TEMP, 0, 0, 0, foo); - } - } -} - -/** - * Parse/compile the 'str' returning the compiled 'program'. - * ctx->Program.ErrorPos will be -1 if successful. Otherwise, ErrorPos - * indicates the position of the error in 'str'. - */ void _mesa_parse_arb_vertex_program(GLcontext * ctx, GLenum target, - const GLubyte * string, GLsizei len, + const GLubyte * str, GLsizei len, struct vertex_program *program) { - GLubyte *our_string; - parse_state *state; - - /* XXX: How do I handle these errors? */ - if (len < 10 || _mesa_strncmp((const char *) string, "!!ARBvp1.0", 10)) { - ctx->Program.ErrorPos = 0; - _mesa_error(ctx, GL_INVALID_OPERATION, "glProgramStringARB(bad header)"); - return; - } + GLuint retval; + struct arb_program ap; + + retval = _mesa_parse_arb_program(ctx, str, len, &ap); - /* Make a null-terminated copy of the program string */ - our_string = (GLubyte *) MALLOC(len + 1); - if (!our_string) { - _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB"); + /* XXX: Parse error. Cleanup things and return */ + if (retval) + { return; } - MEMCPY(our_string, string, len); - our_string[len] = 0; - state = parse_state_init(our_string + 10, _mesa_strlen((char *) our_string) - 10); - - if (parse(state) == ARB_VP_SUCESS) { - printf("parse sucess!\n"); - } - else { - printf("*** error\n"); - parse_state_cleanup(state); - return; - } - - /* First, we 'fold' bindings from a big mess of productions and - * tokens into one BINDING_TOKEN, which points to an entry - * in the binding sym table that holds all of the relevant - * info for the binding destination. - */ - parse_tree_fold_bindings(state, state->pt_head); - - /* Now, for each type of binding, walk the parse tree and stick - * the index into the binding sym table - */ - parse_tree_assign_bindings(state, state->pt_head); - - /* XXX: this still needs a' fixin to get folded bindings - * -- it does? wtf do I mean? */ - parse_tree_assign_param_arrays(state, state->pt_head); - - /* XXX: Now, assign registers. For this, we'll need to create - * bindings for all temps (and what else?? ) - */ - assign_regs(state); - - /* Ok, now generate code */ - parse_tree_generate_opcodes(state, state->pt_head); - - /* Just for testing.. */ - program->Base.Target = target; - if (program->Base.String) { - FREE(program->Base.String); + /* XXX: Eh.. we parsed something that wasn't a vertex program. doh! */ + if (ap.type != GL_VERTEX_PROGRAM_ARB) + { + return; } - program->Base.String = our_string; - program->Base.Format = GL_PROGRAM_FORMAT_ASCII_ARB; - - if (program->Instructions) { - FREE(program->Instructions); - } - - program->Instructions = - (struct vp_instruction *) _mesa_malloc(sizeof(struct vp_instruction)); - program->Instructions[0].Opcode = VP_OPCODE_END; - program->InputsRead = 0; - program->OutputsWritten = 0; - program->IsPositionInvariant = 0; - - parse_state_cleanup(state); + +#if DEBUG_VP + debug_vp_inst(ap.Base.NumInstructions, ap.VPInstructions); +#endif - /* TODO: - * - handle implicit state grabbing & register allocation like discussed - * - implicit param declarations -- see above - * - * - variable bindings -- ADDRESS - * - deal with explicit array sizes & size mismatches - * - shuddup all my debugging crap - * - grep for XXX - * - multiple vtx attrib binding error - * - What do I do on look ahead for prod 54 & 55? (see arbvp_grammar.txt) - * - misc errors - * - check integer ranges - * - check array index ranges - * - check variable counts - * - param register allocation - * - exercise swizzles and masks - * - error handling - * - generate opcodes - * + Get addres registers for relative offsets in PARAM arrays - * + Properly encode implicit PARAMs and ATTRIBs. - * + ARL - * + SWZ - * + actually emit Mesa opcodes - * - segfaults while freeing stuff - * - OPTION + /* copy the relvant contents of the arb_program struct into the + * fragment_program struct */ + program->Base.NumInstructions = ap.Base.NumInstructions; + program->Base.NumTemporaries = ap.Base.NumTemporaries; + program->Base.NumParameters = ap.Base.NumParameters; + program->Base.NumAttributes = ap.Base.NumAttributes; + program->Base.NumAddressRegs = ap.Base.NumAddressRegs; + + program->Instructions = ap.VPInstructions; + program->IsPositionInvariant = ap.HintPositionInvariant; + program->InputsRead = ap.InputsRead; + program->OutputsWritten = ap.OutputsWritten; + program->Parameters = ap.Parameters; } diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c index 198bb34cbb9..62d968a32fa 100644 --- a/src/mesa/main/attrib.c +++ b/src/mesa/main/attrib.c @@ -65,7 +65,7 @@ new_attrib_node( GLbitfield kind ) } -void +void GLAPIENTRY _mesa_PushAttrib(GLbitfield mask) { struct gl_attrib_node *newnode; @@ -783,7 +783,7 @@ pop_texture_group(GLcontext *ctx, const struct gl_texture_attrib *texAttrib) * We could at least check if the value to restore equals the current value * and then skip the Mesa call. */ -void +void GLAPIENTRY _mesa_PopAttrib(void) { struct gl_attrib_node *attr, *next; @@ -1138,7 +1138,7 @@ _mesa_PopAttrib(void) #define GL_CLIENT_UNPACK_BIT (1<<21) -void +void GLAPIENTRY _mesa_PushClientAttrib(GLbitfield mask) { struct gl_attrib_node *newnode; @@ -1190,7 +1190,7 @@ _mesa_PushClientAttrib(GLbitfield mask) -void +void GLAPIENTRY _mesa_PopClientAttrib(void) { struct gl_attrib_node *attr, *next; diff --git a/src/mesa/main/attrib.h b/src/mesa/main/attrib.h index 82676246373..09d75196b23 100644 --- a/src/mesa/main/attrib.h +++ b/src/mesa/main/attrib.h @@ -43,16 +43,16 @@ #if _HAVE_FULL_GL -extern void +extern void GLAPIENTRY _mesa_PushAttrib( GLbitfield mask ); -extern void +extern void GLAPIENTRY _mesa_PopAttrib( void ); -extern void +extern void GLAPIENTRY _mesa_PushClientAttrib( GLbitfield mask ); -extern void +extern void GLAPIENTRY _mesa_PopClientAttrib( void ); extern void diff --git a/src/mesa/main/blend.c b/src/mesa/main/blend.c index dad5184dd92..e5032bf1bb6 100644 --- a/src/mesa/main/blend.c +++ b/src/mesa/main/blend.c @@ -50,7 +50,7 @@ * flushes the vertices and notifies the driver via * dd_function_table::BlendFunc callback. */ -void +void GLAPIENTRY _mesa_BlendFunc( GLenum sfactor, GLenum dfactor ) { @@ -144,7 +144,7 @@ _mesa_BlendFunc( GLenum sfactor, GLenum dfactor ) * On a change, flush the vertices and notify the driver via * dd_function_table::BlendFuncSeparate. */ -void +void GLAPIENTRY _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorA, GLenum dfactorA ) { @@ -285,7 +285,7 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB, /* This is really an extension function! */ -void +void GLAPIENTRY _mesa_BlendEquation( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); @@ -334,8 +334,9 @@ _mesa_BlendEquation( GLenum mode ) /* This is needed to support 1.1's RGB logic ops AND * 1.0's blending logicops. */ - ctx->Color.ColorLogicOpEnabled = (mode==GL_LOGIC_OP && - ctx->Color.BlendEnabled); + ctx->Color._LogicOpEnabled = (ctx->Color.ColorLogicOpEnabled || + (ctx->Color.BlendEnabled && + mode == GL_LOGIC_OP)); if (ctx->Driver.BlendEquation) (*ctx->Driver.BlendEquation)( ctx, mode ); @@ -358,7 +359,7 @@ _mesa_BlendEquation( GLenum mode ) * change, flushes the vertices and notifies the driver via * dd_function_table::BlendColor callback. */ -void +void GLAPIENTRY _mesa_BlendColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) { GLfloat tmp[4]; @@ -391,7 +392,7 @@ _mesa_BlendColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) * On a change, flushes the vertices and notifies the driver via * dd_function_table::AlphaFunc callback. */ -void +void GLAPIENTRY _mesa_AlphaFunc( GLenum func, GLclampf ref ) { GET_CURRENT_CONTEXT(ctx); @@ -436,7 +437,7 @@ gl_colorbuffer_attrib::LogicOp. * On a change, flushes the vertices and notifies the driver via the * dd_function_table::LogicOpcode callback. */ -void +void GLAPIENTRY _mesa_LogicOp( GLenum opcode ) { GET_CURRENT_CONTEXT(ctx); @@ -476,7 +477,7 @@ _mesa_LogicOp( GLenum opcode ) } #if _HAVE_FULL_GL -void +void GLAPIENTRY _mesa_IndexMask( GLuint mask ) { GET_CURRENT_CONTEXT(ctx); @@ -508,7 +509,7 @@ _mesa_IndexMask( GLuint mask ) * change, flushes the vertices and notifies the driver via the * dd_function_table::ColorMask callback. */ -void +void GLAPIENTRY _mesa_ColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ) { @@ -572,6 +573,7 @@ void _mesa_init_color( GLcontext * ctx ) ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 ); ctx->Color.IndexLogicOpEnabled = GL_FALSE; ctx->Color.ColorLogicOpEnabled = GL_FALSE; + ctx->Color._LogicOpEnabled = GL_FALSE; ctx->Color.LogicOp = GL_COPY; ctx->Color.DitherFlag = GL_TRUE; diff --git a/src/mesa/main/blend.h b/src/mesa/main/blend.h index a967937e682..ae96bd46b65 100644 --- a/src/mesa/main/blend.h +++ b/src/mesa/main/blend.h @@ -36,39 +36,39 @@ #include "mtypes.h" -extern void +extern void GLAPIENTRY _mesa_BlendFunc( GLenum sfactor, GLenum dfactor ); -extern void +extern void GLAPIENTRY _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorA, GLenum dfactorA ); -extern void +extern void GLAPIENTRY _mesa_BlendEquation( GLenum mode ); -extern void +extern void GLAPIENTRY _mesa_BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -extern void +extern void GLAPIENTRY _mesa_AlphaFunc( GLenum func, GLclampf ref ); -extern void +extern void GLAPIENTRY _mesa_LogicOp( GLenum opcode ); -extern void +extern void GLAPIENTRY _mesa_IndexMask( GLuint mask ); -extern void +extern void GLAPIENTRY _mesa_ColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ); -extern void +extern void _mesa_init_color( GLcontext * ctx ); #endif diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c index e47065415db..0f70829ff49 100644 --- a/src/mesa/main/bufferobj.c +++ b/src/mesa/main/bufferobj.c @@ -62,7 +62,7 @@ buffer_object_get_target( GLcontext *ctx, GLenum target, const char * str ) break; default: _mesa_error(ctx, GL_INVALID_ENUM, "gl%s(target)", str); - break; + return NULL; } if (bufObj->Name == 0) @@ -347,6 +347,18 @@ _mesa_init_buffer_objects( GLcontext *ctx ) for (i = 0; i < VERT_ATTRIB_MAX; i++) { ctx->Array.VertexAttrib[i].BufferObj = ctx->Array.NullBufferObj; } + + /* Device drivers might override these assignments after the Mesa + * context is initialized. + */ + ctx->Driver.NewBufferObject = _mesa_new_buffer_object; + ctx->Driver.DeleteBuffer = _mesa_delete_buffer_object; + ctx->Driver.BindBuffer = NULL; + ctx->Driver.BufferData = _mesa_buffer_data; + ctx->Driver.BufferSubData = _mesa_buffer_subdata; + ctx->Driver.GetBufferSubData = _mesa_buffer_get_subdata; + ctx->Driver.MapBuffer = _mesa_buffer_map; + ctx->Driver.UnmapBuffer = NULL; } @@ -355,7 +367,7 @@ _mesa_init_buffer_objects( GLcontext *ctx ) /* API Functions */ /**********************************************************************/ -void +void GLAPIENTRY _mesa_BindBufferARB(GLenum target, GLuint buffer) { GET_CURRENT_CONTEXT(ctx); @@ -424,7 +436,7 @@ _mesa_BindBufferARB(GLenum target, GLuint buffer) * \param n Number of buffer objects to delete. * \param buffer Array of \c n buffer object IDs. */ -void +void GLAPIENTRY _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids) { GET_CURRENT_CONTEXT(ctx); @@ -499,7 +511,7 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids) * \param n Number of IDs to generate. * \param buffer Array of \c n locations to store the IDs. */ -void +void GLAPIENTRY _mesa_GenBuffersARB(GLsizei n, GLuint *buffer) { GET_CURRENT_CONTEXT(ctx); @@ -548,7 +560,7 @@ _mesa_GenBuffersARB(GLsizei n, GLuint *buffer) * \return \c GL_TRUE if \c id is the name of a buffer object, * \c GL_FALSE otherwise. */ -GLboolean +GLboolean GLAPIENTRY _mesa_IsBufferARB(GLuint id) { struct gl_buffer_object * bufObj; @@ -566,7 +578,7 @@ _mesa_IsBufferARB(GLuint id) } -void +void GLAPIENTRY _mesa_BufferDataARB(GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage) { @@ -603,7 +615,7 @@ _mesa_BufferDataARB(GLenum target, GLsizeiptrARB size, } if (bufObj->Pointer) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glBufferSubDataARB(buffer is mapped)" ); + _mesa_error(ctx, GL_INVALID_OPERATION, "glBufferDataARB(buffer is mapped)" ); return; } @@ -614,7 +626,7 @@ _mesa_BufferDataARB(GLenum target, GLsizeiptrARB size, } -void +void GLAPIENTRY _mesa_BufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data) { @@ -623,7 +635,7 @@ _mesa_BufferSubDataARB(GLenum target, GLintptrARB offset, ASSERT_OUTSIDE_BEGIN_END(ctx); bufObj = buffer_object_subdata_range_good( ctx, target, offset, size, - "glBufferSubDataARB" ); + "BufferSubDataARB" ); if (!bufObj) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBufferSubDataARB" ); return; @@ -639,7 +651,7 @@ _mesa_BufferSubDataARB(GLenum target, GLintptrARB offset, } -void +void GLAPIENTRY _mesa_GetBufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data) { @@ -648,7 +660,7 @@ _mesa_GetBufferSubDataARB(GLenum target, GLintptrARB offset, ASSERT_OUTSIDE_BEGIN_END(ctx); bufObj = buffer_object_subdata_range_good( ctx, target, offset, size, - "glGetBufferSubDataARB" ); + "GetBufferSubDataARB" ); if (!bufObj) { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetBufferSubDataARB" ); return; @@ -664,7 +676,7 @@ _mesa_GetBufferSubDataARB(GLenum target, GLintptrARB offset, } -void * +void * GLAPIENTRY _mesa_MapBufferARB(GLenum target, GLenum access) { GET_CURRENT_CONTEXT(ctx); @@ -699,11 +711,13 @@ _mesa_MapBufferARB(GLenum target, GLenum access) _mesa_error(ctx, GL_OUT_OF_MEMORY, "glMapBufferARB(access)"); } + bufObj->Access = access; + return bufObj->Pointer; } -GLboolean +GLboolean GLAPIENTRY _mesa_UnmapBufferARB(GLenum target) { GET_CURRENT_CONTEXT(ctx); @@ -711,7 +725,6 @@ _mesa_UnmapBufferARB(GLenum target) GLboolean status = GL_TRUE; ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); - bufObj = buffer_object_get_target( ctx, target, "UnmapBufferARB" ); if ( bufObj == NULL ) { _mesa_error(ctx, GL_INVALID_OPERATION, "glUnmapBufferARB" ); @@ -727,13 +740,14 @@ _mesa_UnmapBufferARB(GLenum target) status = (*ctx->Driver.UnmapBuffer)( ctx, target, bufObj ); } + bufObj->Access = GL_READ_WRITE_ARB; /* initial value, OK? */ bufObj->Pointer = NULL; return status; } -void +void GLAPIENTRY _mesa_GetBufferParameterivARB(GLenum target, GLenum pname, GLint *params) { GET_CURRENT_CONTEXT(ctx); @@ -766,7 +780,7 @@ _mesa_GetBufferParameterivARB(GLenum target, GLenum pname, GLint *params) } -void +void GLAPIENTRY _mesa_GetBufferPointervARB(GLenum target, GLenum pname, GLvoid **params) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/bufferobj.h b/src/mesa/main/bufferobj.h index dddaa527147..8490e36fc54 100644 --- a/src/mesa/main/bufferobj.h +++ b/src/mesa/main/bufferobj.h @@ -84,37 +84,37 @@ _mesa_buffer_map( GLcontext *ctx, GLenum target, GLenum access, * API functions */ -extern void +extern void GLAPIENTRY _mesa_BindBufferARB(GLenum target, GLuint buffer); -extern void +extern void GLAPIENTRY _mesa_DeleteBuffersARB(GLsizei n, const GLuint * buffer); -extern void +extern void GLAPIENTRY _mesa_GenBuffersARB(GLsizei n, GLuint * buffer); -GLboolean +extern GLboolean GLAPIENTRY _mesa_IsBufferARB(GLuint buffer); -extern void +extern void GLAPIENTRY _mesa_BufferDataARB(GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage); -extern void +extern void GLAPIENTRY _mesa_BufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data); -extern void +extern void GLAPIENTRY _mesa_GetBufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data); -extern void * +extern void * GLAPIENTRY _mesa_MapBufferARB(GLenum target, GLenum access); -GLboolean +extern GLboolean GLAPIENTRY _mesa_UnmapBufferARB(GLenum target); -extern void +extern void GLAPIENTRY _mesa_GetBufferParameterivARB(GLenum target, GLenum pname, GLint *params); -extern void +extern void GLAPIENTRY _mesa_GetBufferPointervARB(GLenum target, GLenum pname, GLvoid **params); #endif diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c index 6c58ed408c4..519bfb34b94 100644 --- a/src/mesa/main/buffers.c +++ b/src/mesa/main/buffers.c @@ -41,7 +41,7 @@ #if _HAVE_FULL_GL -void +void GLAPIENTRY _mesa_ClearIndex( GLfloat c ) { GET_CURRENT_CONTEXT(ctx); @@ -75,7 +75,7 @@ _mesa_ClearIndex( GLfloat c ) * change, flushes the vertices and notifies the driver via the * dd_function_table::ClearColor callback. */ -void +void GLAPIENTRY _mesa_ClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) { GLfloat tmp[4]; @@ -110,7 +110,7 @@ _mesa_ClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) * etc. If the rasterization mode is set to GL_RENDER then requests the driver * to clear the buffers, via the dd_function_table::Clear callback. */ -void +void GLAPIENTRY _mesa_Clear( GLbitfield mask ) { GET_CURRENT_CONTEXT(ctx); @@ -176,7 +176,7 @@ _mesa_Clear( GLbitfield mask ) * __GLcontextRec::NewState and notifies the driver via the * dd_function_table::DrawBuffer callback. */ -void +void GLAPIENTRY _mesa_DrawBuffer( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); @@ -327,7 +327,7 @@ _mesa_DrawBuffer( GLenum mode ) * new pixel state in __GLcontextRec::NewState and notifies the driver via * dd_function_table::ReadBuffer. */ -void +void GLAPIENTRY _mesa_ReadBuffer( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); @@ -436,7 +436,7 @@ _mesa_ReadBuffer( GLenum mode ) * \note This function may be called from within Mesa or called by the * user directly (see the GL_MESA_resize_buffers extension). */ -void +void GLAPIENTRY _mesa_ResizeBuffersMESA( void ) { GLcontext *ctx = _mesa_get_current_context(); @@ -488,7 +488,7 @@ _mesa_ResizeBuffersMESA( void ) /* * XXX move somewhere else someday? */ -void +void GLAPIENTRY _mesa_SampleCoverageARB(GLclampf value, GLboolean invert) { GLcontext *ctx = _mesa_get_current_context(); @@ -520,7 +520,7 @@ _mesa_SampleCoverageARB(GLclampf value, GLboolean invert) * change flushes the vertices and notifies the driver via * the dd_function_table::Scissor callback. */ -void +void GLAPIENTRY _mesa_Scissor( GLint x, GLint y, GLsizei width, GLsizei height ) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/buffers.h b/src/mesa/main/buffers.h index 7c992a98cad..83e1b482511 100644 --- a/src/mesa/main/buffers.h +++ b/src/mesa/main/buffers.h @@ -36,29 +36,29 @@ #include "mtypes.h" -extern void +extern void GLAPIENTRY _mesa_ClearIndex( GLfloat c ); -extern void +extern void GLAPIENTRY _mesa_ClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); -extern void +extern void GLAPIENTRY _mesa_Clear( GLbitfield mask ); -extern void +extern void GLAPIENTRY _mesa_DrawBuffer( GLenum mode ); -extern void +extern void GLAPIENTRY _mesa_ReadBuffer( GLenum mode ); -extern void +extern void GLAPIENTRY _mesa_ResizeBuffersMESA( void ); -extern void +extern void GLAPIENTRY _mesa_Scissor( GLint x, GLint y, GLsizei width, GLsizei height ); -extern void +extern void GLAPIENTRY _mesa_SampleCoverageARB(GLclampf value, GLboolean invert); extern void diff --git a/src/mesa/main/clip.c b/src/mesa/main/clip.c index a061980af42..31e6af91bd1 100644 --- a/src/mesa/main/clip.c +++ b/src/mesa/main/clip.c @@ -41,7 +41,7 @@ -void +void GLAPIENTRY _mesa_ClipPlane( GLenum plane, const GLdouble *eq ) { GET_CURRENT_CONTEXT(ctx); @@ -98,7 +98,7 @@ _mesa_ClipPlane( GLenum plane, const GLdouble *eq ) } -void +void GLAPIENTRY _mesa_GetClipPlane( GLenum plane, GLdouble *equation ) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/clip.h b/src/mesa/main/clip.h index 154e3ce9482..9442e864395 100644 --- a/src/mesa/main/clip.h +++ b/src/mesa/main/clip.h @@ -33,8 +33,10 @@ #include "mtypes.h" -extern void _mesa_ClipPlane( GLenum plane, const GLdouble *equation ); +extern void GLAPIENTRY +_mesa_ClipPlane( GLenum plane, const GLdouble *equation ); -extern void _mesa_GetClipPlane( GLenum plane, GLdouble *equation ); +extern void GLAPIENTRY +_mesa_GetClipPlane( GLenum plane, GLdouble *equation ); #endif diff --git a/src/mesa/main/colortab.c b/src/mesa/main/colortab.c index cc268557268..a44f9a01c54 100644 --- a/src/mesa/main/colortab.c +++ b/src/mesa/main/colortab.c @@ -155,7 +155,7 @@ set_component_sizes( struct gl_color_table *table ) -void +void GLAPIENTRY _mesa_ColorTable( GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *data ) @@ -439,7 +439,7 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat, -void +void GLAPIENTRY _mesa_ColorSubTable( GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data ) @@ -637,7 +637,7 @@ _mesa_ColorSubTable( GLenum target, GLsizei start, /* XXX not tested */ -void +void GLAPIENTRY _mesa_CopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) { @@ -651,7 +651,7 @@ _mesa_CopyColorTable(GLenum target, GLenum internalformat, /* XXX not tested */ -void +void GLAPIENTRY _mesa_CopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width) { @@ -663,7 +663,7 @@ _mesa_CopyColorSubTable(GLenum target, GLsizei start, -void +void GLAPIENTRY _mesa_GetColorTable( GLenum target, GLenum format, GLenum type, GLvoid *data ) { @@ -864,7 +864,7 @@ _mesa_GetColorTable( GLenum target, GLenum format, -void +void GLAPIENTRY _mesa_ColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params) { GET_CURRENT_CONTEXT(ctx); @@ -957,7 +957,7 @@ _mesa_ColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params) -void +void GLAPIENTRY _mesa_ColorTableParameteriv(GLenum target, GLenum pname, const GLint *params) { GLfloat fparams[4]; @@ -980,7 +980,7 @@ _mesa_ColorTableParameteriv(GLenum target, GLenum pname, const GLint *params) -void +void GLAPIENTRY _mesa_GetColorTableParameterfv( GLenum target, GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); @@ -1154,7 +1154,7 @@ _mesa_GetColorTableParameterfv( GLenum target, GLenum pname, GLfloat *params ) -void +void GLAPIENTRY _mesa_GetColorTableParameteriv( GLenum target, GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/colortab.h b/src/mesa/main/colortab.h index 9ccf27693f0..4bd16210a0b 100644 --- a/src/mesa/main/colortab.h +++ b/src/mesa/main/colortab.h @@ -41,40 +41,40 @@ #if _HAVE_FULL_GL -extern void +extern void GLAPIENTRY _mesa_ColorTable( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table ); -extern void +extern void GLAPIENTRY _mesa_ColorSubTable( GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *table ); -extern void +extern void GLAPIENTRY _mesa_CopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -extern void +extern void GLAPIENTRY _mesa_CopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -extern void +extern void GLAPIENTRY _mesa_GetColorTable( GLenum target, GLenum format, GLenum type, GLvoid *table ); -extern void +extern void GLAPIENTRY _mesa_ColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params); -extern void +extern void GLAPIENTRY _mesa_ColorTableParameteriv(GLenum target, GLenum pname, const GLint *params); -extern void +extern void GLAPIENTRY _mesa_GetColorTableParameterfv( GLenum target, GLenum pname, GLfloat *params ); -extern void +extern void GLAPIENTRY _mesa_GetColorTableParameteriv( GLenum target, GLenum pname, GLint *params ); diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 7341a8bb892..e554f7508e7 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1062,6 +1062,15 @@ _mesa_init_constants( GLcontext *ctx ) ctx->Const.MaxProgramMatrices = MAX_PROGRAM_MATRICES; ctx->Const.MaxProgramMatrixStackDepth = MAX_PROGRAM_MATRIX_STACK_DEPTH; + /* If we're running in the X server, do bounds checking to prevent + * segfaults and server crashes! + */ +#if defined(XFree86LOADER) && defined(IN_MODULE) + ctx->Const.CheckArrayBounds = GL_TRUE; +#else + ctx->Const.CheckArrayBounds = GL_FALSE; +#endif + ASSERT(ctx->Const.MaxTextureUnits == MAX2(ctx->Const.MaxTextureImageUnits, ctx->Const.MaxTextureCoordUnits)); } @@ -1906,7 +1915,7 @@ _mesa_record_error( GLcontext *ctx, GLenum error ) * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the * dd_function_table::Finish driver callback, if not NULL. */ -void +void GLAPIENTRY _mesa_Finish( void ) { GET_CURRENT_CONTEXT(ctx); @@ -1922,7 +1931,7 @@ _mesa_Finish( void ) * Calls the #ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH macro and the * dd_function_table::Flush driver callback, if not NULL. */ -void +void GLAPIENTRY _mesa_Flush( void ) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/context.h b/src/mesa/main/context.h index caf81d8a21c..663cfc84500 100644 --- a/src/mesa/main/context.h +++ b/src/mesa/main/context.h @@ -250,10 +250,10 @@ extern void _mesa_record_error( GLcontext *ctx, GLenum error ); -extern void +extern void GLAPIENTRY _mesa_Finish( void ); -extern void +extern void GLAPIENTRY _mesa_Flush( void ); /*@}*/ diff --git a/src/mesa/main/convolve.c b/src/mesa/main/convolve.c index 341d60eacdd..b7d2eeb20f9 100644 --- a/src/mesa/main/convolve.c +++ b/src/mesa/main/convolve.c @@ -101,7 +101,7 @@ base_filter_format( GLenum format ) } -void +void GLAPIENTRY _mesa_ConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *image) { GLint baseFormat; @@ -174,7 +174,7 @@ _mesa_ConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width, G } -void +void GLAPIENTRY _mesa_ConvolutionFilter2D(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image) { GLint baseFormat; @@ -257,7 +257,7 @@ _mesa_ConvolutionFilter2D(GLenum target, GLenum internalFormat, GLsizei width, G } -void +void GLAPIENTRY _mesa_ConvolutionParameterf(GLenum target, GLenum pname, GLfloat param) { GET_CURRENT_CONTEXT(ctx); @@ -300,7 +300,7 @@ _mesa_ConvolutionParameterf(GLenum target, GLenum pname, GLfloat param) } -void +void GLAPIENTRY _mesa_ConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params) { GET_CURRENT_CONTEXT(ctx); @@ -356,7 +356,7 @@ _mesa_ConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params) } -void +void GLAPIENTRY _mesa_ConvolutionParameteri(GLenum target, GLenum pname, GLint param) { GET_CURRENT_CONTEXT(ctx); @@ -399,7 +399,7 @@ _mesa_ConvolutionParameteri(GLenum target, GLenum pname, GLint param) } -void +void GLAPIENTRY _mesa_ConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params) { GET_CURRENT_CONTEXT(ctx); @@ -468,7 +468,7 @@ _mesa_ConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params) } -void +void GLAPIENTRY _mesa_CopyConvolutionFilter1D(GLenum target, GLenum internalFormat, GLint x, GLint y, GLsizei width) { GLint baseFormat; @@ -496,7 +496,7 @@ _mesa_CopyConvolutionFilter1D(GLenum target, GLenum internalFormat, GLint x, GLi } -void +void GLAPIENTRY _mesa_CopyConvolutionFilter2D(GLenum target, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height) { GLint baseFormat; @@ -529,7 +529,7 @@ _mesa_CopyConvolutionFilter2D(GLenum target, GLenum internalFormat, GLint x, GLi } -void +void GLAPIENTRY _mesa_GetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image) { const struct gl_convolution_attrib *filter; @@ -579,7 +579,7 @@ _mesa_GetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *im } -void +void GLAPIENTRY _mesa_GetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params) { GET_CURRENT_CONTEXT(ctx); @@ -640,7 +640,7 @@ _mesa_GetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params) } -void +void GLAPIENTRY _mesa_GetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params) { GET_CURRENT_CONTEXT(ctx); @@ -710,7 +710,7 @@ _mesa_GetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params) } -void +void GLAPIENTRY _mesa_GetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span) { const GLint colStart = MAX_CONVOLUTION_WIDTH * 4; @@ -768,7 +768,7 @@ _mesa_GetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, } -void +void GLAPIENTRY _mesa_SeparableFilter2D(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column) { const GLint colStart = MAX_CONVOLUTION_WIDTH * 4; diff --git a/src/mesa/main/convolve.h b/src/mesa/main/convolve.h index deac1e2c0b3..4505cdae01e 100644 --- a/src/mesa/main/convolve.h +++ b/src/mesa/main/convolve.h @@ -32,51 +32,51 @@ #if _HAVE_FULL_GL -extern void +extern void GLAPIENTRY _mesa_ConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -extern void +extern void GLAPIENTRY _mesa_ConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -extern void +extern void GLAPIENTRY _mesa_ConvolutionParameterf(GLenum target, GLenum pname, GLfloat params); -extern void +extern void GLAPIENTRY _mesa_ConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params); -extern void +extern void GLAPIENTRY _mesa_ConvolutionParameteri(GLenum target, GLenum pname, GLint params); -extern void +extern void GLAPIENTRY _mesa_ConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params); -extern void +extern void GLAPIENTRY _mesa_CopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -extern void +extern void GLAPIENTRY _mesa_CopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -extern void +extern void GLAPIENTRY _mesa_GetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image); -extern void +extern void GLAPIENTRY _mesa_GetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params); -extern void +extern void GLAPIENTRY _mesa_GetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params); -extern void +extern void GLAPIENTRY _mesa_GetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -extern void +extern void GLAPIENTRY _mesa_SeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index e14ae7f1a68..e9826abd6d2 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -480,6 +480,17 @@ struct dd_function_table { GLsizei imageSize, const GLvoid *data, struct gl_texture_object *texObj, struct gl_texture_image *texImage); + /** + * Called to validate a certain compressed format. + */ + GLboolean (*IsCompressedFormat)( GLcontext *ctx, GLenum internalFormat ); + /** + * Called to get bytes of storage needed for the given texture size and + * compressed format. + */ + GLuint (*CompressedTextureSize)( GLcontext *ctx, + GLsizei width, GLsizei height, GLsizei depth, + GLenum format ); /*@}*/ /** @@ -905,76 +916,76 @@ typedef struct { * \name Vertex */ /*@{*/ - void (*ArrayElement)( GLint ); /* NOTE */ - void (*Color3f)( GLfloat, GLfloat, GLfloat ); - void (*Color3fv)( const GLfloat * ); - void (*Color4f)( GLfloat, GLfloat, GLfloat, GLfloat ); - void (*Color4fv)( const GLfloat * ); - void (*EdgeFlag)( GLboolean ); - void (*EdgeFlagv)( const GLboolean * ); - void (*EvalCoord1f)( GLfloat ); /* NOTE */ - void (*EvalCoord1fv)( const GLfloat * ); /* NOTE */ - void (*EvalCoord2f)( GLfloat, GLfloat ); /* NOTE */ - void (*EvalCoord2fv)( const GLfloat * ); /* NOTE */ - void (*EvalPoint1)( GLint ); /* NOTE */ - void (*EvalPoint2)( GLint, GLint ); /* NOTE */ - void (*FogCoordfEXT)( GLfloat ); - void (*FogCoordfvEXT)( const GLfloat * ); - void (*Indexf)( GLfloat ); - void (*Indexfv)( const GLfloat * ); - void (*Materialfv)( GLenum face, GLenum pname, const GLfloat * ); /* NOTE */ - void (*MultiTexCoord1fARB)( GLenum, GLfloat ); - void (*MultiTexCoord1fvARB)( GLenum, const GLfloat * ); - void (*MultiTexCoord2fARB)( GLenum, GLfloat, GLfloat ); - void (*MultiTexCoord2fvARB)( GLenum, const GLfloat * ); - void (*MultiTexCoord3fARB)( GLenum, GLfloat, GLfloat, GLfloat ); - void (*MultiTexCoord3fvARB)( GLenum, const GLfloat * ); - void (*MultiTexCoord4fARB)( GLenum, GLfloat, GLfloat, GLfloat, GLfloat ); - void (*MultiTexCoord4fvARB)( GLenum, const GLfloat * ); - void (*Normal3f)( GLfloat, GLfloat, GLfloat ); - void (*Normal3fv)( const GLfloat * ); - void (*SecondaryColor3fEXT)( GLfloat, GLfloat, GLfloat ); - void (*SecondaryColor3fvEXT)( const GLfloat * ); - void (*TexCoord1f)( GLfloat ); - void (*TexCoord1fv)( const GLfloat * ); - void (*TexCoord2f)( GLfloat, GLfloat ); - void (*TexCoord2fv)( const GLfloat * ); - void (*TexCoord3f)( GLfloat, GLfloat, GLfloat ); - void (*TexCoord3fv)( const GLfloat * ); - void (*TexCoord4f)( GLfloat, GLfloat, GLfloat, GLfloat ); - void (*TexCoord4fv)( const GLfloat * ); - void (*Vertex2f)( GLfloat, GLfloat ); - void (*Vertex2fv)( const GLfloat * ); - void (*Vertex3f)( GLfloat, GLfloat, GLfloat ); - void (*Vertex3fv)( const GLfloat * ); - void (*Vertex4f)( GLfloat, GLfloat, GLfloat, GLfloat ); - void (*Vertex4fv)( const GLfloat * ); - void (*CallList)( GLuint ); /* NOTE */ - void (*CallLists)( GLsizei, GLenum, const GLvoid * ); /* NOTE */ - void (*Begin)( GLenum ); - void (*End)( void ); - void (*VertexAttrib1fNV)( GLuint index, GLfloat x ); - void (*VertexAttrib1fvNV)( GLuint index, const GLfloat *v ); - void (*VertexAttrib2fNV)( GLuint index, GLfloat x, GLfloat y ); - void (*VertexAttrib2fvNV)( GLuint index, const GLfloat *v ); - void (*VertexAttrib3fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z ); - void (*VertexAttrib3fvNV)( GLuint index, const GLfloat *v ); - void (*VertexAttrib4fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w ); - void (*VertexAttrib4fvNV)( GLuint index, const GLfloat *v ); + void (GLAPIENTRYP ArrayElement)( GLint ); /* NOTE */ + void (GLAPIENTRYP Color3f)( GLfloat, GLfloat, GLfloat ); + void (GLAPIENTRYP Color3fv)( const GLfloat * ); + void (GLAPIENTRYP Color4f)( GLfloat, GLfloat, GLfloat, GLfloat ); + void (GLAPIENTRYP Color4fv)( const GLfloat * ); + void (GLAPIENTRYP EdgeFlag)( GLboolean ); + void (GLAPIENTRYP EdgeFlagv)( const GLboolean * ); + void (GLAPIENTRYP EvalCoord1f)( GLfloat ); /* NOTE */ + void (GLAPIENTRYP EvalCoord1fv)( const GLfloat * ); /* NOTE */ + void (GLAPIENTRYP EvalCoord2f)( GLfloat, GLfloat ); /* NOTE */ + void (GLAPIENTRYP EvalCoord2fv)( const GLfloat * ); /* NOTE */ + void (GLAPIENTRYP EvalPoint1)( GLint ); /* NOTE */ + void (GLAPIENTRYP EvalPoint2)( GLint, GLint ); /* NOTE */ + void (GLAPIENTRYP FogCoordfEXT)( GLfloat ); + void (GLAPIENTRYP FogCoordfvEXT)( const GLfloat * ); + void (GLAPIENTRYP Indexf)( GLfloat ); + void (GLAPIENTRYP Indexfv)( const GLfloat * ); + void (GLAPIENTRYP Materialfv)( GLenum face, GLenum pname, const GLfloat * ); /* NOTE */ + void (GLAPIENTRYP MultiTexCoord1fARB)( GLenum, GLfloat ); + void (GLAPIENTRYP MultiTexCoord1fvARB)( GLenum, const GLfloat * ); + void (GLAPIENTRYP MultiTexCoord2fARB)( GLenum, GLfloat, GLfloat ); + void (GLAPIENTRYP MultiTexCoord2fvARB)( GLenum, const GLfloat * ); + void (GLAPIENTRYP MultiTexCoord3fARB)( GLenum, GLfloat, GLfloat, GLfloat ); + void (GLAPIENTRYP MultiTexCoord3fvARB)( GLenum, const GLfloat * ); + void (GLAPIENTRYP MultiTexCoord4fARB)( GLenum, GLfloat, GLfloat, GLfloat, GLfloat ); + void (GLAPIENTRYP MultiTexCoord4fvARB)( GLenum, const GLfloat * ); + void (GLAPIENTRYP Normal3f)( GLfloat, GLfloat, GLfloat ); + void (GLAPIENTRYP Normal3fv)( const GLfloat * ); + void (GLAPIENTRYP SecondaryColor3fEXT)( GLfloat, GLfloat, GLfloat ); + void (GLAPIENTRYP SecondaryColor3fvEXT)( const GLfloat * ); + void (GLAPIENTRYP TexCoord1f)( GLfloat ); + void (GLAPIENTRYP TexCoord1fv)( const GLfloat * ); + void (GLAPIENTRYP TexCoord2f)( GLfloat, GLfloat ); + void (GLAPIENTRYP TexCoord2fv)( const GLfloat * ); + void (GLAPIENTRYP TexCoord3f)( GLfloat, GLfloat, GLfloat ); + void (GLAPIENTRYP TexCoord3fv)( const GLfloat * ); + void (GLAPIENTRYP TexCoord4f)( GLfloat, GLfloat, GLfloat, GLfloat ); + void (GLAPIENTRYP TexCoord4fv)( const GLfloat * ); + void (GLAPIENTRYP Vertex2f)( GLfloat, GLfloat ); + void (GLAPIENTRYP Vertex2fv)( const GLfloat * ); + void (GLAPIENTRYP Vertex3f)( GLfloat, GLfloat, GLfloat ); + void (GLAPIENTRYP Vertex3fv)( const GLfloat * ); + void (GLAPIENTRYP Vertex4f)( GLfloat, GLfloat, GLfloat, GLfloat ); + void (GLAPIENTRYP Vertex4fv)( const GLfloat * ); + void (GLAPIENTRYP CallList)( GLuint ); /* NOTE */ + void (GLAPIENTRYP CallLists)( GLsizei, GLenum, const GLvoid * ); /* NOTE */ + void (GLAPIENTRYP Begin)( GLenum ); + void (GLAPIENTRYP End)( void ); + void (GLAPIENTRYP VertexAttrib1fNV)( GLuint index, GLfloat x ); + void (GLAPIENTRYP VertexAttrib1fvNV)( GLuint index, const GLfloat *v ); + void (GLAPIENTRYP VertexAttrib2fNV)( GLuint index, GLfloat x, GLfloat y ); + void (GLAPIENTRYP VertexAttrib2fvNV)( GLuint index, const GLfloat *v ); + void (GLAPIENTRYP VertexAttrib3fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z ); + void (GLAPIENTRYP VertexAttrib3fvNV)( GLuint index, const GLfloat *v ); + void (GLAPIENTRYP VertexAttrib4fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w ); + void (GLAPIENTRYP VertexAttrib4fvNV)( GLuint index, const GLfloat *v ); /*@}*/ /* */ - void (*Rectf)( GLfloat, GLfloat, GLfloat, GLfloat ); + void (GLAPIENTRYP Rectf)( GLfloat, GLfloat, GLfloat, GLfloat ); /** * \name Array */ /*@{*/ - void (*DrawArrays)( GLenum mode, GLint start, GLsizei count ); - void (*DrawElements)( GLenum mode, GLsizei count, GLenum type, + void (GLAPIENTRYP DrawArrays)( GLenum mode, GLint start, GLsizei count ); + void (GLAPIENTRYP DrawElements)( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices ); - void (*DrawRangeElements)( GLenum mode, GLuint start, + void (GLAPIENTRYP DrawRangeElements)( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices ); /*@}*/ @@ -990,8 +1001,8 @@ typedef struct { * accelerated vertex formats, eventually... */ /*@{*/ - void (*EvalMesh1)( GLenum mode, GLint i1, GLint i2 ); - void (*EvalMesh2)( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ); + void (GLAPIENTRYP EvalMesh1)( GLenum mode, GLint i1, GLint i2 ); + void (GLAPIENTRYP EvalMesh2)( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ); /*@}*/ } GLvertexformat; diff --git a/src/mesa/main/depth.c b/src/mesa/main/depth.c index 1e07607c463..eb8c8b821b2 100644 --- a/src/mesa/main/depth.c +++ b/src/mesa/main/depth.c @@ -39,25 +39,26 @@ -void +void GLAPIENTRY _mesa_ClearDepth( GLclampd depth ) { GET_CURRENT_CONTEXT(ctx); - GLfloat tmp = (GLfloat) CLAMP( depth, 0.0, 1.0 ); ASSERT_OUTSIDE_BEGIN_END(ctx); - if (ctx->Depth.Clear == tmp) + depth = CLAMP( depth, 0.0, 1.0 ); + + if (ctx->Depth.Clear == depth) return; FLUSH_VERTICES(ctx, _NEW_DEPTH); - ctx->Depth.Clear = tmp; + ctx->Depth.Clear = depth; if (ctx->Driver.ClearDepth) (*ctx->Driver.ClearDepth)( ctx, ctx->Depth.Clear ); } -void +void GLAPIENTRY _mesa_DepthFunc( GLenum func ) { GET_CURRENT_CONTEXT(ctx); @@ -93,7 +94,7 @@ _mesa_DepthFunc( GLenum func ) -void +void GLAPIENTRY _mesa_DepthMask( GLboolean flag ) { GET_CURRENT_CONTEXT(ctx); @@ -119,7 +120,7 @@ _mesa_DepthMask( GLboolean flag ) /* GL_EXT_depth_bounds_test */ -void +void GLAPIENTRY _mesa_DepthBoundsEXT( GLclampd zmin, GLclampd zmax ) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/depth.h b/src/mesa/main/depth.h index ce5f28e84d6..0532a2e6d16 100644 --- a/src/mesa/main/depth.h +++ b/src/mesa/main/depth.h @@ -37,19 +37,19 @@ #if _HAVE_FULL_GL -extern void +extern void GLAPIENTRY _mesa_ClearDepth( GLclampd depth ); -extern void +extern void GLAPIENTRY _mesa_DepthFunc( GLenum func ); -extern void +extern void GLAPIENTRY _mesa_DepthMask( GLboolean flag ); extern void _mesa_init_depth( GLcontext * ctx ); -extern void +extern void GLAPIENTRY _mesa_DepthBoundsEXT( GLclampd zmin, GLclampd zmax ); #else diff --git a/src/mesa/main/descrip.mms b/src/mesa/main/descrip.mms index 41b5fe52e2b..67d4e2de817 100644 --- a/src/mesa/main/descrip.mms +++ b/src/mesa/main/descrip.mms @@ -20,6 +20,7 @@ SOURCES =accum.c \ api_loopback.c \ api_noop.c \ api_validate.c \ + arbparse.c \ arbfragparse.c \ arbprogram.c \ arbvertparse.c \ @@ -71,13 +72,13 @@ SOURCES =accum.c \ texstore.c \ texutil.c \ varray.c \ - vtxfmt.c \ - vsnprintf.c + vtxfmt.c OBJECTS=accum.obj,\ api_loopback.obj,\ api_noop.obj,\ api_validate.obj,\ +arbparse.obj,\ arbfragparse.obj,\ arbprogram.obj,\ arbvertparse.obj,\ @@ -129,8 +130,7 @@ texstate.obj,\ texstore.obj,\ texutil.obj,\ varray.obj,\ -vtxfmt.obj,\ -vsnprintf.obj +vtxfmt.obj ##### RULES ##### @@ -150,6 +150,7 @@ accum.obj : accum.c api_loopback.obj : api_loopback.c api_noop.obj : api_noop.c api_validate.obj : api_validate.c +arbparse.obj : arbparse.c arbfragparse.obj : arbfragparse.c arbprogram.obj : arbprogram.c arbvertparse.obj : arbvertparse.c @@ -177,7 +178,7 @@ hash.obj : hash.c hint.obj : hint.c histogram.obj : histogram.c image.obj : image.c -imports.obj : imports.c +imports.obj : imports.c vsnprintf.c light.obj : light.c lines.obj : lines.c matrix.obj : matrix.c @@ -202,4 +203,3 @@ texstore.obj : texstore.c texutil.obj : texutil.c varray.obj : varray.c vtxfmt.obj : vtxfmt.c -vsnprintf.obj : vsnprintf.c diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c index 095ec45f057..c547a2c74db 100644 --- a/src/mesa/main/dlist.c +++ b/src/mesa/main/dlist.c @@ -866,7 +866,7 @@ _mesa_alloc_opcode( GLcontext *ctx, /* * Display List compilation functions */ -static void save_Accum( GLenum op, GLfloat value ) +static void GLAPIENTRY save_Accum( GLenum op, GLfloat value ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -882,7 +882,7 @@ static void save_Accum( GLenum op, GLfloat value ) } -static void save_AlphaFunc( GLenum func, GLclampf ref ) +static void GLAPIENTRY save_AlphaFunc( GLenum func, GLclampf ref ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -898,7 +898,7 @@ static void save_AlphaFunc( GLenum func, GLclampf ref ) } -static void save_BindTexture( GLenum target, GLuint texture ) +static void GLAPIENTRY save_BindTexture( GLenum target, GLuint texture ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -914,7 +914,7 @@ static void save_BindTexture( GLenum target, GLuint texture ) } -static void save_Bitmap( GLsizei width, GLsizei height, +static void GLAPIENTRY save_Bitmap( GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *pixels ) @@ -943,7 +943,7 @@ static void save_Bitmap( GLsizei width, GLsizei height, } -static void save_BlendEquation( GLenum mode ) +static void GLAPIENTRY save_BlendEquation( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -958,7 +958,7 @@ static void save_BlendEquation( GLenum mode ) } -static void save_BlendFunc( GLenum sfactor, GLenum dfactor ) +static void GLAPIENTRY save_BlendFunc( GLenum sfactor, GLenum dfactor ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -974,7 +974,7 @@ static void save_BlendFunc( GLenum sfactor, GLenum dfactor ) } -static void save_BlendFuncSeparateEXT(GLenum sfactorRGB, GLenum dfactorRGB, +static void GLAPIENTRY save_BlendFuncSeparateEXT(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorA, GLenum dfactorA) { GET_CURRENT_CONTEXT(ctx); @@ -994,7 +994,7 @@ static void save_BlendFuncSeparateEXT(GLenum sfactorRGB, GLenum dfactorRGB, } -static void save_BlendColor( GLfloat red, GLfloat green, +static void GLAPIENTRY save_BlendColor( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ) { GET_CURRENT_CONTEXT(ctx); @@ -1013,7 +1013,7 @@ static void save_BlendColor( GLfloat red, GLfloat green, } -void _mesa_save_CallList( GLuint list ) +void GLAPIENTRY _mesa_save_CallList( GLuint list ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1034,7 +1034,7 @@ void _mesa_save_CallList( GLuint list ) } -void _mesa_save_CallLists( GLsizei n, GLenum type, const GLvoid *lists ) +void GLAPIENTRY _mesa_save_CallLists( GLsizei n, GLenum type, const GLvoid *lists ) { GET_CURRENT_CONTEXT(ctx); GLint i; @@ -1078,7 +1078,7 @@ void _mesa_save_CallLists( GLsizei n, GLenum type, const GLvoid *lists ) } -static void save_Clear( GLbitfield mask ) +static void GLAPIENTRY save_Clear( GLbitfield mask ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1093,7 +1093,7 @@ static void save_Clear( GLbitfield mask ) } -static void save_ClearAccum( GLfloat red, GLfloat green, +static void GLAPIENTRY save_ClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ) { GET_CURRENT_CONTEXT(ctx); @@ -1112,7 +1112,7 @@ static void save_ClearAccum( GLfloat red, GLfloat green, } -static void save_ClearColor( GLclampf red, GLclampf green, +static void GLAPIENTRY save_ClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) { GET_CURRENT_CONTEXT(ctx); @@ -1131,7 +1131,7 @@ static void save_ClearColor( GLclampf red, GLclampf green, } -static void save_ClearDepth( GLclampd depth ) +static void GLAPIENTRY save_ClearDepth( GLclampd depth ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1146,7 +1146,7 @@ static void save_ClearDepth( GLclampd depth ) } -static void save_ClearIndex( GLfloat c ) +static void GLAPIENTRY save_ClearIndex( GLfloat c ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1161,7 +1161,7 @@ static void save_ClearIndex( GLfloat c ) } -static void save_ClearStencil( GLint s ) +static void GLAPIENTRY save_ClearStencil( GLint s ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1176,7 +1176,7 @@ static void save_ClearStencil( GLint s ) } -static void save_ClipPlane( GLenum plane, const GLdouble *equ ) +static void GLAPIENTRY save_ClipPlane( GLenum plane, const GLdouble *equ ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1196,7 +1196,7 @@ static void save_ClipPlane( GLenum plane, const GLdouble *equ ) -static void save_ColorMask( GLboolean red, GLboolean green, +static void GLAPIENTRY save_ColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ) { GET_CURRENT_CONTEXT(ctx); @@ -1215,7 +1215,7 @@ static void save_ColorMask( GLboolean red, GLboolean green, } -static void save_ColorMaterial( GLenum face, GLenum mode ) +static void GLAPIENTRY save_ColorMaterial( GLenum face, GLenum mode ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1232,7 +1232,7 @@ static void save_ColorMaterial( GLenum face, GLenum mode ) } -static void save_ColorTable( GLenum target, GLenum internalFormat, +static void GLAPIENTRY save_ColorTable( GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table ) { @@ -1271,7 +1271,7 @@ static void save_ColorTable( GLenum target, GLenum internalFormat, -static void +static void GLAPIENTRY save_ColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params) { GET_CURRENT_CONTEXT(ctx); @@ -1300,7 +1300,7 @@ save_ColorTableParameterfv(GLenum target, GLenum pname, const GLfloat *params) } -static void +static void GLAPIENTRY save_ColorTableParameteriv(GLenum target, GLenum pname, const GLint *params) { GET_CURRENT_CONTEXT(ctx); @@ -1330,7 +1330,7 @@ save_ColorTableParameteriv(GLenum target, GLenum pname, const GLint *params) -static void save_ColorSubTable( GLenum target, GLsizei start, GLsizei count, +static void GLAPIENTRY save_ColorSubTable( GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *table) { @@ -1357,7 +1357,7 @@ static void save_ColorSubTable( GLenum target, GLsizei start, GLsizei count, } -static void +static void GLAPIENTRY save_CopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width) { @@ -1379,7 +1379,7 @@ save_CopyColorSubTable(GLenum target, GLsizei start, } -static void +static void GLAPIENTRY save_CopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) { @@ -1401,7 +1401,7 @@ save_CopyColorTable(GLenum target, GLenum internalformat, } -static void +static void GLAPIENTRY save_ConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *filter) { @@ -1429,7 +1429,7 @@ save_ConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width, } -static void +static void GLAPIENTRY save_ConvolutionFilter2D(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *filter) @@ -1459,7 +1459,7 @@ save_ConvolutionFilter2D(GLenum target, GLenum internalFormat, } -static void +static void GLAPIENTRY save_ConvolutionParameteri(GLenum target, GLenum pname, GLint param) { GET_CURRENT_CONTEXT(ctx); @@ -1477,7 +1477,7 @@ save_ConvolutionParameteri(GLenum target, GLenum pname, GLint param) } -static void +static void GLAPIENTRY save_ConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params) { GET_CURRENT_CONTEXT(ctx); @@ -1505,7 +1505,7 @@ save_ConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params) } -static void +static void GLAPIENTRY save_ConvolutionParameterf(GLenum target, GLenum pname, GLfloat param) { GET_CURRENT_CONTEXT(ctx); @@ -1523,7 +1523,7 @@ save_ConvolutionParameterf(GLenum target, GLenum pname, GLfloat param) } -static void +static void GLAPIENTRY save_ConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params) { GET_CURRENT_CONTEXT(ctx); @@ -1551,7 +1551,7 @@ save_ConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat *params) } -static void +static void GLAPIENTRY save_CopyPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum type ) { @@ -1573,7 +1573,7 @@ save_CopyPixels( GLint x, GLint y, -static void +static void GLAPIENTRY save_CopyTexImage1D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border ) { @@ -1597,7 +1597,7 @@ save_CopyTexImage1D( GLenum target, GLint level, GLenum internalformat, } -static void +static void GLAPIENTRY save_CopyTexImage2D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, @@ -1625,7 +1625,7 @@ save_CopyTexImage2D( GLenum target, GLint level, -static void +static void GLAPIENTRY save_CopyTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width ) @@ -1648,7 +1648,7 @@ save_CopyTexSubImage1D( GLenum target, GLint level, } -static void +static void GLAPIENTRY save_CopyTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, @@ -1675,7 +1675,7 @@ save_CopyTexSubImage2D( GLenum target, GLint level, } -static void +static void GLAPIENTRY save_CopyTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, @@ -1704,7 +1704,7 @@ save_CopyTexSubImage3D( GLenum target, GLint level, } -static void save_CullFace( GLenum mode ) +static void GLAPIENTRY save_CullFace( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1719,7 +1719,7 @@ static void save_CullFace( GLenum mode ) } -static void save_DepthFunc( GLenum func ) +static void GLAPIENTRY save_DepthFunc( GLenum func ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1734,7 +1734,7 @@ static void save_DepthFunc( GLenum func ) } -static void save_DepthMask( GLboolean mask ) +static void GLAPIENTRY save_DepthMask( GLboolean mask ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1749,7 +1749,7 @@ static void save_DepthMask( GLboolean mask ) } -static void save_DepthRange( GLclampd nearval, GLclampd farval ) +static void GLAPIENTRY save_DepthRange( GLclampd nearval, GLclampd farval ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1765,7 +1765,7 @@ static void save_DepthRange( GLclampd nearval, GLclampd farval ) } -static void save_Disable( GLenum cap ) +static void GLAPIENTRY save_Disable( GLenum cap ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1780,7 +1780,7 @@ static void save_Disable( GLenum cap ) } -static void save_DrawBuffer( GLenum mode ) +static void GLAPIENTRY save_DrawBuffer( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1795,7 +1795,7 @@ static void save_DrawBuffer( GLenum mode ) } -static void save_DrawPixels( GLsizei width, GLsizei height, +static void GLAPIENTRY save_DrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels ) { @@ -1822,7 +1822,7 @@ static void save_DrawPixels( GLsizei width, GLsizei height, -static void save_Enable( GLenum cap ) +static void GLAPIENTRY save_Enable( GLenum cap ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1838,7 +1838,7 @@ static void save_Enable( GLenum cap ) -void _mesa_save_EvalMesh1( GLenum mode, GLint i1, GLint i2 ) +void GLAPIENTRY _mesa_save_EvalMesh1( GLenum mode, GLint i1, GLint i2 ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1855,7 +1855,7 @@ void _mesa_save_EvalMesh1( GLenum mode, GLint i1, GLint i2 ) } -void _mesa_save_EvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ) +void GLAPIENTRY _mesa_save_EvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1876,7 +1876,7 @@ void _mesa_save_EvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ) -static void save_Fogfv( GLenum pname, const GLfloat *params ) +static void GLAPIENTRY save_Fogfv( GLenum pname, const GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1895,13 +1895,13 @@ static void save_Fogfv( GLenum pname, const GLfloat *params ) } -static void save_Fogf( GLenum pname, GLfloat param ) +static void GLAPIENTRY save_Fogf( GLenum pname, GLfloat param ) { save_Fogfv(pname, ¶m); } -static void save_Fogiv(GLenum pname, const GLint *params ) +static void GLAPIENTRY save_Fogiv(GLenum pname, const GLint *params ) { GLfloat p[4]; switch (pname) { @@ -1926,13 +1926,13 @@ static void save_Fogiv(GLenum pname, const GLint *params ) } -static void save_Fogi(GLenum pname, GLint param ) +static void GLAPIENTRY save_Fogi(GLenum pname, GLint param ) { save_Fogiv(pname, ¶m); } -static void save_FrontFace( GLenum mode ) +static void GLAPIENTRY save_FrontFace( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1947,7 +1947,7 @@ static void save_FrontFace( GLenum mode ) } -static void save_Frustum( GLdouble left, GLdouble right, +static void GLAPIENTRY save_Frustum( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval ) { @@ -1969,7 +1969,7 @@ static void save_Frustum( GLdouble left, GLdouble right, } -static void save_Hint( GLenum target, GLenum mode ) +static void GLAPIENTRY save_Hint( GLenum target, GLenum mode ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -1985,7 +1985,7 @@ static void save_Hint( GLenum target, GLenum mode ) } -static void +static void GLAPIENTRY save_Histogram(GLenum target, GLsizei width, GLenum internalFormat, GLboolean sink) { GET_CURRENT_CONTEXT(ctx); @@ -2005,7 +2005,7 @@ save_Histogram(GLenum target, GLsizei width, GLenum internalFormat, GLboolean si } -static void save_IndexMask( GLuint mask ) +static void GLAPIENTRY save_IndexMask( GLuint mask ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2020,7 +2020,7 @@ static void save_IndexMask( GLuint mask ) } -static void save_InitNames( void ) +static void GLAPIENTRY save_InitNames( void ) { GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); @@ -2031,7 +2031,7 @@ static void save_InitNames( void ) } -static void save_Lightfv( GLenum light, GLenum pname, const GLfloat *params ) +static void GLAPIENTRY save_Lightfv( GLenum light, GLenum pname, const GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2085,13 +2085,13 @@ static void save_Lightfv( GLenum light, GLenum pname, const GLfloat *params ) } -static void save_Lightf( GLenum light, GLenum pname, GLfloat params ) +static void GLAPIENTRY save_Lightf( GLenum light, GLenum pname, GLfloat params ) { save_Lightfv(light, pname, ¶ms); } -static void save_Lightiv( GLenum light, GLenum pname, const GLint *params ) +static void GLAPIENTRY save_Lightiv( GLenum light, GLenum pname, const GLint *params ) { GLfloat fparam[4]; switch (pname) { @@ -2129,13 +2129,13 @@ static void save_Lightiv( GLenum light, GLenum pname, const GLint *params ) } -static void save_Lighti( GLenum light, GLenum pname, GLint param ) +static void GLAPIENTRY save_Lighti( GLenum light, GLenum pname, GLint param ) { save_Lightiv( light, pname, ¶m ); } -static void save_LightModelfv( GLenum pname, const GLfloat *params ) +static void GLAPIENTRY save_LightModelfv( GLenum pname, const GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2154,13 +2154,13 @@ static void save_LightModelfv( GLenum pname, const GLfloat *params ) } -static void save_LightModelf( GLenum pname, GLfloat param ) +static void GLAPIENTRY save_LightModelf( GLenum pname, GLfloat param ) { save_LightModelfv(pname, ¶m); } -static void save_LightModeliv( GLenum pname, const GLint *params ) +static void GLAPIENTRY save_LightModeliv( GLenum pname, const GLint *params ) { GLfloat fparam[4]; switch (pname) { @@ -2183,13 +2183,13 @@ static void save_LightModeliv( GLenum pname, const GLint *params ) } -static void save_LightModeli( GLenum pname, GLint param ) +static void GLAPIENTRY save_LightModeli( GLenum pname, GLint param ) { save_LightModeliv(pname, ¶m); } -static void save_LineStipple( GLint factor, GLushort pattern ) +static void GLAPIENTRY save_LineStipple( GLint factor, GLushort pattern ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2205,7 +2205,7 @@ static void save_LineStipple( GLint factor, GLushort pattern ) } -static void save_LineWidth( GLfloat width ) +static void GLAPIENTRY save_LineWidth( GLfloat width ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2220,7 +2220,7 @@ static void save_LineWidth( GLfloat width ) } -static void save_ListBase( GLuint base ) +static void GLAPIENTRY save_ListBase( GLuint base ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2235,7 +2235,7 @@ static void save_ListBase( GLuint base ) } -static void save_LoadIdentity( void ) +static void GLAPIENTRY save_LoadIdentity( void ) { GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); @@ -2246,7 +2246,7 @@ static void save_LoadIdentity( void ) } -static void save_LoadMatrixf( const GLfloat *m ) +static void GLAPIENTRY save_LoadMatrixf( const GLfloat *m ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2264,7 +2264,7 @@ static void save_LoadMatrixf( const GLfloat *m ) } -static void save_LoadMatrixd( const GLdouble *m ) +static void GLAPIENTRY save_LoadMatrixd( const GLdouble *m ) { GLfloat f[16]; GLint i; @@ -2275,7 +2275,7 @@ static void save_LoadMatrixd( const GLdouble *m ) } -static void save_LoadName( GLuint name ) +static void GLAPIENTRY save_LoadName( GLuint name ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2290,7 +2290,7 @@ static void save_LoadName( GLuint name ) } -static void save_LogicOp( GLenum opcode ) +static void GLAPIENTRY save_LogicOp( GLenum opcode ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2305,7 +2305,7 @@ static void save_LogicOp( GLenum opcode ) } -static void save_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride, +static void GLAPIENTRY save_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points) { GET_CURRENT_CONTEXT(ctx); @@ -2326,7 +2326,7 @@ static void save_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride, } } -static void save_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride, +static void GLAPIENTRY save_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points) { GET_CURRENT_CONTEXT(ctx); @@ -2348,7 +2348,7 @@ static void save_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride, } -static void save_Map2d( GLenum target, +static void GLAPIENTRY save_Map2d( GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points ) @@ -2380,7 +2380,7 @@ static void save_Map2d( GLenum target, } -static void save_Map2f( GLenum target, +static void GLAPIENTRY save_Map2f( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points ) @@ -2411,7 +2411,7 @@ static void save_Map2f( GLenum target, } -static void save_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 ) +static void GLAPIENTRY save_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2428,13 +2428,13 @@ static void save_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 ) } -static void save_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 ) +static void GLAPIENTRY save_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 ) { save_MapGrid1f(un, (GLfloat) u1, (GLfloat) u2); } -static void save_MapGrid2f( GLint un, GLfloat u1, GLfloat u2, +static void GLAPIENTRY save_MapGrid2f( GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2 ) { GET_CURRENT_CONTEXT(ctx); @@ -2456,7 +2456,7 @@ static void save_MapGrid2f( GLint un, GLfloat u1, GLfloat u2, -static void save_MapGrid2d( GLint un, GLdouble u1, GLdouble u2, +static void GLAPIENTRY save_MapGrid2d( GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2 ) { save_MapGrid2f(un, (GLfloat) u1, (GLfloat) u2, @@ -2464,7 +2464,7 @@ static void save_MapGrid2d( GLint un, GLdouble u1, GLdouble u2, } -static void save_MatrixMode( GLenum mode ) +static void GLAPIENTRY save_MatrixMode( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2479,7 +2479,7 @@ static void save_MatrixMode( GLenum mode ) } -static void +static void GLAPIENTRY save_Minmax(GLenum target, GLenum internalFormat, GLboolean sink) { GET_CURRENT_CONTEXT(ctx); @@ -2498,7 +2498,7 @@ save_Minmax(GLenum target, GLenum internalFormat, GLboolean sink) } -static void save_MultMatrixf( const GLfloat *m ) +static void GLAPIENTRY save_MultMatrixf( const GLfloat *m ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2516,7 +2516,7 @@ static void save_MultMatrixf( const GLfloat *m ) } -static void save_MultMatrixd( const GLdouble *m ) +static void GLAPIENTRY save_MultMatrixd( const GLdouble *m ) { GLfloat f[16]; GLint i; @@ -2527,7 +2527,7 @@ static void save_MultMatrixd( const GLdouble *m ) } -static void save_NewList( GLuint list, GLenum mode ) +static void GLAPIENTRY save_NewList( GLuint list, GLenum mode ) { GET_CURRENT_CONTEXT(ctx); /* It's an error to call this function while building a display list */ @@ -2538,7 +2538,7 @@ static void save_NewList( GLuint list, GLenum mode ) -static void save_Ortho( GLdouble left, GLdouble right, +static void GLAPIENTRY save_Ortho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval ) { @@ -2560,7 +2560,7 @@ static void save_Ortho( GLdouble left, GLdouble right, } -static void +static void GLAPIENTRY save_PixelMapfv( GLenum map, GLint mapsize, const GLfloat *values ) { GET_CURRENT_CONTEXT(ctx); @@ -2579,7 +2579,7 @@ save_PixelMapfv( GLenum map, GLint mapsize, const GLfloat *values ) } -static void +static void GLAPIENTRY save_PixelMapuiv(GLenum map, GLint mapsize, const GLuint *values ) { GLfloat fvalues[MAX_PIXEL_MAP_TABLE]; @@ -2598,7 +2598,7 @@ save_PixelMapuiv(GLenum map, GLint mapsize, const GLuint *values ) } -static void +static void GLAPIENTRY save_PixelMapusv(GLenum map, GLint mapsize, const GLushort *values) { GLfloat fvalues[MAX_PIXEL_MAP_TABLE]; @@ -2617,7 +2617,7 @@ save_PixelMapusv(GLenum map, GLint mapsize, const GLushort *values) } -static void +static void GLAPIENTRY save_PixelTransferf( GLenum pname, GLfloat param ) { GET_CURRENT_CONTEXT(ctx); @@ -2634,14 +2634,14 @@ save_PixelTransferf( GLenum pname, GLfloat param ) } -static void +static void GLAPIENTRY save_PixelTransferi( GLenum pname, GLint param ) { save_PixelTransferf( pname, (GLfloat) param ); } -static void +static void GLAPIENTRY save_PixelZoom( GLfloat xfactor, GLfloat yfactor ) { GET_CURRENT_CONTEXT(ctx); @@ -2658,7 +2658,7 @@ save_PixelZoom( GLfloat xfactor, GLfloat yfactor ) } -static void +static void GLAPIENTRY save_PointParameterfvEXT( GLenum pname, const GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); @@ -2677,25 +2677,25 @@ save_PointParameterfvEXT( GLenum pname, const GLfloat *params ) } -static void save_PointParameterfEXT( GLenum pname, GLfloat param ) +static void GLAPIENTRY save_PointParameterfEXT( GLenum pname, GLfloat param ) { save_PointParameterfvEXT(pname, ¶m); } -static void save_PointParameteriNV( GLenum pname, GLint param ) +static void GLAPIENTRY save_PointParameteriNV( GLenum pname, GLint param ) { GLfloat p = (GLfloat) param; save_PointParameterfvEXT(pname, &p); } -static void save_PointParameterivNV( GLenum pname, const GLint *param ) +static void GLAPIENTRY save_PointParameterivNV( GLenum pname, const GLint *param ) { GLfloat p = (GLfloat) param[0]; save_PointParameterfvEXT(pname, &p); } -static void save_PointSize( GLfloat size ) +static void GLAPIENTRY save_PointSize( GLfloat size ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2710,7 +2710,7 @@ static void save_PointSize( GLfloat size ) } -static void save_PolygonMode( GLenum face, GLenum mode ) +static void GLAPIENTRY save_PolygonMode( GLenum face, GLenum mode ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2729,7 +2729,7 @@ static void save_PolygonMode( GLenum face, GLenum mode ) /* * Polygon stipple must have been upacked already! */ -static void save_PolygonStipple( const GLubyte *pattern ) +static void GLAPIENTRY save_PolygonStipple( const GLubyte *pattern ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2747,7 +2747,7 @@ static void save_PolygonStipple( const GLubyte *pattern ) } -static void save_PolygonOffset( GLfloat factor, GLfloat units ) +static void GLAPIENTRY save_PolygonOffset( GLfloat factor, GLfloat units ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2763,14 +2763,14 @@ static void save_PolygonOffset( GLfloat factor, GLfloat units ) } -static void save_PolygonOffsetEXT( GLfloat factor, GLfloat bias ) +static void GLAPIENTRY save_PolygonOffsetEXT( GLfloat factor, GLfloat bias ) { GET_CURRENT_CONTEXT(ctx); save_PolygonOffset(factor, ctx->DepthMaxF * bias); } -static void save_PopAttrib( void ) +static void GLAPIENTRY save_PopAttrib( void ) { GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); @@ -2781,7 +2781,7 @@ static void save_PopAttrib( void ) } -static void save_PopMatrix( void ) +static void GLAPIENTRY save_PopMatrix( void ) { GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); @@ -2792,7 +2792,7 @@ static void save_PopMatrix( void ) } -static void save_PopName( void ) +static void GLAPIENTRY save_PopName( void ) { GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); @@ -2803,7 +2803,7 @@ static void save_PopName( void ) } -static void save_PrioritizeTextures( GLsizei num, const GLuint *textures, +static void GLAPIENTRY save_PrioritizeTextures( GLsizei num, const GLuint *textures, const GLclampf *priorities ) { GET_CURRENT_CONTEXT(ctx); @@ -2824,7 +2824,7 @@ static void save_PrioritizeTextures( GLsizei num, const GLuint *textures, } -static void save_PushAttrib( GLbitfield mask ) +static void GLAPIENTRY save_PushAttrib( GLbitfield mask ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2839,7 +2839,7 @@ static void save_PushAttrib( GLbitfield mask ) } -static void save_PushMatrix( void ) +static void GLAPIENTRY save_PushMatrix( void ) { GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); @@ -2850,7 +2850,7 @@ static void save_PushMatrix( void ) } -static void save_PushName( GLuint name ) +static void GLAPIENTRY save_PushName( GLuint name ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2865,7 +2865,7 @@ static void save_PushName( GLuint name ) } -static void save_RasterPos4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ) +static void GLAPIENTRY save_RasterPos4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -2882,125 +2882,125 @@ static void save_RasterPos4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ) } } -static void save_RasterPos2d(GLdouble x, GLdouble y) +static void GLAPIENTRY save_RasterPos2d(GLdouble x, GLdouble y) { save_RasterPos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F); } -static void save_RasterPos2f(GLfloat x, GLfloat y) +static void GLAPIENTRY save_RasterPos2f(GLfloat x, GLfloat y) { save_RasterPos4f(x, y, 0.0F, 1.0F); } -static void save_RasterPos2i(GLint x, GLint y) +static void GLAPIENTRY save_RasterPos2i(GLint x, GLint y) { save_RasterPos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F); } -static void save_RasterPos2s(GLshort x, GLshort y) +static void GLAPIENTRY save_RasterPos2s(GLshort x, GLshort y) { save_RasterPos4f(x, y, 0.0F, 1.0F); } -static void save_RasterPos3d(GLdouble x, GLdouble y, GLdouble z) +static void GLAPIENTRY save_RasterPos3d(GLdouble x, GLdouble y, GLdouble z) { save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); } -static void save_RasterPos3f(GLfloat x, GLfloat y, GLfloat z) +static void GLAPIENTRY save_RasterPos3f(GLfloat x, GLfloat y, GLfloat z) { save_RasterPos4f(x, y, z, 1.0F); } -static void save_RasterPos3i(GLint x, GLint y, GLint z) +static void GLAPIENTRY save_RasterPos3i(GLint x, GLint y, GLint z) { save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); } -static void save_RasterPos3s(GLshort x, GLshort y, GLshort z) +static void GLAPIENTRY save_RasterPos3s(GLshort x, GLshort y, GLshort z) { save_RasterPos4f(x, y, z, 1.0F); } -static void save_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) +static void GLAPIENTRY save_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) { save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); } -static void save_RasterPos4i(GLint x, GLint y, GLint z, GLint w) +static void GLAPIENTRY save_RasterPos4i(GLint x, GLint y, GLint z, GLint w) { save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); } -static void save_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w) +static void GLAPIENTRY save_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w) { save_RasterPos4f(x, y, z, w); } -static void save_RasterPos2dv(const GLdouble *v) +static void GLAPIENTRY save_RasterPos2dv(const GLdouble *v) { save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); } -static void save_RasterPos2fv(const GLfloat *v) +static void GLAPIENTRY save_RasterPos2fv(const GLfloat *v) { save_RasterPos4f(v[0], v[1], 0.0F, 1.0F); } -static void save_RasterPos2iv(const GLint *v) +static void GLAPIENTRY save_RasterPos2iv(const GLint *v) { save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); } -static void save_RasterPos2sv(const GLshort *v) +static void GLAPIENTRY save_RasterPos2sv(const GLshort *v) { save_RasterPos4f(v[0], v[1], 0.0F, 1.0F); } -static void save_RasterPos3dv(const GLdouble *v) +static void GLAPIENTRY save_RasterPos3dv(const GLdouble *v) { save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); } -static void save_RasterPos3fv(const GLfloat *v) +static void GLAPIENTRY save_RasterPos3fv(const GLfloat *v) { save_RasterPos4f(v[0], v[1], v[2], 1.0F); } -static void save_RasterPos3iv(const GLint *v) +static void GLAPIENTRY save_RasterPos3iv(const GLint *v) { save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); } -static void save_RasterPos3sv(const GLshort *v) +static void GLAPIENTRY save_RasterPos3sv(const GLshort *v) { save_RasterPos4f(v[0], v[1], v[2], 1.0F); } -static void save_RasterPos4dv(const GLdouble *v) +static void GLAPIENTRY save_RasterPos4dv(const GLdouble *v) { save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]); } -static void save_RasterPos4fv(const GLfloat *v) +static void GLAPIENTRY save_RasterPos4fv(const GLfloat *v) { save_RasterPos4f(v[0], v[1], v[2], v[3]); } -static void save_RasterPos4iv(const GLint *v) +static void GLAPIENTRY save_RasterPos4iv(const GLint *v) { save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]); } -static void save_RasterPos4sv(const GLshort *v) +static void GLAPIENTRY save_RasterPos4sv(const GLshort *v) { save_RasterPos4f(v[0], v[1], v[2], v[3]); } -static void save_PassThrough( GLfloat token ) +static void GLAPIENTRY save_PassThrough( GLfloat token ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -3015,7 +3015,7 @@ static void save_PassThrough( GLfloat token ) } -static void save_ReadBuffer( GLenum mode ) +static void GLAPIENTRY save_ReadBuffer( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -3030,7 +3030,7 @@ static void save_ReadBuffer( GLenum mode ) } -static void +static void GLAPIENTRY save_ResetHistogram(GLenum target) { GET_CURRENT_CONTEXT(ctx); @@ -3046,7 +3046,7 @@ save_ResetHistogram(GLenum target) } -static void +static void GLAPIENTRY save_ResetMinmax(GLenum target) { GET_CURRENT_CONTEXT(ctx); @@ -3062,7 +3062,7 @@ save_ResetMinmax(GLenum target) } -static void save_Rotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z ) +static void GLAPIENTRY save_Rotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -3080,13 +3080,13 @@ static void save_Rotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z ) } -static void save_Rotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ) +static void GLAPIENTRY save_Rotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ) { save_Rotatef((GLfloat) angle, (GLfloat) x, (GLfloat) y, (GLfloat) z); } -static void save_Scalef( GLfloat x, GLfloat y, GLfloat z ) +static void GLAPIENTRY save_Scalef( GLfloat x, GLfloat y, GLfloat z ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -3103,13 +3103,13 @@ static void save_Scalef( GLfloat x, GLfloat y, GLfloat z ) } -static void save_Scaled( GLdouble x, GLdouble y, GLdouble z ) +static void GLAPIENTRY save_Scaled( GLdouble x, GLdouble y, GLdouble z ) { save_Scalef((GLfloat) x, (GLfloat) y, (GLfloat) z); } -static void save_Scissor( GLint x, GLint y, GLsizei width, GLsizei height ) +static void GLAPIENTRY save_Scissor( GLint x, GLint y, GLsizei width, GLsizei height ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -3127,7 +3127,7 @@ static void save_Scissor( GLint x, GLint y, GLsizei width, GLsizei height ) } -static void save_ShadeModel( GLenum mode ) +static void GLAPIENTRY save_ShadeModel( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -3142,7 +3142,7 @@ static void save_ShadeModel( GLenum mode ) } -static void save_StencilFunc( GLenum func, GLint ref, GLuint mask ) +static void GLAPIENTRY save_StencilFunc( GLenum func, GLint ref, GLuint mask ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -3159,7 +3159,7 @@ static void save_StencilFunc( GLenum func, GLint ref, GLuint mask ) } -static void save_StencilMask( GLuint mask ) +static void GLAPIENTRY save_StencilMask( GLuint mask ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -3174,7 +3174,7 @@ static void save_StencilMask( GLuint mask ) } -static void save_StencilOp( GLenum fail, GLenum zfail, GLenum zpass ) +static void GLAPIENTRY save_StencilOp( GLenum fail, GLenum zfail, GLenum zpass ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -3191,7 +3191,7 @@ static void save_StencilOp( GLenum fail, GLenum zfail, GLenum zpass ) } -static void save_TexEnvfv( GLenum target, GLenum pname, const GLfloat *params ) +static void GLAPIENTRY save_TexEnvfv( GLenum target, GLenum pname, const GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -3211,13 +3211,13 @@ static void save_TexEnvfv( GLenum target, GLenum pname, const GLfloat *params ) } -static void save_TexEnvf( GLenum target, GLenum pname, GLfloat param ) +static void GLAPIENTRY save_TexEnvf( GLenum target, GLenum pname, GLfloat param ) { save_TexEnvfv( target, pname, ¶m ); } -static void save_TexEnvi( GLenum target, GLenum pname, GLint param ) +static void GLAPIENTRY save_TexEnvi( GLenum target, GLenum pname, GLint param ) { GLfloat p[4]; p[0] = (GLfloat) param; @@ -3226,7 +3226,7 @@ static void save_TexEnvi( GLenum target, GLenum pname, GLint param ) } -static void save_TexEnviv( GLenum target, GLenum pname, const GLint *param ) +static void GLAPIENTRY save_TexEnviv( GLenum target, GLenum pname, const GLint *param ) { GLfloat p[4]; p[0] = INT_TO_FLOAT( param[0] ); @@ -3237,7 +3237,7 @@ static void save_TexEnviv( GLenum target, GLenum pname, const GLint *param ) } -static void save_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) +static void GLAPIENTRY save_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -3257,7 +3257,7 @@ static void save_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) } -static void save_TexGeniv(GLenum coord, GLenum pname, const GLint *params ) +static void GLAPIENTRY save_TexGeniv(GLenum coord, GLenum pname, const GLint *params ) { GLfloat p[4]; p[0] = (GLfloat) params[0]; @@ -3268,14 +3268,14 @@ static void save_TexGeniv(GLenum coord, GLenum pname, const GLint *params ) } -static void save_TexGend(GLenum coord, GLenum pname, GLdouble param ) +static void GLAPIENTRY save_TexGend(GLenum coord, GLenum pname, GLdouble param ) { GLfloat p = (GLfloat) param; save_TexGenfv( coord, pname, &p ); } -static void save_TexGendv(GLenum coord, GLenum pname, const GLdouble *params ) +static void GLAPIENTRY save_TexGendv(GLenum coord, GLenum pname, const GLdouble *params ) { GLfloat p[4]; p[0] = (GLfloat) params[0]; @@ -3286,19 +3286,19 @@ static void save_TexGendv(GLenum coord, GLenum pname, const GLdouble *params ) } -static void save_TexGenf( GLenum coord, GLenum pname, GLfloat param ) +static void GLAPIENTRY save_TexGenf( GLenum coord, GLenum pname, GLfloat param ) { save_TexGenfv(coord, pname, ¶m); } -static void save_TexGeni( GLenum coord, GLenum pname, GLint param ) +static void GLAPIENTRY save_TexGeni( GLenum coord, GLenum pname, GLint param ) { save_TexGeniv( coord, pname, ¶m ); } -static void save_TexParameterfv( GLenum target, +static void GLAPIENTRY save_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); @@ -3319,13 +3319,13 @@ static void save_TexParameterfv( GLenum target, } -static void save_TexParameterf( GLenum target, GLenum pname, GLfloat param ) +static void GLAPIENTRY save_TexParameterf( GLenum target, GLenum pname, GLfloat param ) { save_TexParameterfv(target, pname, ¶m); } -static void save_TexParameteri( GLenum target, GLenum pname, GLint param ) +static void GLAPIENTRY save_TexParameteri( GLenum target, GLenum pname, GLint param ) { GLfloat fparam[4]; fparam[0] = (GLfloat) param; @@ -3334,7 +3334,7 @@ static void save_TexParameteri( GLenum target, GLenum pname, GLint param ) } -static void save_TexParameteriv( GLenum target, GLenum pname, const GLint *params ) +static void GLAPIENTRY save_TexParameteriv( GLenum target, GLenum pname, const GLint *params ) { GLfloat fparam[4]; fparam[0] = (GLfloat) params[0]; @@ -3343,7 +3343,7 @@ static void save_TexParameteriv( GLenum target, GLenum pname, const GLint *param } -static void save_TexImage1D( GLenum target, +static void GLAPIENTRY save_TexImage1D( GLenum target, GLint level, GLint components, GLsizei width, GLint border, GLenum format, GLenum type, @@ -3382,7 +3382,7 @@ static void save_TexImage1D( GLenum target, } -static void save_TexImage2D( GLenum target, +static void GLAPIENTRY save_TexImage2D( GLenum target, GLint level, GLint components, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, @@ -3422,7 +3422,7 @@ static void save_TexImage2D( GLenum target, } -static void save_TexImage3D( GLenum target, +static void GLAPIENTRY save_TexImage3D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, @@ -3464,7 +3464,7 @@ static void save_TexImage3D( GLenum target, } -static void save_TexSubImage1D( GLenum target, GLint level, GLint xoffset, +static void GLAPIENTRY save_TexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels ) { @@ -3493,7 +3493,7 @@ static void save_TexSubImage1D( GLenum target, GLint level, GLint xoffset, } -static void save_TexSubImage2D( GLenum target, GLint level, +static void GLAPIENTRY save_TexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, @@ -3526,7 +3526,7 @@ static void save_TexSubImage2D( GLenum target, GLint level, } -static void save_TexSubImage3D( GLenum target, GLint level, +static void GLAPIENTRY save_TexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset,GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, @@ -3562,7 +3562,7 @@ static void save_TexSubImage3D( GLenum target, GLint level, } -static void save_Translatef( GLfloat x, GLfloat y, GLfloat z ) +static void GLAPIENTRY save_Translatef( GLfloat x, GLfloat y, GLfloat z ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -3579,14 +3579,14 @@ static void save_Translatef( GLfloat x, GLfloat y, GLfloat z ) } -static void save_Translated( GLdouble x, GLdouble y, GLdouble z ) +static void GLAPIENTRY save_Translated( GLdouble x, GLdouble y, GLdouble z ) { save_Translatef((GLfloat) x, (GLfloat) y, (GLfloat) z); } -static void save_Viewport( GLint x, GLint y, GLsizei width, GLsizei height ) +static void GLAPIENTRY save_Viewport( GLint x, GLint y, GLsizei width, GLsizei height ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -3604,7 +3604,7 @@ static void save_Viewport( GLint x, GLint y, GLsizei width, GLsizei height ) } -static void save_WindowPos4fMESA( GLfloat x, GLfloat y, GLfloat z, GLfloat w ) +static void GLAPIENTRY save_WindowPos4fMESA( GLfloat x, GLfloat y, GLfloat z, GLfloat w ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -3621,119 +3621,119 @@ static void save_WindowPos4fMESA( GLfloat x, GLfloat y, GLfloat z, GLfloat w ) } } -static void save_WindowPos2dMESA(GLdouble x, GLdouble y) +static void GLAPIENTRY save_WindowPos2dMESA(GLdouble x, GLdouble y) { save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, 0.0F, 1.0F); } -static void save_WindowPos2fMESA(GLfloat x, GLfloat y) +static void GLAPIENTRY save_WindowPos2fMESA(GLfloat x, GLfloat y) { save_WindowPos4fMESA(x, y, 0.0F, 1.0F); } -static void save_WindowPos2iMESA(GLint x, GLint y) +static void GLAPIENTRY save_WindowPos2iMESA(GLint x, GLint y) { save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, 0.0F, 1.0F); } -static void save_WindowPos2sMESA(GLshort x, GLshort y) +static void GLAPIENTRY save_WindowPos2sMESA(GLshort x, GLshort y) { save_WindowPos4fMESA(x, y, 0.0F, 1.0F); } -static void save_WindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z) +static void GLAPIENTRY save_WindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z) { save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); } -static void save_WindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z) +static void GLAPIENTRY save_WindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z) { save_WindowPos4fMESA(x, y, z, 1.0F); } -static void save_WindowPos3iMESA(GLint x, GLint y, GLint z) +static void GLAPIENTRY save_WindowPos3iMESA(GLint x, GLint y, GLint z) { save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); } -static void save_WindowPos3sMESA(GLshort x, GLshort y, GLshort z) +static void GLAPIENTRY save_WindowPos3sMESA(GLshort x, GLshort y, GLshort z) { save_WindowPos4fMESA(x, y, z, 1.0F); } -static void save_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w) +static void GLAPIENTRY save_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w) { save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); } -static void save_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w) +static void GLAPIENTRY save_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w) { save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); } -static void save_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w) +static void GLAPIENTRY save_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w) { save_WindowPos4fMESA(x, y, z, w); } -static void save_WindowPos2dvMESA(const GLdouble *v) +static void GLAPIENTRY save_WindowPos2dvMESA(const GLdouble *v) { save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); } -static void save_WindowPos2fvMESA(const GLfloat *v) +static void GLAPIENTRY save_WindowPos2fvMESA(const GLfloat *v) { save_WindowPos4fMESA(v[0], v[1], 0.0F, 1.0F); } -static void save_WindowPos2ivMESA(const GLint *v) +static void GLAPIENTRY save_WindowPos2ivMESA(const GLint *v) { save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); } -static void save_WindowPos2svMESA(const GLshort *v) +static void GLAPIENTRY save_WindowPos2svMESA(const GLshort *v) { save_WindowPos4fMESA(v[0], v[1], 0.0F, 1.0F); } -static void save_WindowPos3dvMESA(const GLdouble *v) +static void GLAPIENTRY save_WindowPos3dvMESA(const GLdouble *v) { save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); } -static void save_WindowPos3fvMESA(const GLfloat *v) +static void GLAPIENTRY save_WindowPos3fvMESA(const GLfloat *v) { save_WindowPos4fMESA(v[0], v[1], v[2], 1.0F); } -static void save_WindowPos3ivMESA(const GLint *v) +static void GLAPIENTRY save_WindowPos3ivMESA(const GLint *v) { save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); } -static void save_WindowPos3svMESA(const GLshort *v) +static void GLAPIENTRY save_WindowPos3svMESA(const GLshort *v) { save_WindowPos4fMESA(v[0], v[1], v[2], 1.0F); } -static void save_WindowPos4dvMESA(const GLdouble *v) +static void GLAPIENTRY save_WindowPos4dvMESA(const GLdouble *v) { save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]); } -static void save_WindowPos4fvMESA(const GLfloat *v) +static void GLAPIENTRY save_WindowPos4fvMESA(const GLfloat *v) { save_WindowPos4fMESA(v[0], v[1], v[2], v[3]); } -static void save_WindowPos4ivMESA(const GLint *v) +static void GLAPIENTRY save_WindowPos4ivMESA(const GLint *v) { save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]); } -static void save_WindowPos4svMESA(const GLshort *v) +static void GLAPIENTRY save_WindowPos4svMESA(const GLshort *v) { save_WindowPos4fMESA(v[0], v[1], v[2], v[3]); } @@ -3741,7 +3741,7 @@ static void save_WindowPos4svMESA(const GLshort *v) /* GL_ARB_multitexture */ -static void save_ActiveTextureARB( GLenum target ) +static void GLAPIENTRY save_ActiveTextureARB( GLenum target ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -3758,7 +3758,7 @@ static void save_ActiveTextureARB( GLenum target ) /* GL_ARB_transpose_matrix */ -static void save_LoadTransposeMatrixdARB( const GLdouble m[16] ) +static void GLAPIENTRY save_LoadTransposeMatrixdARB( const GLdouble m[16] ) { GLfloat tm[16]; _math_transposefd(tm, m); @@ -3766,7 +3766,7 @@ static void save_LoadTransposeMatrixdARB( const GLdouble m[16] ) } -static void save_LoadTransposeMatrixfARB( const GLfloat m[16] ) +static void GLAPIENTRY save_LoadTransposeMatrixfARB( const GLfloat m[16] ) { GLfloat tm[16]; _math_transposef(tm, m); @@ -3774,7 +3774,7 @@ static void save_LoadTransposeMatrixfARB( const GLfloat m[16] ) } -static void +static void GLAPIENTRY save_MultTransposeMatrixdARB( const GLdouble m[16] ) { GLfloat tm[16]; @@ -3783,7 +3783,7 @@ save_MultTransposeMatrixdARB( const GLdouble m[16] ) } -static void +static void GLAPIENTRY save_MultTransposeMatrixfARB( const GLfloat m[16] ) { GLfloat tm[16]; @@ -3792,7 +3792,7 @@ save_MultTransposeMatrixfARB( const GLfloat m[16] ) } -static void +static void GLAPIENTRY save_PixelTexGenSGIX(GLenum mode) { GET_CURRENT_CONTEXT(ctx); @@ -3809,7 +3809,7 @@ save_PixelTexGenSGIX(GLenum mode) /* GL_ARB_texture_compression */ -static void +static void GLAPIENTRY save_CompressedTexImage1DARB(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, @@ -3853,7 +3853,7 @@ save_CompressedTexImage1DARB(GLenum target, GLint level, } -static void +static void GLAPIENTRY save_CompressedTexImage2DARB(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, @@ -3898,7 +3898,7 @@ save_CompressedTexImage2DARB(GLenum target, GLint level, } -static void +static void GLAPIENTRY save_CompressedTexImage3DARB(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, @@ -3944,7 +3944,7 @@ save_CompressedTexImage3DARB(GLenum target, GLint level, } -static void +static void GLAPIENTRY save_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data) @@ -3982,7 +3982,7 @@ save_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset, } -static void +static void GLAPIENTRY save_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, @@ -4023,7 +4023,7 @@ save_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset, } -static void +static void GLAPIENTRY save_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, @@ -4067,7 +4067,7 @@ save_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset, /* GL_ARB_multisample */ -static void +static void GLAPIENTRY save_SampleCoverageARB(GLclampf value, GLboolean invert) { GET_CURRENT_CONTEXT(ctx); @@ -4086,7 +4086,7 @@ save_SampleCoverageARB(GLclampf value, GLboolean invert) /* GL_SGIS_pixel_texture */ -static void +static void GLAPIENTRY save_PixelTexGenParameteriSGIS(GLenum target, GLint value) { GET_CURRENT_CONTEXT(ctx); @@ -4103,21 +4103,21 @@ save_PixelTexGenParameteriSGIS(GLenum target, GLint value) } -static void +static void GLAPIENTRY save_PixelTexGenParameterfSGIS(GLenum target, GLfloat value) { save_PixelTexGenParameteriSGIS(target, (GLint) value); } -static void +static void GLAPIENTRY save_PixelTexGenParameterivSGIS(GLenum target, const GLint *value) { save_PixelTexGenParameteriSGIS(target, *value); } -static void +static void GLAPIENTRY save_PixelTexGenParameterfvSGIS(GLenum target, const GLfloat *value) { save_PixelTexGenParameteriSGIS(target, (GLint) *value); @@ -4128,7 +4128,7 @@ save_PixelTexGenParameterfvSGIS(GLenum target, const GLfloat *value) * GL_NV_vertex_program */ #if FEATURE_NV_vertex_program -static void +static void GLAPIENTRY save_BindProgramNV(GLenum target, GLuint id) { GET_CURRENT_CONTEXT(ctx); @@ -4144,7 +4144,7 @@ save_BindProgramNV(GLenum target, GLuint id) } } -static void +static void GLAPIENTRY save_ExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params) { GET_CURRENT_CONTEXT(ctx); @@ -4165,7 +4165,7 @@ save_ExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params) } -static void +static void GLAPIENTRY save_ProgramParameter4fNV(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) @@ -4188,7 +4188,7 @@ save_ProgramParameter4fNV(GLenum target, GLuint index, } -static void +static void GLAPIENTRY save_ProgramParameter4fvNV(GLenum target, GLuint index, const GLfloat *params) { save_ProgramParameter4fNV(target, index, params[0], params[1], @@ -4196,7 +4196,7 @@ save_ProgramParameter4fvNV(GLenum target, GLuint index, const GLfloat *params) } -static void +static void GLAPIENTRY save_ProgramParameter4dNV(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) @@ -4206,7 +4206,7 @@ save_ProgramParameter4dNV(GLenum target, GLuint index, } -static void +static void GLAPIENTRY save_ProgramParameter4dvNV(GLenum target, GLuint index, const GLdouble *params) { @@ -4216,7 +4216,7 @@ save_ProgramParameter4dvNV(GLenum target, GLuint index, } -static void +static void GLAPIENTRY save_ProgramParameters4dvNV(GLenum target, GLuint index, GLuint num, const GLdouble *params) { @@ -4227,7 +4227,7 @@ save_ProgramParameters4dvNV(GLenum target, GLuint index, } -static void +static void GLAPIENTRY save_ProgramParameters4fvNV(GLenum target, GLuint index, GLuint num, const GLfloat *params) { @@ -4238,7 +4238,7 @@ save_ProgramParameters4fvNV(GLenum target, GLuint index, } -static void +static void GLAPIENTRY save_LoadProgramNV(GLenum target, GLuint id, GLsizei len, const GLubyte *program) { @@ -4267,7 +4267,7 @@ save_LoadProgramNV(GLenum target, GLuint id, GLsizei len, } -static void +static void GLAPIENTRY save_RequestResidentProgramsNV(GLsizei num, const GLuint *ids) { GET_CURRENT_CONTEXT(ctx); @@ -4290,7 +4290,7 @@ save_RequestResidentProgramsNV(GLsizei num, const GLuint *ids) } -static void +static void GLAPIENTRY save_TrackMatrixNV(GLenum target, GLuint address, GLenum matrix, GLenum transform) { @@ -4315,7 +4315,7 @@ save_TrackMatrixNV(GLenum target, GLuint address, * GL_NV_fragment_program */ #if FEATURE_NV_fragment_program -static void +static void GLAPIENTRY save_ProgramLocalParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { @@ -4337,7 +4337,7 @@ save_ProgramLocalParameter4fARB(GLenum target, GLuint index, } -static void +static void GLAPIENTRY save_ProgramLocalParameter4fvARB(GLenum target, GLuint index, const GLfloat *params) { @@ -4359,7 +4359,7 @@ save_ProgramLocalParameter4fvARB(GLenum target, GLuint index, } -static void +static void GLAPIENTRY save_ProgramLocalParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) @@ -4382,7 +4382,7 @@ save_ProgramLocalParameter4dARB(GLenum target, GLuint index, } -static void +static void GLAPIENTRY save_ProgramLocalParameter4dvARB(GLenum target, GLuint index, const GLdouble *params) { @@ -4403,7 +4403,7 @@ save_ProgramLocalParameter4dvARB(GLenum target, GLuint index, } } -static void +static void GLAPIENTRY save_ProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { @@ -4433,7 +4433,7 @@ save_ProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte *name, } -static void +static void GLAPIENTRY save_ProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte *name, const float v[]) { @@ -4441,7 +4441,7 @@ save_ProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte *name, } -static void +static void GLAPIENTRY save_ProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { @@ -4450,7 +4450,7 @@ save_ProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte *name, } -static void +static void GLAPIENTRY save_ProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte *name, const double v[]) { @@ -4464,7 +4464,7 @@ save_ProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte *name, /* GL_EXT_stencil_two_side */ -static void save_ActiveStencilFaceEXT( GLenum face ) +static void GLAPIENTRY save_ActiveStencilFaceEXT( GLenum face ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -4480,7 +4480,7 @@ static void save_ActiveStencilFaceEXT( GLenum face ) /* GL_EXT_depth_bounds_test */ -static void save_DepthBoundsEXT( GLclampd zmin, GLclampd zmax ) +static void GLAPIENTRY save_DepthBoundsEXT( GLclampd zmin, GLclampd zmax ) { GET_CURRENT_CONTEXT(ctx); Node *n; @@ -4499,7 +4499,7 @@ static void save_DepthBoundsEXT( GLclampd zmin, GLclampd zmax ) #if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program -static void +static void GLAPIENTRY save_ProgramStringARB(GLenum target, GLenum format, GLsizei len, const GLvoid *string) { @@ -4528,7 +4528,7 @@ save_ProgramStringARB(GLenum target, GLenum format, GLsizei len, } -static void +static void GLAPIENTRY save_ProgramEnvParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { @@ -4550,7 +4550,7 @@ save_ProgramEnvParameter4fARB(GLenum target, GLuint index, } -static void +static void GLAPIENTRY save_ProgramEnvParameter4fvARB(GLenum target, GLuint index, const GLfloat *params) { @@ -4559,7 +4559,7 @@ save_ProgramEnvParameter4fvARB(GLenum target, GLuint index, } -static void +static void GLAPIENTRY save_ProgramEnvParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { @@ -4571,7 +4571,7 @@ save_ProgramEnvParameter4dARB(GLenum target, GLuint index, } -static void +static void GLAPIENTRY save_ProgramEnvParameter4dvARB(GLenum target, GLuint index, const GLdouble *params) { @@ -5230,7 +5230,7 @@ islist(GLcontext *ctx, GLuint list) * the absolute list number, not relative to ListBase. * \param list - display list number */ -static void +static void GLAPIENTRY execute_list( GLcontext *ctx, GLuint list ) { Node *n; @@ -6019,7 +6019,7 @@ execute_list( GLcontext *ctx, GLuint list ) /* * Test if a display list number is valid. */ -GLboolean +GLboolean GLAPIENTRY _mesa_IsList( GLuint list ) { GET_CURRENT_CONTEXT(ctx); @@ -6032,7 +6032,7 @@ _mesa_IsList( GLuint list ) /* * Delete a sequence of consecutive display lists. */ -void +void GLAPIENTRY _mesa_DeleteLists( GLuint list, GLsizei range ) { GET_CURRENT_CONTEXT(ctx); @@ -6055,7 +6055,7 @@ _mesa_DeleteLists( GLuint list, GLsizei range ) * Return a display list number, n, such that lists n through n+range-1 * are free. */ -GLuint +GLuint GLAPIENTRY _mesa_GenLists(GLsizei range ) { GET_CURRENT_CONTEXT(ctx); @@ -6095,7 +6095,7 @@ _mesa_GenLists(GLsizei range ) /* * Begin a new display list. */ -void +void GLAPIENTRY _mesa_NewList( GLuint list, GLenum mode ) { GET_CURRENT_CONTEXT(ctx); @@ -6156,7 +6156,7 @@ _mesa_NewList( GLuint list, GLenum mode ) /* * End definition of current display list. */ -void +void GLAPIENTRY _mesa_EndList( void ) { GET_CURRENT_CONTEXT(ctx); @@ -6196,7 +6196,7 @@ _mesa_EndList( void ) -void +void GLAPIENTRY _mesa_CallList( GLuint list ) { GLboolean save_compile_flag; @@ -6235,7 +6235,7 @@ _mesa_CallList( GLuint list ) /* * Execute glCallLists: call multiple display lists. */ -void +void GLAPIENTRY _mesa_CallLists( GLsizei n, GLenum type, const GLvoid *lists ) { GET_CURRENT_CONTEXT(ctx); @@ -6289,7 +6289,7 @@ _mesa_CallLists( GLsizei n, GLenum type, const GLvoid *lists ) /* * Set the offset added to list numbers in glCallLists. */ -void +void GLAPIENTRY _mesa_ListBase( GLuint base ) { GET_CURRENT_CONTEXT(ctx); @@ -6301,182 +6301,182 @@ _mesa_ListBase( GLuint base ) /* Can no longer assume ctx->Exec->Func is equal to _mesa_Func. */ -static void exec_Finish( void ) +static void GLAPIENTRY exec_Finish( void ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->Finish(); } -static void exec_Flush( void ) +static void GLAPIENTRY exec_Flush( void ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->Flush( ); } -static void exec_GetBooleanv( GLenum pname, GLboolean *params ) +static void GLAPIENTRY exec_GetBooleanv( GLenum pname, GLboolean *params ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetBooleanv( pname, params ); } -static void exec_GetClipPlane( GLenum plane, GLdouble *equation ) +static void GLAPIENTRY exec_GetClipPlane( GLenum plane, GLdouble *equation ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetClipPlane( plane, equation ); } -static void exec_GetDoublev( GLenum pname, GLdouble *params ) +static void GLAPIENTRY exec_GetDoublev( GLenum pname, GLdouble *params ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetDoublev( pname, params ); } -static GLenum exec_GetError( void ) +static GLenum GLAPIENTRY exec_GetError( void ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); return ctx->Exec->GetError( ); } -static void exec_GetFloatv( GLenum pname, GLfloat *params ) +static void GLAPIENTRY exec_GetFloatv( GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetFloatv( pname, params ); } -static void exec_GetIntegerv( GLenum pname, GLint *params ) +static void GLAPIENTRY exec_GetIntegerv( GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetIntegerv( pname, params ); } -static void exec_GetLightfv( GLenum light, GLenum pname, GLfloat *params ) +static void GLAPIENTRY exec_GetLightfv( GLenum light, GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetLightfv( light, pname, params ); } -static void exec_GetLightiv( GLenum light, GLenum pname, GLint *params ) +static void GLAPIENTRY exec_GetLightiv( GLenum light, GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetLightiv( light, pname, params ); } -static void exec_GetMapdv( GLenum target, GLenum query, GLdouble *v ) +static void GLAPIENTRY exec_GetMapdv( GLenum target, GLenum query, GLdouble *v ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetMapdv( target, query, v ); } -static void exec_GetMapfv( GLenum target, GLenum query, GLfloat *v ) +static void GLAPIENTRY exec_GetMapfv( GLenum target, GLenum query, GLfloat *v ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetMapfv( target, query, v ); } -static void exec_GetMapiv( GLenum target, GLenum query, GLint *v ) +static void GLAPIENTRY exec_GetMapiv( GLenum target, GLenum query, GLint *v ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetMapiv( target, query, v ); } -static void exec_GetMaterialfv( GLenum face, GLenum pname, GLfloat *params ) +static void GLAPIENTRY exec_GetMaterialfv( GLenum face, GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetMaterialfv( face, pname, params ); } -static void exec_GetMaterialiv( GLenum face, GLenum pname, GLint *params ) +static void GLAPIENTRY exec_GetMaterialiv( GLenum face, GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetMaterialiv( face, pname, params ); } -static void exec_GetPixelMapfv( GLenum map, GLfloat *values ) +static void GLAPIENTRY exec_GetPixelMapfv( GLenum map, GLfloat *values ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetPixelMapfv( map, values ); } -static void exec_GetPixelMapuiv( GLenum map, GLuint *values ) +static void GLAPIENTRY exec_GetPixelMapuiv( GLenum map, GLuint *values ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetPixelMapuiv( map, values ); } -static void exec_GetPixelMapusv( GLenum map, GLushort *values ) +static void GLAPIENTRY exec_GetPixelMapusv( GLenum map, GLushort *values ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetPixelMapusv( map, values ); } -static void exec_GetPolygonStipple( GLubyte *dest ) +static void GLAPIENTRY exec_GetPolygonStipple( GLubyte *dest ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetPolygonStipple( dest ); } -static const GLubyte *exec_GetString( GLenum name ) +static const GLubyte * GLAPIENTRY exec_GetString( GLenum name ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); return ctx->Exec->GetString( name ); } -static void exec_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ) +static void GLAPIENTRY exec_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetTexEnvfv( target, pname, params ); } -static void exec_GetTexEnviv( GLenum target, GLenum pname, GLint *params ) +static void GLAPIENTRY exec_GetTexEnviv( GLenum target, GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetTexEnviv( target, pname, params ); } -static void exec_GetTexGendv( GLenum coord, GLenum pname, GLdouble *params ) +static void GLAPIENTRY exec_GetTexGendv( GLenum coord, GLenum pname, GLdouble *params ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetTexGendv( coord, pname, params ); } -static void exec_GetTexGenfv( GLenum coord, GLenum pname, GLfloat *params ) +static void GLAPIENTRY exec_GetTexGenfv( GLenum coord, GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetTexGenfv( coord, pname, params ); } -static void exec_GetTexGeniv( GLenum coord, GLenum pname, GLint *params ) +static void GLAPIENTRY exec_GetTexGeniv( GLenum coord, GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetTexGeniv( coord, pname, params ); } -static void exec_GetTexImage( GLenum target, GLint level, GLenum format, +static void GLAPIENTRY exec_GetTexImage( GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels ) { GET_CURRENT_CONTEXT(ctx); @@ -6484,7 +6484,7 @@ static void exec_GetTexImage( GLenum target, GLint level, GLenum format, ctx->Exec->GetTexImage( target, level, format, type, pixels ); } -static void exec_GetTexLevelParameterfv( GLenum target, GLint level, +static void GLAPIENTRY exec_GetTexLevelParameterfv( GLenum target, GLint level, GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); @@ -6492,7 +6492,7 @@ static void exec_GetTexLevelParameterfv( GLenum target, GLint level, ctx->Exec->GetTexLevelParameterfv( target, level, pname, params ); } -static void exec_GetTexLevelParameteriv( GLenum target, GLint level, +static void GLAPIENTRY exec_GetTexLevelParameteriv( GLenum target, GLint level, GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); @@ -6500,7 +6500,7 @@ static void exec_GetTexLevelParameteriv( GLenum target, GLint level, ctx->Exec->GetTexLevelParameteriv( target, level, pname, params ); } -static void exec_GetTexParameterfv( GLenum target, GLenum pname, +static void GLAPIENTRY exec_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); @@ -6508,35 +6508,35 @@ static void exec_GetTexParameterfv( GLenum target, GLenum pname, ctx->Exec->GetTexParameterfv( target, pname, params ); } -static void exec_GetTexParameteriv( GLenum target, GLenum pname, GLint *params ) +static void GLAPIENTRY exec_GetTexParameteriv( GLenum target, GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetTexParameteriv( target, pname, params ); } -static GLboolean exec_IsEnabled( GLenum cap ) +static GLboolean GLAPIENTRY exec_IsEnabled( GLenum cap ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); return ctx->Exec->IsEnabled( cap ); } -static void exec_PixelStoref( GLenum pname, GLfloat param ) +static void GLAPIENTRY exec_PixelStoref( GLenum pname, GLfloat param ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->PixelStoref( pname, param ); } -static void exec_PixelStorei( GLenum pname, GLint param ) +static void GLAPIENTRY exec_PixelStorei( GLenum pname, GLint param ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->PixelStorei( pname, param ); } -static void exec_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, +static void GLAPIENTRY exec_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels ) { GET_CURRENT_CONTEXT(ctx); @@ -6544,28 +6544,28 @@ static void exec_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, ctx->Exec->ReadPixels( x, y, width, height, format, type, pixels ); } -static GLint exec_RenderMode( GLenum mode ) +static GLint GLAPIENTRY exec_RenderMode( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); return ctx->Exec->RenderMode( mode ); } -static void exec_FeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer ) +static void GLAPIENTRY exec_FeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->FeedbackBuffer( size, type, buffer ); } -static void exec_SelectBuffer( GLsizei size, GLuint *buffer ) +static void GLAPIENTRY exec_SelectBuffer( GLsizei size, GLuint *buffer ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->SelectBuffer( size, buffer ); } -static GLboolean exec_AreTexturesResident(GLsizei n, const GLuint *texName, +static GLboolean GLAPIENTRY exec_AreTexturesResident(GLsizei n, const GLuint *texName, GLboolean *residences) { GET_CURRENT_CONTEXT(ctx); @@ -6573,7 +6573,7 @@ static GLboolean exec_AreTexturesResident(GLsizei n, const GLuint *texName, return ctx->Exec->AreTexturesResident( n, texName, residences); } -static void exec_ColorPointer(GLint size, GLenum type, GLsizei stride, +static void GLAPIENTRY exec_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); @@ -6581,56 +6581,56 @@ static void exec_ColorPointer(GLint size, GLenum type, GLsizei stride, ctx->Exec->ColorPointer( size, type, stride, ptr); } -static void exec_DeleteTextures( GLsizei n, const GLuint *texName) +static void GLAPIENTRY exec_DeleteTextures( GLsizei n, const GLuint *texName) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->DeleteTextures( n, texName); } -static void exec_DisableClientState( GLenum cap ) +static void GLAPIENTRY exec_DisableClientState( GLenum cap ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->DisableClientState( cap ); } -static void exec_EdgeFlagPointer(GLsizei stride, const GLvoid *vptr) +static void GLAPIENTRY exec_EdgeFlagPointer(GLsizei stride, const GLvoid *vptr) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->EdgeFlagPointer( stride, vptr); } -static void exec_EnableClientState( GLenum cap ) +static void GLAPIENTRY exec_EnableClientState( GLenum cap ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->EnableClientState( cap ); } -static void exec_GenTextures( GLsizei n, GLuint *texName ) +static void GLAPIENTRY exec_GenTextures( GLsizei n, GLuint *texName ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GenTextures( n, texName ); } -static void exec_GetPointerv( GLenum pname, GLvoid **params ) +static void GLAPIENTRY exec_GetPointerv( GLenum pname, GLvoid **params ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetPointerv( pname, params ); } -static void exec_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr) +static void GLAPIENTRY exec_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->IndexPointer( type, stride, ptr); } -static void exec_InterleavedArrays(GLenum format, GLsizei stride, +static void GLAPIENTRY exec_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer) { GET_CURRENT_CONTEXT(ctx); @@ -6638,35 +6638,35 @@ static void exec_InterleavedArrays(GLenum format, GLsizei stride, ctx->Exec->InterleavedArrays( format, stride, pointer); } -static GLboolean exec_IsTexture( GLuint texture ) +static GLboolean GLAPIENTRY exec_IsTexture( GLuint texture ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); return ctx->Exec->IsTexture( texture ); } -static void exec_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr ) +static void GLAPIENTRY exec_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->NormalPointer( type, stride, ptr ); } -static void exec_PopClientAttrib(void) +static void GLAPIENTRY exec_PopClientAttrib(void) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->PopClientAttrib(); } -static void exec_PushClientAttrib(GLbitfield mask) +static void GLAPIENTRY exec_PushClientAttrib(GLbitfield mask) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->PushClientAttrib( mask); } -static void exec_TexCoordPointer(GLint size, GLenum type, GLsizei stride, +static void GLAPIENTRY exec_TexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); @@ -6674,7 +6674,7 @@ static void exec_TexCoordPointer(GLint size, GLenum type, GLsizei stride, ctx->Exec->TexCoordPointer( size, type, stride, ptr); } -static void exec_GetCompressedTexImageARB(GLenum target, GLint level, +static void GLAPIENTRY exec_GetCompressedTexImageARB(GLenum target, GLint level, GLvoid *img) { GET_CURRENT_CONTEXT(ctx); @@ -6682,7 +6682,7 @@ static void exec_GetCompressedTexImageARB(GLenum target, GLint level, ctx->Exec->GetCompressedTexImageARB( target, level, img); } -static void exec_VertexPointer(GLint size, GLenum type, GLsizei stride, +static void GLAPIENTRY exec_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); @@ -6690,7 +6690,7 @@ static void exec_VertexPointer(GLint size, GLenum type, GLsizei stride, ctx->Exec->VertexPointer( size, type, stride, ptr); } -static void exec_CopyConvolutionFilter1D(GLenum target, GLenum internalFormat, +static void GLAPIENTRY exec_CopyConvolutionFilter1D(GLenum target, GLenum internalFormat, GLint x, GLint y, GLsizei width) { GET_CURRENT_CONTEXT(ctx); @@ -6698,7 +6698,7 @@ static void exec_CopyConvolutionFilter1D(GLenum target, GLenum internalFormat, ctx->Exec->CopyConvolutionFilter1D( target, internalFormat, x, y, width); } -static void exec_CopyConvolutionFilter2D(GLenum target, GLenum internalFormat, +static void GLAPIENTRY exec_CopyConvolutionFilter2D(GLenum target, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height) { @@ -6708,7 +6708,7 @@ static void exec_CopyConvolutionFilter2D(GLenum target, GLenum internalFormat, height); } -static void exec_GetColorTable( GLenum target, GLenum format, +static void GLAPIENTRY exec_GetColorTable( GLenum target, GLenum format, GLenum type, GLvoid *data ) { GET_CURRENT_CONTEXT(ctx); @@ -6716,7 +6716,7 @@ static void exec_GetColorTable( GLenum target, GLenum format, ctx->Exec->GetColorTable( target, format, type, data ); } -static void exec_GetColorTableParameterfv( GLenum target, GLenum pname, +static void GLAPIENTRY exec_GetColorTableParameterfv( GLenum target, GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); @@ -6724,7 +6724,7 @@ static void exec_GetColorTableParameterfv( GLenum target, GLenum pname, ctx->Exec->GetColorTableParameterfv( target, pname, params ); } -static void exec_GetColorTableParameteriv( GLenum target, GLenum pname, +static void GLAPIENTRY exec_GetColorTableParameteriv( GLenum target, GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); @@ -6732,7 +6732,7 @@ static void exec_GetColorTableParameteriv( GLenum target, GLenum pname, ctx->Exec->GetColorTableParameteriv( target, pname, params ); } -static void exec_GetConvolutionFilter(GLenum target, GLenum format, GLenum type, +static void GLAPIENTRY exec_GetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image) { GET_CURRENT_CONTEXT(ctx); @@ -6740,7 +6740,7 @@ static void exec_GetConvolutionFilter(GLenum target, GLenum format, GLenum type, ctx->Exec->GetConvolutionFilter( target, format, type, image); } -static void exec_GetConvolutionParameterfv(GLenum target, GLenum pname, +static void GLAPIENTRY exec_GetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params) { GET_CURRENT_CONTEXT(ctx); @@ -6748,7 +6748,7 @@ static void exec_GetConvolutionParameterfv(GLenum target, GLenum pname, ctx->Exec->GetConvolutionParameterfv( target, pname, params); } -static void exec_GetConvolutionParameteriv(GLenum target, GLenum pname, +static void GLAPIENTRY exec_GetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params) { GET_CURRENT_CONTEXT(ctx); @@ -6756,7 +6756,7 @@ static void exec_GetConvolutionParameteriv(GLenum target, GLenum pname, ctx->Exec->GetConvolutionParameteriv( target, pname, params); } -static void exec_GetHistogram(GLenum target, GLboolean reset, GLenum format, +static void GLAPIENTRY exec_GetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values) { GET_CURRENT_CONTEXT(ctx); @@ -6764,7 +6764,7 @@ static void exec_GetHistogram(GLenum target, GLboolean reset, GLenum format, ctx->Exec->GetHistogram( target, reset, format, type, values); } -static void exec_GetHistogramParameterfv(GLenum target, GLenum pname, +static void GLAPIENTRY exec_GetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params) { GET_CURRENT_CONTEXT(ctx); @@ -6772,7 +6772,7 @@ static void exec_GetHistogramParameterfv(GLenum target, GLenum pname, ctx->Exec->GetHistogramParameterfv( target, pname, params); } -static void exec_GetHistogramParameteriv(GLenum target, GLenum pname, +static void GLAPIENTRY exec_GetHistogramParameteriv(GLenum target, GLenum pname, GLint *params) { GET_CURRENT_CONTEXT(ctx); @@ -6780,7 +6780,7 @@ static void exec_GetHistogramParameteriv(GLenum target, GLenum pname, ctx->Exec->GetHistogramParameteriv( target, pname, params); } -static void exec_GetMinmax(GLenum target, GLboolean reset, GLenum format, +static void GLAPIENTRY exec_GetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values) { GET_CURRENT_CONTEXT(ctx); @@ -6788,7 +6788,7 @@ static void exec_GetMinmax(GLenum target, GLboolean reset, GLenum format, ctx->Exec->GetMinmax( target, reset, format, type, values); } -static void exec_GetMinmaxParameterfv(GLenum target, GLenum pname, +static void GLAPIENTRY exec_GetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params) { GET_CURRENT_CONTEXT(ctx); @@ -6796,7 +6796,7 @@ static void exec_GetMinmaxParameterfv(GLenum target, GLenum pname, ctx->Exec->GetMinmaxParameterfv( target, pname, params); } -static void exec_GetMinmaxParameteriv(GLenum target, GLenum pname, +static void GLAPIENTRY exec_GetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params) { GET_CURRENT_CONTEXT(ctx); @@ -6804,7 +6804,7 @@ static void exec_GetMinmaxParameteriv(GLenum target, GLenum pname, ctx->Exec->GetMinmaxParameteriv( target, pname, params); } -static void exec_GetSeparableFilter(GLenum target, GLenum format, GLenum type, +static void GLAPIENTRY exec_GetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span) { GET_CURRENT_CONTEXT(ctx); @@ -6812,7 +6812,7 @@ static void exec_GetSeparableFilter(GLenum target, GLenum format, GLenum type, ctx->Exec->GetSeparableFilter( target, format, type, row, column, span); } -static void exec_SeparableFilter2D(GLenum target, GLenum internalFormat, +static void GLAPIENTRY exec_SeparableFilter2D(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column) @@ -6823,21 +6823,21 @@ static void exec_SeparableFilter2D(GLenum target, GLenum internalFormat, type, row, column); } -static void exec_GetPixelTexGenParameterivSGIS(GLenum target, GLint *value) +static void GLAPIENTRY exec_GetPixelTexGenParameterivSGIS(GLenum target, GLint *value) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetPixelTexGenParameterivSGIS( target, value); } -static void exec_GetPixelTexGenParameterfvSGIS(GLenum target, GLfloat *value) +static void GLAPIENTRY exec_GetPixelTexGenParameterfvSGIS(GLenum target, GLfloat *value) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->GetPixelTexGenParameterfvSGIS( target, value); } -static void exec_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, +static void GLAPIENTRY exec_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); @@ -6845,7 +6845,7 @@ static void exec_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, ctx->Exec->ColorPointerEXT( size, type, stride, count, ptr); } -static void exec_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, +static void GLAPIENTRY exec_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr) { GET_CURRENT_CONTEXT(ctx); @@ -6853,7 +6853,7 @@ static void exec_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, ctx->Exec->EdgeFlagPointerEXT( stride, count, ptr); } -static void exec_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, +static void GLAPIENTRY exec_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); @@ -6861,7 +6861,7 @@ static void exec_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, ctx->Exec->IndexPointerEXT( type, stride, count, ptr); } -static void exec_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, +static void GLAPIENTRY exec_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); @@ -6869,7 +6869,7 @@ static void exec_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, ctx->Exec->NormalPointerEXT( type, stride, count, ptr); } -static void exec_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, +static void GLAPIENTRY exec_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); @@ -6877,7 +6877,7 @@ static void exec_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, ctx->Exec->TexCoordPointerEXT( size, type, stride, count, ptr); } -static void exec_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, +static void GLAPIENTRY exec_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); @@ -6885,21 +6885,21 @@ static void exec_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, ctx->Exec->VertexPointerEXT( size, type, stride, count, ptr); } -static void exec_LockArraysEXT(GLint first, GLsizei count) +static void GLAPIENTRY exec_LockArraysEXT(GLint first, GLsizei count) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->LockArraysEXT( first, count); } -static void exec_UnlockArraysEXT( void ) +static void GLAPIENTRY exec_UnlockArraysEXT( void ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->UnlockArraysEXT( ); } -static void exec_ResizeBuffersMESA( void ) +static void GLAPIENTRY exec_ResizeBuffersMESA( void ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); @@ -6907,14 +6907,14 @@ static void exec_ResizeBuffersMESA( void ) } -static void exec_ClientActiveTextureARB( GLenum target ) +static void GLAPIENTRY exec_ClientActiveTextureARB( GLenum target ) { GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); ctx->Exec->ClientActiveTextureARB(target); } -static void exec_SecondaryColorPointerEXT(GLint size, GLenum type, +static void GLAPIENTRY exec_SecondaryColorPointerEXT(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); @@ -6922,7 +6922,7 @@ static void exec_SecondaryColorPointerEXT(GLint size, GLenum type, ctx->Exec->SecondaryColorPointerEXT( size, type, stride, ptr); } -static void exec_FogCoordPointerEXT(GLenum type, GLsizei stride, +static void GLAPIENTRY exec_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); @@ -6931,7 +6931,7 @@ static void exec_FogCoordPointerEXT(GLenum type, GLsizei stride, } /* GL_EXT_multi_draw_arrays */ -static void exec_MultiDrawArraysEXT(GLenum mode, GLint *first, +static void GLAPIENTRY exec_MultiDrawArraysEXT(GLenum mode, GLint *first, GLsizei *count, GLsizei primcount) { GET_CURRENT_CONTEXT(ctx); @@ -6940,7 +6940,7 @@ static void exec_MultiDrawArraysEXT(GLenum mode, GLint *first, } /* GL_EXT_multi_draw_arrays */ -static void exec_MultiDrawElementsEXT(GLenum mode, const GLsizei *count, +static void GLAPIENTRY exec_MultiDrawElementsEXT(GLenum mode, const GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount) { @@ -6950,7 +6950,7 @@ static void exec_MultiDrawElementsEXT(GLenum mode, const GLsizei *count, } /* GL_IBM_multimode_draw_arrays */ -static void exec_MultiModeDrawArraysIBM(const GLenum *mode, const GLint *first, +static void GLAPIENTRY exec_MultiModeDrawArraysIBM(const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride) { @@ -6960,7 +6960,7 @@ static void exec_MultiModeDrawArraysIBM(const GLenum *mode, const GLint *first, } /* GL_IBM_multimode_draw_arrays */ -static void exec_MultiModeDrawElementsIBM(const GLenum *mode, +static void GLAPIENTRY exec_MultiModeDrawElementsIBM(const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid * const *indices, @@ -7504,7 +7504,7 @@ static const char *enum_string( GLenum k ) * Print the commands in a display list. For debugging only. * TODO: many commands aren't handled yet. */ -static void print_list( GLcontext *ctx, GLuint list ) +static void GLAPIENTRY print_list( GLcontext *ctx, GLuint list ) { Node *n; GLboolean done; diff --git a/src/mesa/main/dlist.h b/src/mesa/main/dlist.h index f0beaf47acb..a6b9c363a11 100644 --- a/src/mesa/main/dlist.h +++ b/src/mesa/main/dlist.h @@ -42,21 +42,21 @@ extern void _mesa_init_lists( void ); extern void _mesa_destroy_list( GLcontext *ctx, GLuint list ); -extern void _mesa_CallList( GLuint list ); +extern void GLAPIENTRY _mesa_CallList( GLuint list ); -extern void _mesa_CallLists( GLsizei n, GLenum type, const GLvoid *lists ); +extern void GLAPIENTRY _mesa_CallLists( GLsizei n, GLenum type, const GLvoid *lists ); -extern void _mesa_DeleteLists( GLuint list, GLsizei range ); +extern void GLAPIENTRY _mesa_DeleteLists( GLuint list, GLsizei range ); -extern void _mesa_EndList( void ); +extern void GLAPIENTRY _mesa_EndList( void ); -extern GLuint _mesa_GenLists( GLsizei range ); +extern GLuint GLAPIENTRY _mesa_GenLists( GLsizei range ); -extern GLboolean _mesa_IsList( GLuint list ); +extern GLboolean GLAPIENTRY _mesa_IsList( GLuint list ); -extern void _mesa_ListBase( GLuint base ); +extern void GLAPIENTRY _mesa_ListBase( GLuint base ); -extern void _mesa_NewList( GLuint list, GLenum mode ); +extern void GLAPIENTRY _mesa_NewList( GLuint list, GLenum mode ); extern void _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize ); @@ -73,11 +73,11 @@ extern int _mesa_alloc_opcode( GLcontext *ctx, GLuint sz, void (*destroy)( GLcontext *, void * ), void (*print)( GLcontext *, void * ) ); -extern void _mesa_save_EvalMesh2(GLenum mode, GLint i1, GLint i2, +extern void GLAPIENTRY _mesa_save_EvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ); -extern void _mesa_save_EvalMesh1( GLenum mode, GLint i1, GLint i2 ); -extern void _mesa_save_CallLists( GLsizei n, GLenum type, const GLvoid *lists ); -extern void _mesa_save_CallList( GLuint list ); +extern void GLAPIENTRY _mesa_save_EvalMesh1( GLenum mode, GLint i1, GLint i2 ); +extern void GLAPIENTRY _mesa_save_CallLists( GLsizei n, GLenum type, const GLvoid *lists ); +extern void GLAPIENTRY _mesa_save_CallList( GLuint list ); extern void _mesa_init_display_list( GLcontext * ctx ); extern void _mesa_save_vtxfmt_init( GLvertexformat *vfmt ); diff --git a/src/mesa/main/drawpix.c b/src/mesa/main/drawpix.c index b9b472492b0..12b9f2930d8 100644 --- a/src/mesa/main/drawpix.c +++ b/src/mesa/main/drawpix.c @@ -38,7 +38,7 @@ /* * Execute glDrawPixels */ -void +void GLAPIENTRY _mesa_DrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels ) { @@ -87,7 +87,7 @@ _mesa_DrawPixels( GLsizei width, GLsizei height, } } -void +void GLAPIENTRY _mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height, GLenum type ) { @@ -139,7 +139,7 @@ _mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height, -void +void GLAPIENTRY _mesa_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels ) { @@ -168,7 +168,7 @@ _mesa_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, -void +void GLAPIENTRY _mesa_Bitmap( GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap ) @@ -232,7 +232,7 @@ _mesa_Bitmap( GLsizei width, GLsizei height, * Z-compositing. Normally, this operation requires two glDrawPixels * calls with stencil testing. */ -void +void GLAPIENTRY _mesa_DrawDepthPixelsMESA( GLsizei width, GLsizei height, GLenum colorFormat, GLenum colorType, const GLvoid *colors, diff --git a/src/mesa/main/drawpix.h b/src/mesa/main/drawpix.h index 478767af4bf..2a2d7de8d81 100644 --- a/src/mesa/main/drawpix.h +++ b/src/mesa/main/drawpix.h @@ -31,22 +31,22 @@ #include "mtypes.h" -extern void +extern void GLAPIENTRY _mesa_DrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels ); -extern void +extern void GLAPIENTRY _mesa_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels ); -extern void +extern void GLAPIENTRY _mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height, GLenum type ); -extern void +extern void GLAPIENTRY _mesa_Bitmap( GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap ); diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c index 8cb84d55d6e..a882cf4580c 100644 --- a/src/mesa/main/enable.c +++ b/src/mesa/main/enable.c @@ -156,7 +156,7 @@ client_state( GLcontext *ctx, GLenum cap, GLboolean state ) * Get's the current context, assures that we're outside glBegin()/glEnd() and * calls client_state(). */ -void +void GLAPIENTRY _mesa_EnableClientState( GLenum cap ) { GET_CURRENT_CONTEXT(ctx); @@ -175,7 +175,7 @@ _mesa_EnableClientState( GLenum cap ) * Get's the current context, assures that we're outside glBegin()/glEnd() and * calls client_state(). */ -void +void GLAPIENTRY _mesa_DisableClientState( GLenum cap ) { GET_CURRENT_CONTEXT(ctx); @@ -231,9 +231,12 @@ void _mesa_set_enable( GLcontext *ctx, GLenum cap, GLboolean state ) return; FLUSH_VERTICES(ctx, _NEW_COLOR); ctx->Color.BlendEnabled = state; - /* The following needed to accomodate 1.0 RGB logic op blending */ - ctx->Color.ColorLogicOpEnabled = - (ctx->Color.BlendEquation == GL_LOGIC_OP && state); + /* This is needed to support 1.1's RGB logic ops AND + * 1.0's blending logicops. + */ + ctx->Color._LogicOpEnabled = + (ctx->Color.ColorLogicOpEnabled || + (state && ctx->Color.BlendEquation == GL_LOGIC_OP)); break; #if FEATURE_userclip case GL_CLIP_PLANE0: @@ -383,6 +386,12 @@ void _mesa_set_enable( GLcontext *ctx, GLenum cap, GLboolean state ) return; FLUSH_VERTICES(ctx, _NEW_COLOR); ctx->Color.ColorLogicOpEnabled = state; + /* This is needed to support 1.1's RGB logic ops AND + * 1.0's blending logicops. + */ + ctx->Color._LogicOpEnabled = + (state || (ctx->Color.BlendEnabled && + ctx->Color.BlendEquation == GL_LOGIC_OP)); break; case GL_MAP1_COLOR_4: if (ctx->Eval.Map1Color4 == state) @@ -1009,7 +1018,7 @@ void _mesa_set_enable( GLcontext *ctx, GLenum cap, GLboolean state ) * Get's the current context, assures that we're outside glBegin()/glEnd() and * calls _mesa_set_enable(). */ -void +void GLAPIENTRY _mesa_Enable( GLenum cap ) { GET_CURRENT_CONTEXT(ctx); @@ -1029,7 +1038,7 @@ _mesa_Enable( GLenum cap ) * Get's the current context, assures that we're outside glBegin()/glEnd() and * calls _mesa_set_enable(). */ -void +void GLAPIENTRY _mesa_Disable( GLenum cap ) { GET_CURRENT_CONTEXT(ctx); @@ -1056,7 +1065,7 @@ _mesa_Disable( GLenum cap ) * For the capabilities associated with extensions verifies that those * extensions are effectively present before reporting. */ -GLboolean +GLboolean GLAPIENTRY _mesa_IsEnabled( GLenum cap ) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/enable.h b/src/mesa/main/enable.h index eeafb2dddd4..25c90b0275a 100644 --- a/src/mesa/main/enable.h +++ b/src/mesa/main/enable.h @@ -38,19 +38,19 @@ extern void _mesa_set_enable( GLcontext* ctx, GLenum cap, GLboolean state ); -extern void +extern void GLAPIENTRY _mesa_Disable( GLenum cap ); -extern void +extern void GLAPIENTRY _mesa_Enable( GLenum cap ); -extern GLboolean +extern GLboolean GLAPIENTRY _mesa_IsEnabled( GLenum cap ); -extern void +extern void GLAPIENTRY _mesa_EnableClientState( GLenum cap ); -extern void +extern void GLAPIENTRY _mesa_DisableClientState( GLenum cap ); diff --git a/src/mesa/main/eval.c b/src/mesa/main/eval.c index 314ecf0491d..3f89f9c1eae 100644 --- a/src/mesa/main/eval.c +++ b/src/mesa/main/eval.c @@ -417,7 +417,7 @@ map1(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, -void +void GLAPIENTRY _mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points ) { @@ -425,7 +425,7 @@ _mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride, } -void +void GLAPIENTRY _mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points ) { @@ -516,7 +516,7 @@ map2( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, } -void +void GLAPIENTRY _mesa_Map2f( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, @@ -527,7 +527,7 @@ _mesa_Map2f( GLenum target, } -void +void GLAPIENTRY _mesa_Map2d( GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, @@ -539,7 +539,7 @@ _mesa_Map2d( GLenum target, -void +void GLAPIENTRY _mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v ) { GET_CURRENT_CONTEXT(ctx); @@ -604,7 +604,7 @@ _mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v ) } -void +void GLAPIENTRY _mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v ) { GET_CURRENT_CONTEXT(ctx); @@ -669,7 +669,7 @@ _mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v ) } -void +void GLAPIENTRY _mesa_GetMapiv( GLenum target, GLenum query, GLint *v ) { GET_CURRENT_CONTEXT(ctx); @@ -735,7 +735,7 @@ _mesa_GetMapiv( GLenum target, GLenum query, GLint *v ) -void +void GLAPIENTRY _mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 ) { GET_CURRENT_CONTEXT(ctx); @@ -753,14 +753,14 @@ _mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 ) } -void +void GLAPIENTRY _mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 ) { _mesa_MapGrid1f( un, (GLfloat) u1, (GLfloat) u2 ); } -void +void GLAPIENTRY _mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2 ) { @@ -788,7 +788,7 @@ _mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2, } -void +void GLAPIENTRY _mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2 ) { diff --git a/src/mesa/main/eval.h b/src/mesa/main/eval.h index 525835c7d5d..b3ff0a96f82 100644 --- a/src/mesa/main/eval.h +++ b/src/mesa/main/eval.h @@ -72,47 +72,47 @@ extern GLfloat *_mesa_copy_map_points2d(GLenum target, -extern void +extern void GLAPIENTRY _mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points ); -extern void +extern void GLAPIENTRY _mesa_Map2f( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points ); -extern void +extern void GLAPIENTRY _mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points ); -extern void +extern void GLAPIENTRY _mesa_Map2d( GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points ); -extern void +extern void GLAPIENTRY _mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 ); -extern void +extern void GLAPIENTRY _mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 ); -extern void +extern void GLAPIENTRY _mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2 ); -extern void +extern void GLAPIENTRY _mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2 ); -extern void +extern void GLAPIENTRY _mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v ); -extern void +extern void GLAPIENTRY _mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v ); -extern void +extern void GLAPIENTRY _mesa_GetMapiv( GLenum target, GLenum query, GLint *v ); #else diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c index fb67683a396..fa7a33e0c0d 100644 --- a/src/mesa/main/extensions.c +++ b/src/mesa/main/extensions.c @@ -143,6 +143,7 @@ static const struct { { OFF, "GL_SGIX_shadow", F(SGIX_shadow) }, { OFF, "GL_SGIX_shadow_ambient", F(SGIX_shadow_ambient) }, { OFF, "GL_SUN_multi_draw_arrays", F(EXT_multi_draw_arrays) }, + { OFF, "GL_S3_s3tc", F(S3_s3tc) }, }; @@ -281,9 +282,11 @@ void _mesa_enable_1_4_extensions(GLcontext *ctx) { ctx->Extensions.ARB_depth_texture = GL_TRUE; + ctx->Extensions.ARB_fragment_program = GL_TRUE; ctx->Extensions.ARB_shadow = GL_TRUE; ctx->Extensions.ARB_texture_env_crossbar = GL_TRUE; ctx->Extensions.ARB_texture_mirrored_repeat = GL_TRUE; + ctx->Extensions.ARB_vertex_program = GL_TRUE; ctx->Extensions.ARB_window_pos = GL_TRUE; ctx->Extensions.EXT_blend_color = GL_TRUE; ctx->Extensions.EXT_blend_func_separate = GL_TRUE; diff --git a/src/mesa/main/feedback.c b/src/mesa/main/feedback.c index 731fdf86bb8..106f34300a8 100644 --- a/src/mesa/main/feedback.c +++ b/src/mesa/main/feedback.c @@ -48,7 +48,7 @@ -void +void GLAPIENTRY _mesa_FeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer ) { GET_CURRENT_CONTEXT(ctx); @@ -102,7 +102,7 @@ _mesa_FeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer ) } -void +void GLAPIENTRY _mesa_PassThrough( GLfloat token ) { GET_CURRENT_CONTEXT(ctx); @@ -171,7 +171,7 @@ void _mesa_feedback_vertex( GLcontext *ctx, * Verifies we're not in selection mode, flushes the vertices and initialize * the fields in __GLcontextRec::Select with the given buffer. */ -void +void GLAPIENTRY _mesa_SelectBuffer( GLsizei size, GLuint *buffer ) { GET_CURRENT_CONTEXT(ctx); @@ -273,7 +273,7 @@ static void write_hit_record( GLcontext *ctx ) * the hit record data in gl_selection. Marks new render mode in * __GLcontextRec::NewState. */ -void +void GLAPIENTRY _mesa_InitNames( void ) { GET_CURRENT_CONTEXT(ctx); @@ -304,7 +304,7 @@ _mesa_InitNames( void ) * * sa __GLcontextRec::Select. */ -void +void GLAPIENTRY _mesa_LoadName( GLuint name ) { GET_CURRENT_CONTEXT(ctx); @@ -343,7 +343,7 @@ _mesa_LoadName( GLuint name ) * * sa __GLcontextRec::Select. */ -void +void GLAPIENTRY _mesa_PushName( GLuint name ) { GET_CURRENT_CONTEXT(ctx); @@ -374,7 +374,7 @@ _mesa_PushName( GLuint name ) * * sa __GLcontextRec::Select. */ -void +void GLAPIENTRY _mesa_PopName( void ) { GET_CURRENT_CONTEXT(ctx); @@ -417,7 +417,7 @@ _mesa_PopName( void ) * __GLcontextRec::RenderMode and notifies the driver via the * dd_function_table::RenderMode callback. */ -GLint +GLint GLAPIENTRY _mesa_RenderMode( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/feedback.h b/src/mesa/main/feedback.h index e1f47030c91..bbd27e3a975 100644 --- a/src/mesa/main/feedback.h +++ b/src/mesa/main/feedback.h @@ -54,28 +54,28 @@ extern void _mesa_feedback_vertex( GLcontext *ctx, extern void _mesa_update_hitflag( GLcontext *ctx, GLfloat z ); -extern void +extern void GLAPIENTRY _mesa_PassThrough( GLfloat token ); -extern void +extern void GLAPIENTRY _mesa_FeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer ); -extern void +extern void GLAPIENTRY _mesa_SelectBuffer( GLsizei size, GLuint *buffer ); -extern void +extern void GLAPIENTRY _mesa_InitNames( void ); -extern void +extern void GLAPIENTRY _mesa_LoadName( GLuint name ); -extern void +extern void GLAPIENTRY _mesa_PushName( GLuint name ); -extern void +extern void GLAPIENTRY _mesa_PopName( void ); -extern GLint +extern GLint GLAPIENTRY _mesa_RenderMode( GLenum mode ); diff --git a/src/mesa/main/fog.c b/src/mesa/main/fog.c index b7f967ed673..d3b8a923aae 100644 --- a/src/mesa/main/fog.c +++ b/src/mesa/main/fog.c @@ -31,14 +31,14 @@ -void +void GLAPIENTRY _mesa_Fogf(GLenum pname, GLfloat param) { _mesa_Fogfv(pname, ¶m); } -void +void GLAPIENTRY _mesa_Fogi(GLenum pname, GLint param ) { GLfloat fparam = (GLfloat) param; @@ -46,7 +46,7 @@ _mesa_Fogi(GLenum pname, GLint param ) } -void +void GLAPIENTRY _mesa_Fogiv(GLenum pname, const GLint *params ) { GLfloat p[4]; @@ -73,7 +73,7 @@ _mesa_Fogiv(GLenum pname, const GLint *params ) } -void +void GLAPIENTRY _mesa_Fogfv( GLenum pname, const GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/fog.h b/src/mesa/main/fog.h index 4a0417545b5..a14d19cdb39 100644 --- a/src/mesa/main/fog.h +++ b/src/mesa/main/fog.h @@ -42,16 +42,16 @@ #if _HAVE_FULL_GL -extern void +extern void GLAPIENTRY _mesa_Fogf(GLenum pname, GLfloat param); -extern void +extern void GLAPIENTRY _mesa_Fogi(GLenum pname, GLint param ); -extern void +extern void GLAPIENTRY _mesa_Fogfv(GLenum pname, const GLfloat *params ); -extern void +extern void GLAPIENTRY _mesa_Fogiv(GLenum pname, const GLint *params ); extern void _mesa_init_fog( GLcontext * ctx ); diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c index 76f70d26a71..dc5ddccb4b7 100644 --- a/src/mesa/main/get.c +++ b/src/mesa/main/get.c @@ -133,7 +133,7 @@ pixel_texgen_mode(const GLcontext *ctx) * otherwise gets the specified parameter from the current context, converting * it value into GLboolean. */ -void +void GLAPIENTRY _mesa_GetBooleanv( GLenum pname, GLboolean *params ) { GET_CURRENT_CONTEXT(ctx); @@ -1676,7 +1676,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params ) * otherwise gets the specified parameter from the current context, converting * it value into GLdouble. */ -void +void GLAPIENTRY _mesa_GetDoublev( GLenum pname, GLdouble *params ) { GET_CURRENT_CONTEXT(ctx); @@ -3213,7 +3213,7 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params ) * otherwise gets the specified parameter from the current context, converting * it value into GLfloat. */ -void +void GLAPIENTRY _mesa_GetFloatv( GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); @@ -4726,7 +4726,7 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params ) * otherwise gets the specified parameter from the current context, converting * it value into GLinteger. */ -void +void GLAPIENTRY _mesa_GetIntegerv( GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); @@ -6276,7 +6276,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params ) * Tries to get the specified pointer via dd_function_table::GetPointerv, * otherwise gets the specified pointer from the current context. */ -void +void GLAPIENTRY _mesa_GetPointerv( GLenum pname, GLvoid **params ) { GET_CURRENT_CONTEXT(ctx); @@ -6295,28 +6295,28 @@ _mesa_GetPointerv( GLenum pname, GLvoid **params ) switch (pname) { case GL_VERTEX_ARRAY_POINTER: - *params = ctx->Array.Vertex.Ptr; + *params = (GLvoid *) ctx->Array.Vertex.Ptr; break; case GL_NORMAL_ARRAY_POINTER: - *params = ctx->Array.Normal.Ptr; + *params = (GLvoid *) ctx->Array.Normal.Ptr; break; case GL_COLOR_ARRAY_POINTER: - *params = ctx->Array.Color.Ptr; + *params = (GLvoid *) ctx->Array.Color.Ptr; break; case GL_SECONDARY_COLOR_ARRAY_POINTER_EXT: - *params = ctx->Array.SecondaryColor.Ptr; + *params = (GLvoid *) ctx->Array.SecondaryColor.Ptr; break; case GL_FOG_COORDINATE_ARRAY_POINTER_EXT: - *params = ctx->Array.FogCoord.Ptr; + *params = (GLvoid *) ctx->Array.FogCoord.Ptr; break; case GL_INDEX_ARRAY_POINTER: - *params = ctx->Array.Index.Ptr; + *params = (GLvoid *) ctx->Array.Index.Ptr; break; case GL_TEXTURE_COORD_ARRAY_POINTER: - *params = ctx->Array.TexCoord[clientUnit].Ptr; + *params = (GLvoid *) ctx->Array.TexCoord[clientUnit].Ptr; break; case GL_EDGE_FLAG_ARRAY_POINTER: - *params = ctx->Array.EdgeFlag.Ptr; + *params = (GLvoid *) ctx->Array.EdgeFlag.Ptr; break; case GL_FEEDBACK_BUFFER_POINTER: *params = ctx->Feedback.Buffer; @@ -6371,7 +6371,7 @@ _mesa_GetPointerv( GLenum pname, GLvoid **params ) * Tries to get the string from dd_function_table::GetString, otherwise returns * the hardcoded strings. */ -const GLubyte * +const GLubyte * GLAPIENTRY _mesa_GetString( GLenum name ) { GET_CURRENT_CONTEXT(ctx); @@ -6466,7 +6466,7 @@ _mesa_GetString( GLenum name ) * * Returns __GLcontextRec::ErrorValue. */ -GLenum +GLenum GLAPIENTRY _mesa_GetError( void ) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/get.h b/src/mesa/main/get.h index 5c7a81e1511..9b47b230a98 100644 --- a/src/mesa/main/get.h +++ b/src/mesa/main/get.h @@ -35,25 +35,25 @@ #include "mtypes.h" -extern void +extern void GLAPIENTRY _mesa_GetBooleanv( GLenum pname, GLboolean *params ); -extern void +extern void GLAPIENTRY _mesa_GetDoublev( GLenum pname, GLdouble *params ); -extern void +extern void GLAPIENTRY _mesa_GetFloatv( GLenum pname, GLfloat *params ); -extern void +extern void GLAPIENTRY _mesa_GetIntegerv( GLenum pname, GLint *params ); -extern void +extern void GLAPIENTRY _mesa_GetPointerv( GLenum pname, GLvoid **params ); -extern const GLubyte * +extern const GLubyte * GLAPIENTRY _mesa_GetString( GLenum name ); -extern GLenum +extern GLenum GLAPIENTRY _mesa_GetError( void ); #endif diff --git a/src/mesa/main/hint.c b/src/mesa/main/hint.c index 5af819194ad..23ab1e6d0e6 100644 --- a/src/mesa/main/hint.c +++ b/src/mesa/main/hint.c @@ -32,7 +32,7 @@ -void +void GLAPIENTRY _mesa_Hint( GLenum target, GLenum mode ) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/hint.h b/src/mesa/main/hint.h index 57f3823fcfb..bfc3887107d 100644 --- a/src/mesa/main/hint.h +++ b/src/mesa/main/hint.h @@ -41,7 +41,7 @@ #if _HAVE_FULL_GL -extern void +extern void GLAPIENTRY _mesa_Hint( GLenum target, GLenum mode ); extern void diff --git a/src/mesa/main/histogram.c b/src/mesa/main/histogram.c index ea2c465e433..f390a2dade9 100644 --- a/src/mesa/main/histogram.c +++ b/src/mesa/main/histogram.c @@ -662,7 +662,7 @@ base_histogram_format( GLenum format ) */ -void +void GLAPIENTRY _mesa_GetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values) { GET_CURRENT_CONTEXT(ctx); @@ -729,7 +729,7 @@ _mesa_GetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvo } -void +void GLAPIENTRY _mesa_GetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values) { GET_CURRENT_CONTEXT(ctx); @@ -792,7 +792,7 @@ _mesa_GetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, G } -void +void GLAPIENTRY _mesa_GetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params) { GET_CURRENT_CONTEXT(ctx); @@ -839,7 +839,7 @@ _mesa_GetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params) } -void +void GLAPIENTRY _mesa_GetHistogramParameteriv(GLenum target, GLenum pname, GLint *params) { GET_CURRENT_CONTEXT(ctx); @@ -886,7 +886,7 @@ _mesa_GetHistogramParameteriv(GLenum target, GLenum pname, GLint *params) } -void +void GLAPIENTRY _mesa_GetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params) { GET_CURRENT_CONTEXT(ctx); @@ -912,7 +912,7 @@ _mesa_GetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params) } -void +void GLAPIENTRY _mesa_GetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params) { GET_CURRENT_CONTEXT(ctx); @@ -938,7 +938,7 @@ _mesa_GetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params) } -void +void GLAPIENTRY _mesa_Histogram(GLenum target, GLsizei width, GLenum internalFormat, GLboolean sink) { GLuint i; @@ -1021,7 +1021,7 @@ _mesa_Histogram(GLenum target, GLsizei width, GLenum internalFormat, GLboolean s } -void +void GLAPIENTRY _mesa_Minmax(GLenum target, GLenum internalFormat, GLboolean sink) { GET_CURRENT_CONTEXT(ctx); @@ -1049,7 +1049,7 @@ _mesa_Minmax(GLenum target, GLenum internalFormat, GLboolean sink) } -void +void GLAPIENTRY _mesa_ResetHistogram(GLenum target) { GLuint i; @@ -1077,7 +1077,7 @@ _mesa_ResetHistogram(GLenum target) } -void +void GLAPIENTRY _mesa_ResetMinmax(GLenum target) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/histogram.h b/src/mesa/main/histogram.h index 548e0ba3839..67ddce01cfc 100644 --- a/src/mesa/main/histogram.h +++ b/src/mesa/main/histogram.h @@ -48,25 +48,35 @@ extern void _mesa_update_histogram(GLcontext *ctx, GLuint n, const GLfloat rgba[][4]); -extern void _mesa_GetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values); +extern void GLAPIENTRY +_mesa_GetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values); -extern void _mesa_GetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +extern void GLAPIENTRY +_mesa_GetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -extern void _mesa_GetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params); +extern void GLAPIENTRY +_mesa_GetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params); -extern void _mesa_GetHistogramParameteriv(GLenum target, GLenum pname, GLint *params); +extern void GLAPIENTRY +_mesa_GetHistogramParameteriv(GLenum target, GLenum pname, GLint *params); -extern void _mesa_GetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params); +extern void GLAPIENTRY +_mesa_GetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params); -extern void _mesa_GetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params); +extern void GLAPIENTRY +_mesa_GetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params); -extern void _mesa_Histogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +extern void GLAPIENTRY +_mesa_Histogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -extern void _mesa_Minmax(GLenum target, GLenum internalformat, GLboolean sink); +extern void GLAPIENTRY +_mesa_Minmax(GLenum target, GLenum internalformat, GLboolean sink); -extern void _mesa_ResetHistogram(GLenum target); +extern void GLAPIENTRY +_mesa_ResetHistogram(GLenum target); -extern void _mesa_ResetMinmax(GLenum target); +extern void GLAPIENTRY +_mesa_ResetMinmax(GLenum target); extern void _mesa_update_minmax(GLcontext *ctx, GLuint n, const GLfloat rgba[][4]); diff --git a/src/mesa/main/image.c b/src/mesa/main/image.c index b9f026d7e65..955f14f6b18 100644 --- a/src/mesa/main/image.c +++ b/src/mesa/main/image.c @@ -161,6 +161,8 @@ GLint _mesa_sizeof_type( GLenum type ) return sizeof(GLint); case GL_FLOAT: return sizeof(GLfloat); + case GL_HALF_FLOAT_NV: + return sizeof(GLhalfNV); default: return -1; } @@ -188,6 +190,8 @@ GLint _mesa_sizeof_packed_type( GLenum type ) return sizeof(GLuint); case GL_INT: return sizeof(GLint); + case GL_HALF_FLOAT_NV: + return sizeof(GLhalfNV); case GL_FLOAT: return sizeof(GLfloat); case GL_UNSIGNED_BYTE_3_3_2: @@ -297,6 +301,8 @@ GLint _mesa_bytes_per_pixel( GLenum format, GLenum type ) return comps * sizeof(GLint); case GL_FLOAT: return comps * sizeof(GLfloat); + case GL_HALF_FLOAT_NV: + return comps * sizeof(GLhalfNV); case GL_UNSIGNED_BYTE_3_3_2: case GL_UNSIGNED_BYTE_2_3_3_REV: if (format == GL_RGB || format == GL_BGR) @@ -361,6 +367,7 @@ _mesa_is_legal_format_and_type( GLenum format, GLenum type ) case GL_INT: case GL_UNSIGNED_INT: case GL_FLOAT: + case GL_HALF_FLOAT_NV: return GL_TRUE; default: return GL_FALSE; @@ -381,6 +388,7 @@ _mesa_is_legal_format_and_type( GLenum format, GLenum type ) case GL_INT: case GL_UNSIGNED_INT: case GL_FLOAT: + case GL_HALF_FLOAT_NV: return GL_TRUE; default: return GL_FALSE; @@ -395,6 +403,7 @@ _mesa_is_legal_format_and_type( GLenum format, GLenum type ) case GL_INT: case GL_UNSIGNED_INT: case GL_FLOAT: + case GL_HALF_FLOAT_NV: case GL_UNSIGNED_BYTE_3_3_2: case GL_UNSIGNED_BYTE_2_3_3_REV: case GL_UNSIGNED_SHORT_5_6_5: @@ -414,6 +423,7 @@ _mesa_is_legal_format_and_type( GLenum format, GLenum type ) case GL_INT: case GL_UNSIGNED_INT: case GL_FLOAT: + case GL_HALF_FLOAT_NV: case GL_UNSIGNED_SHORT_4_4_4_4: case GL_UNSIGNED_SHORT_4_4_4_4_REV: case GL_UNSIGNED_SHORT_5_5_5_1: @@ -1538,6 +1548,82 @@ _mesa_pack_float_rgba_span( GLcontext *ctx, } } break; + case GL_HALF_FLOAT_NV: + { + GLhalfNV *dst = (GLhalfNV *) dstAddr; + switch (dstFormat) { + case GL_RED: + for (i=0;i<n;i++) + dst[i] = _mesa_float_to_half(rgba[i][RCOMP]); + break; + case GL_GREEN: + for (i=0;i<n;i++) + dst[i] = _mesa_float_to_half(rgba[i][GCOMP]); + break; + case GL_BLUE: + for (i=0;i<n;i++) + dst[i] = _mesa_float_to_half(rgba[i][BCOMP]); + break; + case GL_ALPHA: + for (i=0;i<n;i++) + dst[i] = _mesa_float_to_half(rgba[i][ACOMP]); + break; + case GL_LUMINANCE: + for (i=0;i<n;i++) + dst[i] = _mesa_float_to_half(luminance[i]); + break; + case GL_LUMINANCE_ALPHA: + for (i=0;i<n;i++) { + dst[i*2+0] = _mesa_float_to_half(luminance[i]); + dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]); + } + break; + case GL_RGB: + for (i=0;i<n;i++) { + dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]); + dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); + dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]); + } + break; + case GL_RGBA: + for (i=0;i<n;i++) { + dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]); + dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); + dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]); + dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); + } + break; + case GL_BGR: + for (i=0;i<n;i++) { + dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]); + dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); + dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]); + } + break; + case GL_BGRA: + for (i=0;i<n;i++) { + dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]); + dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); + dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]); + dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); + } + break; + case GL_ABGR_EXT: + for (i=0;i<n;i++) { + dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]); + dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]); + dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]); + dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]); + } + break; + default: + _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); + } + if (dstPacking->SwapBytes) { + _mesa_swap2( (GLushort *) dst, n * comps ); + } + } + break; case GL_UNSIGNED_BYTE_3_3_2: if (dstFormat == GL_RGB) { GLubyte *dst = (GLubyte *) dstAddr; @@ -1925,6 +2011,7 @@ extract_uint_indexes(GLuint n, GLuint indexes[], srcType == GL_SHORT || srcType == GL_UNSIGNED_INT || srcType == GL_INT || + srcType == GL_HALF_FLOAT_NV || srcType == GL_FLOAT); switch (srcType) { @@ -2062,6 +2149,23 @@ extract_uint_indexes(GLuint n, GLuint indexes[], } } break; + case GL_HALF_FLOAT_NV: + { + GLuint i; + const GLhalfNV *s = (const GLhalfNV *) src; + if (unpack->SwapBytes) { + for (i = 0; i < n; i++) { + GLhalfNV value = s[i]; + SWAP2BYTE(value); + indexes[i] = (GLuint) _mesa_half_to_float(value); + } + } + else { + for (i = 0; i < n; i++) + indexes[i] = (GLuint) _mesa_half_to_float(s[i]); + } + } + break; default: _mesa_problem(NULL, "bad srcType in extract_uint_indexes"); return; @@ -2113,6 +2217,7 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4], srcType == GL_SHORT || srcType == GL_UNSIGNED_INT || srcType == GL_INT || + srcType == GL_HALF_FLOAT_NV || srcType == GL_FLOAT || srcType == GL_UNSIGNED_BYTE_3_3_2 || srcType == GL_UNSIGNED_BYTE_2_3_3_REV || @@ -2291,6 +2396,12 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4], PROCESS(blueIndex, BCOMP, 0.0F, GLfloat, (GLfloat)); PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat)); break; + case GL_HALF_FLOAT_NV: + PROCESS(redIndex, RCOMP, 0.0F, GLhalfNV, _mesa_half_to_float); + PROCESS(greenIndex, GCOMP, 0.0F, GLhalfNV, _mesa_half_to_float); + PROCESS(blueIndex, BCOMP, 0.0F, GLhalfNV, _mesa_half_to_float); + PROCESS(alphaIndex, ACOMP, 1.0F, GLhalfNV, _mesa_half_to_float); + break; case GL_UNSIGNED_BYTE_3_3_2: { const GLubyte *ubsrc = (const GLubyte *) src; @@ -2626,6 +2737,7 @@ _mesa_unpack_chan_color_span( GLcontext *ctx, srcType == GL_SHORT || srcType == GL_UNSIGNED_INT || srcType == GL_INT || + srcType == GL_HALF_FLOAT_NV || srcType == GL_FLOAT || srcType == GL_UNSIGNED_BYTE_3_3_2 || srcType == GL_UNSIGNED_BYTE_2_3_3_REV || @@ -3019,6 +3131,7 @@ _mesa_unpack_float_color_span( GLcontext *ctx, srcType == GL_SHORT || srcType == GL_UNSIGNED_INT || srcType == GL_INT || + srcType == GL_HALF_FLOAT_NV || srcType == GL_FLOAT || srcType == GL_UNSIGNED_BYTE_3_3_2 || srcType == GL_UNSIGNED_BYTE_2_3_3_REV || @@ -3285,6 +3398,7 @@ _mesa_unpack_index_span( const GLcontext *ctx, GLuint n, srcType == GL_SHORT || srcType == GL_UNSIGNED_INT || srcType == GL_INT || + srcType == GL_HALF_FLOAT_NV || srcType == GL_FLOAT); ASSERT(dstType == GL_UNSIGNED_BYTE || @@ -3457,6 +3571,18 @@ _mesa_pack_index_span( const GLcontext *ctx, GLuint n, } } break; + case GL_HALF_FLOAT_NV: + { + GLhalfNV *dst = (GLhalfNV *) dest; + GLuint i; + for (i = 0; i < n; i++) { + dst[i] = _mesa_float_to_half((GLfloat) source[i]); + } + if (dstPacking->SwapBytes) { + _mesa_swap2( (GLushort *) dst, n ); + } + } + break; default: _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); } @@ -3491,6 +3617,7 @@ _mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n, srcType == GL_SHORT || srcType == GL_UNSIGNED_INT || srcType == GL_INT || + srcType == GL_HALF_FLOAT_NV || srcType == GL_FLOAT); ASSERT(dstType == GL_UNSIGNED_BYTE || @@ -3677,6 +3804,18 @@ _mesa_pack_stencil_span( const GLcontext *ctx, GLuint n, } } break; + case GL_HALF_FLOAT_NV: + { + GLhalfNV *dst = (GLhalfNV *) dest; + GLuint i; + for (i=0;i<n;i++) { + dst[i] = _mesa_half_to_float(source[i]); + } + if (dstPacking->SwapBytes) { + _mesa_swap2( (GLushort *) dst, n ); + } + } + break; case GL_BITMAP: if (dstPacking->LsbFirst) { GLubyte *dst = (GLubyte *) dest; @@ -3778,6 +3917,15 @@ _mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLfloat *dest, case GL_FLOAT: MEMCPY(dest, source, n * sizeof(GLfloat)); break; + case GL_HALF_FLOAT_NV: + { + GLuint i; + const GLhalfNV *src = (const GLhalfNV *) source; + for (i = 0; i < n; i++) { + dest[i] = _mesa_half_to_float(src[i]); + } + } + break; default: _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()"); return; @@ -3898,6 +4046,18 @@ _mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest, } } break; + case GL_HALF_FLOAT_NV: + { + GLhalfNV *dst = (GLhalfNV *) dest; + GLuint i; + for (i = 0; i < n; i++) { + dst[i] = _mesa_float_to_half(depthSpan[i]); + } + if (dstPacking->SwapBytes) { + _mesa_swap2( (GLushort *) dst, n ); + } + } + break; default: _mesa_problem(ctx, "bad type in _mesa_pack_depth_span"); } diff --git a/src/mesa/main/imports.c b/src/mesa/main/imports.c index 41179f4d940..3ca91fb15b7 100644 --- a/src/mesa/main/imports.c +++ b/src/mesa/main/imports.c @@ -64,8 +64,11 @@ #ifdef WIN32 #define vsnprintf _vsnprintf -#elif defined(__IBMC__) || defined(__IBMCPP__) || defined(VMS) +#elif defined(__IBMC__) || defined(__IBMCPP__) || ( defined(__VMS) && __CRTL_VER < 70312000 ) extern int vsnprintf(char *str, size_t count, const char *fmt, va_list arg); +#ifdef __VMS +#include "vsnprintf.c" +#endif #endif @@ -350,6 +353,9 @@ static void init_sqrt_table(void) } +/** + * Single precision square root. + */ float _mesa_sqrtf( float x ) { @@ -494,7 +500,9 @@ _mesa_inv_sqrtf(float n) } -/** Wrapper around either pow() or xf86pow() */ +/** + * Wrapper around either pow() or xf86pow(). + */ double _mesa_pow(double x, double y) { @@ -506,7 +514,7 @@ _mesa_pow(double x, double y) } -/* +/** * Return number of bits set in given GLuint. */ unsigned int @@ -519,6 +527,145 @@ _mesa_bitcount(unsigned int n) return bits; } + +/** + * Convert a 4-byte float to a 2-byte half float. + * Based on code from: + * http://www.opengl.org/discussion_boards/ubb/Forum3/HTML/008786.html + */ +GLhalfNV +_mesa_float_to_half(float val) +{ + const int flt = *((int *) &val); + const int flt_m = flt & 0x7fffff; + const int flt_e = (flt >> 23) & 0xff; + const int flt_s = (flt >> 31) & 0x1; + int s, e, m; + GLhalfNV result; + + /* sign bit */ + s = flt_s; + + /* handle special cases */ + if ((flt_e == 0) && (flt_m == 0)) { + /* zero */ + m = 0; + e = 0; + } + else if ((flt_e == 0) && (flt_m != 0)) { + /* denorm -- denorm float maps to 0 half */ + m = 0; + e = 0; + } + else if ((flt_e == 0xff) && (flt_m == 0)) { + /* infinity */ + m = 0; + e = 31; + } + else if ((flt_e == 0xff) && (flt_m != 0)) { + /* NaN */ + m = 1; + e = 31; + } + else { + /* regular number */ + const int new_exp = flt_e - 127; + if (new_exp < -24) { + /* this maps to 0 */ + m = 0; + e = 0; + } + else if (new_exp < -14) { + /* this maps to a denorm */ + unsigned int exp_val = (unsigned int) (-14 - new_exp); /* 2^-exp_val*/ + e = 0; + switch (exp_val) { + case 0: + _mesa_warning(NULL, + "float_to_half: logical error in denorm creation!\n"); + m = 0; + break; + case 1: m = 512 + (flt_m >> 14); break; + case 2: m = 256 + (flt_m >> 15); break; + case 3: m = 128 + (flt_m >> 16); break; + case 4: m = 64 + (flt_m >> 17); break; + case 5: m = 32 + (flt_m >> 18); break; + case 6: m = 16 + (flt_m >> 19); break; + case 7: m = 8 + (flt_m >> 20); break; + case 8: m = 4 + (flt_m >> 21); break; + case 9: m = 2 + (flt_m >> 22); break; + case 10: m = 1; break; + } + } + else if (new_exp > 15) { + /* map this value to infinity */ + m = 0; + e = 31; + } + else { + /* regular */ + e = new_exp + 15; + m = flt_m >> 13; + } + } + + result = (s << 15) | (e << 10) | m; + return result; +} + + +/** + * Convert a 2-byte half float to a 4-byte float. + * Based on code from: + * http://www.opengl.org/discussion_boards/ubb/Forum3/HTML/008786.html + */ +float +_mesa_half_to_float(GLhalfNV val) +{ + /* XXX could also use a 64K-entry lookup table */ + const int m = val & 0x3ff; + const int e = (val >> 10) & 0x1f; + const int s = (val >> 15) & 0x1; + int flt_m, flt_e, flt_s, flt; + float result; + + /* sign bit */ + flt_s = s; + + /* handle special cases */ + if ((e == 0) && (m == 0)) { + /* zero */ + flt_m = 0; + flt_e = 0; + } + else if ((e == 0) && (m != 0)) { + /* denorm -- denorm half will fit in non-denorm single */ + const float half_denorm = 1.0f / 16384.0f; /* 2^-14 */ + float mantissa = ((float) (m)) / 1024.0f; + float sign = s ? -1.0f : 1.0f; + return sign * mantissa * half_denorm; + } + else if ((e == 31) && (m == 0)) { + /* infinity */ + flt_e = 0xff; + flt_m = 0; + } + else if ((e == 31) && (m != 0)) { + /* NaN */ + flt_e = 0xff; + flt_m = 1; + } + else { + /* regular */ + flt_e = e + 112; + flt_m = m << 13; + } + + flt = (flt_s << 31) | (flt_e << 23) | flt_m; + result = *((float *) &flt); + return result; +} + /*@}*/ @@ -526,7 +673,9 @@ _mesa_bitcount(unsigned int n) /** \name Environment vars */ /*@{*/ -/** Wrapper around either () or xf86() */ +/** + * Wrapper for getenv(). + */ char * _mesa_getenv( const char *var ) { diff --git a/src/mesa/main/imports.h b/src/mesa/main/imports.h index 2c9c2fc3429..0c0a291e164 100644 --- a/src/mesa/main/imports.h +++ b/src/mesa/main/imports.h @@ -696,6 +696,12 @@ _mesa_log2(float x); extern unsigned int _mesa_bitcount(unsigned int n); +extern GLhalfNV +_mesa_float_to_half(float f); + +extern float +_mesa_half_to_float(GLhalfNV h); + extern char * _mesa_getenv( const char *var ); diff --git a/src/mesa/main/light.c b/src/mesa/main/light.c index 5d473135681..4febf6faaa5 100644 --- a/src/mesa/main/light.c +++ b/src/mesa/main/light.c @@ -34,7 +34,7 @@ #include "math/m_matrix.h" -void +void GLAPIENTRY _mesa_ShadeModel( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); @@ -59,14 +59,14 @@ _mesa_ShadeModel( GLenum mode ) } -void +void GLAPIENTRY _mesa_Lightf( GLenum light, GLenum pname, GLfloat param ) { _mesa_Lightfv( light, pname, ¶m ); } -void +void GLAPIENTRY _mesa_Lightfv( GLenum light, GLenum pname, const GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); @@ -192,14 +192,14 @@ _mesa_Lightfv( GLenum light, GLenum pname, const GLfloat *params ) } -void +void GLAPIENTRY _mesa_Lighti( GLenum light, GLenum pname, GLint param ) { _mesa_Lightiv( light, pname, ¶m ); } -void +void GLAPIENTRY _mesa_Lightiv( GLenum light, GLenum pname, const GLint *params ) { GLfloat fparam[4]; @@ -241,7 +241,7 @@ _mesa_Lightiv( GLenum light, GLenum pname, const GLint *params ) -void +void GLAPIENTRY _mesa_GetLightfv( GLenum light, GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); @@ -291,7 +291,7 @@ _mesa_GetLightfv( GLenum light, GLenum pname, GLfloat *params ) } -void +void GLAPIENTRY _mesa_GetLightiv( GLenum light, GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); @@ -361,7 +361,7 @@ _mesa_GetLightiv( GLenum light, GLenum pname, GLint *params ) /**********************************************************************/ -void +void GLAPIENTRY _mesa_LightModelfv( GLenum pname, const GLfloat *params ) { GLenum newenum; @@ -428,7 +428,7 @@ _mesa_LightModelfv( GLenum pname, const GLfloat *params ) } -void +void GLAPIENTRY _mesa_LightModeliv( GLenum pname, const GLint *params ) { GLfloat fparam[4]; @@ -453,14 +453,14 @@ _mesa_LightModeliv( GLenum pname, const GLint *params ) } -void +void GLAPIENTRY _mesa_LightModeli( GLenum pname, GLint param ) { _mesa_LightModeliv( pname, ¶m ); } -void +void GLAPIENTRY _mesa_LightModelf( GLenum pname, GLfloat param ) { _mesa_LightModelfv( pname, ¶m ); @@ -649,7 +649,7 @@ _mesa_update_color_material( GLcontext *ctx, const GLfloat color[4] ) } -void +void GLAPIENTRY _mesa_ColorMaterial( GLenum face, GLenum mode ) { GET_CURRENT_CONTEXT(ctx); @@ -687,7 +687,7 @@ _mesa_ColorMaterial( GLenum face, GLenum mode ) } -void +void GLAPIENTRY _mesa_GetMaterialfv( GLenum face, GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); @@ -733,7 +733,7 @@ _mesa_GetMaterialfv( GLenum face, GLenum pname, GLfloat *params ) } -void +void GLAPIENTRY _mesa_GetMaterialiv( GLenum face, GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/light.h b/src/mesa/main/light.h index 1eb7f56985f..1f19019450f 100644 --- a/src/mesa/main/light.h +++ b/src/mesa/main/light.h @@ -34,47 +34,47 @@ #include "mtypes.h" -extern void +extern void GLAPIENTRY _mesa_ShadeModel( GLenum mode ); #if _HAVE_FULL_GL -extern void +extern void GLAPIENTRY _mesa_ColorMaterial( GLenum face, GLenum mode ); -extern void +extern void GLAPIENTRY _mesa_Lightf( GLenum light, GLenum pname, GLfloat param ); -extern void +extern void GLAPIENTRY _mesa_Lightfv( GLenum light, GLenum pname, const GLfloat *params ); -extern void +extern void GLAPIENTRY _mesa_Lightiv( GLenum light, GLenum pname, const GLint *params ); -extern void +extern void GLAPIENTRY _mesa_Lighti( GLenum light, GLenum pname, GLint param ); -extern void +extern void GLAPIENTRY _mesa_LightModelf( GLenum pname, GLfloat param ); -extern void +extern void GLAPIENTRY _mesa_LightModelfv( GLenum pname, const GLfloat *params ); -extern void +extern void GLAPIENTRY _mesa_LightModeli( GLenum pname, GLint param ); -extern void +extern void GLAPIENTRY _mesa_LightModeliv( GLenum pname, const GLint *params ); -extern void +extern void GLAPIENTRY _mesa_GetLightfv( GLenum light, GLenum pname, GLfloat *params ); -extern void +extern void GLAPIENTRY _mesa_GetLightiv( GLenum light, GLenum pname, GLint *params ); -extern void +extern void GLAPIENTRY _mesa_GetMaterialfv( GLenum face, GLenum pname, GLfloat *params ); -extern void +extern void GLAPIENTRY _mesa_GetMaterialiv( GLenum face, GLenum pname, GLint *params ); diff --git a/src/mesa/main/lines.c b/src/mesa/main/lines.c index 27f778a3946..c30d9ac109e 100644 --- a/src/mesa/main/lines.c +++ b/src/mesa/main/lines.c @@ -50,7 +50,7 @@ * width is different from one. Notifies the driver via the * dd_function_table::LineWidth callback. */ -void +void GLAPIENTRY _mesa_LineWidth( GLfloat width ) { GET_CURRENT_CONTEXT(ctx); @@ -93,7 +93,7 @@ _mesa_LineWidth( GLfloat width ) * change flushes the vertices and notifies the driver via * the dd_function_table::LineStipple callback. */ -void +void GLAPIENTRY _mesa_LineStipple( GLint factor, GLushort pattern ) { GET_CURRENT_CONTEXT(ctx); @@ -122,7 +122,7 @@ _mesa_LineStipple( GLint factor, GLushort pattern ) * Initializes __GLcontextRec::Line and line related constants in * __GLcontextRec::Const. */ -void _mesa_init_line( GLcontext * ctx ) +void GLAPIENTRY _mesa_init_line( GLcontext * ctx ) { /* Line group */ ctx->Line.SmoothFlag = GL_FALSE; diff --git a/src/mesa/main/lines.h b/src/mesa/main/lines.h index 7305a986473..5a47e9858d5 100644 --- a/src/mesa/main/lines.h +++ b/src/mesa/main/lines.h @@ -36,13 +36,13 @@ #include "mtypes.h" -extern void +extern void GLAPIENTRY _mesa_LineWidth( GLfloat width ); -extern void +extern void GLAPIENTRY _mesa_LineStipple( GLint factor, GLushort pattern ); -extern void +extern void GLAPIENTRY _mesa_init_line( GLcontext * ctx ); #endif diff --git a/src/mesa/main/macros.h b/src/mesa/main/macros.h index e0ede0804a8..4370a580751 100644 --- a/src/mesa/main/macros.h +++ b/src/mesa/main/macros.h @@ -44,45 +44,45 @@ extern GLfloat _mesa_ubyte_to_float_color_tab[256]; #define UBYTE_TO_FLOAT(u) _mesa_ubyte_to_float_color_tab[(unsigned int)(u)] /** Convert GLfloat in [0.0,1.0] to GLubyte in [0,255] */ -#define FLOAT_TO_UBYTE(X) ((GLubyte) (GLint) ((X) * 255.0F)) +#define FLOAT_TO_UBYTE(X) ((GLubyte) (GLint) ((X) * 255.0F)) /** Convert GLbyte in [-128,127] to GLfloat in [-1.0,1.0] */ -#define BYTE_TO_FLOAT(B) ((2.0F * (B) + 1.0F) * (1.0F/255.0F)) +#define BYTE_TO_FLOAT(B) ((2.0F * (B) + 1.0F) * (1.0F/255.0F)) /** Convert GLfloat in [-1.0,1.0] to GLbyte in [-128,127] */ -#define FLOAT_TO_BYTE(X) ( (((GLint) (255.0F * (X))) - 1) / 2 ) +#define FLOAT_TO_BYTE(X) ( (((GLint) (255.0F * (X))) - 1) / 2 ) /** Convert GLushort in [0,65536] to GLfloat in [0.0,1.0] */ -#define USHORT_TO_FLOAT(S) ((GLfloat) (S) * (1.0F / 65535.0F)) +#define USHORT_TO_FLOAT(S) ((GLfloat) (S) * (1.0F / 65535.0F)) /** Convert GLfloat in [0.0,1.0] to GLushort in [0,65536] */ -#define FLOAT_TO_USHORT(X) ((GLushort) (GLint) ((X) * 65535.0F)) +#define FLOAT_TO_USHORT(X) ((GLushort) (GLint) ((X) * 65535.0F)) /** Convert GLshort in [-32768,32767] to GLfloat in [-1.0,1.0] */ -#define SHORT_TO_FLOAT(S) ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)) +#define SHORT_TO_FLOAT(S) ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)) /** Convert GLfloat in [0.0,1.0] to GLshort in [-32768,32767] */ -#define FLOAT_TO_SHORT(X) ( (((GLint) (65535.0F * (X))) - 1) / 2 ) +#define FLOAT_TO_SHORT(X) ( (((GLint) (65535.0F * (X))) - 1) / 2 ) /** Convert GLuint in [0,4294967295] to GLfloat in [0.0,1.0] */ -#define UINT_TO_FLOAT(U) ((GLfloat) (U) * (1.0F / 4294967295.0F)) +#define UINT_TO_FLOAT(U) ((GLfloat) (U) * (1.0F / 4294967295.0F)) /** Convert GLfloat in [0.0,1.0] to GLuint in [0,4294967295] */ -#define FLOAT_TO_UINT(X) ((GLuint) ((X) * 4294967295.0)) +#define FLOAT_TO_UINT(X) ((GLuint) ((X) * 4294967295.0)) /** Convert GLint in [-2147483648,2147483647] to GLfloat in [-1.0,1.0] */ -#define INT_TO_FLOAT(I) ((2.0F * (I) + 1.0F) * (1.0F/4294967294.0F)) +#define INT_TO_FLOAT(I) ((2.0F * (I) + 1.0F) * (1.0F/4294967294.0F)) /** Convert GLfloat in [-1.0,1.0] to GLint in [-2147483648,2147483647] */ /* causes overflow: -#define FLOAT_TO_INT(X) ( (((GLint) (4294967294.0F * (X))) - 1) / 2 ) +#define FLOAT_TO_INT(X) ( (((GLint) (4294967294.0F * (X))) - 1) / 2 ) */ /* a close approximation: */ -#define FLOAT_TO_INT(X) ( (GLint) (2147483647.0 * (X)) ) +#define FLOAT_TO_INT(X) ( (GLint) (2147483647.0 * (X)) ) #define BYTE_TO_UBYTE(b) ((GLubyte) ((b) < 0 ? 0 : (GLubyte) (b))) @@ -124,13 +124,13 @@ extern GLfloat _mesa_ubyte_to_float_color_tab[256]; /*@{*/ /** Zero */ -#define ZERO_4V( DST ) (DST)[0] = (DST)[1] = (DST)[2] = (DST)[3] = 0 +#define ZERO_4V( DST ) (DST)[0] = (DST)[1] = (DST)[2] = (DST)[3] = 0 /** Test for equality */ -#define TEST_EQ_4V(a,b) ((a)[0] == (b)[0] && \ - (a)[1] == (b)[1] && \ - (a)[2] == (b)[2] && \ - (a)[3] == (b)[3]) +#define TEST_EQ_4V(a,b) ((a)[0] == (b)[0] && \ + (a)[1] == (b)[1] && \ + (a)[2] == (b)[2] && \ + (a)[3] == (b)[3]) /** Test for equality (unsigned bytes) */ #if defined(__i386__) @@ -140,149 +140,148 @@ extern GLfloat _mesa_ubyte_to_float_color_tab[256]; #endif /** Copy a 4-element vector */ -#define COPY_4V( DST, SRC ) \ -do { \ - (DST)[0] = (SRC)[0]; \ - (DST)[1] = (SRC)[1]; \ - (DST)[2] = (SRC)[2]; \ - (DST)[3] = (SRC)[3]; \ +#define COPY_4V( DST, SRC ) \ +do { \ + (DST)[0] = (SRC)[0]; \ + (DST)[1] = (SRC)[1]; \ + (DST)[2] = (SRC)[2]; \ + (DST)[3] = (SRC)[3]; \ } while (0) /** Copy a 4-element vector with cast */ -#define COPY_4V_CAST( DST, SRC, CAST ) \ -do { \ - (DST)[0] = (CAST)(SRC)[0]; \ - (DST)[1] = (CAST)(SRC)[1]; \ - (DST)[2] = (CAST)(SRC)[2]; \ - (DST)[3] = (CAST)(SRC)[3]; \ +#define COPY_4V_CAST( DST, SRC, CAST ) \ +do { \ + (DST)[0] = (CAST)(SRC)[0]; \ + (DST)[1] = (CAST)(SRC)[1]; \ + (DST)[2] = (CAST)(SRC)[2]; \ + (DST)[3] = (CAST)(SRC)[3]; \ } while (0) /** Copy a 4-element unsigned byte vector */ #if defined(__i386__) -#define COPY_4UBV(DST, SRC) \ -do { \ - *((GLuint*)(DST)) = *((GLuint*)(SRC)); \ +#define COPY_4UBV(DST, SRC) \ +do { \ + *((GLuint*)(DST)) = *((GLuint*)(SRC)); \ } while (0) #else /* The GLuint cast might fail if DST or SRC are not dword-aligned (RISC) */ -#define COPY_4UBV(DST, SRC) \ -do { \ - (DST)[0] = (SRC)[0]; \ - (DST)[1] = (SRC)[1]; \ - (DST)[2] = (SRC)[2]; \ - (DST)[3] = (SRC)[3]; \ +#define COPY_4UBV(DST, SRC) \ +do { \ + (DST)[0] = (SRC)[0]; \ + (DST)[1] = (SRC)[1]; \ + (DST)[2] = (SRC)[2]; \ + (DST)[3] = (SRC)[3]; \ } while (0) #endif -/** Copy a 4-element float vector */ -#define COPY_4FV( DST, SRC ) \ -do { \ - const GLfloat *_tmp = (SRC); \ - (DST)[0] = _tmp[0]; \ - (DST)[1] = _tmp[1]; \ - (DST)[2] = _tmp[2]; \ - (DST)[3] = _tmp[3]; \ +/** Copy a 4-element float vector (Use COPY_FLOAT to avoid loading FPU) */ +#define COPY_4FV( DST, SRC ) \ +do { \ + COPY_FLOAT((DST)[0], (SRC)[0]); \ + COPY_FLOAT((DST)[1], (SRC)[1]); \ + COPY_FLOAT((DST)[2], (SRC)[2]); \ + COPY_FLOAT((DST)[3], (SRC)[3]); \ } while (0) /** Copy \p SZ elements into a 4-element vector */ -#define COPY_SZ_4V(DST, SZ, SRC) \ -do { \ - switch (SZ) { \ - case 4: (DST)[3] = (SRC)[3]; \ - case 3: (DST)[2] = (SRC)[2]; \ - case 2: (DST)[1] = (SRC)[1]; \ - case 1: (DST)[0] = (SRC)[0]; \ - } \ +#define COPY_SZ_4V(DST, SZ, SRC) \ +do { \ + switch (SZ) { \ + case 4: (DST)[3] = (SRC)[3]; \ + case 3: (DST)[2] = (SRC)[2]; \ + case 2: (DST)[1] = (SRC)[1]; \ + case 1: (DST)[0] = (SRC)[0]; \ + } \ } while(0) /** Copy \p SZ elements into a homegeneous (4-element) vector, giving * default values to the remaining */ -#define COPY_CLEAN_4V(DST, SZ, SRC) \ -do { \ - ASSIGN_4V( DST, 0, 0, 0, 1 ); \ - COPY_SZ_4V( DST, SZ, SRC ); \ +#define COPY_CLEAN_4V(DST, SZ, SRC) \ +do { \ + ASSIGN_4V( DST, 0, 0, 0, 1 ); \ + COPY_SZ_4V( DST, SZ, SRC ); \ } while (0) /** Subtraction */ -#define SUB_4V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] - (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] - (SRCB)[1]; \ - (DST)[2] = (SRCA)[2] - (SRCB)[2]; \ - (DST)[3] = (SRCA)[3] - (SRCB)[3]; \ +#define SUB_4V( DST, SRCA, SRCB ) \ +do { \ + (DST)[0] = (SRCA)[0] - (SRCB)[0]; \ + (DST)[1] = (SRCA)[1] - (SRCB)[1]; \ + (DST)[2] = (SRCA)[2] - (SRCB)[2]; \ + (DST)[3] = (SRCA)[3] - (SRCB)[3]; \ } while (0) /** Addition */ -#define ADD_4V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] + (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] + (SRCB)[1]; \ - (DST)[2] = (SRCA)[2] + (SRCB)[2]; \ - (DST)[3] = (SRCA)[3] + (SRCB)[3]; \ +#define ADD_4V( DST, SRCA, SRCB ) \ +do { \ + (DST)[0] = (SRCA)[0] + (SRCB)[0]; \ + (DST)[1] = (SRCA)[1] + (SRCB)[1]; \ + (DST)[2] = (SRCA)[2] + (SRCB)[2]; \ + (DST)[3] = (SRCA)[3] + (SRCB)[3]; \ } while (0) /** Element-wise multiplication */ -#define SCALE_4V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] * (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] * (SRCB)[1]; \ - (DST)[2] = (SRCA)[2] * (SRCB)[2]; \ - (DST)[3] = (SRCA)[3] * (SRCB)[3]; \ +#define SCALE_4V( DST, SRCA, SRCB ) \ +do { \ + (DST)[0] = (SRCA)[0] * (SRCB)[0]; \ + (DST)[1] = (SRCA)[1] * (SRCB)[1]; \ + (DST)[2] = (SRCA)[2] * (SRCB)[2]; \ + (DST)[3] = (SRCA)[3] * (SRCB)[3]; \ } while (0) /** In-place addition */ -#define ACC_4V( DST, SRC ) \ -do { \ - (DST)[0] += (SRC)[0]; \ - (DST)[1] += (SRC)[1]; \ - (DST)[2] += (SRC)[2]; \ - (DST)[3] += (SRC)[3]; \ +#define ACC_4V( DST, SRC ) \ +do { \ + (DST)[0] += (SRC)[0]; \ + (DST)[1] += (SRC)[1]; \ + (DST)[2] += (SRC)[2]; \ + (DST)[3] += (SRC)[3]; \ } while (0) /** Element-wise multiplication and addition */ -#define ACC_SCALE_4V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] += (SRCA)[0] * (SRCB)[0]; \ - (DST)[1] += (SRCA)[1] * (SRCB)[1]; \ - (DST)[2] += (SRCA)[2] * (SRCB)[2]; \ - (DST)[3] += (SRCA)[3] * (SRCB)[3]; \ +#define ACC_SCALE_4V( DST, SRCA, SRCB ) \ +do { \ + (DST)[0] += (SRCA)[0] * (SRCB)[0]; \ + (DST)[1] += (SRCA)[1] * (SRCB)[1]; \ + (DST)[2] += (SRCA)[2] * (SRCB)[2]; \ + (DST)[3] += (SRCA)[3] * (SRCB)[3]; \ } while (0) /** In-place scalar multiplication and addition */ -#define ACC_SCALE_SCALAR_4V( DST, S, SRCB ) \ -do { \ - (DST)[0] += S * (SRCB)[0]; \ - (DST)[1] += S * (SRCB)[1]; \ - (DST)[2] += S * (SRCB)[2]; \ - (DST)[3] += S * (SRCB)[3]; \ +#define ACC_SCALE_SCALAR_4V( DST, S, SRCB ) \ +do { \ + (DST)[0] += S * (SRCB)[0]; \ + (DST)[1] += S * (SRCB)[1]; \ + (DST)[2] += S * (SRCB)[2]; \ + (DST)[3] += S * (SRCB)[3]; \ } while (0) /** Scalar multiplication */ -#define SCALE_SCALAR_4V( DST, S, SRCB ) \ -do { \ - (DST)[0] = S * (SRCB)[0]; \ - (DST)[1] = S * (SRCB)[1]; \ - (DST)[2] = S * (SRCB)[2]; \ - (DST)[3] = S * (SRCB)[3]; \ +#define SCALE_SCALAR_4V( DST, S, SRCB ) \ +do { \ + (DST)[0] = S * (SRCB)[0]; \ + (DST)[1] = S * (SRCB)[1]; \ + (DST)[2] = S * (SRCB)[2]; \ + (DST)[3] = S * (SRCB)[3]; \ } while (0) /** In-place scalar multiplication */ -#define SELF_SCALE_SCALAR_4V( DST, S ) \ -do { \ - (DST)[0] *= S; \ - (DST)[1] *= S; \ - (DST)[2] *= S; \ - (DST)[3] *= S; \ +#define SELF_SCALE_SCALAR_4V( DST, S ) \ +do { \ + (DST)[0] *= S; \ + (DST)[1] *= S; \ + (DST)[2] *= S; \ + (DST)[3] *= S; \ } while (0) /** Assignment */ -#define ASSIGN_4V( V, V0, V1, V2, V3 ) \ -do { \ - V[0] = V0; \ - V[1] = V1; \ - V[2] = V2; \ - V[3] = V3; \ +#define ASSIGN_4V( V, V0, V1, V2, V3 ) \ +do { \ + V[0] = V0; \ + V[1] = V1; \ + V[2] = V2; \ + V[3] = V3; \ } while(0) /*@}*/ @@ -293,124 +292,124 @@ do { \ /*@{*/ /** Zero */ -#define ZERO_3V( DST ) (DST)[0] = (DST)[1] = (DST)[2] = 0 +#define ZERO_3V( DST ) (DST)[0] = (DST)[1] = (DST)[2] = 0 /** Test for equality */ -#define TEST_EQ_3V(a,b) ((a)[0] == (b)[0] && \ - (a)[1] == (b)[1] && \ - (a)[2] == (b)[2]) +#define TEST_EQ_3V(a,b) ((a)[0] == (b)[0] && \ + (a)[1] == (b)[1] && \ + (a)[2] == (b)[2]) /** Copy a 3-element vector */ -#define COPY_3V( DST, SRC ) \ -do { \ - (DST)[0] = (SRC)[0]; \ - (DST)[1] = (SRC)[1]; \ - (DST)[2] = (SRC)[2]; \ +#define COPY_3V( DST, SRC ) \ +do { \ + (DST)[0] = (SRC)[0]; \ + (DST)[1] = (SRC)[1]; \ + (DST)[2] = (SRC)[2]; \ } while (0) /** Copy a 3-element vector with cast */ -#define COPY_3V_CAST( DST, SRC, CAST ) \ -do { \ - (DST)[0] = (CAST)(SRC)[0]; \ - (DST)[1] = (CAST)(SRC)[1]; \ - (DST)[2] = (CAST)(SRC)[2]; \ +#define COPY_3V_CAST( DST, SRC, CAST ) \ +do { \ + (DST)[0] = (CAST)(SRC)[0]; \ + (DST)[1] = (CAST)(SRC)[1]; \ + (DST)[2] = (CAST)(SRC)[2]; \ } while (0) /** Copy a 3-element float vector */ -#define COPY_3FV( DST, SRC ) \ -do { \ - const GLfloat *_tmp = (SRC); \ - (DST)[0] = _tmp[0]; \ - (DST)[1] = _tmp[1]; \ - (DST)[2] = _tmp[2]; \ +#define COPY_3FV( DST, SRC ) \ +do { \ + const GLfloat *_tmp = (SRC); \ + (DST)[0] = _tmp[0]; \ + (DST)[1] = _tmp[1]; \ + (DST)[2] = _tmp[2]; \ } while (0) /** Subtraction */ -#define SUB_3V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] - (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] - (SRCB)[1]; \ - (DST)[2] = (SRCA)[2] - (SRCB)[2]; \ +#define SUB_3V( DST, SRCA, SRCB ) \ +do { \ + (DST)[0] = (SRCA)[0] - (SRCB)[0]; \ + (DST)[1] = (SRCA)[1] - (SRCB)[1]; \ + (DST)[2] = (SRCA)[2] - (SRCB)[2]; \ } while (0) /** Addition */ -#define ADD_3V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] + (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] + (SRCB)[1]; \ - (DST)[2] = (SRCA)[2] + (SRCB)[2]; \ +#define ADD_3V( DST, SRCA, SRCB ) \ +do { \ + (DST)[0] = (SRCA)[0] + (SRCB)[0]; \ + (DST)[1] = (SRCA)[1] + (SRCB)[1]; \ + (DST)[2] = (SRCA)[2] + (SRCB)[2]; \ } while (0) /** In-place scalar multiplication */ -#define SCALE_3V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] * (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] * (SRCB)[1]; \ - (DST)[2] = (SRCA)[2] * (SRCB)[2]; \ +#define SCALE_3V( DST, SRCA, SRCB ) \ +do { \ + (DST)[0] = (SRCA)[0] * (SRCB)[0]; \ + (DST)[1] = (SRCA)[1] * (SRCB)[1]; \ + (DST)[2] = (SRCA)[2] * (SRCB)[2]; \ } while (0) /** In-place element-wise multiplication */ -#define SELF_SCALE_3V( DST, SRC ) \ -do { \ - (DST)[0] *= (SRC)[0]; \ - (DST)[1] *= (SRC)[1]; \ - (DST)[2] *= (SRC)[2]; \ +#define SELF_SCALE_3V( DST, SRC ) \ +do { \ + (DST)[0] *= (SRC)[0]; \ + (DST)[1] *= (SRC)[1]; \ + (DST)[2] *= (SRC)[2]; \ } while (0) /** In-place addition */ -#define ACC_3V( DST, SRC ) \ -do { \ - (DST)[0] += (SRC)[0]; \ - (DST)[1] += (SRC)[1]; \ - (DST)[2] += (SRC)[2]; \ +#define ACC_3V( DST, SRC ) \ +do { \ + (DST)[0] += (SRC)[0]; \ + (DST)[1] += (SRC)[1]; \ + (DST)[2] += (SRC)[2]; \ } while (0) /** Element-wise multiplication and addition */ -#define ACC_SCALE_3V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] += (SRCA)[0] * (SRCB)[0]; \ - (DST)[1] += (SRCA)[1] * (SRCB)[1]; \ - (DST)[2] += (SRCA)[2] * (SRCB)[2]; \ +#define ACC_SCALE_3V( DST, SRCA, SRCB ) \ +do { \ + (DST)[0] += (SRCA)[0] * (SRCB)[0]; \ + (DST)[1] += (SRCA)[1] * (SRCB)[1]; \ + (DST)[2] += (SRCA)[2] * (SRCB)[2]; \ } while (0) /** Scalar multiplication */ -#define SCALE_SCALAR_3V( DST, S, SRCB ) \ -do { \ - (DST)[0] = S * (SRCB)[0]; \ - (DST)[1] = S * (SRCB)[1]; \ - (DST)[2] = S * (SRCB)[2]; \ +#define SCALE_SCALAR_3V( DST, S, SRCB ) \ +do { \ + (DST)[0] = S * (SRCB)[0]; \ + (DST)[1] = S * (SRCB)[1]; \ + (DST)[2] = S * (SRCB)[2]; \ } while (0) /** In-place scalar multiplication and addition */ -#define ACC_SCALE_SCALAR_3V( DST, S, SRCB ) \ -do { \ - (DST)[0] += S * (SRCB)[0]; \ - (DST)[1] += S * (SRCB)[1]; \ - (DST)[2] += S * (SRCB)[2]; \ +#define ACC_SCALE_SCALAR_3V( DST, S, SRCB ) \ +do { \ + (DST)[0] += S * (SRCB)[0]; \ + (DST)[1] += S * (SRCB)[1]; \ + (DST)[2] += S * (SRCB)[2]; \ } while (0) /** In-place scalar multiplication */ -#define SELF_SCALE_SCALAR_3V( DST, S ) \ -do { \ - (DST)[0] *= S; \ - (DST)[1] *= S; \ - (DST)[2] *= S; \ +#define SELF_SCALE_SCALAR_3V( DST, S ) \ +do { \ + (DST)[0] *= S; \ + (DST)[1] *= S; \ + (DST)[2] *= S; \ } while (0) /** In-place scalar addition */ -#define ACC_SCALAR_3V( DST, S ) \ -do { \ - (DST)[0] += S; \ - (DST)[1] += S; \ - (DST)[2] += S; \ +#define ACC_SCALAR_3V( DST, S ) \ +do { \ + (DST)[0] += S; \ + (DST)[1] += S; \ + (DST)[2] += S; \ } while (0) /** Assignment */ -#define ASSIGN_3V( V, V0, V1, V2 ) \ -do { \ - V[0] = V0; \ - V[1] = V1; \ - V[2] = V2; \ +#define ASSIGN_3V( V, V0, V1, V2 ) \ +do { \ + V[0] = V0; \ + V[1] = V1; \ + V[2] = V2; \ } while(0) /*@}*/ @@ -421,91 +420,91 @@ do { \ /*@{*/ /** Zero */ -#define ZERO_2V( DST ) (DST)[0] = (DST)[1] = 0 +#define ZERO_2V( DST ) (DST)[0] = (DST)[1] = 0 /** Copy a 2-element vector */ -#define COPY_2V( DST, SRC ) \ -do { \ - (DST)[0] = (SRC)[0]; \ - (DST)[1] = (SRC)[1]; \ +#define COPY_2V( DST, SRC ) \ +do { \ + (DST)[0] = (SRC)[0]; \ + (DST)[1] = (SRC)[1]; \ } while (0) /** Copy a 2-element vector with cast */ -#define COPY_2V_CAST( DST, SRC, CAST ) \ -do { \ - (DST)[0] = (CAST)(SRC)[0]; \ - (DST)[1] = (CAST)(SRC)[1]; \ +#define COPY_2V_CAST( DST, SRC, CAST ) \ +do { \ + (DST)[0] = (CAST)(SRC)[0]; \ + (DST)[1] = (CAST)(SRC)[1]; \ } while (0) /** Copy a 2-element float vector */ -#define COPY_2FV( DST, SRC ) \ -do { \ - const GLfloat *_tmp = (SRC); \ - (DST)[0] = _tmp[0]; \ - (DST)[1] = _tmp[1]; \ +#define COPY_2FV( DST, SRC ) \ +do { \ + const GLfloat *_tmp = (SRC); \ + (DST)[0] = _tmp[0]; \ + (DST)[1] = _tmp[1]; \ } while (0) /** Subtraction */ -#define SUB_2V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] - (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] - (SRCB)[1]; \ +#define SUB_2V( DST, SRCA, SRCB ) \ +do { \ + (DST)[0] = (SRCA)[0] - (SRCB)[0]; \ + (DST)[1] = (SRCA)[1] - (SRCB)[1]; \ } while (0) /** Addition */ -#define ADD_2V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] + (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] + (SRCB)[1]; \ +#define ADD_2V( DST, SRCA, SRCB ) \ +do { \ + (DST)[0] = (SRCA)[0] + (SRCB)[0]; \ + (DST)[1] = (SRCA)[1] + (SRCB)[1]; \ } while (0) /** In-place scalar multiplication */ -#define SCALE_2V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] = (SRCA)[0] * (SRCB)[0]; \ - (DST)[1] = (SRCA)[1] * (SRCB)[1]; \ +#define SCALE_2V( DST, SRCA, SRCB ) \ +do { \ + (DST)[0] = (SRCA)[0] * (SRCB)[0]; \ + (DST)[1] = (SRCA)[1] * (SRCB)[1]; \ } while (0) /** In-place addition */ -#define ACC_2V( DST, SRC ) \ -do { \ - (DST)[0] += (SRC)[0]; \ - (DST)[1] += (SRC)[1]; \ +#define ACC_2V( DST, SRC ) \ +do { \ + (DST)[0] += (SRC)[0]; \ + (DST)[1] += (SRC)[1]; \ } while (0) /** Element-wise multiplication and addition */ -#define ACC_SCALE_2V( DST, SRCA, SRCB ) \ -do { \ - (DST)[0] += (SRCA)[0] * (SRCB)[0]; \ - (DST)[1] += (SRCA)[1] * (SRCB)[1]; \ +#define ACC_SCALE_2V( DST, SRCA, SRCB ) \ +do { \ + (DST)[0] += (SRCA)[0] * (SRCB)[0]; \ + (DST)[1] += (SRCA)[1] * (SRCB)[1]; \ } while (0) /** Scalar multiplication */ -#define SCALE_SCALAR_2V( DST, S, SRCB ) \ -do { \ - (DST)[0] = S * (SRCB)[0]; \ - (DST)[1] = S * (SRCB)[1]; \ +#define SCALE_SCALAR_2V( DST, S, SRCB ) \ +do { \ + (DST)[0] = S * (SRCB)[0]; \ + (DST)[1] = S * (SRCB)[1]; \ } while (0) /** In-place scalar multiplication and addition */ -#define ACC_SCALE_SCALAR_2V( DST, S, SRCB ) \ -do { \ - (DST)[0] += S * (SRCB)[0]; \ - (DST)[1] += S * (SRCB)[1]; \ +#define ACC_SCALE_SCALAR_2V( DST, S, SRCB ) \ +do { \ + (DST)[0] += S * (SRCB)[0]; \ + (DST)[1] += S * (SRCB)[1]; \ } while (0) /** In-place scalar multiplication */ -#define SELF_SCALE_SCALAR_2V( DST, S ) \ -do { \ - (DST)[0] *= S; \ - (DST)[1] *= S; \ +#define SELF_SCALE_SCALAR_2V( DST, S ) \ +do { \ + (DST)[0] *= S; \ + (DST)[1] *= S; \ } while (0) /** In-place scalar addition */ -#define ACC_SCALAR_2V( DST, S ) \ -do { \ - (DST)[0] += S; \ - (DST)[1] += S; \ +#define ACC_SCALAR_2V( DST, S ) \ +do { \ + (DST)[0] += S; \ + (DST)[1] += S; \ } while (0) @@ -516,79 +515,79 @@ do { \ * \note \p OUT argument is evaluated twice! * \note Be wary of using *coord++ as an argument to any of these macros! */ -#define LINTERP(T, OUT, IN) ((OUT) + (T) * ((IN) - (OUT))) +#define LINTERP(T, OUT, IN) ((OUT) + (T) * ((IN) - (OUT))) /* Can do better with integer math */ -#define INTERP_UB( t, dstub, outub, inub ) \ -do { \ - GLfloat inf = UBYTE_TO_FLOAT( inub ); \ - GLfloat outf = UBYTE_TO_FLOAT( outub ); \ - GLfloat dstf = LINTERP( t, outf, inf ); \ - UNCLAMPED_FLOAT_TO_UBYTE( dstub, dstf ); \ +#define INTERP_UB( t, dstub, outub, inub ) \ +do { \ + GLfloat inf = UBYTE_TO_FLOAT( inub ); \ + GLfloat outf = UBYTE_TO_FLOAT( outub ); \ + GLfloat dstf = LINTERP( t, outf, inf ); \ + UNCLAMPED_FLOAT_TO_UBYTE( dstub, dstf ); \ } while (0) -#define INTERP_CHAN( t, dstc, outc, inc ) \ -do { \ - GLfloat inf = CHAN_TO_FLOAT( inc ); \ - GLfloat outf = CHAN_TO_FLOAT( outc ); \ - GLfloat dstf = LINTERP( t, outf, inf ); \ - UNCLAMPED_FLOAT_TO_CHAN( dstc, dstf ); \ +#define INTERP_CHAN( t, dstc, outc, inc ) \ +do { \ + GLfloat inf = CHAN_TO_FLOAT( inc ); \ + GLfloat outf = CHAN_TO_FLOAT( outc ); \ + GLfloat dstf = LINTERP( t, outf, inf ); \ + UNCLAMPED_FLOAT_TO_CHAN( dstc, dstf ); \ } while (0) -#define INTERP_UI( t, dstui, outui, inui ) \ +#define INTERP_UI( t, dstui, outui, inui ) \ dstui = (GLuint) (GLint) LINTERP( (t), (GLfloat) (outui), (GLfloat) (inui) ) -#define INTERP_F( t, dstf, outf, inf ) \ +#define INTERP_F( t, dstf, outf, inf ) \ dstf = LINTERP( t, outf, inf ) -#define INTERP_4F( t, dst, out, in ) \ -do { \ - dst[0] = LINTERP( (t), (out)[0], (in)[0] ); \ - dst[1] = LINTERP( (t), (out)[1], (in)[1] ); \ - dst[2] = LINTERP( (t), (out)[2], (in)[2] ); \ - dst[3] = LINTERP( (t), (out)[3], (in)[3] ); \ +#define INTERP_4F( t, dst, out, in ) \ +do { \ + dst[0] = LINTERP( (t), (out)[0], (in)[0] ); \ + dst[1] = LINTERP( (t), (out)[1], (in)[1] ); \ + dst[2] = LINTERP( (t), (out)[2], (in)[2] ); \ + dst[3] = LINTERP( (t), (out)[3], (in)[3] ); \ } while (0) -#define INTERP_3F( t, dst, out, in ) \ -do { \ - dst[0] = LINTERP( (t), (out)[0], (in)[0] ); \ - dst[1] = LINTERP( (t), (out)[1], (in)[1] ); \ - dst[2] = LINTERP( (t), (out)[2], (in)[2] ); \ +#define INTERP_3F( t, dst, out, in ) \ +do { \ + dst[0] = LINTERP( (t), (out)[0], (in)[0] ); \ + dst[1] = LINTERP( (t), (out)[1], (in)[1] ); \ + dst[2] = LINTERP( (t), (out)[2], (in)[2] ); \ } while (0) -#define INTERP_4CHAN( t, dst, out, in ) \ -do { \ - INTERP_CHAN( (t), (dst)[0], (out)[0], (in)[0] ); \ - INTERP_CHAN( (t), (dst)[1], (out)[1], (in)[1] ); \ - INTERP_CHAN( (t), (dst)[2], (out)[2], (in)[2] ); \ - INTERP_CHAN( (t), (dst)[3], (out)[3], (in)[3] ); \ +#define INTERP_4CHAN( t, dst, out, in ) \ +do { \ + INTERP_CHAN( (t), (dst)[0], (out)[0], (in)[0] ); \ + INTERP_CHAN( (t), (dst)[1], (out)[1], (in)[1] ); \ + INTERP_CHAN( (t), (dst)[2], (out)[2], (in)[2] ); \ + INTERP_CHAN( (t), (dst)[3], (out)[3], (in)[3] ); \ } while (0) -#define INTERP_3CHAN( t, dst, out, in ) \ -do { \ - INTERP_CHAN( (t), (dst)[0], (out)[0], (in)[0] ); \ - INTERP_CHAN( (t), (dst)[1], (out)[1], (in)[1] ); \ - INTERP_CHAN( (t), (dst)[2], (out)[2], (in)[2] ); \ +#define INTERP_3CHAN( t, dst, out, in ) \ +do { \ + INTERP_CHAN( (t), (dst)[0], (out)[0], (in)[0] ); \ + INTERP_CHAN( (t), (dst)[1], (out)[1], (in)[1] ); \ + INTERP_CHAN( (t), (dst)[2], (out)[2], (in)[2] ); \ } while (0) -#define INTERP_SZ( t, vec, to, out, in, sz ) \ -do { \ - switch (sz) { \ - case 4: vec[to][3] = LINTERP( (t), (vec)[out][3], (vec)[in][3] ); \ - case 3: vec[to][2] = LINTERP( (t), (vec)[out][2], (vec)[in][2] ); \ - case 2: vec[to][1] = LINTERP( (t), (vec)[out][1], (vec)[in][1] ); \ - case 1: vec[to][0] = LINTERP( (t), (vec)[out][0], (vec)[in][0] ); \ - } \ +#define INTERP_SZ( t, vec, to, out, in, sz ) \ +do { \ + switch (sz) { \ + case 4: vec[to][3] = LINTERP( (t), (vec)[out][3], (vec)[in][3] ); \ + case 3: vec[to][2] = LINTERP( (t), (vec)[out][2], (vec)[in][2] ); \ + case 2: vec[to][1] = LINTERP( (t), (vec)[out][1], (vec)[in][1] ); \ + case 1: vec[to][0] = LINTERP( (t), (vec)[out][0], (vec)[in][0] ); \ + } \ } while(0) /** Assign scalers to short vectors */ -#define ASSIGN_2V( V, V0, V1 ) \ -do { \ - V[0] = V0; \ - V[1] = V1; \ +#define ASSIGN_2V( V, V0, V1 ) \ +do { \ + V[0] = V0; \ + V[1] = V1; \ } while(0) /*@}*/ @@ -618,31 +617,31 @@ do { \ /** Dot product of two 4-element vectors */ #define DOT4( a, b ) ( (a)[0]*(b)[0] + (a)[1]*(b)[1] + \ - (a)[2]*(b)[2] + (a)[3]*(b)[3] ) + (a)[2]*(b)[2] + (a)[3]*(b)[3] ) /** Dot product of two 4-element vectors */ #define DOT4V(v,a,b,c,d) (v[0]*(a) + v[1]*(b) + v[2]*(c) + v[3]*(d)) /** Cross product of two 3-element vectors */ -#define CROSS3(n, u, v) \ -do { \ - (n)[0] = (u)[1]*(v)[2] - (u)[2]*(v)[1]; \ - (n)[1] = (u)[2]*(v)[0] - (u)[0]*(v)[2]; \ - (n)[2] = (u)[0]*(v)[1] - (u)[1]*(v)[0]; \ +#define CROSS3(n, u, v) \ +do { \ + (n)[0] = (u)[1]*(v)[2] - (u)[2]*(v)[1]; \ + (n)[1] = (u)[2]*(v)[0] - (u)[0]*(v)[2]; \ + (n)[2] = (u)[0]*(v)[1] - (u)[1]*(v)[0]; \ } while (0) /* Normalize a 3-element vector to unit length. */ -#define NORMALIZE_3FV( V ) \ -do { \ - GLfloat len = (GLfloat) LEN_SQUARED_3FV(V); \ - if (len) { \ - len = INV_SQRTF(len); \ - (V)[0] = (GLfloat) ((V)[0] * len); \ - (V)[1] = (GLfloat) ((V)[1] * len); \ - (V)[2] = (GLfloat) ((V)[2] * len); \ - } \ +#define NORMALIZE_3FV( V ) \ +do { \ + GLfloat len = (GLfloat) LEN_SQUARED_3FV(V); \ + if (len) { \ + len = INV_SQRTF(len); \ + (V)[0] = (GLfloat) ((V)[0] * len); \ + (V)[1] = (GLfloat) ((V)[1] * len); \ + (V)[2] = (GLfloat) ((V)[2] * len); \ + } \ } while(0) #define LEN_3FV( V ) (SQRTF((V)[0]*(V)[0]+(V)[1]*(V)[1]+(V)[2]*(V)[2])) diff --git a/src/mesa/main/matrix.c b/src/mesa/main/matrix.c index e74e1728e79..76ca28451f7 100644 --- a/src/mesa/main/matrix.c +++ b/src/mesa/main/matrix.c @@ -61,7 +61,7 @@ * the top matrix of the current matrix stack and sets * __GLcontextRec::NewState. */ -void +void GLAPIENTRY _mesa_Frustum( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval ) @@ -103,7 +103,7 @@ _mesa_Frustum( GLdouble left, GLdouble right, * the top matrix of the current matrix stack and sets * __GLcontextRec::NewState. */ -void +void GLAPIENTRY _mesa_Ortho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval ) @@ -142,7 +142,7 @@ _mesa_Ortho( GLdouble left, GLdouble right, * __GLcontextRec::CurrentStack and gl_transform_attrib::MatrixMode with the * specified matrix stack. */ -void +void GLAPIENTRY _mesa_MatrixMode( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); @@ -222,7 +222,7 @@ _mesa_MatrixMode( GLenum mode ) * matrix in the stack. Marks __GLcontextRec::NewState with the stack dirty * flag. */ -void +void GLAPIENTRY _mesa_PushMatrix( void ) { GET_CURRENT_CONTEXT(ctx); @@ -254,7 +254,7 @@ _mesa_PushMatrix( void ) * moves the stack head down. Marks __GLcontextRec::NewState with the dirty * stack flag. */ -void +void GLAPIENTRY _mesa_PopMatrix( void ) { GET_CURRENT_CONTEXT(ctx); @@ -284,7 +284,7 @@ _mesa_PopMatrix( void ) * matrix in the current stack. Marks __GLcontextRec::NewState with the stack * dirty flag. */ -void +void GLAPIENTRY _mesa_LoadIdentity( void ) { GET_CURRENT_CONTEXT(ctx); @@ -309,7 +309,7 @@ _mesa_LoadIdentity( void ) * in the current stack and the given matrix. Marks __GLcontextRec::NewState * with the dirty stack flag. */ -void +void GLAPIENTRY _mesa_LoadMatrixf( const GLfloat *m ) { GET_CURRENT_CONTEXT(ctx); @@ -339,7 +339,7 @@ _mesa_LoadMatrixf( const GLfloat *m ) * matrix in the current stack and the given matrix. Marks * __GLcontextRec::NewState with the dirty stack flag. */ -void +void GLAPIENTRY _mesa_MultMatrixf( const GLfloat *m ) { GET_CURRENT_CONTEXT(ctx); @@ -371,7 +371,7 @@ _mesa_MultMatrixf( const GLfloat *m ) * matrix in the current stack and the given parameters. Marks * __GLcontextRec::NewState with the dirty stack flag. */ -void +void GLAPIENTRY _mesa_Rotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z ) { GET_CURRENT_CONTEXT(ctx); @@ -396,7 +396,7 @@ _mesa_Rotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z ) * matrix in the current stack and the given parameters. Marks * __GLcontextRec::NewState with the dirty stack flag. */ -void +void GLAPIENTRY _mesa_Scalef( GLfloat x, GLfloat y, GLfloat z ) { GET_CURRENT_CONTEXT(ctx); @@ -419,7 +419,7 @@ _mesa_Scalef( GLfloat x, GLfloat y, GLfloat z ) * matrix in the current stack and the given parameters. Marks * __GLcontextRec::NewState with the dirty stack flag. */ -void +void GLAPIENTRY _mesa_Translatef( GLfloat x, GLfloat y, GLfloat z ) { GET_CURRENT_CONTEXT(ctx); @@ -430,7 +430,7 @@ _mesa_Translatef( GLfloat x, GLfloat y, GLfloat z ) #if _HAVE_FULL_GL -void +void GLAPIENTRY _mesa_LoadMatrixd( const GLdouble *m ) { GLint i; @@ -441,7 +441,7 @@ _mesa_LoadMatrixd( const GLdouble *m ) _mesa_LoadMatrixf(f); } -void +void GLAPIENTRY _mesa_MultMatrixd( const GLdouble *m ) { GLint i; @@ -453,21 +453,21 @@ _mesa_MultMatrixd( const GLdouble *m ) } -void +void GLAPIENTRY _mesa_Rotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ) { _mesa_Rotatef((GLfloat) angle, (GLfloat) x, (GLfloat) y, (GLfloat) z); } -void +void GLAPIENTRY _mesa_Scaled( GLdouble x, GLdouble y, GLdouble z ) { _mesa_Scalef((GLfloat) x, (GLfloat) y, (GLfloat) z); } -void +void GLAPIENTRY _mesa_Translated( GLdouble x, GLdouble y, GLdouble z ) { _mesa_Translatef((GLfloat) x, (GLfloat) y, (GLfloat) z); @@ -476,7 +476,7 @@ _mesa_Translated( GLdouble x, GLdouble y, GLdouble z ) #if _HAVE_FULL_GL -void +void GLAPIENTRY _mesa_LoadTransposeMatrixfARB( const GLfloat *m ) { GLfloat tm[16]; @@ -486,7 +486,7 @@ _mesa_LoadTransposeMatrixfARB( const GLfloat *m ) } -void +void GLAPIENTRY _mesa_LoadTransposeMatrixdARB( const GLdouble *m ) { GLfloat tm[16]; @@ -496,7 +496,7 @@ _mesa_LoadTransposeMatrixdARB( const GLdouble *m ) } -void +void GLAPIENTRY _mesa_MultTransposeMatrixfARB( const GLfloat *m ) { GLfloat tm[16]; @@ -506,7 +506,7 @@ _mesa_MultTransposeMatrixfARB( const GLfloat *m ) } -void +void GLAPIENTRY _mesa_MultTransposeMatrixdARB( const GLdouble *m ) { GLfloat tm[16]; @@ -528,7 +528,7 @@ _mesa_MultTransposeMatrixdARB( const GLdouble *m ) * Flushes the vertices and calls _mesa_set_viewport() with the given * parameters. */ -void +void GLAPIENTRY _mesa_Viewport( GLint x, GLint y, GLsizei width, GLsizei height ) { GET_CURRENT_CONTEXT(ctx); @@ -625,7 +625,7 @@ _mesa_set_viewport( GLcontext *ctx, GLint x, GLint y, #if _HAVE_FULL_GL -void +void GLAPIENTRY _mesa_DepthRange( GLclampd nearval, GLclampd farval ) { /* diff --git a/src/mesa/main/matrix.h b/src/mesa/main/matrix.h index b81ab848448..38769867a75 100644 --- a/src/mesa/main/matrix.h +++ b/src/mesa/main/matrix.h @@ -35,77 +35,77 @@ #include "mtypes.h" -extern void +extern void GLAPIENTRY _mesa_Frustum( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval ); -extern void +extern void GLAPIENTRY _mesa_Ortho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval ); -extern void +extern void GLAPIENTRY _mesa_PushMatrix( void ); -extern void +extern void GLAPIENTRY _mesa_PopMatrix( void ); -extern void +extern void GLAPIENTRY _mesa_LoadIdentity( void ); -extern void +extern void GLAPIENTRY _mesa_LoadMatrixf( const GLfloat *m ); -extern void +extern void GLAPIENTRY _mesa_LoadMatrixd( const GLdouble *m ); -extern void +extern void GLAPIENTRY _mesa_MatrixMode( GLenum mode ); -extern void +extern void GLAPIENTRY _mesa_MultMatrixf( const GLfloat *m ); -extern void +extern void GLAPIENTRY _mesa_MultMatrixd( const GLdouble *m ); -extern void +extern void GLAPIENTRY _mesa_Rotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z ); -extern void +extern void GLAPIENTRY _mesa_Rotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ); -extern void +extern void GLAPIENTRY _mesa_Scalef( GLfloat x, GLfloat y, GLfloat z ); -extern void +extern void GLAPIENTRY _mesa_Scaled( GLdouble x, GLdouble y, GLdouble z ); -extern void +extern void GLAPIENTRY _mesa_Translatef( GLfloat x, GLfloat y, GLfloat z ); -extern void +extern void GLAPIENTRY _mesa_Translated( GLdouble x, GLdouble y, GLdouble z ); -extern void +extern void GLAPIENTRY _mesa_LoadTransposeMatrixfARB( const GLfloat *m ); -extern void +extern void GLAPIENTRY _mesa_LoadTransposeMatrixdARB( const GLdouble *m ); -extern void +extern void GLAPIENTRY _mesa_MultTransposeMatrixfARB( const GLfloat *m ); -extern void +extern void GLAPIENTRY _mesa_MultTransposeMatrixdARB( const GLdouble *m ); -extern void +extern void GLAPIENTRY _mesa_Viewport( GLint x, GLint y, GLsizei width, GLsizei height ); -extern void +extern void _mesa_set_viewport( GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height ); -extern void +extern void GLAPIENTRY _mesa_DepthRange( GLclampd nearval, GLclampd farval ); diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index a8432a985fd..012667a2abe 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -430,6 +430,7 @@ struct gl_colorbuffer_attrib { GLenum LogicOp; /**< Logic operator */ GLboolean IndexLogicOpEnabled; /**< Color index logic op enabled flag */ GLboolean ColorLogicOpEnabled; /**< RGBA logic op enabled flag */ + GLboolean _LogicOpEnabled; /**< RGBA logic op + EXT_blend_logic_op enabled flag */ /*@}*/ GLboolean DitherFlag; /**< Dither enable flag */ @@ -473,7 +474,7 @@ struct gl_current_attrib { */ struct gl_depthbuffer_attrib { GLenum Func; /**< Function for depth buffer compare */ - GLfloat Clear; /**< Value to clear depth buffer to */ + GLclampd Clear; /**< Value to clear depth buffer to */ GLboolean Test; /**< Depth buffering enabled flag */ GLboolean Mask; /**< Depth buffer writable? */ GLboolean OcclusionTest; /**< GL_HP_occlusion_test */ @@ -1289,13 +1290,15 @@ struct gl_client_array { GLenum Type; GLsizei Stride; /**< user-specified stride */ GLsizei StrideB; /**< actual stride in bytes */ - GLubyte *Ptr; - GLuint Flags; + const GLubyte *Ptr; GLuint Enabled; /**< one of the _NEW_ARRAY_ bits */ GLboolean Normalized; /**< GL_ARB_vertex_program */ /**< GL_ARB_vertex_buffer_object */ struct gl_buffer_object *BufferObj; + GLuint _MaxElement; + + GLuint Flags; }; @@ -1327,6 +1330,7 @@ struct gl_array_attrib { struct gl_buffer_object *ArrayBufferObj; struct gl_buffer_object *ElementArrayBufferObj; #endif + GLuint _MaxElement; /* Min of all enabled array's maxes */ }; @@ -1442,7 +1446,8 @@ enum register_file PROGRAM_ENV_PARAM, PROGRAM_NAMED_PARAM, PROGRAM_STATE_VAR, - PROGRAM_WRITE_ONLY + PROGRAM_WRITE_ONLY, + PROGRAM_ADDRESS }; @@ -1481,6 +1486,7 @@ struct vertex_program GLboolean IsPositionInvariant; /* GL_NV_vertex_program1_1 */ GLuint InputsRead; /* Bitmask of which input regs are read */ GLuint OutputsWritten; /* Bitmask of which output regs are written to */ + struct program_parameter_list *Parameters; /**< array [NumParameters] */ }; @@ -1718,6 +1724,8 @@ struct gl_constants /* vertex or fragment program */ GLuint MaxProgramMatrices; GLuint MaxProgramMatrixStackDepth; + /* vertex array / buffer object bounds checking */ + GLboolean CheckArrayBounds; }; @@ -1807,6 +1815,7 @@ struct gl_extensions GLboolean SGIX_shadow_ambient; /* or GL_ARB_shadow_ambient */ GLboolean TDFX_texture_compression_FXT1; GLboolean APPLE_client_storage; + GLboolean S3_s3tc; /*@}*/ /* The extension string */ const GLubyte *String; diff --git a/src/mesa/main/nvprogram.c b/src/mesa/main/nvprogram.c index 2fb20772879..65ce7ca6526 100644 --- a/src/mesa/main/nvprogram.c +++ b/src/mesa/main/nvprogram.c @@ -49,7 +49,7 @@ * Execute a vertex state program. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_ExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params) { struct vertex_program *vprog; @@ -81,7 +81,7 @@ _mesa_ExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params) * \note Not compiled into display lists. * \note Called from the GL API dispatcher. */ -GLboolean _mesa_AreProgramsResidentNV(GLsizei n, const GLuint *ids, +GLboolean GLAPIENTRY _mesa_AreProgramsResidentNV(GLsizei n, const GLuint *ids, GLboolean *residences) { GLint i, j; @@ -128,7 +128,7 @@ GLboolean _mesa_AreProgramsResidentNV(GLsizei n, const GLuint *ids, * Request that a set of programs be resident in hardware. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_RequestResidentProgramsNV(GLsizei n, const GLuint *ids) { GLint i; @@ -166,7 +166,7 @@ _mesa_RequestResidentProgramsNV(GLsizei n, const GLuint *ids) * \note Not compiled into display lists. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_GetProgramParameterfvNV(GLenum target, GLuint index, GLenum pname, GLfloat *params) { @@ -201,7 +201,7 @@ _mesa_GetProgramParameterfvNV(GLenum target, GLuint index, * \note Not compiled into display lists. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_GetProgramParameterdvNV(GLenum target, GLuint index, GLenum pname, GLdouble *params) { @@ -236,7 +236,7 @@ _mesa_GetProgramParameterdvNV(GLenum target, GLuint index, * \note Not compiled into display lists. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_GetProgramivNV(GLuint id, GLenum pname, GLint *params) { struct program *prog; @@ -273,7 +273,7 @@ _mesa_GetProgramivNV(GLuint id, GLenum pname, GLint *params) * \note Not compiled into display lists. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_GetProgramStringNV(GLuint id, GLenum pname, GLubyte *program) { struct program *prog; @@ -307,7 +307,7 @@ _mesa_GetProgramStringNV(GLuint id, GLenum pname, GLubyte *program) * \note Not compiled into display lists. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_GetTrackMatrixivNV(GLenum target, GLuint address, GLenum pname, GLint *params) { @@ -349,7 +349,7 @@ _mesa_GetTrackMatrixivNV(GLenum target, GLuint address, * \note Not compiled into display lists. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_GetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble *params) { GET_CURRENT_CONTEXT(ctx); @@ -385,7 +385,7 @@ _mesa_GetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble *params) * \note Not compiled into display lists. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_GetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat *params) { GET_CURRENT_CONTEXT(ctx); @@ -421,7 +421,7 @@ _mesa_GetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat *params) * \note Not compiled into display lists. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_GetVertexAttribivNV(GLuint index, GLenum pname, GLint *params) { GET_CURRENT_CONTEXT(ctx); @@ -468,7 +468,7 @@ _mesa_GetVertexAttribivNV(GLuint index, GLenum pname, GLint *params) * \note Not compiled into display lists. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_GetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid **pointer) { GET_CURRENT_CONTEXT(ctx); @@ -484,7 +484,7 @@ _mesa_GetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid **pointer) return; } - *pointer = ctx->Array.VertexAttrib[index].Ptr;; + *pointer = (GLvoid *) ctx->Array.VertexAttrib[index].Ptr;; } @@ -493,7 +493,7 @@ _mesa_GetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid **pointer) * Load/parse/compile a program. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_LoadProgramNV(GLenum target, GLuint id, GLsizei len, const GLubyte *program) { @@ -555,7 +555,7 @@ _mesa_LoadProgramNV(GLenum target, GLuint id, GLsizei len, * Set a program parameter register. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_ProgramParameter4dNV(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { @@ -568,7 +568,7 @@ _mesa_ProgramParameter4dNV(GLenum target, GLuint index, * Set a program parameter register. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_ProgramParameter4dvNV(GLenum target, GLuint index, const GLdouble *params) { @@ -582,7 +582,7 @@ _mesa_ProgramParameter4dvNV(GLenum target, GLuint index, * Set a program parameter register. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_ProgramParameter4fNV(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { @@ -609,7 +609,7 @@ _mesa_ProgramParameter4fNV(GLenum target, GLuint index, * Set a program parameter register. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_ProgramParameter4fvNV(GLenum target, GLuint index, const GLfloat *params) { @@ -623,7 +623,7 @@ _mesa_ProgramParameter4fvNV(GLenum target, GLuint index, * Set a sequence of program parameter registers. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_ProgramParameters4dvNV(GLenum target, GLuint index, GLuint num, const GLdouble *params) { @@ -655,7 +655,7 @@ _mesa_ProgramParameters4dvNV(GLenum target, GLuint index, * Set a sequence of program parameter registers. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_ProgramParameters4fvNV(GLenum target, GLuint index, GLuint num, const GLfloat *params) { @@ -685,7 +685,7 @@ _mesa_ProgramParameters4fvNV(GLenum target, GLuint index, * Setup tracking of matrices into program parameter registers. * \note Called from the GL API dispatcher. */ -void +void GLAPIENTRY _mesa_TrackMatrixNV(GLenum target, GLuint address, GLenum matrix, GLenum transform) { @@ -743,7 +743,7 @@ _mesa_TrackMatrixNV(GLenum target, GLuint address, } -void +void GLAPIENTRY _mesa_ProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { @@ -779,7 +779,7 @@ _mesa_ProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte *name, } -void +void GLAPIENTRY _mesa_ProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte *name, const float v[]) { @@ -787,7 +787,7 @@ _mesa_ProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte *name, } -void +void GLAPIENTRY _mesa_ProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { @@ -796,7 +796,7 @@ _mesa_ProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte *name, } -void +void GLAPIENTRY _mesa_ProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte *name, const double v[]) { @@ -806,7 +806,7 @@ _mesa_ProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte *name, } -void +void GLAPIENTRY _mesa_GetProgramNamedParameterfvNV(GLuint id, GLsizei len, const GLubyte *name, GLfloat *params) { @@ -844,7 +844,7 @@ _mesa_GetProgramNamedParameterfvNV(GLuint id, GLsizei len, const GLubyte *name, } -void +void GLAPIENTRY _mesa_GetProgramNamedParameterdvNV(GLuint id, GLsizei len, const GLubyte *name, GLdouble *params) { diff --git a/src/mesa/main/nvprogram.h b/src/mesa/main/nvprogram.h index f505a84ab8c..dcea7727e04 100644 --- a/src/mesa/main/nvprogram.h +++ b/src/mesa/main/nvprogram.h @@ -30,88 +30,88 @@ #define NVPROGRAM_H -extern void +extern void GLAPIENTRY _mesa_ExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params); -extern GLboolean +extern GLboolean GLAPIENTRY _mesa_AreProgramsResidentNV(GLsizei n, const GLuint *ids, GLboolean *residences); -extern void +extern void GLAPIENTRY _mesa_RequestResidentProgramsNV(GLsizei n, const GLuint *ids); -extern void +extern void GLAPIENTRY _mesa_GetProgramParameterfvNV(GLenum target, GLuint index, GLenum pname, GLfloat *params); -extern void +extern void GLAPIENTRY _mesa_GetProgramParameterdvNV(GLenum target, GLuint index, GLenum pname, GLdouble *params); -extern void +extern void GLAPIENTRY _mesa_GetProgramivNV(GLuint id, GLenum pname, GLint *params); -extern void +extern void GLAPIENTRY _mesa_GetProgramStringNV(GLuint id, GLenum pname, GLubyte *program); -extern void +extern void GLAPIENTRY _mesa_GetTrackMatrixivNV(GLenum target, GLuint address, GLenum pname, GLint *params); -extern void +extern void GLAPIENTRY _mesa_GetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble *params); -extern void +extern void GLAPIENTRY _mesa_GetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat *params); -extern void +extern void GLAPIENTRY _mesa_GetVertexAttribivNV(GLuint index, GLenum pname, GLint *params); -extern void +extern void GLAPIENTRY _mesa_GetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid **pointer); -extern void +extern void GLAPIENTRY _mesa_LoadProgramNV(GLenum target, GLuint id, GLsizei len, const GLubyte *program); -extern void +extern void GLAPIENTRY _mesa_ProgramParameter4dNV(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -extern void +extern void GLAPIENTRY _mesa_ProgramParameter4dvNV(GLenum target, GLuint index, const GLdouble *params); -extern void +extern void GLAPIENTRY _mesa_ProgramParameter4fNV(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern void +extern void GLAPIENTRY _mesa_ProgramParameter4fvNV(GLenum target, GLuint index, const GLfloat *params); -extern void +extern void GLAPIENTRY _mesa_ProgramParameters4dvNV(GLenum target, GLuint index, GLuint num, const GLdouble *params); -extern void +extern void GLAPIENTRY _mesa_ProgramParameters4fvNV(GLenum target, GLuint index, GLuint num, const GLfloat *params); -extern void +extern void GLAPIENTRY _mesa_TrackMatrixNV(GLenum target, GLuint address, GLenum matrix, GLenum transform); -extern void +extern void GLAPIENTRY _mesa_ProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern void +extern void GLAPIENTRY _mesa_ProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte *name, const float v[]); -extern void +extern void GLAPIENTRY _mesa_ProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -extern void +extern void GLAPIENTRY _mesa_ProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte *name, const double v[]); -extern void +extern void GLAPIENTRY _mesa_GetProgramNamedParameterfvNV(GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); -extern void +extern void GLAPIENTRY _mesa_GetProgramNamedParameterdvNV(GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); diff --git a/src/mesa/main/nvvertexec.c b/src/mesa/main/nvvertexec.c index 580d04abca5..f3034ea6991 100644 --- a/src/mesa/main/nvvertexec.c +++ b/src/mesa/main/nvvertexec.c @@ -64,6 +64,23 @@ _mesa_init_vp_registers(GLcontext *ctx) } /* The program parameters aren't touched */ + /* XXX: This should be moved to glBegin() time, but its safe (and slow!) + * here - Karl + */ + if (ctx->VertexProgram.Current->Parameters) { + + /* Grab the state */ + _mesa_load_state_parameters(ctx, ctx->VertexProgram.Current->Parameters); + + /* And copy it into the program state */ + for (i=0; i<ctx->VertexProgram.Current->Parameters->NumParameters; i++) { + MEMCPY(ctx->VertexProgram.Parameters[i], + &ctx->VertexProgram.Current->Parameters->Parameters[i].Values, + 4*sizeof(GLfloat)); + } + + } + } @@ -234,13 +251,11 @@ get_register_pointer( const struct vp_src_register *source, return state->Inputs[source->Index]; case PROGRAM_LOCAL_PARAM: /* XXX fix */ - return state->Temporaries[source->Index]; + return state->Temporaries[source->Index]; case PROGRAM_ENV_PARAM: return state->Parameters[source->Index]; case PROGRAM_STATE_VAR: - /* XXX fix */ - return NULL; - break; + return state->Parameters[source->Index]; default: _mesa_problem(NULL, "Bad source register file in fetch_vector4(vp)"); diff --git a/src/mesa/main/occlude.c b/src/mesa/main/occlude.c index 871beb9e541..1285874ef6f 100644 --- a/src/mesa/main/occlude.c +++ b/src/mesa/main/occlude.c @@ -97,7 +97,7 @@ delete_query_object(struct occlusion_query *q) } -void +void GLAPIENTRY _mesa_GenQueriesARB(GLsizei n, GLuint *ids) { GET_CURRENT_CONTEXT(ctx); @@ -131,7 +131,7 @@ _mesa_GenQueriesARB(GLsizei n, GLuint *ids) } -void +void GLAPIENTRY _mesa_DeleteQueriesARB(GLsizei n, const GLuint *ids) { GET_CURRENT_CONTEXT(ctx); @@ -161,7 +161,7 @@ _mesa_DeleteQueriesARB(GLsizei n, const GLuint *ids) } -GLboolean +GLboolean GLAPIENTRY _mesa_IsQueryARB(GLuint id) { GET_CURRENT_CONTEXT(ctx); @@ -174,7 +174,7 @@ _mesa_IsQueryARB(GLuint id) } -void +void GLAPIENTRY _mesa_BeginQueryARB(GLenum target, GLuint id) { GET_CURRENT_CONTEXT(ctx); @@ -216,7 +216,7 @@ _mesa_BeginQueryARB(GLenum target, GLuint id) } -void +void GLAPIENTRY _mesa_EndQueryARB(GLenum target) { GET_CURRENT_CONTEXT(ctx); @@ -245,7 +245,7 @@ _mesa_EndQueryARB(GLenum target) } -void +void GLAPIENTRY _mesa_GetQueryivARB(GLenum target, GLenum pname, GLint *params) { GET_CURRENT_CONTEXT(ctx); @@ -270,7 +270,7 @@ _mesa_GetQueryivARB(GLenum target, GLenum pname, GLint *params) } -void +void GLAPIENTRY _mesa_GetQueryObjectivARB(GLuint id, GLenum pname, GLint *params) { GET_CURRENT_CONTEXT(ctx); @@ -299,7 +299,7 @@ _mesa_GetQueryObjectivARB(GLuint id, GLenum pname, GLint *params) } -void +void GLAPIENTRY _mesa_GetQueryObjectuivARB(GLuint id, GLenum pname, GLuint *params) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/occlude.h b/src/mesa/main/occlude.h index e837dd72eb4..5696463aecf 100644 --- a/src/mesa/main/occlude.h +++ b/src/mesa/main/occlude.h @@ -30,28 +30,28 @@ extern void _mesa_init_occlude(GLcontext *ctx); -extern void +extern void GLAPIENTRY _mesa_GenQueriesARB(GLsizei n, GLuint *ids); -extern void +extern void GLAPIENTRY _mesa_DeleteQueriesARB(GLsizei n, const GLuint *ids); -extern GLboolean +extern GLboolean GLAPIENTRY _mesa_IsQueryARB(GLuint id); -extern void +extern void GLAPIENTRY _mesa_BeginQueryARB(GLenum target, GLuint id); -extern void +extern void GLAPIENTRY _mesa_EndQueryARB(GLenum target); -extern void +extern void GLAPIENTRY _mesa_GetQueryivARB(GLenum target, GLenum pname, GLint *params); -extern void +extern void GLAPIENTRY _mesa_GetQueryObjectivARB(GLuint id, GLenum pname, GLint *params); -extern void +extern void GLAPIENTRY _mesa_GetQueryObjectuivARB(GLuint id, GLenum pname, GLuint *params); diff --git a/src/mesa/main/pixel.c b/src/mesa/main/pixel.c index e0c792b4f18..61c7e570da1 100644 --- a/src/mesa/main/pixel.c +++ b/src/mesa/main/pixel.c @@ -38,7 +38,7 @@ -void +void GLAPIENTRY _mesa_PixelZoom( GLfloat xfactor, GLfloat yfactor ) { GET_CURRENT_CONTEXT(ctx); @@ -59,7 +59,7 @@ _mesa_PixelZoom( GLfloat xfactor, GLfloat yfactor ) /**********************************************************************/ -void +void GLAPIENTRY _mesa_PixelStorei( GLenum pname, GLint param ) { /* NOTE: this call can't be compiled into the display list */ @@ -240,7 +240,7 @@ _mesa_PixelStorei( GLenum pname, GLint param ) } -void +void GLAPIENTRY _mesa_PixelStoref( GLenum pname, GLfloat param ) { _mesa_PixelStorei( pname, (GLint) param ); @@ -254,7 +254,7 @@ _mesa_PixelStoref( GLenum pname, GLfloat param ) -void +void GLAPIENTRY _mesa_PixelMapfv( GLenum map, GLsizei mapsize, const GLfloat *values ) { GLint i; @@ -352,7 +352,7 @@ _mesa_PixelMapfv( GLenum map, GLsizei mapsize, const GLfloat *values ) -void +void GLAPIENTRY _mesa_PixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values ) { const GLint n = MIN2(mapsize, MAX_PIXEL_MAP_TABLE); @@ -373,7 +373,7 @@ _mesa_PixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values ) -void +void GLAPIENTRY _mesa_PixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values ) { const GLint n = MIN2(mapsize, MAX_PIXEL_MAP_TABLE); @@ -394,7 +394,7 @@ _mesa_PixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values ) -void +void GLAPIENTRY _mesa_GetPixelMapfv( GLenum map, GLfloat *values ) { GET_CURRENT_CONTEXT(ctx); @@ -442,7 +442,7 @@ _mesa_GetPixelMapfv( GLenum map, GLfloat *values ) } -void +void GLAPIENTRY _mesa_GetPixelMapuiv( GLenum map, GLuint *values ) { GET_CURRENT_CONTEXT(ctx); @@ -502,7 +502,7 @@ _mesa_GetPixelMapuiv( GLenum map, GLuint *values ) } -void +void GLAPIENTRY _mesa_GetPixelMapusv( GLenum map, GLushort *values ) { GET_CURRENT_CONTEXT(ctx); @@ -576,7 +576,7 @@ _mesa_GetPixelMapusv( GLenum map, GLushort *values ) * Implements glPixelTransfer[fi] whether called immediately or from a * display list. */ -void +void GLAPIENTRY _mesa_PixelTransferf( GLenum pname, GLfloat param ) { GET_CURRENT_CONTEXT(ctx); @@ -770,7 +770,7 @@ _mesa_PixelTransferf( GLenum pname, GLfloat param ) } -void +void GLAPIENTRY _mesa_PixelTransferi( GLenum pname, GLint param ) { _mesa_PixelTransferf( pname, (GLfloat) param ); diff --git a/src/mesa/main/pixel.h b/src/mesa/main/pixel.h index e41d6b1d83f..a3efcf5666e 100644 --- a/src/mesa/main/pixel.h +++ b/src/mesa/main/pixel.h @@ -38,37 +38,38 @@ /** \name API functions */ /*@*/ -extern void +extern void GLAPIENTRY _mesa_GetPixelMapfv( GLenum map, GLfloat *values ); -extern void +extern void GLAPIENTRY _mesa_GetPixelMapuiv( GLenum map, GLuint *values ); -extern void +extern void GLAPIENTRY _mesa_GetPixelMapusv( GLenum map, GLushort *values ); -extern void +extern void GLAPIENTRY _mesa_PixelMapfv( GLenum map, GLsizei mapsize, const GLfloat *values ); -extern void +extern void GLAPIENTRY _mesa_PixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values ); -extern void +extern void GLAPIENTRY _mesa_PixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values ); -extern void +extern void GLAPIENTRY _mesa_PixelStoref( GLenum pname, GLfloat param ); -extern void + +extern void GLAPIENTRY _mesa_PixelStorei( GLenum pname, GLint param ); -extern void +extern void GLAPIENTRY _mesa_PixelTransferf( GLenum pname, GLfloat param ); -extern void +extern void GLAPIENTRY _mesa_PixelTransferi( GLenum pname, GLint param ); -extern void +extern void GLAPIENTRY _mesa_PixelZoom( GLfloat xfactor, GLfloat yfactor ); /*@}*/ diff --git a/src/mesa/main/points.c b/src/mesa/main/points.c index 466be5712bf..cbb91554a1e 100644 --- a/src/mesa/main/points.c +++ b/src/mesa/main/points.c @@ -49,7 +49,7 @@ * size is different from one. Notifies the driver via * the dd_function_table::PointSize callback. */ -void +void GLAPIENTRY _mesa_PointSize( GLfloat size ) { GET_CURRENT_CONTEXT(ctx); @@ -84,7 +84,7 @@ _mesa_PointSize( GLfloat size ) /* * Added by GL_NV_point_sprite */ -void +void GLAPIENTRY _mesa_PointParameteriNV( GLenum pname, GLint param ) { const GLfloat value = (GLfloat) param; @@ -95,7 +95,7 @@ _mesa_PointParameteriNV( GLenum pname, GLint param ) /* * Added by GL_NV_point_sprite */ -void +void GLAPIENTRY _mesa_PointParameterivNV( GLenum pname, const GLint *params ) { const GLfloat value = (GLfloat) params[0]; @@ -107,7 +107,7 @@ _mesa_PointParameterivNV( GLenum pname, const GLint *params ) /* * Same for both GL_EXT_point_parameters and GL_ARB_point_parameters. */ -void +void GLAPIENTRY _mesa_PointParameterfEXT( GLenum pname, GLfloat param) { _mesa_PointParameterfvEXT(pname, ¶m); @@ -118,7 +118,7 @@ _mesa_PointParameterfEXT( GLenum pname, GLfloat param) /* * Same for both GL_EXT_point_parameters and GL_ARB_point_parameters. */ -void +void GLAPIENTRY _mesa_PointParameterfvEXT( GLenum pname, const GLfloat *params) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/points.h b/src/mesa/main/points.h index 7a4a77caa9b..16513c3ec67 100644 --- a/src/mesa/main/points.h +++ b/src/mesa/main/points.h @@ -35,19 +35,19 @@ #include "mtypes.h" -extern void +extern void GLAPIENTRY _mesa_PointSize( GLfloat size ); -extern void +extern void GLAPIENTRY _mesa_PointParameteriNV( GLenum pname, GLint param ); -extern void +extern void GLAPIENTRY _mesa_PointParameterivNV( GLenum pname, const GLint *params ); -extern void +extern void GLAPIENTRY _mesa_PointParameterfEXT( GLenum pname, GLfloat param ); -extern void +extern void GLAPIENTRY _mesa_PointParameterfvEXT( GLenum pname, const GLfloat *params ); extern void diff --git a/src/mesa/main/polygon.c b/src/mesa/main/polygon.c index 1051c8ce179..192c40516fb 100644 --- a/src/mesa/main/polygon.c +++ b/src/mesa/main/polygon.c @@ -49,7 +49,7 @@ * change, flushes the vertices and notifies the driver via * the dd_function_table::CullFace callback. */ -void +void GLAPIENTRY _mesa_CullFace( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); @@ -85,7 +85,7 @@ _mesa_CullFace( GLenum mode ) * flushes the vertices and notifies the driver via * the dd_function_table::FrontFace callback. */ -void +void GLAPIENTRY _mesa_FrontFace( GLenum mode ) { GET_CURRENT_CONTEXT(ctx); @@ -124,7 +124,7 @@ _mesa_FrontFace( GLenum mode ) * gl_polygon_attrib::BackMode. On change flushes the vertices and notifies the * driver via the dd_function_table::PolygonMode callback. */ -void +void GLAPIENTRY _mesa_PolygonMode( GLenum face, GLenum mode ) { GET_CURRENT_CONTEXT(ctx); @@ -177,7 +177,7 @@ _mesa_PolygonMode( GLenum face, GLenum mode ) #if _HAVE_FULL_GL -void +void GLAPIENTRY _mesa_PolygonStipple( const GLubyte *pattern ) { GET_CURRENT_CONTEXT(ctx); @@ -195,7 +195,7 @@ _mesa_PolygonStipple( const GLubyte *pattern ) -void +void GLAPIENTRY _mesa_GetPolygonStipple( GLubyte *dest ) { GET_CURRENT_CONTEXT(ctx); @@ -208,7 +208,7 @@ _mesa_GetPolygonStipple( GLubyte *dest ) } -void +void GLAPIENTRY _mesa_PolygonOffset( GLfloat factor, GLfloat units ) { GET_CURRENT_CONTEXT(ctx); @@ -231,7 +231,7 @@ _mesa_PolygonOffset( GLfloat factor, GLfloat units ) -void +void GLAPIENTRY _mesa_PolygonOffsetEXT( GLfloat factor, GLfloat bias ) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/polygon.h b/src/mesa/main/polygon.h index ec0735b1080..ef2fd0e92d1 100644 --- a/src/mesa/main/polygon.h +++ b/src/mesa/main/polygon.h @@ -35,28 +35,28 @@ #include "mtypes.h" -extern void +extern void GLAPIENTRY _mesa_CullFace( GLenum mode ); -extern void +extern void GLAPIENTRY _mesa_FrontFace( GLenum mode ); -extern void +extern void GLAPIENTRY _mesa_PolygonMode( GLenum face, GLenum mode ); -extern void +extern void GLAPIENTRY _mesa_PolygonOffset( GLfloat factor, GLfloat units ); -extern void +extern void GLAPIENTRY _mesa_PolygonOffsetEXT( GLfloat factor, GLfloat bias ); -extern void +extern void GLAPIENTRY _mesa_PolygonStipple( const GLubyte *mask ); -extern void +extern void GLAPIENTRY _mesa_GetPolygonStipple( GLubyte *mask ); -extern void +extern void _mesa_update_polygon( GLcontext *ctx ); extern void diff --git a/src/mesa/main/program.c b/src/mesa/main/program.c index bd7de4e4ac7..546c0540032 100644 --- a/src/mesa/main/program.c +++ b/src/mesa/main/program.c @@ -726,8 +726,9 @@ _mesa_fetch_state(GLcontext *ctx, const enum state_index state[], case STATE_LOCAL: COPY_4V(value, ctx->FragmentProgram.Current->Base.LocalParams[idx]); break; - default: - break; + default: + _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()"); + return; } } return; @@ -746,8 +747,9 @@ _mesa_fetch_state(GLcontext *ctx, const enum state_index state[], case STATE_LOCAL: COPY_4V(value, ctx->VertexProgram.Current->Base.LocalParams[idx]); break; - default: - break; + default: + _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()"); + return; } } return; @@ -789,7 +791,7 @@ _mesa_load_state_parameters(GLcontext *ctx, * \note Called from the GL API dispatcher by both glBindProgramNV * and glBindProgramARB. */ -void +void GLAPIENTRY _mesa_BindProgram(GLenum target, GLuint id) { struct program *prog; @@ -892,7 +894,7 @@ _mesa_BindProgram(GLenum target, GLuint id) * \note Not compiled into display lists. * \note Called by both glDeleteProgramsNV and glDeleteProgramsARB. */ -void +void GLAPIENTRY _mesa_DeletePrograms(GLsizei n, const GLuint *ids) { GLint i; @@ -943,7 +945,7 @@ _mesa_DeletePrograms(GLsizei n, const GLuint *ids) * \note Not compiled into display lists. * \note Called by both glGenProgramsNV and glGenProgramsARB. */ -void +void GLAPIENTRY _mesa_GenPrograms(GLsizei n, GLuint *ids) { GLuint first; @@ -988,7 +990,7 @@ _mesa_GenPrograms(GLsizei n, GLuint *ids) * \param id is the program identifier * \return GL_TRUE if id is a program, else GL_FALSE. */ -GLboolean +GLboolean GLAPIENTRY _mesa_IsProgram(GLuint id) { struct program *prog; diff --git a/src/mesa/main/program.h b/src/mesa/main/program.h index ac107d9e372..23807746a6a 100644 --- a/src/mesa/main/program.h +++ b/src/mesa/main/program.h @@ -206,16 +206,16 @@ _mesa_load_state_parameters(GLcontext *ctx, * API functions */ -extern void +extern void GLAPIENTRY _mesa_BindProgram(GLenum target, GLuint id); -extern void +extern void GLAPIENTRY _mesa_DeletePrograms(GLsizei n, const GLuint *ids); -extern void +extern void GLAPIENTRY _mesa_GenPrograms(GLsizei n, GLuint *ids); -extern GLboolean +extern GLboolean GLAPIENTRY _mesa_IsProgram(GLuint id); diff --git a/src/mesa/main/rastpos.c b/src/mesa/main/rastpos.c index 7e39ddc4164..dfd404e4004 100644 --- a/src/mesa/main/rastpos.c +++ b/src/mesa/main/rastpos.c @@ -411,70 +411,70 @@ raster_pos4f(GLcontext *ctx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos2d(GLdouble x, GLdouble y) { _mesa_RasterPos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos2f(GLfloat x, GLfloat y) { _mesa_RasterPos4f(x, y, 0.0F, 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos2i(GLint x, GLint y) { _mesa_RasterPos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos2s(GLshort x, GLshort y) { _mesa_RasterPos4f(x, y, 0.0F, 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos3d(GLdouble x, GLdouble y, GLdouble z) { _mesa_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos3f(GLfloat x, GLfloat y, GLfloat z) { _mesa_RasterPos4f(x, y, z, 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos3i(GLint x, GLint y, GLint z) { _mesa_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos3s(GLshort x, GLshort y, GLshort z) { _mesa_RasterPos4f(x, y, z, 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) { _mesa_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); } /** Calls raster_pos4f() */ -void +void GLAPIENTRY _mesa_RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) { GET_CURRENT_CONTEXT(ctx); @@ -482,77 +482,77 @@ _mesa_RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos4i(GLint x, GLint y, GLint z, GLint w) { _mesa_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w) { _mesa_RasterPos4f(x, y, z, w); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos2dv(const GLdouble *v) { _mesa_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos2fv(const GLfloat *v) { _mesa_RasterPos4f(v[0], v[1], 0.0F, 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos2iv(const GLint *v) { _mesa_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos2sv(const GLshort *v) { _mesa_RasterPos4f(v[0], v[1], 0.0F, 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos3dv(const GLdouble *v) { _mesa_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos3fv(const GLfloat *v) { _mesa_RasterPos4f(v[0], v[1], v[2], 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos3iv(const GLint *v) { _mesa_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos3sv(const GLshort *v) { _mesa_RasterPos4f(v[0], v[1], v[2], 1.0F); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos4dv(const GLdouble *v) { _mesa_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], @@ -560,14 +560,14 @@ _mesa_RasterPos4dv(const GLdouble *v) } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos4fv(const GLfloat *v) { _mesa_RasterPos4f(v[0], v[1], v[2], v[3]); } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos4iv(const GLint *v) { _mesa_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], @@ -575,7 +575,7 @@ _mesa_RasterPos4iv(const GLint *v) } /** Calls _mesa_RasterPos4f() */ -void +void GLAPIENTRY _mesa_RasterPos4sv(const GLshort *v) { _mesa_RasterPos4f(v[0], v[1], v[2], v[3]); @@ -664,147 +664,147 @@ window_pos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) } -void +void GLAPIENTRY _mesa_WindowPos2dMESA(GLdouble x, GLdouble y) { window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F); } -void +void GLAPIENTRY _mesa_WindowPos2fMESA(GLfloat x, GLfloat y) { window_pos4f(x, y, 0.0F, 1.0F); } -void +void GLAPIENTRY _mesa_WindowPos2iMESA(GLint x, GLint y) { window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F); } -void +void GLAPIENTRY _mesa_WindowPos2sMESA(GLshort x, GLshort y) { window_pos4f(x, y, 0.0F, 1.0F); } -void +void GLAPIENTRY _mesa_WindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z) { window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); } -void +void GLAPIENTRY _mesa_WindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z) { window_pos4f(x, y, z, 1.0F); } -void +void GLAPIENTRY _mesa_WindowPos3iMESA(GLint x, GLint y, GLint z) { window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); } -void +void GLAPIENTRY _mesa_WindowPos3sMESA(GLshort x, GLshort y, GLshort z) { window_pos4f(x, y, z, 1.0F); } -void +void GLAPIENTRY _mesa_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w) { window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); } -void +void GLAPIENTRY _mesa_WindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w) { window_pos4f(x, y, z, w); } -void +void GLAPIENTRY _mesa_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w) { window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); } -void +void GLAPIENTRY _mesa_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w) { window_pos4f(x, y, z, w); } -void +void GLAPIENTRY _mesa_WindowPos2dvMESA(const GLdouble *v) { window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); } -void +void GLAPIENTRY _mesa_WindowPos2fvMESA(const GLfloat *v) { window_pos4f(v[0], v[1], 0.0F, 1.0F); } -void +void GLAPIENTRY _mesa_WindowPos2ivMESA(const GLint *v) { window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); } -void +void GLAPIENTRY _mesa_WindowPos2svMESA(const GLshort *v) { window_pos4f(v[0], v[1], 0.0F, 1.0F); } -void +void GLAPIENTRY _mesa_WindowPos3dvMESA(const GLdouble *v) { window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); } -void +void GLAPIENTRY _mesa_WindowPos3fvMESA(const GLfloat *v) { window_pos4f(v[0], v[1], v[2], 1.0); } -void +void GLAPIENTRY _mesa_WindowPos3ivMESA(const GLint *v) { window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); } -void +void GLAPIENTRY _mesa_WindowPos3svMESA(const GLshort *v) { window_pos4f(v[0], v[1], v[2], 1.0F); } -void +void GLAPIENTRY _mesa_WindowPos4dvMESA(const GLdouble *v) { window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]); } -void +void GLAPIENTRY _mesa_WindowPos4fvMESA(const GLfloat *v) { window_pos4f(v[0], v[1], v[2], v[3]); } -void +void GLAPIENTRY _mesa_WindowPos4ivMESA(const GLint *v) { window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]); } -void +void GLAPIENTRY _mesa_WindowPos4svMESA(const GLshort *v) { window_pos4f(v[0], v[1], v[2], v[3]); diff --git a/src/mesa/main/rastpos.h b/src/mesa/main/rastpos.h index ae7278c4700..363f86ad87b 100644 --- a/src/mesa/main/rastpos.h +++ b/src/mesa/main/rastpos.h @@ -35,76 +35,76 @@ #include "glheader.h" -extern void +extern void GLAPIENTRY _mesa_RasterPos2d(GLdouble x, GLdouble y); -extern void +extern void GLAPIENTRY _mesa_RasterPos2f(GLfloat x, GLfloat y); -extern void +extern void GLAPIENTRY _mesa_RasterPos2i(GLint x, GLint y); -extern void +extern void GLAPIENTRY _mesa_RasterPos2s(GLshort x, GLshort y); -extern void +extern void GLAPIENTRY _mesa_RasterPos3d(GLdouble x, GLdouble y, GLdouble z); -extern void +extern void GLAPIENTRY _mesa_RasterPos3f(GLfloat x, GLfloat y, GLfloat z); -extern void +extern void GLAPIENTRY _mesa_RasterPos3i(GLint x, GLint y, GLint z); -extern void +extern void GLAPIENTRY _mesa_RasterPos3s(GLshort x, GLshort y, GLshort z); -extern void +extern void GLAPIENTRY _mesa_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -extern void +extern void GLAPIENTRY _mesa_RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern void +extern void GLAPIENTRY _mesa_RasterPos4i(GLint x, GLint y, GLint z, GLint w); -extern void +extern void GLAPIENTRY _mesa_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w); -extern void +extern void GLAPIENTRY _mesa_RasterPos2dv(const GLdouble *v); -extern void +extern void GLAPIENTRY _mesa_RasterPos2fv(const GLfloat *v); -extern void +extern void GLAPIENTRY _mesa_RasterPos2iv(const GLint *v); -extern void +extern void GLAPIENTRY _mesa_RasterPos2sv(const GLshort *v); -extern void +extern void GLAPIENTRY _mesa_RasterPos3dv(const GLdouble *v); -extern void +extern void GLAPIENTRY _mesa_RasterPos3fv(const GLfloat *v); -extern void +extern void GLAPIENTRY _mesa_RasterPos3iv(const GLint *v); -extern void +extern void GLAPIENTRY _mesa_RasterPos3sv(const GLshort *v); -extern void +extern void GLAPIENTRY _mesa_RasterPos4dv(const GLdouble *v); -extern void +extern void GLAPIENTRY _mesa_RasterPos4fv(const GLfloat *v); -extern void +extern void GLAPIENTRY _mesa_RasterPos4iv(const GLint *v); -extern void +extern void GLAPIENTRY _mesa_RasterPos4sv(const GLshort *v); @@ -113,76 +113,76 @@ _mesa_RasterPos4sv(const GLshort *v); /**********************************************************************/ /*@{*/ -extern void +extern void GLAPIENTRY _mesa_WindowPos2dMESA(GLdouble x, GLdouble y); -extern void +extern void GLAPIENTRY _mesa_WindowPos2fMESA(GLfloat x, GLfloat y); -extern void +extern void GLAPIENTRY _mesa_WindowPos2iMESA(GLint x, GLint y); -extern void +extern void GLAPIENTRY _mesa_WindowPos2sMESA(GLshort x, GLshort y); -extern void +extern void GLAPIENTRY _mesa_WindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z); -extern void +extern void GLAPIENTRY _mesa_WindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z); -extern void +extern void GLAPIENTRY _mesa_WindowPos3iMESA(GLint x, GLint y, GLint z); -extern void +extern void GLAPIENTRY _mesa_WindowPos3sMESA(GLshort x, GLshort y, GLshort z); -extern void +extern void GLAPIENTRY _mesa_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w); -extern void +extern void GLAPIENTRY _mesa_WindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern void +extern void GLAPIENTRY _mesa_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w); -extern void +extern void GLAPIENTRY _mesa_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w); -extern void +extern void GLAPIENTRY _mesa_WindowPos2dvMESA(const GLdouble *v); -extern void +extern void GLAPIENTRY _mesa_WindowPos2fvMESA(const GLfloat *v); -extern void +extern void GLAPIENTRY _mesa_WindowPos2ivMESA(const GLint *v); -extern void +extern void GLAPIENTRY _mesa_WindowPos2svMESA(const GLshort *v); -extern void +extern void GLAPIENTRY _mesa_WindowPos3dvMESA(const GLdouble *v); -extern void +extern void GLAPIENTRY _mesa_WindowPos3fvMESA(const GLfloat *v); -extern void +extern void GLAPIENTRY _mesa_WindowPos3ivMESA(const GLint *v); -extern void +extern void GLAPIENTRY _mesa_WindowPos3svMESA(const GLshort *v); -extern void +extern void GLAPIENTRY _mesa_WindowPos4dvMESA(const GLdouble *v); -extern void +extern void GLAPIENTRY _mesa_WindowPos4fvMESA(const GLfloat *v); -extern void +extern void GLAPIENTRY _mesa_WindowPos4ivMESA(const GLint *v); -extern void +extern void GLAPIENTRY _mesa_WindowPos4svMESA(const GLshort *v); extern void diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c index 7c0d2aaa6a2..4c6f75a8811 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -60,6 +60,7 @@ #include "imports.h" #include "light.h" #include "lines.h" +#include "macros.h" #include "matrix.h" #if FEATURE_ARB_occlusion_query #include "occlude.h" @@ -752,6 +753,110 @@ update_program( GLcontext *ctx ) } +/** + * Update state dependent on vertex arrays. + */ +static void +update_arrays( GLcontext *ctx ) +{ + GLuint i, min; + + /* find min of _MaxElement values for all enabled arrays */ + + /* 0 */ + if (ctx->VertexProgram.Enabled + && ctx->Array.VertexAttrib[VERT_ATTRIB_POS].Enabled) { + min = ctx->Array.VertexAttrib[VERT_ATTRIB_POS]._MaxElement; + } + else if (ctx->Array.Vertex.Enabled) { + min = ctx->Array.Vertex._MaxElement; + } + else { + /* can't draw anything without vertex positions! */ + min = 0; + } + + /* 1 */ + if (ctx->VertexProgram.Enabled + && ctx->Array.VertexAttrib[VERT_ATTRIB_WEIGHT].Enabled) { + min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_WEIGHT]._MaxElement); + } + /* no conventional vertex weight array */ + + /* 2 */ + if (ctx->VertexProgram.Enabled + && ctx->Array.VertexAttrib[VERT_ATTRIB_NORMAL].Enabled) { + min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_NORMAL]._MaxElement); + } + else if (ctx->Array.Normal.Enabled) { + min = MIN2(min, ctx->Array.Normal._MaxElement); + } + + /* 3 */ + if (ctx->VertexProgram.Enabled + && ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR0].Enabled) { + min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR0]._MaxElement); + } + else if (ctx->Array.Color.Enabled) { + min = MIN2(min, ctx->Array.Color._MaxElement); + } + + /* 4 */ + if (ctx->VertexProgram.Enabled + && ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR1].Enabled) { + min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR1]._MaxElement); + } + else if (ctx->Array.SecondaryColor.Enabled) { + min = MIN2(min, ctx->Array.SecondaryColor._MaxElement); + } + + /* 5 */ + if (ctx->VertexProgram.Enabled + && ctx->Array.VertexAttrib[VERT_ATTRIB_FOG].Enabled) { + min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_FOG]._MaxElement); + } + else if (ctx->Array.FogCoord.Enabled) { + min = MIN2(min, ctx->Array.FogCoord._MaxElement); + } + + /* 6 */ + if (ctx->VertexProgram.Enabled + && ctx->Array.VertexAttrib[VERT_ATTRIB_SIX].Enabled) { + min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_SIX]._MaxElement); + } + + /* 7 */ + if (ctx->VertexProgram.Enabled + && ctx->Array.VertexAttrib[VERT_ATTRIB_SEVEN].Enabled) { + min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_SEVEN]._MaxElement); + } + + /* 8..15 */ + for (i = VERT_ATTRIB_TEX0; i < VERT_ATTRIB_MAX; i++) { + if (ctx->VertexProgram.Enabled + && ctx->Array.VertexAttrib[i].Enabled) { + min = MIN2(min, ctx->Array.VertexAttrib[i]._MaxElement); + } + else if (i - VERT_ATTRIB_TEX0 < ctx->Const.MaxTextureCoordUnits + && ctx->Array.TexCoord[i - VERT_ATTRIB_TEX0].Enabled) { + min = MIN2(min, ctx->Array.TexCoord[i - VERT_ATTRIB_TEX0]._MaxElement); + } + } + + if (ctx->Array.Index.Enabled) { + min = MIN2(min, ctx->Array.Index._MaxElement); + } + + if (ctx->Array.EdgeFlag.Enabled) { + min = MIN2(min, ctx->Array.EdgeFlag._MaxElement); + } + + /* _MaxElement is one past the last legal array element */ + ctx->Array._MaxElement = min; +} + + + /* * If __GLcontextRec::NewState is non-zero then this function \b must be called * before rendering any primitive. Basically, function pointers and @@ -793,6 +898,9 @@ void _mesa_update_state( GLcontext *ctx ) if (new_state & _NEW_PROGRAM) update_program( ctx ); + if (new_state & _NEW_ARRAY) + update_arrays( ctx ); + /* ctx->_NeedEyeCoords is now up to date. * * If the truth value of this variable has changed, update for the diff --git a/src/mesa/main/stencil.c b/src/mesa/main/stencil.c index bcfe383790b..8c89e8cc13c 100644 --- a/src/mesa/main/stencil.c +++ b/src/mesa/main/stencil.c @@ -49,7 +49,7 @@ * flushes the vertices and notifies the driver via * the dd_function_table::ClearStencil callback. */ -void +void GLAPIENTRY _mesa_ClearStencil( GLint s ) { GET_CURRENT_CONTEXT(ctx); @@ -80,7 +80,7 @@ _mesa_ClearStencil( GLint s ) * __GLcontextRec::Stencil. On change flushes the vertices and notifies the * driver via the dd_function_table::StencilFunc callback. */ -void +void GLAPIENTRY _mesa_StencilFunc( GLenum func, GLint ref, GLuint mask ) { GET_CURRENT_CONTEXT(ctx); @@ -133,7 +133,7 @@ _mesa_StencilFunc( GLenum func, GLint ref, GLuint mask ) * Updates gl_stencil_attrib::WriteMask. On change flushes the vertices and * notifies the driver via the dd_function_table::StencilMask callback. */ -void +void GLAPIENTRY _mesa_StencilMask( GLuint mask ) { GET_CURRENT_CONTEXT(ctx); @@ -166,7 +166,7 @@ _mesa_StencilMask( GLuint mask ) * __GLcontextRec::Stencil. On change flushes the vertices and notifies the * driver via the dd_function_table::StencilOp callback. */ -void +void GLAPIENTRY _mesa_StencilOp(GLenum fail, GLenum zfail, GLenum zpass) { GET_CURRENT_CONTEXT(ctx); @@ -246,7 +246,7 @@ _mesa_StencilOp(GLenum fail, GLenum zfail, GLenum zpass) #if _HAVE_FULL_GL /* GL_EXT_stencil_two_side */ -void +void GLAPIENTRY _mesa_ActiveStencilFaceEXT(GLenum face) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/stencil.h b/src/mesa/main/stencil.h index cf645608f81..5620d14c730 100644 --- a/src/mesa/main/stencil.h +++ b/src/mesa/main/stencil.h @@ -35,27 +35,27 @@ #include "mtypes.h" -extern void +extern void GLAPIENTRY _mesa_ClearStencil( GLint s ); -extern void +extern void GLAPIENTRY _mesa_StencilFunc( GLenum func, GLint ref, GLuint mask ); -extern void +extern void GLAPIENTRY _mesa_StencilMask( GLuint mask ); -extern void +extern void GLAPIENTRY _mesa_StencilOp( GLenum fail, GLenum zfail, GLenum zpass ); -extern void +extern void GLAPIENTRY _mesa_ActiveStencilFaceEXT(GLenum face); -extern void +extern void _mesa_init_stencil( GLcontext * ctx ); #endif diff --git a/src/mesa/main/texcompress.c b/src/mesa/main/texcompress.c index e6a96957229..4c6eaae4cf3 100644 --- a/src/mesa/main/texcompress.c +++ b/src/mesa/main/texcompress.c @@ -73,6 +73,17 @@ _mesa_get_compressed_formats( GLcontext *ctx, GLint *formats ) n += 3; } } + if (ctx->Extensions.S3_s3tc) { + if (formats) { + formats[n++] = GL_RGB_S3TC; + formats[n++] = GL_RGB4_S3TC; + formats[n++] = GL_RGBA_S3TC; + formats[n++] = GL_RGBA4_S3TC; + } + else { + n += 4; + } + } } return n; } @@ -96,20 +107,35 @@ _mesa_compressed_texture_size( GLcontext *ctx, { GLuint size; + if (ctx->Driver.CompressedTextureSize) { + return ctx->Driver.CompressedTextureSize(ctx, width, height, depth, format); + } + + ASSERT(depth == 1); + switch (format) { case GL_COMPRESSED_RGB_FXT1_3DFX: case GL_COMPRESSED_RGBA_FXT1_3DFX: - /* round up to multiple of 4 */ - size = ((width + 7) / 8) * ((height + 3) / 4) * 16; + /* round up width to next multiple of 8, height to next multiple of 4 */ + width = (width + 7) & ~7; + height = (height + 3) & ~3; + /* 16 bytes per 8x4 tile of RGB[A] texels */ + size = width * height / 2; + /* Textures smaller than 8x4 will effectively be made into 8x4 and + * take 16 bytes. + */ + if (size < 16) + size = 16; return size; case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: + case GL_RGB_S3TC: + case GL_RGB4_S3TC: /* round up width, height to next multiple of 4 */ width = (width + 3) & ~3; height = (height + 3) & ~3; - ASSERT(depth == 1); /* 8 bytes per 4x4 tile of RGB[A] texels */ - size = (width * height * 8) / 16; + size = width * height / 2; /* Textures smaller than 4x4 will effectively be made into 4x4 and * take 8 bytes. */ @@ -118,10 +144,11 @@ _mesa_compressed_texture_size( GLcontext *ctx, return size; case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: + case GL_RGBA_S3TC: + case GL_RGBA4_S3TC: /* round up width, height to next multiple of 4 */ width = (width + 3) & ~3; height = (height + 3) & ~3; - ASSERT(depth == 1); /* 16 bytes per 4x4 tile of RGBA texels */ size = width * height; /* simple! */ /* Textures smaller than 4x4 will effectively be made into 4x4 and @@ -147,22 +174,29 @@ _mesa_compressed_texture_size( GLcontext *ctx, GLint _mesa_compressed_row_stride(GLenum format, GLsizei width) { - GLint bytesPerTile, stride; + GLint stride; switch (format) { + case GL_COMPRESSED_RGB_FXT1_3DFX: + case GL_COMPRESSED_RGBA_FXT1_3DFX: + stride = ((width + 7) / 8) * 16; /* 16 bytes per 8x4 tile */ + break; case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: - bytesPerTile = 8; + case GL_RGB_S3TC: + case GL_RGB4_S3TC: + stride = ((width + 3) / 4) * 8; /* 8 bytes per 4x4 tile */ break; case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: - bytesPerTile = 16; + case GL_RGBA_S3TC: + case GL_RGBA4_S3TC: + stride = ((width + 3) / 4) * 16; /* 16 bytes per 4x4 tile */ break; default: return 0; } - stride = ((width + 3) / 4) * bytesPerTile; return stride; } @@ -185,29 +219,39 @@ _mesa_compressed_image_address(GLint col, GLint row, GLint img, GLenum format, GLsizei width, const GLubyte *image) { - GLint bytesPerTile, stride; GLubyte *addr; - ASSERT((row & 3) == 0); - ASSERT((col & 3) == 0); (void) img; + /* We try to spot a "complete" subtexture "above" ROW, COL; + * this texture is given by appropriate rounding of WIDTH x ROW. + * Then we just add the amount left (usually on the left). + * + * Example for X*Y microtiles (Z bytes each) + * offset = Z * (((width + X - 1) / X) * (row / Y) + col / X); + */ + switch (format) { + case GL_COMPRESSED_RGB_FXT1_3DFX: + case GL_COMPRESSED_RGBA_FXT1_3DFX: + addr = (GLubyte *) image + 16 * (((width + 7) / 8) * (row / 4) + col / 8); + break; case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: - bytesPerTile = 8; + case GL_RGB_S3TC: + case GL_RGB4_S3TC: + addr = (GLubyte *) image + 8 * (((width + 3) / 4) * (row / 4) + col / 4); break; case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: - bytesPerTile = 16; + case GL_RGBA_S3TC: + case GL_RGBA4_S3TC: + addr = (GLubyte *) image + 16 * (((width + 3) / 4) * (row / 4) + col / 4); break; default: return 0; } - stride = ((width + 3) / 4) * bytesPerTile; - - addr = (GLubyte *) image + (row / 4) * stride + (col / 4) * bytesPerTile; return addr; } diff --git a/src/mesa/main/texformat.c b/src/mesa/main/texformat.c index b5c721f211d..7af0b1cdf48 100644 --- a/src/mesa/main/texformat.c +++ b/src/mesa/main/texformat.c @@ -453,6 +453,40 @@ const struct gl_texture_format _mesa_texformat_ycbcr_rev = { fetch_3d_texel_ycbcr_rev, /* FetchTexel3D */ }; +const struct gl_texture_format _mesa_texformat_rgb_fxt1 = { + MESA_FORMAT_RGB_FXT1, /* MesaFormat */ + GL_RGB, /* BaseFormat */ + 4, /*approx*/ /* RedBits */ + 4, /*approx*/ /* GreenBits */ + 4, /*approx*/ /* BlueBits */ + 0, /* AlphaBits */ + 0, /* LuminanceBits */ + 0, /* IntensityBits */ + 0, /* IndexBits */ + 0, /* DepthBits */ + 0, /* TexelBytes */ + NULL, /*impossible*/ /* FetchTexel1D */ + fetch_2d_texel_rgb_fxt1, /* FetchTexel2D */ + NULL, /*impossible*/ /* FetchTexel3D */ +}; + +const struct gl_texture_format _mesa_texformat_rgba_fxt1 = { + MESA_FORMAT_RGBA_FXT1, /* MesaFormat */ + GL_RGBA, /* BaseFormat */ + 4, /*approx*/ /* RedBits */ + 4, /*approx*/ /* GreenBits */ + 4, /*approx*/ /* BlueBits */ + 1, /*approx*/ /* AlphaBits */ + 0, /* LuminanceBits */ + 0, /* IntensityBits */ + 0, /* IndexBits */ + 0, /* DepthBits */ + 0, /* TexelBytes */ + NULL, /*impossible*/ /* FetchTexel1D */ + fetch_2d_texel_rgba_fxt1, /* FetchTexel2D */ + NULL, /*impossible*/ /* FetchTexel3D */ +}; + const struct gl_texture_format _mesa_texformat_rgb_dxt1 = { MESA_FORMAT_RGB_DXT1, /* MesaFormat */ GL_RGB, /* BaseFormat */ @@ -838,13 +872,17 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat, case GL_COMPRESSED_RGB_ARB: if (!ctx->Extensions.ARB_texture_compression) _mesa_problem(ctx, "texture compression extension not enabled"); - if (ctx->Extensions.EXT_texture_compression_s3tc) + if (ctx->Extensions.TDFX_texture_compression_FXT1) + return &_mesa_texformat_rgb_fxt1; + else if (ctx->Extensions.EXT_texture_compression_s3tc || ctx->Extensions.S3_s3tc) return &_mesa_texformat_rgb_dxt1; return &_mesa_texformat_rgb; case GL_COMPRESSED_RGBA_ARB: if (!ctx->Extensions.ARB_texture_compression) _mesa_problem(ctx, "texture compression extension not enabled"); - if (ctx->Extensions.EXT_texture_compression_s3tc) + if (ctx->Extensions.TDFX_texture_compression_FXT1) + return &_mesa_texformat_rgba_fxt1; + else if (ctx->Extensions.EXT_texture_compression_s3tc || ctx->Extensions.S3_s3tc) return &_mesa_texformat_rgba_dxt3; /* Not rgba_dxt1! See the spec */ return &_mesa_texformat_rgba; @@ -855,6 +893,18 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat, else return &_mesa_texformat_ycbcr_rev; + /* GL_3DFX_texture_compression_FXT1 */ + case GL_COMPRESSED_RGB_FXT1_3DFX: + if (ctx->Extensions.TDFX_texture_compression_FXT1) + return &_mesa_texformat_rgb_fxt1; + else + return NULL; + case GL_COMPRESSED_RGBA_FXT1_3DFX: + if (ctx->Extensions.TDFX_texture_compression_FXT1) + return &_mesa_texformat_rgba_fxt1; + else + return NULL; + /* GL_EXT_texture_compression_s3tc */ case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: if (ctx->Extensions.EXT_texture_compression_s3tc) @@ -877,6 +927,20 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat, else return NULL; + /* GL_S3_s3tc */ + case GL_RGB_S3TC: + case GL_RGB4_S3TC: + if (ctx->Extensions.S3_s3tc) + return &_mesa_texformat_rgb_dxt1; + else + return NULL; + case GL_RGBA_S3TC: + case GL_RGBA4_S3TC: + if (ctx->Extensions.S3_s3tc) + return &_mesa_texformat_rgba_dxt3; + else + return NULL; + default: _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()"); return NULL; diff --git a/src/mesa/main/texformat.h b/src/mesa/main/texformat.h index 07fa2adb75f..c43da46d7b1 100644 --- a/src/mesa/main/texformat.h +++ b/src/mesa/main/texformat.h @@ -75,6 +75,8 @@ enum _format { MESA_FORMAT_YCBCR_REV, /* UorV UorV YYYY YYYY */ /*@}*/ + MESA_FORMAT_RGB_FXT1, + MESA_FORMAT_RGBA_FXT1, MESA_FORMAT_RGB_DXT1, MESA_FORMAT_RGBA_DXT1, MESA_FORMAT_RGBA_DXT3, @@ -162,6 +164,8 @@ extern const struct gl_texture_format _mesa_texformat_i8; extern const struct gl_texture_format _mesa_texformat_ci8; extern const struct gl_texture_format _mesa_texformat_ycbcr; extern const struct gl_texture_format _mesa_texformat_ycbcr_rev; +extern const struct gl_texture_format _mesa_texformat_rgb_fxt1; +extern const struct gl_texture_format _mesa_texformat_rgba_fxt1; extern const struct gl_texture_format _mesa_texformat_rgb_dxt1; extern const struct gl_texture_format _mesa_texformat_rgba_dxt1; extern const struct gl_texture_format _mesa_texformat_rgba_dxt3; diff --git a/src/mesa/main/texformat_tmp.h b/src/mesa/main/texformat_tmp.h index 840fcd25498..14eb0463abf 100644 --- a/src/mesa/main/texformat_tmp.h +++ b/src/mesa/main/texformat_tmp.h @@ -337,9 +337,9 @@ static void FETCH(ycbcr_rev)( const struct gl_texture_image *texImage, const GLushort *src0 = USHORT_SRC( texImage, (i & ~1), j, k ); /* even */ const GLushort *src1 = src0 + 1; /* odd */ const GLubyte y0 = *src0 & 0xff; /* luminance */ - const GLubyte cr = (*src0 >> 8) & 0xff; /* chroma U */ + const GLubyte cr = (*src0 >> 8) & 0xff; /* chroma V */ const GLubyte y1 = *src1 & 0xff; /* luminance */ - const GLubyte cb = (*src1 >> 8) & 0xff; /* chroma V */ + const GLubyte cb = (*src1 >> 8) & 0xff; /* chroma U */ GLchan *rgba = (GLchan *) texel; GLint r, g, b; if (i & 1) { @@ -362,6 +362,27 @@ static void FETCH(ycbcr_rev)( const struct gl_texture_image *texImage, #if DIM == 2 +static void FETCH(rgb_fxt1)( const struct gl_texture_image *texImage, + GLint i, GLint j, GLint k, GLvoid *texel ) +{ + /* Extract the (i,j) pixel from texImage->Data and return it + * in texel[RCOMP], texel[GCOMP], texel[BCOMP], texel[ACOMP]. + */ +} +#endif + +#if DIM == 2 +static void FETCH(rgba_fxt1)( const struct gl_texture_image *texImage, + GLint i, GLint j, GLint k, GLvoid *texel ) +{ + /* Extract the (i,j) pixel from texImage->Data and return it + * in texel[RCOMP], texel[GCOMP], texel[BCOMP], texel[ACOMP]. + */ +} +#endif + + +#if DIM == 2 static void FETCH(rgb_dxt1)( const struct gl_texture_image *texImage, GLint i, GLint j, GLint k, GLvoid *texel ) { diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index e10b75b0b3c..ec08168fc02 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -262,6 +262,30 @@ _mesa_base_tex_format( GLcontext *ctx, GLint format ) return GL_RGBA; else return -1; + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: + if (ctx->Extensions.EXT_texture_compression_s3tc) + return GL_RGB; + else + return -1; + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: + if (ctx->Extensions.EXT_texture_compression_s3tc) + return GL_RGBA; + else + return -1; + case GL_RGB_S3TC: + case GL_RGB4_S3TC: + if (ctx->Extensions.S3_s3tc) + return GL_RGB; + else + return -1; + case GL_RGBA_S3TC: + case GL_RGBA4_S3TC: + if (ctx->Extensions.S3_s3tc) + return GL_RGBA; + else + return -1; case GL_YCBCR_MESA: if (ctx->Extensions.MESA_ycbcr_texture) @@ -366,13 +390,24 @@ is_index_format(GLenum format) * are supported. */ static GLboolean -is_compressed_format(GLenum internalFormat) +is_compressed_format(GLcontext *ctx, GLenum internalFormat) { switch (internalFormat) { case GL_COMPRESSED_RGB_FXT1_3DFX: case GL_COMPRESSED_RGBA_FXT1_3DFX: + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: + case GL_RGB_S3TC: + case GL_RGB4_S3TC: + case GL_RGBA_S3TC: + case GL_RGBA4_S3TC: return GL_TRUE; default: + if (ctx->Driver.IsCompressedFormat) { + return ctx->Driver.IsCompressedFormat(ctx, internalFormat); + } return GL_FALSE; } } @@ -916,7 +951,7 @@ _mesa_init_teximage_fields(GLcontext *ctx, GLenum target, img->Height2 = height - 2 * border; /*1 << img->HeightLog2;*/ img->Depth2 = depth - 2 * border; /*1 << img->DepthLog2;*/ img->MaxLog2 = MAX2(img->WidthLog2, img->HeightLog2); - img->IsCompressed = is_compressed_format(internalFormat); + img->IsCompressed = is_compressed_format(ctx, internalFormat); if (img->IsCompressed) img->CompressedSize = _mesa_compressed_texture_size(ctx, width, height, depth, internalFormat); @@ -1236,7 +1271,7 @@ texture_error_check( GLcontext *ctx, GLenum target, } } - if (is_compressed_format(internalFormat)) { + if (is_compressed_format(ctx, internalFormat)) { if (target == GL_TEXTURE_2D || target == GL_PROXY_TEXTURE_2D) { /* OK */ } @@ -1569,7 +1604,7 @@ copytexture_error_check( GLcontext *ctx, GLuint dimensions, return GL_TRUE; } - if (is_compressed_format(internalFormat)) { + if (is_compressed_format(ctx, internalFormat)) { if (target != GL_TEXTURE_2D) { _mesa_error(ctx, GL_INVALID_ENUM, "glCopyTexImage%d(target)", dimensions); @@ -1756,7 +1791,7 @@ copytexsubimage_error_check( GLcontext *ctx, GLuint dimensions, * \param type pixel data type. * \param pixels pixel data. */ -void +void GLAPIENTRY _mesa_GetTexImage( GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels ) { @@ -1895,7 +1930,7 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format, /* * Called from the API. Note that width includes the border. */ -void +void GLAPIENTRY _mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels ) @@ -1984,7 +2019,7 @@ _mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat, } -void +void GLAPIENTRY _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, @@ -2089,7 +2124,7 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat, * Called by the API or display list executor. * Note that width and height include the border. */ -void +void GLAPIENTRY _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, @@ -2170,7 +2205,7 @@ _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat, } -void +void GLAPIENTRY _mesa_TexImage3DEXT( GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, @@ -2182,7 +2217,7 @@ _mesa_TexImage3DEXT( GLenum target, GLint level, GLenum internalFormat, -void +void GLAPIENTRY _mesa_TexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, @@ -2227,7 +2262,7 @@ _mesa_TexSubImage1D( GLenum target, GLint level, } -void +void GLAPIENTRY _mesa_TexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, @@ -2276,7 +2311,7 @@ _mesa_TexSubImage2D( GLenum target, GLint level, -void +void GLAPIENTRY _mesa_TexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, @@ -2321,7 +2356,7 @@ _mesa_TexSubImage3D( GLenum target, GLint level, -void +void GLAPIENTRY _mesa_CopyTexImage1D( GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, @@ -2381,7 +2416,7 @@ _mesa_CopyTexImage1D( GLenum target, GLint level, -void +void GLAPIENTRY _mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border ) @@ -2441,7 +2476,7 @@ _mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat, -void +void GLAPIENTRY _mesa_CopyTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width ) { @@ -2477,7 +2512,7 @@ _mesa_CopyTexSubImage1D( GLenum target, GLint level, -void +void GLAPIENTRY _mesa_CopyTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height ) @@ -2516,7 +2551,7 @@ _mesa_CopyTexSubImage2D( GLenum target, GLint level, -void +void GLAPIENTRY _mesa_CopyTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height ) @@ -2612,7 +2647,7 @@ compressed_texture_error_check(GLcontext *ctx, GLint dimensions, maxTextureSize = 1 << (maxLevels - 1); - if (!is_compressed_format(internalFormat)) + if (!is_compressed_format(ctx, internalFormat)) return GL_INVALID_ENUM; if (border != 0) @@ -2701,7 +2736,7 @@ compressed_subtexture_error_check(GLcontext *ctx, GLint dimensions, maxTextureSize = 1 << (maxLevels - 1); - if (!is_compressed_format(format)) + if (!is_compressed_format(ctx, format)) return GL_INVALID_ENUM; if (width < 1 || width > maxTextureSize) @@ -2733,7 +2768,7 @@ compressed_subtexture_error_check(GLcontext *ctx, GLint dimensions, -void +void GLAPIENTRY _mesa_CompressedTexImage1DARB(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, @@ -2812,7 +2847,7 @@ _mesa_CompressedTexImage1DARB(GLenum target, GLint level, } -void +void GLAPIENTRY _mesa_CompressedTexImage2DARB(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, @@ -2896,7 +2931,7 @@ _mesa_CompressedTexImage2DARB(GLenum target, GLint level, } -void +void GLAPIENTRY _mesa_CompressedTexImage3DARB(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, @@ -2976,7 +3011,7 @@ _mesa_CompressedTexImage3DARB(GLenum target, GLint level, } -void +void GLAPIENTRY _mesa_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data) @@ -3024,7 +3059,7 @@ _mesa_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset, } -void +void GLAPIENTRY _mesa_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, @@ -3074,7 +3109,7 @@ _mesa_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset, } -void +void GLAPIENTRY _mesa_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, @@ -3126,7 +3161,7 @@ _mesa_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset, } -void +void GLAPIENTRY _mesa_GetCompressedTexImageARB(GLenum target, GLint level, GLvoid *img) { const struct gl_texture_unit *texUnit; diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h index e90cd717052..699b4e6bdf3 100644 --- a/src/mesa/main/teximage.h +++ b/src/mesa/main/teximage.h @@ -97,44 +97,44 @@ _mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level, /** \name API entry point functions */ /*@{*/ -extern void +extern void GLAPIENTRY _mesa_TexImage1D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels ); -extern void +extern void GLAPIENTRY _mesa_TexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels ); -extern void +extern void GLAPIENTRY _mesa_TexImage3D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels ); -extern void +extern void GLAPIENTRY _mesa_TexImage3DEXT( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels ); -extern void +extern void GLAPIENTRY _mesa_GetTexImage( GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels ); -extern void +extern void GLAPIENTRY _mesa_TexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels ); -extern void +extern void GLAPIENTRY _mesa_TexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, @@ -142,7 +142,7 @@ _mesa_TexSubImage2D( GLenum target, GLint level, const GLvoid *pixels ); -extern void +extern void GLAPIENTRY _mesa_TexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, @@ -150,48 +150,48 @@ _mesa_TexSubImage3D( GLenum target, GLint level, const GLvoid *pixels ); -extern void +extern void GLAPIENTRY _mesa_CopyTexImage1D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border ); -extern void +extern void GLAPIENTRY _mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border ); -extern void +extern void GLAPIENTRY _mesa_CopyTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width ); -extern void +extern void GLAPIENTRY _mesa_CopyTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height ); -extern void +extern void GLAPIENTRY _mesa_CopyTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height ); -extern void +extern void GLAPIENTRY _mesa_CompressedTexImage1DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -extern void +extern void GLAPIENTRY _mesa_CompressedTexImage2DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -extern void +extern void GLAPIENTRY _mesa_CompressedTexImage3DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, @@ -202,24 +202,24 @@ _mesa_CompressedTexImage3DARB(GLenum target, GLint level, #define _mesa_CompressedTexSubImage2DARB _mesa_CompressedTexSubImage2DAR #define _mesa_CompressedTexSubImage3DARB _mesa_CompressedTexSubImage3DAR #endif -extern void +extern void GLAPIENTRY _mesa_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -extern void +extern void GLAPIENTRY _mesa_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -extern void +extern void GLAPIENTRY _mesa_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -extern void +extern void GLAPIENTRY _mesa_GetCompressedTexImageARB(GLenum target, GLint lod, GLvoid *img); /*@}*/ diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index 08c59a0854d..10fff646767 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -603,7 +603,7 @@ _glthread_DECLARE_STATIC_MUTEX(GenTexturesLock); * to find a block of free texture IDs which are stored in \p texName. * Corresponding empty texture objects are also generated. */ -void +void GLAPIENTRY _mesa_GenTextures( GLsizei n, GLuint *texName ) { GET_CURRENT_CONTEXT(ctx); @@ -655,7 +655,7 @@ _mesa_GenTextures( GLsizei n, GLuint *texName ) * it and decrementing the reference count if so. If the texture reference * count is zero, delete its object. */ -void +void GLAPIENTRY _mesa_DeleteTextures( GLsizei n, const GLuint *texName) { GET_CURRENT_CONTEXT(ctx); @@ -744,7 +744,7 @@ _mesa_DeleteTextures( GLsizei n, const GLuint *texName) * calls dd_function_table::BindTexture. Decrements the old texture reference * count and deletes it if it reaches zero. */ -void +void GLAPIENTRY _mesa_BindTexture( GLenum target, GLuint texName ) { GET_CURRENT_CONTEXT(ctx); @@ -900,7 +900,7 @@ _mesa_BindTexture( GLenum target, GLuint texName ) * Looks up each texture in the hash, clamps the corresponding priority between * 0.0 and 1.0, and calls dd_function_table::PrioritizeTexture. */ -void +void GLAPIENTRY _mesa_PrioritizeTextures( GLsizei n, const GLuint *texName, const GLclampf *priorities ) { @@ -945,7 +945,7 @@ _mesa_PrioritizeTextures( GLsizei n, const GLuint *texName, * Looks up each texture in the hash and calls * dd_function_table::IsTextureResident. */ -GLboolean +GLboolean GLAPIENTRY _mesa_AreTexturesResident(GLsizei n, const GLuint *texName, GLboolean *residences) { @@ -1006,7 +1006,7 @@ _mesa_AreTexturesResident(GLsizei n, const GLuint *texName, * * Calls _mesa_HashLookup(). */ -GLboolean +GLboolean GLAPIENTRY _mesa_IsTexture( GLuint texture ) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/texobj.h b/src/mesa/main/texobj.h index f7e8e690c4c..c5cce28c370 100644 --- a/src/mesa/main/texobj.h +++ b/src/mesa/main/texobj.h @@ -72,28 +72,28 @@ _mesa_test_texobj_completeness( const GLcontext *ctx, */ /*@{*/ -extern void +extern void GLAPIENTRY _mesa_GenTextures( GLsizei n, GLuint *textures ); -extern void +extern void GLAPIENTRY _mesa_DeleteTextures( GLsizei n, const GLuint *textures ); -extern void +extern void GLAPIENTRY _mesa_BindTexture( GLenum target, GLuint texture ); -extern void +extern void GLAPIENTRY _mesa_PrioritizeTextures( GLsizei n, const GLuint *textures, const GLclampf *priorities ); -extern GLboolean +extern GLboolean GLAPIENTRY _mesa_AreTexturesResident( GLsizei n, const GLuint *textures, GLboolean *residences ); -extern GLboolean +extern GLboolean GLAPIENTRY _mesa_IsTexture( GLuint texture ); /*@}*/ diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c index 95009a23a5c..0cfddc15768 100644 --- a/src/mesa/main/texstate.c +++ b/src/mesa/main/texstate.c @@ -151,7 +151,7 @@ _mesa_print_texunit_state( GLcontext *ctx, GLuint unit ) /**********************************************************************/ -void +void GLAPIENTRY _mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param ) { GET_CURRENT_CONTEXT(ctx); @@ -580,7 +580,7 @@ _mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param ) } -void +void GLAPIENTRY _mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param ) { _mesa_TexEnvfv( target, pname, ¶m ); @@ -588,7 +588,7 @@ _mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param ) -void +void GLAPIENTRY _mesa_TexEnvi( GLenum target, GLenum pname, GLint param ) { GLfloat p[4]; @@ -598,7 +598,7 @@ _mesa_TexEnvi( GLenum target, GLenum pname, GLint param ) } -void +void GLAPIENTRY _mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param ) { GLfloat p[4]; @@ -616,7 +616,7 @@ _mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param ) } -void +void GLAPIENTRY _mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); @@ -827,7 +827,7 @@ _mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ) } -void +void GLAPIENTRY _mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); @@ -1078,14 +1078,14 @@ _mesa_validate_texture_wrap_mode(GLcontext * ctx, } -void +void GLAPIENTRY _mesa_TexParameterf( GLenum target, GLenum pname, GLfloat param ) { _mesa_TexParameterfv(target, pname, ¶m); } -void +void GLAPIENTRY _mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); @@ -1404,7 +1404,7 @@ _mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params ) } -void +void GLAPIENTRY _mesa_TexParameteri( GLenum target, GLenum pname, GLint param ) { GLfloat fparam[4]; @@ -1417,7 +1417,7 @@ _mesa_TexParameteri( GLenum target, GLenum pname, GLint param ) } -void +void GLAPIENTRY _mesa_TexParameteriv( GLenum target, GLenum pname, const GLint *params ) { GLfloat fparam[4]; @@ -1438,7 +1438,7 @@ _mesa_TexParameteriv( GLenum target, GLenum pname, const GLint *params ) } -void +void GLAPIENTRY _mesa_GetTexLevelParameterfv( GLenum target, GLint level, GLenum pname, GLfloat *params ) { @@ -1480,7 +1480,7 @@ tex_image_dimensions(GLcontext *ctx, GLenum target) } -void +void GLAPIENTRY _mesa_GetTexLevelParameteriv( GLenum target, GLint level, GLenum pname, GLint *params ) { @@ -1656,7 +1656,7 @@ _mesa_GetTexLevelParameteriv( GLenum target, GLint level, -void +void GLAPIENTRY _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); @@ -1780,7 +1780,7 @@ _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params ) } -void +void GLAPIENTRY _mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); @@ -1917,7 +1917,7 @@ _mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params ) /**********************************************************************/ #if FEATURE_texgen -void +void GLAPIENTRY _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); @@ -2156,7 +2156,7 @@ _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) } -void +void GLAPIENTRY _mesa_TexGeniv(GLenum coord, GLenum pname, const GLint *params ) { GLfloat p[4]; @@ -2173,7 +2173,7 @@ _mesa_TexGeniv(GLenum coord, GLenum pname, const GLint *params ) } -void +void GLAPIENTRY _mesa_TexGend(GLenum coord, GLenum pname, GLdouble param ) { GLfloat p = (GLfloat) param; @@ -2181,7 +2181,7 @@ _mesa_TexGend(GLenum coord, GLenum pname, GLdouble param ) } -void +void GLAPIENTRY _mesa_TexGendv(GLenum coord, GLenum pname, const GLdouble *params ) { GLfloat p[4]; @@ -2198,14 +2198,14 @@ _mesa_TexGendv(GLenum coord, GLenum pname, const GLdouble *params ) } -void +void GLAPIENTRY _mesa_TexGenf( GLenum coord, GLenum pname, GLfloat param ) { _mesa_TexGenfv(coord, pname, ¶m); } -void +void GLAPIENTRY _mesa_TexGeni( GLenum coord, GLenum pname, GLint param ) { _mesa_TexGeniv( coord, pname, ¶m ); @@ -2213,7 +2213,7 @@ _mesa_TexGeni( GLenum coord, GLenum pname, GLint param ) -void +void GLAPIENTRY _mesa_GetTexGendv( GLenum coord, GLenum pname, GLdouble *params ) { GET_CURRENT_CONTEXT(ctx); @@ -2290,7 +2290,7 @@ _mesa_GetTexGendv( GLenum coord, GLenum pname, GLdouble *params ) -void +void GLAPIENTRY _mesa_GetTexGenfv( GLenum coord, GLenum pname, GLfloat *params ) { GET_CURRENT_CONTEXT(ctx); @@ -2367,7 +2367,7 @@ _mesa_GetTexGenfv( GLenum coord, GLenum pname, GLfloat *params ) -void +void GLAPIENTRY _mesa_GetTexGeniv( GLenum coord, GLenum pname, GLint *params ) { GET_CURRENT_CONTEXT(ctx); @@ -2468,7 +2468,7 @@ _mesa_GetTexGeniv( GLenum coord, GLenum pname, GLint *params ) #endif /* GL_ARB_multitexture */ -void +void GLAPIENTRY _mesa_ActiveTextureARB( GLenum target ) { GET_CURRENT_CONTEXT(ctx); @@ -2503,7 +2503,7 @@ _mesa_ActiveTextureARB( GLenum target ) /* GL_ARB_multitexture */ -void +void GLAPIENTRY _mesa_ClientActiveTextureARB( GLenum target ) { GET_CURRENT_CONTEXT(ctx); @@ -2525,7 +2525,7 @@ _mesa_ClientActiveTextureARB( GLenum target ) /* Pixel Texgen Extensions */ /**********************************************************************/ -void +void GLAPIENTRY _mesa_PixelTexGenSGIX(GLenum mode) { GLenum newRgbSource, newAlphaSource; @@ -2564,21 +2564,21 @@ _mesa_PixelTexGenSGIX(GLenum mode) } -void +void GLAPIENTRY _mesa_PixelTexGenParameterfSGIS(GLenum target, GLfloat value) { _mesa_PixelTexGenParameteriSGIS(target, (GLint) value); } -void +void GLAPIENTRY _mesa_PixelTexGenParameterfvSGIS(GLenum target, const GLfloat *value) { _mesa_PixelTexGenParameteriSGIS(target, (GLint) *value); } -void +void GLAPIENTRY _mesa_PixelTexGenParameteriSGIS(GLenum target, GLint value) { GET_CURRENT_CONTEXT(ctx); @@ -2609,14 +2609,14 @@ _mesa_PixelTexGenParameteriSGIS(GLenum target, GLint value) } -void +void GLAPIENTRY _mesa_PixelTexGenParameterivSGIS(GLenum target, const GLint *value) { _mesa_PixelTexGenParameteriSGIS(target, *value); } -void +void GLAPIENTRY _mesa_GetPixelTexGenParameterfvSGIS(GLenum target, GLfloat *value) { GET_CURRENT_CONTEXT(ctx); @@ -2634,7 +2634,7 @@ _mesa_GetPixelTexGenParameterfvSGIS(GLenum target, GLfloat *value) } -void +void GLAPIENTRY _mesa_GetPixelTexGenParameterivSGIS(GLenum target, GLint *value) { GET_CURRENT_CONTEXT(ctx); diff --git a/src/mesa/main/texstate.h b/src/mesa/main/texstate.h index d2cde7b326f..7cc3d2c19ce 100644 --- a/src/mesa/main/texstate.h +++ b/src/mesa/main/texstate.h @@ -47,89 +47,89 @@ _mesa_print_texunit_state( GLcontext *ctx, GLuint unit ); */ /*@{*/ -extern void +extern void GLAPIENTRY _mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ); -extern void +extern void GLAPIENTRY _mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params ); -extern void +extern void GLAPIENTRY _mesa_GetTexGendv( GLenum coord, GLenum pname, GLdouble *params ); -extern void +extern void GLAPIENTRY _mesa_GetTexGenfv( GLenum coord, GLenum pname, GLfloat *params ); -extern void +extern void GLAPIENTRY _mesa_GetTexGeniv( GLenum coord, GLenum pname, GLint *params ); -extern void +extern void GLAPIENTRY _mesa_GetTexLevelParameterfv( GLenum target, GLint level, GLenum pname, GLfloat *params ); -extern void +extern void GLAPIENTRY _mesa_GetTexLevelParameteriv( GLenum target, GLint level, GLenum pname, GLint *params ); -extern void +extern void GLAPIENTRY _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params ); -extern void +extern void GLAPIENTRY _mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params ); -extern void +extern void GLAPIENTRY _mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param ); -extern void +extern void GLAPIENTRY _mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param ); -extern void +extern void GLAPIENTRY _mesa_TexEnvi( GLenum target, GLenum pname, GLint param ); -extern void +extern void GLAPIENTRY _mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param ); -extern void +extern void GLAPIENTRY _mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params ); -extern void +extern void GLAPIENTRY _mesa_TexParameterf( GLenum target, GLenum pname, GLfloat param ); -extern void +extern void GLAPIENTRY _mesa_TexParameteri( GLenum target, GLenum pname, GLint param ); -extern void +extern void GLAPIENTRY _mesa_TexParameteriv( GLenum target, GLenum pname, const GLint *params ); -extern void +extern void GLAPIENTRY _mesa_TexGend( GLenum coord, GLenum pname, GLdouble param ); -extern void +extern void GLAPIENTRY _mesa_TexGendv( GLenum coord, GLenum pname, const GLdouble *params ); -extern void +extern void GLAPIENTRY _mesa_TexGenf( GLenum coord, GLenum pname, GLfloat param ); -extern void +extern void GLAPIENTRY _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ); -extern void +extern void GLAPIENTRY _mesa_TexGeni( GLenum coord, GLenum pname, GLint param ); -extern void +extern void GLAPIENTRY _mesa_TexGeniv( GLenum coord, GLenum pname, const GLint *params ); /* * GL_ARB_multitexture */ -extern void +extern void GLAPIENTRY _mesa_ActiveTextureARB( GLenum target ); -extern void +extern void GLAPIENTRY _mesa_ClientActiveTextureARB( GLenum target ); @@ -137,37 +137,37 @@ _mesa_ClientActiveTextureARB( GLenum target ); * Pixel Texture Extensions */ -extern void +extern void GLAPIENTRY _mesa_PixelTexGenSGIX(GLenum mode); -extern void +extern void GLAPIENTRY _mesa_PixelTexGenParameterfSGIS(GLenum target, GLfloat value); #ifdef VMS #define _mesa_PixelTexGenParameterfvSGIS _mesa_PixelTexGenParameterfv #endif -extern void +extern void GLAPIENTRY _mesa_PixelTexGenParameterfvSGIS(GLenum target, const GLfloat *value); -extern void +extern void GLAPIENTRY _mesa_PixelTexGenParameteriSGIS(GLenum target, GLint value); #ifdef VMS #define _mesa_PixelTexGenParameterivSGIS _mesa_PixelTexGenParameteriv #endif -extern void +extern void GLAPIENTRY _mesa_PixelTexGenParameterivSGIS(GLenum target, const GLint *value); #ifdef VMS #define _mesa_GetPixelTexGenParameterfvSGIS _mesa_GetPixelTexGenParameterfv #endif -extern void +extern void GLAPIENTRY _mesa_GetPixelTexGenParameterfvSGIS(GLenum target, GLfloat *value); #ifdef VMS #define _mesa_GetPixelTexGenParameterivSGIS _mesa_GetPixelTexGenParameteriv #endif -extern void +extern void GLAPIENTRY _mesa_GetPixelTexGenParameterivSGIS(GLenum target, GLint *value); /*@}*/ diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c index 5a564fbc153..f4b864cfb3e 100644 --- a/src/mesa/main/texstore.c +++ b/src/mesa/main/texstore.c @@ -1092,7 +1092,7 @@ _mesa_store_texsubimage3d(GLcontext *ctx, GLenum target, GLint level, texImage->Format, texImage->TexFormat, texImage->Data, width, height, depth, /* src size */ - xoffset, yoffset, xoffset, /* dest offsets */ + xoffset, yoffset, zoffset, /* dest offsets */ texImage->Width * texelBytes, /* dst row stride */ texImage->Width * texImage->Height * texelBytes, format, type, pixels, packing); diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c index fb410540b6c..ddd04b4c81c 100644 --- a/src/mesa/main/varray.c +++ b/src/mesa/main/varray.c @@ -34,9 +34,53 @@ #include "varray.h" -void +#ifndef GL_BOOLEAN +#define GL_BOOLEAN 0x9999 +#endif + + +/** + * Update the fields of a vertex array structure. + * We need to do a few special things for arrays that live in + * vertex buffer objects. + */ +static void +update_array(GLcontext *ctx, struct gl_client_array *array, + GLuint dirtyFlag, GLsizei elementSize, + GLint size, GLenum type, + GLsizei stride, GLboolean normalized, const GLvoid *ptr) +{ + array->Size = size; + array->Type = type; + array->Stride = stride; + array->StrideB = stride ? stride : elementSize; + array->Normalized = normalized; + array->Ptr = (const GLubyte *) ptr; +#if FEATURE_ARB_vertex_buffer_object + array->BufferObj->RefCount--; + /* XXX free buffer object if RefCount == 0 ? */ + array->BufferObj = ctx->Array.ArrayBufferObj; + array->BufferObj->RefCount++; + /* Compute the index of the last array element that's inside the buffer. + * Later in glDrawArrays we'll check if start + count > _MaxElement to + * be sure we won't go out of bounds. + */ + if (ctx->Array.ArrayBufferObj->Name) + array->_MaxElement = ((GLsizeiptrARB) ctx->Array.ArrayBufferObj->Size + - (GLsizeiptrARB) array->Ptr) / array->StrideB; + else +#endif + array->_MaxElement = 2 * 1000 * 1000 * 1000; /* just a big number */ + + ctx->NewState |= _NEW_ARRAY; + ctx->Array.NewState |= dirtyFlag; +} + + +void GLAPIENTRY _mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { + GLsizei elementSize; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); @@ -56,43 +100,34 @@ _mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) /* always need to check that <type> is legal */ switch (type) { case GL_SHORT: - ctx->Array.Vertex.StrideB = size * sizeof(GLshort); + elementSize = size * sizeof(GLshort); break; case GL_INT: - ctx->Array.Vertex.StrideB = size * sizeof(GLint); + elementSize = size * sizeof(GLint); break; case GL_FLOAT: - ctx->Array.Vertex.StrideB = size * sizeof(GLfloat); + elementSize = size * sizeof(GLfloat); break; case GL_DOUBLE: - ctx->Array.Vertex.StrideB = size * sizeof(GLdouble); + elementSize = size * sizeof(GLdouble); break; default: _mesa_error( ctx, GL_INVALID_ENUM, "glVertexPointer(type)" ); return; } - if (stride) - ctx->Array.Vertex.StrideB = stride; - - ctx->Array.Vertex.Size = size; - ctx->Array.Vertex.Type = type; - ctx->Array.Vertex.Stride = stride; - ctx->Array.Vertex.Ptr = (GLubyte *) ptr; -#if FEATURE_ARB_vertex_buffer_object - ctx->Array.Vertex.BufferObj = ctx->Array.ArrayBufferObj; -#endif - ctx->NewState |= _NEW_ARRAY; - ctx->Array.NewState |= _NEW_ARRAY_VERTEX; + update_array(ctx, &ctx->Array.Vertex, _NEW_ARRAY_VERTEX, + elementSize, size, type, stride, GL_FALSE, ptr); if (ctx->Driver.VertexPointer) ctx->Driver.VertexPointer( ctx, size, type, stride, ptr ); } -void +void GLAPIENTRY _mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr ) { + GLsizei elementSize; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); @@ -107,45 +142,37 @@ _mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr ) switch (type) { case GL_BYTE: - ctx->Array.Normal.StrideB = 3 * sizeof(GLbyte); + elementSize = 3 * sizeof(GLbyte); break; case GL_SHORT: - ctx->Array.Normal.StrideB = 3 * sizeof(GLshort); + elementSize = 3 * sizeof(GLshort); break; case GL_INT: - ctx->Array.Normal.StrideB = 3 * sizeof(GLint); + elementSize = 3 * sizeof(GLint); break; case GL_FLOAT: - ctx->Array.Normal.StrideB = 3 * sizeof(GLfloat); + elementSize = 3 * sizeof(GLfloat); break; case GL_DOUBLE: - ctx->Array.Normal.StrideB = 3 * sizeof(GLdouble); + elementSize = 3 * sizeof(GLdouble); break; default: _mesa_error( ctx, GL_INVALID_ENUM, "glNormalPointer(type)" ); return; } - if (stride) - ctx->Array.Normal.StrideB = stride; - ctx->Array.Normal.Size = 3; - ctx->Array.Normal.Type = type; - ctx->Array.Normal.Stride = stride; - ctx->Array.Normal.Ptr = (GLubyte *) ptr; -#if FEATURE_ARB_vertex_buffer_object - ctx->Array.Normal.BufferObj = ctx->Array.ArrayBufferObj; -#endif - ctx->NewState |= _NEW_ARRAY; - ctx->Array.NewState |= _NEW_ARRAY_NORMAL; + update_array(ctx, &ctx->Array.Normal, _NEW_ARRAY_NORMAL, + elementSize, 3, type, stride, GL_FALSE, ptr); if (ctx->Driver.NormalPointer) ctx->Driver.NormalPointer( ctx, type, stride, ptr ); } -void +void GLAPIENTRY _mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { + GLsizei elementSize; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); @@ -153,7 +180,7 @@ _mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) _mesa_error( ctx, GL_INVALID_VALUE, "glColorPointer(size)" ); return; } - if (stride<0) { + if (stride < 0) { _mesa_error( ctx, GL_INVALID_VALUE, "glColorPointer(stride)" ); return; } @@ -164,55 +191,46 @@ _mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) switch (type) { case GL_BYTE: - ctx->Array.Color.StrideB = size * sizeof(GLbyte); + elementSize = size * sizeof(GLbyte); break; case GL_UNSIGNED_BYTE: - ctx->Array.Color.StrideB = size * sizeof(GLubyte); + elementSize = size * sizeof(GLubyte); break; case GL_SHORT: - ctx->Array.Color.StrideB = size * sizeof(GLshort); + elementSize = size * sizeof(GLshort); break; case GL_UNSIGNED_SHORT: - ctx->Array.Color.StrideB = size * sizeof(GLushort); + elementSize = size * sizeof(GLushort); break; case GL_INT: - ctx->Array.Color.StrideB = size * sizeof(GLint); + elementSize = size * sizeof(GLint); break; case GL_UNSIGNED_INT: - ctx->Array.Color.StrideB = size * sizeof(GLuint); + elementSize = size * sizeof(GLuint); break; case GL_FLOAT: - ctx->Array.Color.StrideB = size * sizeof(GLfloat); + elementSize = size * sizeof(GLfloat); break; case GL_DOUBLE: - ctx->Array.Color.StrideB = size * sizeof(GLdouble); + elementSize = size * sizeof(GLdouble); break; default: _mesa_error( ctx, GL_INVALID_ENUM, "glColorPointer(type)" ); return; } - if (stride) - ctx->Array.Color.StrideB = stride; - - ctx->Array.Color.Size = size; - ctx->Array.Color.Type = type; - ctx->Array.Color.Stride = stride; - ctx->Array.Color.Ptr = (GLubyte *) ptr; -#if FEATURE_ARB_vertex_buffer_object - ctx->Array.Color.BufferObj = ctx->Array.ArrayBufferObj; -#endif - ctx->NewState |= _NEW_ARRAY; - ctx->Array.NewState |= _NEW_ARRAY_COLOR0; + update_array(ctx, &ctx->Array.Color, _NEW_ARRAY_COLOR0, + elementSize, size, type, stride, GL_FALSE, ptr); if (ctx->Driver.ColorPointer) ctx->Driver.ColorPointer( ctx, size, type, stride, ptr ); } -void +void GLAPIENTRY _mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr) { + GLint elementSize; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); @@ -223,37 +241,28 @@ _mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr) switch (type) { case GL_FLOAT: - ctx->Array.FogCoord.StrideB = sizeof(GLfloat); + elementSize = sizeof(GLfloat); break; case GL_DOUBLE: - ctx->Array.FogCoord.StrideB = sizeof(GLdouble); + elementSize = sizeof(GLdouble); break; default: _mesa_error( ctx, GL_INVALID_ENUM, "glFogCoordPointer(type)" ); return; } - if (stride) - ctx->Array.FogCoord.StrideB = stride; - - ctx->Array.FogCoord.Size = 1; - ctx->Array.FogCoord.Type = type; - ctx->Array.FogCoord.Stride = stride; - ctx->Array.FogCoord.Ptr = (GLubyte *) ptr; -#if FEATURE_ARB_vertex_buffer_object - ctx->Array.FogCoord.BufferObj = ctx->Array.ArrayBufferObj; -#endif - ctx->NewState |= _NEW_ARRAY; - ctx->Array.NewState |= _NEW_ARRAY_FOGCOORD; + update_array(ctx, &ctx->Array.FogCoord, _NEW_ARRAY_FOGCOORD, + elementSize, 1, type, stride, GL_FALSE, ptr); if (ctx->Driver.FogCoordPointer) ctx->Driver.FogCoordPointer( ctx, type, stride, ptr ); } -void +void GLAPIENTRY _mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr) { + GLsizei elementSize; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); @@ -264,47 +273,38 @@ _mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr) switch (type) { case GL_UNSIGNED_BYTE: - ctx->Array.Index.StrideB = sizeof(GLubyte); + elementSize = sizeof(GLubyte); break; case GL_SHORT: - ctx->Array.Index.StrideB = sizeof(GLshort); + elementSize = sizeof(GLshort); break; case GL_INT: - ctx->Array.Index.StrideB = sizeof(GLint); + elementSize = sizeof(GLint); break; case GL_FLOAT: - ctx->Array.Index.StrideB = sizeof(GLfloat); + elementSize = sizeof(GLfloat); break; case GL_DOUBLE: - ctx->Array.Index.StrideB = sizeof(GLdouble); + elementSize = sizeof(GLdouble); break; default: _mesa_error( ctx, GL_INVALID_ENUM, "glIndexPointer(type)" ); return; } - if (stride) - ctx->Array.Index.StrideB = stride; - - ctx->Array.Index.Size = 1; - ctx->Array.Index.Type = type; - ctx->Array.Index.Stride = stride; - ctx->Array.Index.Ptr = (GLubyte *) ptr; -#if FEATURE_ARB_vertex_buffer_object - ctx->Array.Index.BufferObj = ctx->Array.ArrayBufferObj; -#endif - ctx->NewState |= _NEW_ARRAY; - ctx->Array.NewState |= _NEW_ARRAY_INDEX; + update_array(ctx, &ctx->Array.Index, _NEW_ARRAY_INDEX, + elementSize, 1, type, stride, GL_FALSE, ptr); if (ctx->Driver.IndexPointer) ctx->Driver.IndexPointer( ctx, type, stride, ptr ); } -void +void GLAPIENTRY _mesa_SecondaryColorPointerEXT(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { + GLsizei elementSize; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); @@ -323,58 +323,49 @@ _mesa_SecondaryColorPointerEXT(GLint size, GLenum type, switch (type) { case GL_BYTE: - ctx->Array.SecondaryColor.StrideB = size * sizeof(GLbyte); + elementSize = size * sizeof(GLbyte); break; case GL_UNSIGNED_BYTE: - ctx->Array.SecondaryColor.StrideB = size * sizeof(GLubyte); + elementSize = size * sizeof(GLubyte); break; case GL_SHORT: - ctx->Array.SecondaryColor.StrideB = size * sizeof(GLshort); + elementSize = size * sizeof(GLshort); break; case GL_UNSIGNED_SHORT: - ctx->Array.SecondaryColor.StrideB = size * sizeof(GLushort); + elementSize = size * sizeof(GLushort); break; case GL_INT: - ctx->Array.SecondaryColor.StrideB = size * sizeof(GLint); + elementSize = size * sizeof(GLint); break; case GL_UNSIGNED_INT: - ctx->Array.SecondaryColor.StrideB = size * sizeof(GLuint); + elementSize = size * sizeof(GLuint); break; case GL_FLOAT: - ctx->Array.SecondaryColor.StrideB = size * sizeof(GLfloat); + elementSize = size * sizeof(GLfloat); break; case GL_DOUBLE: - ctx->Array.SecondaryColor.StrideB = size * sizeof(GLdouble); + elementSize = size * sizeof(GLdouble); break; default: _mesa_error( ctx, GL_INVALID_ENUM, "glSecondaryColorPointer(type)" ); return; } - if (stride) - ctx->Array.SecondaryColor.StrideB = stride; - - ctx->Array.SecondaryColor.Size = 3; /* hardwire */ - ctx->Array.SecondaryColor.Type = type; - ctx->Array.SecondaryColor.Stride = stride; - ctx->Array.SecondaryColor.Ptr = (GLubyte *) ptr; -#if FEATURE_ARB_vertex_buffer_object - ctx->Array.SecondaryColor.BufferObj = ctx->Array.ArrayBufferObj; -#endif - ctx->NewState |= _NEW_ARRAY; - ctx->Array.NewState |= _NEW_ARRAY_COLOR1; + update_array(ctx, &ctx->Array.SecondaryColor, _NEW_ARRAY_COLOR1, + elementSize, size, type, stride, GL_FALSE, ptr); if (ctx->Driver.SecondaryColorPointer) ctx->Driver.SecondaryColorPointer( ctx, size, type, stride, ptr ); } -void +void GLAPIENTRY _mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { + GLint elementSize; GET_CURRENT_CONTEXT(ctx); - GLuint texUnit = ctx->Array.ActiveTexture; + const GLuint unit = ctx->Array.ActiveTexture; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); if (size < 1 || size > 4) { @@ -388,64 +379,48 @@ _mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride, if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API)) _mesa_debug(ctx, "glTexCoordPointer(unit %u sz %d type %s stride %d)\n", - texUnit, size, _mesa_lookup_enum_by_nr( type ), stride); + unit, size, _mesa_lookup_enum_by_nr( type ), stride); /* always need to check that <type> is legal */ switch (type) { case GL_SHORT: - ctx->Array.TexCoord[texUnit].StrideB = size * sizeof(GLshort); + elementSize = size * sizeof(GLshort); break; case GL_INT: - ctx->Array.TexCoord[texUnit].StrideB = size * sizeof(GLint); + elementSize = size * sizeof(GLint); break; case GL_FLOAT: - ctx->Array.TexCoord[texUnit].StrideB = size * sizeof(GLfloat); + elementSize = size * sizeof(GLfloat); break; case GL_DOUBLE: - ctx->Array.TexCoord[texUnit].StrideB = size * sizeof(GLdouble); + elementSize = size * sizeof(GLdouble); break; default: _mesa_error( ctx, GL_INVALID_ENUM, "glTexCoordPointer(type)" ); return; } - if (stride) - ctx->Array.TexCoord[texUnit].StrideB = stride; - - ctx->Array.TexCoord[texUnit].Size = size; - ctx->Array.TexCoord[texUnit].Type = type; - ctx->Array.TexCoord[texUnit].Stride = stride; - ctx->Array.TexCoord[texUnit].Ptr = (GLubyte *) ptr; -#if FEATURE_ARB_vertex_buffer_object - ctx->Array.TexCoord[texUnit].BufferObj = ctx->Array.ArrayBufferObj; -#endif - ctx->NewState |= _NEW_ARRAY; - ctx->Array.NewState |= _NEW_ARRAY_TEXCOORD(texUnit); + update_array(ctx, &ctx->Array.TexCoord[unit], _NEW_ARRAY_TEXCOORD(unit), + elementSize, size, type, stride, GL_FALSE, ptr); if (ctx->Driver.TexCoordPointer) ctx->Driver.TexCoordPointer( ctx, size, type, stride, ptr ); } -void -_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *vptr) +void GLAPIENTRY +_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr) { GET_CURRENT_CONTEXT(ctx); - const GLboolean *ptr = (GLboolean *)vptr; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); - if (stride<0) { + if (stride < 0) { _mesa_error( ctx, GL_INVALID_VALUE, "glEdgeFlagPointer(stride)" ); return; } - ctx->Array.EdgeFlag.Stride = stride; - ctx->Array.EdgeFlag.StrideB = stride ? stride : sizeof(GLboolean); - ctx->Array.EdgeFlag.Ptr = (GLboolean *) ptr; -#if FEATURE_ARB_vertex_buffer_object - ctx->Array.EdgeFlag.BufferObj = ctx->Array.ArrayBufferObj; -#endif - ctx->NewState |= _NEW_ARRAY; - ctx->Array.NewState |= _NEW_ARRAY_EDGEFLAG; + + update_array(ctx, &ctx->Array.EdgeFlag, _NEW_ARRAY_EDGEFLAG, + sizeof(GLboolean), 1, GL_BOOLEAN, stride, GL_FALSE, ptr); if (ctx->Driver.EdgeFlagPointer) ctx->Driver.EdgeFlagPointer( ctx, stride, ptr ); @@ -453,10 +428,11 @@ _mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *vptr) #if FEATURE_NV_vertex_program -void +void GLAPIENTRY _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) { + GLsizei elementSize; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); @@ -483,34 +459,24 @@ _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type, /* check for valid 'type' and compute StrideB right away */ switch (type) { case GL_UNSIGNED_BYTE: - ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLubyte); + elementSize = size * sizeof(GLubyte); break; case GL_SHORT: - ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLshort); + elementSize = size * sizeof(GLshort); break; case GL_FLOAT: - ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLfloat); + elementSize = size * sizeof(GLfloat); break; case GL_DOUBLE: - ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLdouble); + elementSize = size * sizeof(GLdouble); break; default: _mesa_error( ctx, GL_INVALID_ENUM, "glVertexAttribPointerNV(type)" ); return; } - if (stride) - ctx->Array.VertexAttrib[index].StrideB = stride; - - ctx->Array.VertexAttrib[index].Stride = stride; - ctx->Array.VertexAttrib[index].Size = size; - ctx->Array.VertexAttrib[index].Type = type; - ctx->Array.VertexAttrib[index].Ptr = (GLubyte *) ptr; -#if FEATURE_ARB_vertex_buffer_object - ctx->Array.VertexAttrib[index].BufferObj = ctx->Array.ArrayBufferObj; -#endif - ctx->NewState |= _NEW_ARRAY; - ctx->Array.NewState |= _NEW_ARRAY_ATTRIB(index); + update_array(ctx, &ctx->Array.VertexAttrib[index], _NEW_ARRAY_ATTRIB(index), + elementSize, size, type, stride, GL_FALSE, ptr); if (ctx->Driver.VertexAttribPointer) ctx->Driver.VertexAttribPointer( ctx, index, size, type, stride, ptr ); @@ -519,11 +485,12 @@ _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type, #if FEATURE_ARB_vertex_program -void +void GLAPIENTRY _mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *ptr) { + GLsizei elementSize; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); @@ -551,47 +518,36 @@ _mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type, /* NOTE: more types are supported here than in the NV extension */ switch (type) { case GL_BYTE: - ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLbyte); + elementSize = size * sizeof(GLbyte); break; case GL_UNSIGNED_BYTE: - ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLubyte); + elementSize = size * sizeof(GLubyte); break; case GL_SHORT: - ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLshort); + elementSize = size * sizeof(GLshort); break; case GL_UNSIGNED_SHORT: - ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLushort); + elementSize = size * sizeof(GLushort); break; case GL_INT: - ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLint); + elementSize = size * sizeof(GLint); break; case GL_UNSIGNED_INT: - ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLuint); + elementSize = size * sizeof(GLuint); break; case GL_FLOAT: - ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLfloat); + elementSize = size * sizeof(GLfloat); break; case GL_DOUBLE: - ctx->Array.VertexAttrib[index].StrideB = size * sizeof(GLdouble); + elementSize = size * sizeof(GLdouble); break; default: _mesa_error( ctx, GL_INVALID_ENUM, "glVertexAttribPointerARB(type)" ); return; } - if (stride) - ctx->Array.VertexAttrib[index].StrideB = stride; - - ctx->Array.VertexAttrib[index].Stride = stride; - ctx->Array.VertexAttrib[index].Size = size; - ctx->Array.VertexAttrib[index].Type = type; - ctx->Array.VertexAttrib[index].Normalized = normalized; - ctx->Array.VertexAttrib[index].Ptr = (GLubyte *) ptr; -#if FEATURE_ARB_vertex_buffer_object - ctx->Array.VertexAttrib[index].BufferObj = ctx->Array.ArrayBufferObj; -#endif - ctx->NewState |= _NEW_ARRAY; - ctx->Array.NewState |= _NEW_ARRAY_ATTRIB(index); + update_array(ctx, &ctx->Array.VertexAttrib[index], _NEW_ARRAY_ATTRIB(index), + elementSize, size, type, stride, normalized, ptr); /* XXX fix if (ctx->Driver.VertexAttribPointer) @@ -601,7 +557,7 @@ _mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type, #endif -void +void GLAPIENTRY _mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr) { @@ -610,7 +566,7 @@ _mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, } -void +void GLAPIENTRY _mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr) { @@ -619,7 +575,7 @@ _mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, } -void +void GLAPIENTRY _mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr) { @@ -628,7 +584,7 @@ _mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, } -void +void GLAPIENTRY _mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr) { @@ -637,7 +593,7 @@ _mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, } -void +void GLAPIENTRY _mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr) { @@ -646,7 +602,7 @@ _mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, } -void +void GLAPIENTRY _mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr) { (void) count; @@ -654,13 +610,12 @@ _mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr) } -void +void GLAPIENTRY _mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer) { GET_CURRENT_CONTEXT(ctx); GLboolean tflag, cflag, nflag; /* enable/disable flags */ GLint tcomps, ccomps, vcomps; /* components per texcoord, color, vertex */ - GLenum ctype = 0; /* color type */ GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */ GLint defstride; /* default stride */ @@ -670,9 +625,9 @@ _mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer) ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); f = sizeof(GLfloat); - c = f * ((4*sizeof(GLubyte) + (f-1)) / f); + c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f); - if (stride<0) { + if (stride < 0) { _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" ); return; } @@ -849,7 +804,7 @@ _mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer) } -void +void GLAPIENTRY _mesa_LockArraysEXT(GLint first, GLsizei count) { GET_CURRENT_CONTEXT(ctx); @@ -876,7 +831,7 @@ _mesa_LockArraysEXT(GLint first, GLsizei count) } -void +void GLAPIENTRY _mesa_UnlockArraysEXT( void ) { GET_CURRENT_CONTEXT(ctx); @@ -897,7 +852,7 @@ _mesa_UnlockArraysEXT( void ) /* GL_EXT_multi_draw_arrays */ /* Somebody forgot to spec the first and count parameters as const! <sigh> */ -void +void GLAPIENTRY _mesa_MultiDrawArraysEXT( GLenum mode, GLint *first, GLsizei *count, GLsizei primcount ) { @@ -915,7 +870,7 @@ _mesa_MultiDrawArraysEXT( GLenum mode, GLint *first, /* GL_EXT_multi_draw_arrays */ -void +void GLAPIENTRY _mesa_MultiDrawElementsEXT( GLenum mode, const GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount ) { @@ -939,7 +894,7 @@ _mesa_MultiDrawElementsEXT( GLenum mode, const GLsizei *count, GLenum type, /* GL_IBM_multimode_draw_arrays */ -void +void GLAPIENTRY _mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first, const GLsizei * count, GLsizei primcount, GLint modestride ) @@ -959,7 +914,7 @@ _mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first, /* GL_IBM_multimode_draw_arrays */ -void +void GLAPIENTRY _mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count, GLenum type, const GLvoid * const * indices, GLsizei primcount, GLint modestride ) @@ -984,7 +939,7 @@ _mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count, /***** Initialization *****/ /**********************************************************************/ -void +void _mesa_init_varray( GLcontext * ctx ) { GLuint i; @@ -1047,12 +1002,12 @@ _mesa_init_varray( GLcontext * ctx ) ctx->Array.EdgeFlag.Flags = CA_CLIENT_DATA; ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */ for (i = 0; i < VERT_ATTRIB_MAX; i++) { - ctx->Array.TexCoord[i].Size = 4; - ctx->Array.TexCoord[i].Type = GL_FLOAT; - ctx->Array.TexCoord[i].Stride = 0; - ctx->Array.TexCoord[i].StrideB = 0; - ctx->Array.TexCoord[i].Ptr = NULL; - ctx->Array.TexCoord[i].Enabled = GL_FALSE; - ctx->Array.TexCoord[i].Flags = CA_CLIENT_DATA; + ctx->Array.VertexAttrib[i].Size = 4; + ctx->Array.VertexAttrib[i].Type = GL_FLOAT; + ctx->Array.VertexAttrib[i].Stride = 0; + ctx->Array.VertexAttrib[i].StrideB = 0; + ctx->Array.VertexAttrib[i].Ptr = NULL; + ctx->Array.VertexAttrib[i].Enabled = GL_FALSE; + ctx->Array.VertexAttrib[i].Flags = CA_CLIENT_DATA; } } diff --git a/src/mesa/main/varray.h b/src/mesa/main/varray.h index d81213f358e..3589735f684 100644 --- a/src/mesa/main/varray.h +++ b/src/mesa/main/varray.h @@ -41,107 +41,107 @@ #if _HAVE_FULL_GL -extern void +extern void GLAPIENTRY _mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); -extern void +extern void GLAPIENTRY _mesa_UnlockArraysEXT( void ); -extern void +extern void GLAPIENTRY _mesa_LockArraysEXT(GLint first, GLsizei count); -extern void +extern void GLAPIENTRY _mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr); -extern void +extern void GLAPIENTRY _mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); -extern void +extern void GLAPIENTRY _mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr); -extern void +extern void GLAPIENTRY _mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); -extern void +extern void GLAPIENTRY _mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr); -extern void +extern void GLAPIENTRY _mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr); -extern void +extern void GLAPIENTRY _mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr); -extern void +extern void GLAPIENTRY _mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr); -extern void +extern void GLAPIENTRY _mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr); -extern void +extern void GLAPIENTRY _mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *ptr); -extern void +extern void GLAPIENTRY _mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr); -extern void +extern void GLAPIENTRY _mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr); -extern void +extern void GLAPIENTRY _mesa_SecondaryColorPointerEXT(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); -extern void +extern void GLAPIENTRY _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -extern void +extern void GLAPIENTRY _mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -extern void +extern void GLAPIENTRY _mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer); -extern void +extern void GLAPIENTRY _mesa_MultiDrawArraysEXT( GLenum mode, GLint *first, GLsizei *count, GLsizei primcount ); -extern void +extern void GLAPIENTRY _mesa_MultiDrawElementsEXT( GLenum mode, const GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount ); -extern void +extern void GLAPIENTRY _mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first, const GLsizei * count, GLsizei primcount, GLint modestride ); -extern void +extern void GLAPIENTRY _mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count, GLenum type, const GLvoid * const * indices, GLsizei primcount, GLint modestride ); diff --git a/src/mesa/main/vtxfmt_tmp.h b/src/mesa/main/vtxfmt_tmp.h index 3cbd278371c..044ec1bbaf7 100644 --- a/src/mesa/main/vtxfmt_tmp.h +++ b/src/mesa/main/vtxfmt_tmp.h @@ -30,316 +30,316 @@ #define PRE_LOOPBACK( FUNC ) #endif -static void TAG(ArrayElement)( GLint i ) +static void GLAPIENTRY TAG(ArrayElement)( GLint i ) { PRE_LOOPBACK( ArrayElement ); _glapi_Dispatch->ArrayElement( i ); } -static void TAG(Color3f)( GLfloat r, GLfloat g, GLfloat b ) +static void GLAPIENTRY TAG(Color3f)( GLfloat r, GLfloat g, GLfloat b ) { PRE_LOOPBACK( Color3f ); _glapi_Dispatch->Color3f( r, g, b ); } -static void TAG(Color3fv)( const GLfloat *v ) +static void GLAPIENTRY TAG(Color3fv)( const GLfloat *v ) { PRE_LOOPBACK( Color3fv ); _glapi_Dispatch->Color3fv( v ); } -static void TAG(Color4f)( GLfloat r, GLfloat g, GLfloat b, GLfloat a ) +static void GLAPIENTRY TAG(Color4f)( GLfloat r, GLfloat g, GLfloat b, GLfloat a ) { PRE_LOOPBACK( Color4f ); _glapi_Dispatch->Color4f( r, g, b, a ); } -static void TAG(Color4fv)( const GLfloat *v ) +static void GLAPIENTRY TAG(Color4fv)( const GLfloat *v ) { PRE_LOOPBACK( Color4fv ); _glapi_Dispatch->Color4fv( v ); } -static void TAG(EdgeFlag)( GLboolean e ) +static void GLAPIENTRY TAG(EdgeFlag)( GLboolean e ) { PRE_LOOPBACK( EdgeFlag ); _glapi_Dispatch->EdgeFlag( e ); } -static void TAG(EdgeFlagv)( const GLboolean *v ) +static void GLAPIENTRY TAG(EdgeFlagv)( const GLboolean *v ) { PRE_LOOPBACK( EdgeFlagv ); _glapi_Dispatch->EdgeFlagv( v ); } -static void TAG(EvalCoord1f)( GLfloat s ) +static void GLAPIENTRY TAG(EvalCoord1f)( GLfloat s ) { PRE_LOOPBACK( EvalCoord1f ); _glapi_Dispatch->EvalCoord1f( s ); } -static void TAG(EvalCoord1fv)( const GLfloat *v ) +static void GLAPIENTRY TAG(EvalCoord1fv)( const GLfloat *v ) { PRE_LOOPBACK( EvalCoord1fv ); _glapi_Dispatch->EvalCoord1fv( v ); } -static void TAG(EvalCoord2f)( GLfloat s, GLfloat t ) +static void GLAPIENTRY TAG(EvalCoord2f)( GLfloat s, GLfloat t ) { PRE_LOOPBACK( EvalCoord2f ); _glapi_Dispatch->EvalCoord2f( s, t ); } -static void TAG(EvalCoord2fv)( const GLfloat *v ) +static void GLAPIENTRY TAG(EvalCoord2fv)( const GLfloat *v ) { PRE_LOOPBACK( EvalCoord2fv ); _glapi_Dispatch->EvalCoord2fv( v ); } -static void TAG(EvalPoint1)( GLint i ) +static void GLAPIENTRY TAG(EvalPoint1)( GLint i ) { PRE_LOOPBACK( EvalPoint1 ); _glapi_Dispatch->EvalPoint1( i ); } -static void TAG(EvalPoint2)( GLint i, GLint j ) +static void GLAPIENTRY TAG(EvalPoint2)( GLint i, GLint j ) { PRE_LOOPBACK( EvalPoint2 ); _glapi_Dispatch->EvalPoint2( i, j ); } -static void TAG(FogCoordfEXT)( GLfloat f ) +static void GLAPIENTRY TAG(FogCoordfEXT)( GLfloat f ) { PRE_LOOPBACK( FogCoordfEXT ); _glapi_Dispatch->FogCoordfEXT( f ); } -static void TAG(FogCoordfvEXT)( const GLfloat *v ) +static void GLAPIENTRY TAG(FogCoordfvEXT)( const GLfloat *v ) { PRE_LOOPBACK( FogCoordfvEXT ); _glapi_Dispatch->FogCoordfvEXT( v ); } -static void TAG(Indexf)( GLfloat f ) +static void GLAPIENTRY TAG(Indexf)( GLfloat f ) { PRE_LOOPBACK( Indexf ); - _glapi_Dispatch->Indexi( f ); + _glapi_Dispatch->Indexf( f ); } -static void TAG(Indexfv)( const GLfloat *v ) +static void GLAPIENTRY TAG(Indexfv)( const GLfloat *v ) { PRE_LOOPBACK( Indexfv ); _glapi_Dispatch->Indexfv( v ); } -static void TAG(Materialfv)( GLenum face, GLenum pname, const GLfloat *v ) +static void GLAPIENTRY TAG(Materialfv)( GLenum face, GLenum pname, const GLfloat *v ) { PRE_LOOPBACK( Materialfv ); _glapi_Dispatch->Materialfv( face, pname, v ); } -static void TAG(MultiTexCoord1fARB)( GLenum target, GLfloat a ) +static void GLAPIENTRY TAG(MultiTexCoord1fARB)( GLenum target, GLfloat a ) { PRE_LOOPBACK( MultiTexCoord1fARB ); _glapi_Dispatch->MultiTexCoord1fARB( target, a ); } -static void TAG(MultiTexCoord1fvARB)( GLenum target, const GLfloat *tc ) +static void GLAPIENTRY TAG(MultiTexCoord1fvARB)( GLenum target, const GLfloat *tc ) { PRE_LOOPBACK( MultiTexCoord1fvARB ); _glapi_Dispatch->MultiTexCoord1fvARB( target, tc ); } -static void TAG(MultiTexCoord2fARB)( GLenum target, GLfloat s, GLfloat t ) +static void GLAPIENTRY TAG(MultiTexCoord2fARB)( GLenum target, GLfloat s, GLfloat t ) { PRE_LOOPBACK( MultiTexCoord2fARB ); _glapi_Dispatch->MultiTexCoord2fARB( target, s, t ); } -static void TAG(MultiTexCoord2fvARB)( GLenum target, const GLfloat *tc ) +static void GLAPIENTRY TAG(MultiTexCoord2fvARB)( GLenum target, const GLfloat *tc ) { PRE_LOOPBACK( MultiTexCoord2fvARB ); _glapi_Dispatch->MultiTexCoord2fvARB( target, tc ); } -static void TAG(MultiTexCoord3fARB)( GLenum target, GLfloat s, +static void GLAPIENTRY TAG(MultiTexCoord3fARB)( GLenum target, GLfloat s, GLfloat t, GLfloat r ) { PRE_LOOPBACK( MultiTexCoord3fARB ); _glapi_Dispatch->MultiTexCoord3fARB( target, s, t, r ); } -static void TAG(MultiTexCoord3fvARB)( GLenum target, const GLfloat *tc ) +static void GLAPIENTRY TAG(MultiTexCoord3fvARB)( GLenum target, const GLfloat *tc ) { PRE_LOOPBACK( MultiTexCoord3fvARB ); _glapi_Dispatch->MultiTexCoord3fvARB( target, tc ); } -static void TAG(MultiTexCoord4fARB)( GLenum target, GLfloat s, +static void GLAPIENTRY TAG(MultiTexCoord4fARB)( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q ) { PRE_LOOPBACK( MultiTexCoord4fARB ); _glapi_Dispatch->MultiTexCoord4fARB( target, s, t, r, q ); } -static void TAG(MultiTexCoord4fvARB)( GLenum target, const GLfloat *tc ) +static void GLAPIENTRY TAG(MultiTexCoord4fvARB)( GLenum target, const GLfloat *tc ) { PRE_LOOPBACK( MultiTexCoord4fvARB ); _glapi_Dispatch->MultiTexCoord4fvARB( target, tc ); } -static void TAG(Normal3f)( GLfloat x, GLfloat y, GLfloat z ) +static void GLAPIENTRY TAG(Normal3f)( GLfloat x, GLfloat y, GLfloat z ) { PRE_LOOPBACK( Normal3f ); _glapi_Dispatch->Normal3f( x, y, z ); } -static void TAG(Normal3fv)( const GLfloat *v ) +static void GLAPIENTRY TAG(Normal3fv)( const GLfloat *v ) { PRE_LOOPBACK( Normal3fv ); _glapi_Dispatch->Normal3fv( v ); } -static void TAG(SecondaryColor3fEXT)( GLfloat r, GLfloat g, GLfloat b ) +static void GLAPIENTRY TAG(SecondaryColor3fEXT)( GLfloat r, GLfloat g, GLfloat b ) { PRE_LOOPBACK( SecondaryColor3fEXT ); _glapi_Dispatch->SecondaryColor3fEXT( r, g, b ); } -static void TAG(SecondaryColor3fvEXT)( const GLfloat *v ) +static void GLAPIENTRY TAG(SecondaryColor3fvEXT)( const GLfloat *v ) { PRE_LOOPBACK( SecondaryColor3fvEXT ); _glapi_Dispatch->SecondaryColor3fvEXT( v ); } -static void TAG(TexCoord1f)( GLfloat s ) +static void GLAPIENTRY TAG(TexCoord1f)( GLfloat s ) { PRE_LOOPBACK( TexCoord1f ); _glapi_Dispatch->TexCoord1f( s ); } -static void TAG(TexCoord1fv)( const GLfloat *tc ) +static void GLAPIENTRY TAG(TexCoord1fv)( const GLfloat *tc ) { PRE_LOOPBACK( TexCoord1fv ); _glapi_Dispatch->TexCoord1fv( tc ); } -static void TAG(TexCoord2f)( GLfloat s, GLfloat t ) +static void GLAPIENTRY TAG(TexCoord2f)( GLfloat s, GLfloat t ) { PRE_LOOPBACK( TexCoord2f ); _glapi_Dispatch->TexCoord2f( s, t ); } -static void TAG(TexCoord2fv)( const GLfloat *tc ) +static void GLAPIENTRY TAG(TexCoord2fv)( const GLfloat *tc ) { PRE_LOOPBACK( TexCoord2fv ); _glapi_Dispatch->TexCoord2fv( tc ); } -static void TAG(TexCoord3f)( GLfloat s, GLfloat t, GLfloat r ) +static void GLAPIENTRY TAG(TexCoord3f)( GLfloat s, GLfloat t, GLfloat r ) { PRE_LOOPBACK( TexCoord3f ); _glapi_Dispatch->TexCoord3f( s, t, r ); } -static void TAG(TexCoord3fv)( const GLfloat *tc ) +static void GLAPIENTRY TAG(TexCoord3fv)( const GLfloat *tc ) { PRE_LOOPBACK( TexCoord3fv ); _glapi_Dispatch->TexCoord3fv( tc ); } -static void TAG(TexCoord4f)( GLfloat s, GLfloat t, GLfloat r, GLfloat q ) +static void GLAPIENTRY TAG(TexCoord4f)( GLfloat s, GLfloat t, GLfloat r, GLfloat q ) { PRE_LOOPBACK( TexCoord4f ); _glapi_Dispatch->TexCoord4f( s, t, r, q ); } -static void TAG(TexCoord4fv)( const GLfloat *tc ) +static void GLAPIENTRY TAG(TexCoord4fv)( const GLfloat *tc ) { PRE_LOOPBACK( TexCoord4fv ); _glapi_Dispatch->TexCoord4fv( tc ); } -static void TAG(Vertex2f)( GLfloat x, GLfloat y ) +static void GLAPIENTRY TAG(Vertex2f)( GLfloat x, GLfloat y ) { PRE_LOOPBACK( Vertex2f ); _glapi_Dispatch->Vertex2f( x, y ); } -static void TAG(Vertex2fv)( const GLfloat *v ) +static void GLAPIENTRY TAG(Vertex2fv)( const GLfloat *v ) { PRE_LOOPBACK( Vertex2fv ); _glapi_Dispatch->Vertex2fv( v ); } -static void TAG(Vertex3f)( GLfloat x, GLfloat y, GLfloat z ) +static void GLAPIENTRY TAG(Vertex3f)( GLfloat x, GLfloat y, GLfloat z ) { PRE_LOOPBACK( Vertex3f ); _glapi_Dispatch->Vertex3f( x, y, z ); } -static void TAG(Vertex3fv)( const GLfloat *v ) +static void GLAPIENTRY TAG(Vertex3fv)( const GLfloat *v ) { PRE_LOOPBACK( Vertex3fv ); _glapi_Dispatch->Vertex3fv( v ); } -static void TAG(Vertex4f)( GLfloat x, GLfloat y, GLfloat z, GLfloat w ) +static void GLAPIENTRY TAG(Vertex4f)( GLfloat x, GLfloat y, GLfloat z, GLfloat w ) { PRE_LOOPBACK( Vertex4f ); _glapi_Dispatch->Vertex4f( x, y, z, w ); } -static void TAG(Vertex4fv)( const GLfloat *v ) +static void GLAPIENTRY TAG(Vertex4fv)( const GLfloat *v ) { PRE_LOOPBACK( Vertex4fv ); _glapi_Dispatch->Vertex4fv( v ); } -static void TAG(CallList)( GLuint i ) +static void GLAPIENTRY TAG(CallList)( GLuint i ) { PRE_LOOPBACK( CallList ); _glapi_Dispatch->CallList( i ); } -static void TAG(CallLists)( GLsizei sz, GLenum type, const GLvoid *v ) +static void GLAPIENTRY TAG(CallLists)( GLsizei sz, GLenum type, const GLvoid *v ) { PRE_LOOPBACK( CallLists ); _glapi_Dispatch->CallLists( sz, type, v ); } -static void TAG(Begin)( GLenum mode ) +static void GLAPIENTRY TAG(Begin)( GLenum mode ) { PRE_LOOPBACK( Begin ); _glapi_Dispatch->Begin( mode ); } -static void TAG(End)( void ) +static void GLAPIENTRY TAG(End)( void ) { PRE_LOOPBACK( End ); _glapi_Dispatch->End(); } -static void TAG(Rectf)( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ) +static void GLAPIENTRY TAG(Rectf)( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ) { PRE_LOOPBACK( Rectf ); _glapi_Dispatch->Rectf( x1, y1, x2, y2 ); } -static void TAG(DrawArrays)( GLenum mode, GLint start, GLsizei count ) +static void GLAPIENTRY TAG(DrawArrays)( GLenum mode, GLint start, GLsizei count ) { PRE_LOOPBACK( DrawArrays ); _glapi_Dispatch->DrawArrays( mode, start, count ); } -static void TAG(DrawElements)( GLenum mode, GLsizei count, GLenum type, +static void GLAPIENTRY TAG(DrawElements)( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices ) { PRE_LOOPBACK( DrawElements ); _glapi_Dispatch->DrawElements( mode, count, type, indices ); } -static void TAG(DrawRangeElements)( GLenum mode, GLuint start, +static void GLAPIENTRY TAG(DrawRangeElements)( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices ) { @@ -347,64 +347,64 @@ static void TAG(DrawRangeElements)( GLenum mode, GLuint start, _glapi_Dispatch->DrawRangeElements( mode, start, end, count, type, indices ); } -static void TAG(EvalMesh1)( GLenum mode, GLint i1, GLint i2 ) +static void GLAPIENTRY TAG(EvalMesh1)( GLenum mode, GLint i1, GLint i2 ) { PRE_LOOPBACK( EvalMesh1 ); _glapi_Dispatch->EvalMesh1( mode, i1, i2 ); } -static void TAG(EvalMesh2)( GLenum mode, GLint i1, GLint i2, +static void GLAPIENTRY TAG(EvalMesh2)( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ) { PRE_LOOPBACK( EvalMesh2 ); _glapi_Dispatch->EvalMesh2( mode, i1, i2, j1, j2 ); } -static void TAG(VertexAttrib1fNV)( GLuint index, GLfloat x ) +static void GLAPIENTRY TAG(VertexAttrib1fNV)( GLuint index, GLfloat x ) { PRE_LOOPBACK( VertexAttrib1fNV ); _glapi_Dispatch->VertexAttrib1fNV( index, x ); } -static void TAG(VertexAttrib1fvNV)( GLuint index, const GLfloat *v ) +static void GLAPIENTRY TAG(VertexAttrib1fvNV)( GLuint index, const GLfloat *v ) { PRE_LOOPBACK( VertexAttrib1fvNV ); _glapi_Dispatch->VertexAttrib1fvNV( index, v ); } -static void TAG(VertexAttrib2fNV)( GLuint index, GLfloat x, GLfloat y ) +static void GLAPIENTRY TAG(VertexAttrib2fNV)( GLuint index, GLfloat x, GLfloat y ) { PRE_LOOPBACK( VertexAttrib2fNV ); _glapi_Dispatch->VertexAttrib2fNV( index, x, y ); } -static void TAG(VertexAttrib2fvNV)( GLuint index, const GLfloat *v ) +static void GLAPIENTRY TAG(VertexAttrib2fvNV)( GLuint index, const GLfloat *v ) { PRE_LOOPBACK( VertexAttrib2fvNV ); _glapi_Dispatch->VertexAttrib2fvNV( index, v ); } -static void TAG(VertexAttrib3fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z ) +static void GLAPIENTRY TAG(VertexAttrib3fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z ) { PRE_LOOPBACK( VertexAttrib3fNV ); _glapi_Dispatch->VertexAttrib3fNV( index, x, y, z ); } -static void TAG(VertexAttrib3fvNV)( GLuint index, const GLfloat *v ) +static void GLAPIENTRY TAG(VertexAttrib3fvNV)( GLuint index, const GLfloat *v ) { PRE_LOOPBACK( VertexAttrib3fvNV ); _glapi_Dispatch->VertexAttrib3fvNV( index, v ); } -static void TAG(VertexAttrib4fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w ) +static void GLAPIENTRY TAG(VertexAttrib4fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w ) { PRE_LOOPBACK( VertexAttrib4fNV ); _glapi_Dispatch->VertexAttrib4fNV( index, x, y, z, w ); } -static void TAG(VertexAttrib4fvNV)( GLuint index, const GLfloat *v ) +static void GLAPIENTRY TAG(VertexAttrib4fvNV)( GLuint index, const GLfloat *v ) { - PRE_LOOPBACK( VertexAttrib4fNV ); + PRE_LOOPBACK( VertexAttrib4fvNV ); _glapi_Dispatch->VertexAttrib4fvNV( index, v ); } diff --git a/src/mesa/swrast/s_blend.c b/src/mesa/swrast/s_blend.c index 345df378ff0..6d522ffd870 100644 --- a/src/mesa/swrast/s_blend.c +++ b/src/mesa/swrast/s_blend.c @@ -780,7 +780,7 @@ _swrast_blend_span( GLcontext *ctx, const struct sw_span *span, ASSERT(span->end <= MAX_WIDTH); ASSERT(span->arrayMask & SPAN_RGBA); - ASSERT(!ctx->Color.ColorLogicOpEnabled); + ASSERT(!ctx->Color._LogicOpEnabled); /* Read span of current frame buffer pixels */ if (span->arrayMask & SPAN_XY) { diff --git a/src/mesa/swrast/s_context.c b/src/mesa/swrast/s_context.c index 99da79afd5f..fb09eb30601 100644 --- a/src/mesa/swrast/s_context.c +++ b/src/mesa/swrast/s_context.c @@ -59,7 +59,7 @@ _swrast_update_rasterflags( GLcontext *ctx ) if (ctx->Visual.rgbMode) { const GLuint colorMask = *((GLuint *) &ctx->Color.ColorMask); if (colorMask != 0xffffffff) RasterMask |= MASKING_BIT; - if (ctx->Color.ColorLogicOpEnabled) RasterMask |= LOGIC_OP_BIT; + if (ctx->Color._LogicOpEnabled) RasterMask |= LOGIC_OP_BIT; if (ctx->Texture._EnabledUnits) RasterMask |= TEXTURE_BIT; } else { @@ -269,7 +269,7 @@ _swrast_validate_point( GLcontext *ctx, const SWvertex *v0 ) } -static void +static void _ASMAPI _swrast_validate_blend_func( GLcontext *ctx, GLuint n, const GLubyte mask[], GLchan src[][4], @@ -311,11 +311,6 @@ _swrast_validate_texture_sample( GLcontext *ctx, GLuint texUnit, swrast->TextureSample[texUnit]( ctx, texUnit, tObj, n, texcoords, lambda, rgba ); - - /* GL_SGI_texture_color_table */ - if (ctx->Texture.Unit[texUnit].ColorTableEnabled) { - _swrast_texture_table_lookup(&ctx->Texture.Unit[texUnit].ColorTable, n, rgba); - } } diff --git a/src/mesa/swrast/s_context.h b/src/mesa/swrast/s_context.h index c699078e166..6dc8b13b0e7 100644 --- a/src/mesa/swrast/s_context.h +++ b/src/mesa/swrast/s_context.h @@ -202,14 +202,9 @@ typedef void (*texture_sample_func)(GLcontext *ctx, GLuint texUnit, GLuint n, const GLfloat texcoords[][4], const GLfloat lambda[], GLchan rgba[][4]); -#ifdef USE_MMX_ASM typedef void (_ASMAPIP blend_func)( GLcontext *ctx, GLuint n, const GLubyte mask[], GLchan src[][4], CONST GLchan dst[][4] ); -#else -typedef void (*blend_func)( GLcontext *ctx, GLuint n, const GLubyte mask[], - GLchan src[][4], CONST GLchan dst[][4] ); -#endif typedef void (*swrast_point_func)( GLcontext *ctx, const SWvertex *); diff --git a/src/mesa/swrast/s_nvfragprog.c b/src/mesa/swrast/s_nvfragprog.c index 332edc5c86e..94458238b51 100644 --- a/src/mesa/swrast/s_nvfragprog.c +++ b/src/mesa/swrast/s_nvfragprog.c @@ -38,7 +38,6 @@ /* if 1, print some debugging info */ #define DEBUG_FRAG 0 - /** * Fetch a texel. */ @@ -120,13 +119,14 @@ get_register_pointer( GLcontext *ctx, ASSERT(source->Index < MAX_NV_FRAGMENT_PROGRAM_PARAMS); src = ctx->FragmentProgram.Parameters[source->Index]; break; + + case PROGRAM_STATE_VAR: + /* Fallthrough */ + case PROGRAM_NAMED_PARAM: ASSERT(source->Index < (GLint) program->Parameters->NumParameters); src = program->Parameters->Parameters[source->Index].Values; break; - case PROGRAM_STATE_VAR: - src = NULL; - break; default: _mesa_problem(ctx, "Invalid input register file in fetch_vector4"); src = NULL; @@ -572,6 +572,12 @@ execute_program( GLcontext *ctx, printf("execute fragment program --------------------\n"); #endif + /* XXX: This should go someplace else, but it is safe here (and slow!) + * - karl + */ + _mesa_load_state_parameters(ctx, program->Parameters); + + for (pc = 0; pc < maxInst; pc++) { const struct fp_instruction *inst = program->Instructions + pc; diff --git a/src/mesa/swrast/s_readpix.c b/src/mesa/swrast/s_readpix.c index 00aa43d07cc..f2b91e05282 100644 --- a/src/mesa/swrast/s_readpix.c +++ b/src/mesa/swrast/s_readpix.c @@ -1,9 +1,8 @@ - /* * Mesa 3-D graphics library - * Version: 4.1 + * Version: 5.1 * - * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * Copyright (C) 1999-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"), @@ -61,6 +60,17 @@ read_index_pixels( GLcontext *ctx, return; } + if (type != GL_BYTE && + type != GL_UNSIGNED_BYTE && + type != GL_SHORT && + type != GL_UNSIGNED_SHORT && + type != GL_INT && + type != GL_UNSIGNED_INT && + type != GL_FLOAT) { + _mesa_error( ctx, GL_INVALID_OPERATION, "glReadPixels(index type)"); + return; + } + _swrast_use_read_buffer(ctx); readWidth = (width > MAX_WIDTH) ? MAX_WIDTH : width; diff --git a/src/mesa/swrast/s_span.c b/src/mesa/swrast/s_span.c index a3be9734c3d..013114768d2 100644 --- a/src/mesa/swrast/s_span.c +++ b/src/mesa/swrast/s_span.c @@ -716,7 +716,7 @@ multi_write_rgba_span( GLcontext *ctx, struct sw_span *span ) /* make copy of incoming colors */ MEMCPY( rgbaTmp, span->array->rgba, 4 * span->end * sizeof(GLchan) ); - if (ctx->Color.ColorLogicOpEnabled) { + if (ctx->Color._LogicOpEnabled) { _swrast_logicop_rgba_span(ctx, span, rgbaTmp); } else if (ctx->Color.BlendEnabled) { @@ -1100,7 +1100,7 @@ _swrast_write_rgba_span( GLcontext *ctx, struct sw_span *span) } else { /* normal: write to exactly one buffer */ - if (ctx->Color.ColorLogicOpEnabled) { + if (ctx->Color._LogicOpEnabled) { _swrast_logicop_rgba_span(ctx, span, span->array->rgba); monoColor = GL_FALSE; } @@ -1373,7 +1373,7 @@ _swrast_write_texture_span( GLcontext *ctx, struct sw_span *span) } else { /* normal: write to exactly one buffer */ - if (ctx->Color.ColorLogicOpEnabled) { + if (ctx->Color._LogicOpEnabled) { _swrast_logicop_rgba_span(ctx, span, span->array->rgba); } else if (ctx->Color.BlendEnabled) { diff --git a/src/mesa/swrast/s_spantemp.h b/src/mesa/swrast/s_spantemp.h index df08f14760a..95d9358a16d 100644 --- a/src/mesa/swrast/s_spantemp.h +++ b/src/mesa/swrast/s_spantemp.h @@ -366,6 +366,7 @@ NAME(read_index_pixels)( const GLcontext *ctx, #undef NAME +#undef SPAN_VARS #undef INIT_PIXEL_PTR #undef INC_PIXEL_PTR #undef STORE_RGB_PIXEL diff --git a/src/mesa/swrast/s_texture.c b/src/mesa/swrast/s_texture.c index a196f34c275..2342179a4e6 100644 --- a/src/mesa/swrast/s_texture.c +++ b/src/mesa/swrast/s_texture.c @@ -3873,9 +3873,6 @@ texture_apply( const GLcontext *ctx, else if (format == GL_DEPTH_COMPONENT) { format = texUnit->_Current->DepthMode; } - else if (texUnit->ColorTableEnabled) { - format = texUnit->ColorTable.Format; - } switch (texUnit->EnvMode) { case GL_REPLACE: diff --git a/src/mesa/swrast_setup/ss_context.c b/src/mesa/swrast_setup/ss_context.c index c000e41943b..eb133f969c8 100644 --- a/src/mesa/swrast_setup/ss_context.c +++ b/src/mesa/swrast_setup/ss_context.c @@ -83,10 +83,10 @@ _swsetup_DestroyContext( GLcontext *ctx ) ALIGN_FREE(swsetup->verts); if (swsetup->ChanSecondaryColor.Ptr) - ALIGN_FREE(swsetup->ChanSecondaryColor.Ptr); + ALIGN_FREE((void *) swsetup->ChanSecondaryColor.Ptr); if (swsetup->ChanColor.Ptr) - ALIGN_FREE(swsetup->ChanColor.Ptr); + ALIGN_FREE((void *) swsetup->ChanColor.Ptr); FREE(swsetup); ctx->swsetup_context = 0; diff --git a/src/mesa/tnl/t_array_api.c b/src/mesa/tnl/t_array_api.c index 0357829ff48..f9f5fe99511 100644 --- a/src/mesa/tnl/t_array_api.c +++ b/src/mesa/tnl/t_array_api.c @@ -124,7 +124,7 @@ static void _tnl_draw_range_elements( GLcontext *ctx, GLenum mode, /** * Called via the GL API dispatcher. */ -void +void GLAPIENTRY _tnl_DrawArrays(GLenum mode, GLint start, GLsizei count) { GET_CURRENT_CONTEXT(ctx); @@ -278,7 +278,7 @@ _tnl_DrawArrays(GLenum mode, GLint start, GLsizei count) /** * Called via the GL API dispatcher. */ -void +void GLAPIENTRY _tnl_DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices) @@ -291,8 +291,12 @@ _tnl_DrawRangeElements(GLenum mode, if (ctx->Array.ElementArrayBufferObj->Name) { /* use indices in the buffer object */ - ASSERT(ctx->Array.ElementArrayBufferObj->Data); - indices = (GLuint *) ctx->Array.ElementArrayBufferObj->Data; + if (!ctx->Array.ElementArrayBufferObj->Data) { + _mesa_warning(ctx, + "DrawRangeElements with empty vertex elements buffer!"); + return; + } + indices = (GLvoid *) ctx->Array.ElementArrayBufferObj->Data; } /* Check arguments, etc. @@ -349,7 +353,7 @@ _tnl_DrawRangeElements(GLenum mode, /** * Called via the GL API dispatcher. */ -void +void GLAPIENTRY _tnl_DrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) { @@ -361,7 +365,10 @@ _tnl_DrawElements(GLenum mode, GLsizei count, GLenum type, if (ctx->Array.ElementArrayBufferObj->Name) { /* use indices in the buffer object */ - ASSERT(ctx->Array.ElementArrayBufferObj->Data); + if (!ctx->Array.ElementArrayBufferObj->Data) { + _mesa_warning(ctx, "DrawElements with empty vertex elements buffer!"); + return; + } indices = (const GLvoid *) ctx->Array.ElementArrayBufferObj->Data; } diff --git a/src/mesa/tnl/t_array_api.h b/src/mesa/tnl/t_array_api.h index c26112bef5c..61d1f696b00 100644 --- a/src/mesa/tnl/t_array_api.h +++ b/src/mesa/tnl/t_array_api.h @@ -30,12 +30,12 @@ #include "t_context.h" -extern void _tnl_DrawArrays(GLenum mode, GLint first, GLsizei count); +extern void GLAPIENTRY _tnl_DrawArrays(GLenum mode, GLint first, GLsizei count); -extern void _tnl_DrawElements(GLenum mode, GLsizei count, GLenum type, +extern void GLAPIENTRY _tnl_DrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -extern void _tnl_DrawRangeElements(GLenum mode, GLuint start, +extern void GLAPIENTRY _tnl_DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); diff --git a/src/mesa/tnl/t_array_import.c b/src/mesa/tnl/t_array_import.c index 7ced47561e7..16874dfb9a6 100644 --- a/src/mesa/tnl/t_array_import.c +++ b/src/mesa/tnl/t_array_import.c @@ -46,7 +46,7 @@ static void _tnl_import_vertex( GLcontext *ctx, struct gl_client_array *tmp; GLboolean is_writeable = 0; struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs; - GLubyte *data; + const GLubyte *data; tmp = _ac_import_vertex(ctx, GL_FLOAT, @@ -69,7 +69,7 @@ static void _tnl_import_normal( GLcontext *ctx, struct gl_client_array *tmp; GLboolean is_writeable = 0; struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs; - GLubyte *data; + const GLubyte *data; tmp = _ac_import_normal(ctx, GL_FLOAT, stride ? 3*sizeof(GLfloat) : 0, writeable, @@ -136,7 +136,7 @@ static void _tnl_import_fogcoord( GLcontext *ctx, struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs; struct gl_client_array *tmp; GLboolean is_writeable = 0; - GLubyte *data; + const GLubyte *data; tmp = _ac_import_fogcoord(ctx, GL_FLOAT, stride ? sizeof(GLfloat) : 0, writeable, @@ -155,7 +155,7 @@ static void _tnl_import_index( GLcontext *ctx, struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs; struct gl_client_array *tmp; GLboolean is_writeable = 0; - GLubyte *data; + const GLubyte *data; tmp = _ac_import_index(ctx, GL_FLOAT, stride ? sizeof(GLfloat) : 0, writeable, @@ -176,7 +176,7 @@ static void _tnl_import_texcoord( GLcontext *ctx, struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs; struct gl_client_array *tmp; GLboolean is_writeable = 0; - GLubyte *data; + const GLubyte *data; tmp = _ac_import_texcoord(ctx, unit, GL_FLOAT, stride ? 4 * sizeof(GLfloat) : 0, @@ -199,7 +199,7 @@ static void _tnl_import_edgeflag( GLcontext *ctx, struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs; struct gl_client_array *tmp; GLboolean is_writeable = 0; - GLubyte *data; + const GLubyte *data; tmp = _ac_import_edgeflag(ctx, GL_UNSIGNED_BYTE, sizeof(GLubyte), @@ -220,7 +220,7 @@ static void _tnl_import_attrib( GLcontext *ctx, struct tnl_vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs; struct gl_client_array *tmp; GLboolean is_writeable = 0; - GLubyte *data; + const GLubyte *data; tmp = _ac_import_attrib(ctx, index, GL_FLOAT, stride ? 4 * sizeof(GLfloat) : 0, diff --git a/src/mesa/tnl/t_vb_texgen.c b/src/mesa/tnl/t_vb_texgen.c index e649e0f9b62..6ffc53d7e06 100644 --- a/src/mesa/tnl/t_vb_texgen.c +++ b/src/mesa/tnl/t_vb_texgen.c @@ -352,22 +352,20 @@ static void texgen( GLcontext *ctx, struct vertex_buffer *VB = &tnl->vb; GLvector4f *in = VB->TexCoordPtr[unit]; GLvector4f *out = &store->texcoord[unit]; - struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; + const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; const GLvector4f *obj = VB->ObjPtr; const GLvector4f *eye = VB->EyePtr; const GLvector4f *normal = VB->NormalPtr; + const GLfloat *m = store->tmp_m; + const GLuint count = VB->Count; GLfloat (*texcoord)[4] = (GLfloat (*)[4])out->data; - GLfloat *indata; - GLuint count = VB->Count; GLfloat (*f)[3] = store->tmp_f; - GLfloat *m = store->tmp_m; GLuint holes = 0; - if (texUnit->_GenFlags & TEXGEN_NEED_M) { - build_m_tab[in->size]( store->tmp_f, store->tmp_m, normal, eye ); + build_m_tab[eye->size]( store->tmp_f, store->tmp_m, normal, eye ); } else if (texUnit->_GenFlags & TEXGEN_NEED_F) { - build_f_tab[in->size]( (GLfloat *)store->tmp_f, 3, normal, eye ); + build_f_tab[eye->size]( (GLfloat *)store->tmp_f, 3, normal, eye ); } if (!in) { @@ -413,8 +411,8 @@ static void texgen( GLcontext *ctx, texUnit->EyePlaneS ); break; case GL_SPHERE_MAP: - for (indata=in->start,i=0 ; i<count ;i++, STRIDE_F(indata,in->stride)) - texcoord[i][0] = indata[0] * m[i] + 0.5F; + for (i = 0; i < count; i++) + texcoord[i][0] = f[i][0] * m[i] + 0.5F; break; case GL_REFLECTION_MAP_NV: for (i=0;i<count;i++) @@ -446,8 +444,8 @@ static void texgen( GLcontext *ctx, texUnit->EyePlaneT ); break; case GL_SPHERE_MAP: - for (indata=in->start,i=0; i<count ;i++,STRIDE_F(indata,in->stride)) - texcoord[i][1] = indata[1] * m[i] + 0.5F; + for (i = 0; i < count; i++) + texcoord[i][1] = f[i][1] * m[i] + 0.5F; break; case GL_REFLECTION_MAP_NV: for (i=0;i<count;i++) @@ -547,9 +545,9 @@ static GLboolean run_validate_texgen_stage( GLcontext *ctx, if (texUnit->TexGenEnabled) { GLuint sz; - if (texUnit->TexGenEnabled & R_BIT) + if (texUnit->TexGenEnabled & Q_BIT) sz = 4; - else if (texUnit->TexGenEnabled & Q_BIT) + else if (texUnit->TexGenEnabled & R_BIT) sz = 3; else if (texUnit->TexGenEnabled & T_BIT) sz = 2; @@ -558,8 +556,9 @@ static GLboolean run_validate_texgen_stage( GLcontext *ctx, store->TexgenSize[i] = sz; store->TexgenHoles[i] = (all_bits[sz] & ~texUnit->TexGenEnabled); - store->TexgenFunc[i] = texgen; + store->TexgenFunc[i] = texgen; /* general solution */ + /* look for special texgen cases */ if (texUnit->TexGenEnabled == (S_BIT|T_BIT|R_BIT)) { if (texUnit->_GenFlags == TEXGEN_REFLECTION_MAP_NV) { store->TexgenFunc[i] = texgen_reflection_map_nv; diff --git a/src/mesa/x86/assyntax.h b/src/mesa/x86/assyntax.h index 53e554728d8..54648dfe9ec 100644 --- a/src/mesa/x86/assyntax.h +++ b/src/mesa/x86/assyntax.h @@ -1,4 +1,4 @@ -/* $Id: assyntax.h,v 1.22 2003/10/02 17:36:45 brianp Exp $ */ +/* $Id: assyntax.h,v 1.22.2.1 2003/11/21 15:49:45 keithw Exp $ */ #ifndef __ASSYNTAX_H__ #define __ASSYNTAX_H__ @@ -1074,7 +1074,7 @@ SECTION _DATA public align=16 class=DATA use32 flat #define B_REGDB(d, b) BYTE_PTR [b + d] /* Variable indirect: */ -#define VARINDIRECT(var) var +#define VARINDIRECT(var) [var] /* Use register contents as jump/call target: */ #define CODEPTR(reg) P_(reg) @@ -1086,6 +1086,7 @@ SECTION _DATA public align=16 class=DATA use32 flat #define P_(a) P_ ## a #define X_(a) X_ ## a #define D_(a) D_ ## a +#define SR_(a) W_ ## a #define S_(a) L_ ## a #define L_(a) L_ ## a #define W_(a) W_ ## a @@ -1227,7 +1228,7 @@ SECTION _DATA public align=16 class=DATA use32 flat #define LOOPNZ(a) loopnz a #define LSL(a, b) lsl b, a #define LTR(a) ltr a -#define MOV_SR(a, b) mov S_(b), S_(a) +#define MOV_SR(a, b) mov SR_(b), SR_(a) #define MOV_L(a, b) mov L_(b), L_(a) #define MOV_W(a, b) mov W_(b), W_(a) #define MOV_B(a, b) mov B_(b), B_(a) @@ -1262,14 +1263,14 @@ SECTION _DATA public align=16 class=DATA use32 flat #define OUTS_L outsd #define OUTS_W outsw #define OUTS_B outsb -#define POP_SR(a) pop S_(a) +#define POP_SR(a) pop SR_(a) #define POP_L(a) pop L_(a) #define POP_W(a) pop W_(a) #define POPA_L popad #define POPA_W popa #define POPF_L popfd #define POPF_W popf -#define PUSH_SR(a) push S_(a) +#define PUSH_SR(a) push SR_(a) #define PUSH_L(a) push L_(a) #define PUSH_W(a) push W_(a) #define PUSH_B(a) push B_(a) @@ -1341,15 +1342,15 @@ SECTION _DATA public align=16 class=DATA use32 flat #define SETZ(a) setz a #define SGDT(a) sgdt a #define SIDT(a) sidt a -#define SHL_L(a, b) shl L_(b), L_(a) -#define SHL_W(a, b) shl W_(b), W_(a) +#define SHL_L(a, b) shl L_(b), B_(a) +#define SHL_W(a, b) shl W_(b), B_(a) #define SHL_B(a, b) shl B_(b), B_(a) #define SHLD_L(a,b,c) shld #define SHLD2_L(a,b) shld L_(b), L_(a) #define SHLD_W(a,b,c) shld #define SHLD2_W(a,b) shld W_(b), W_(a) -#define SHR_L(a, b) shr L_(b), L_(a) -#define SHR_W(a, b) shr W_(b), W_(a) +#define SHR_L(a, b) shr L_(b), B_(a) +#define SHR_W(a, b) shr W_(b), B_(a) #define SHR_B(a, b) shr B_(b), B_(a) #define SHRD_L(a,b,c) shrd #define SHRD2_L(a,b) shrd L_(b), L_(a) @@ -1360,9 +1361,9 @@ SECTION _DATA public align=16 class=DATA use32 flat #define STC stc #define STD std #define STI sti -#define STOS_L stos -#define STOS_W stos -#define STOS_B stos +#define STOS_L stosd +#define STOS_W stosw +#define STOS_B stosb #define STR(a) str a #define SUB_L(a, b) sub L_(b), L_(a) #define SUB_W(a, b) sub W_(b), W_(a) @@ -1693,5 +1694,18 @@ SECTION _DATA public align=16 class=DATA use32 flat #define LLBL(a) a #endif +/* Segment overrides */ +#define SEGCS D_BYTE 46 +#define SEGDS D_BYTE 62 +#define SEGES D_BYTE 38 +#define SEGFS D_BYTE 100 +#define SEGGS D_BYTE 101 + +/* Temporary labels: valid until next non-local label */ +#ifdef NASM_ASSEMBLER +#define TLBL(a) CONCAT(.,a) +#else +#define TLBL(a) CONCAT(a,$) +#endif #endif /* __ASSYNTAX_H__ */ diff --git a/src/mesa/x86/common_x86.c b/src/mesa/x86/common_x86.c index da572dfbf0a..ba0aaea94ed 100644 --- a/src/mesa/x86/common_x86.c +++ b/src/mesa/x86/common_x86.c @@ -1,4 +1,4 @@ -/* $Id: common_x86.c,v 1.22 2003/02/04 02:22:51 brianp Exp $ */ +/* $Id: common_x86.c,v 1.22.4.1 2003/11/21 15:49:45 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -52,14 +52,12 @@ int _mesa_x86_cpu_features = 0; /* No reason for this to be public. */ -extern int _mesa_identify_x86_cpu_features(void); - -extern GLuint _mesa_x86_has_cpuid(void); -extern void _mesa_x86_cpuid(GLuint op, GLuint *reg_eax, GLuint *reg_ebx, GLuint *reg_ecx, GLuint *reg_edx); -extern GLuint _mesa_x86_cpuid_eax(GLuint op); -extern GLuint _mesa_x86_cpuid_ebx(GLuint op); -extern GLuint _mesa_x86_cpuid_ecx(GLuint op); -extern GLuint _mesa_x86_cpuid_edx(GLuint op); +extern GLuint _ASMAPI _mesa_x86_has_cpuid(void); +extern void _ASMAPI _mesa_x86_cpuid(GLuint op, GLuint *reg_eax, GLuint *reg_ebx, GLuint *reg_ecx, GLuint *reg_edx); +extern GLuint _ASMAPI _mesa_x86_cpuid_eax(GLuint op); +extern GLuint _ASMAPI _mesa_x86_cpuid_ebx(GLuint op); +extern GLuint _ASMAPI _mesa_x86_cpuid_ecx(GLuint op); +extern GLuint _ASMAPI _mesa_x86_cpuid_edx(GLuint op); static void message( const char *msg ) { diff --git a/src/mesa/x86/glapi_x86.S b/src/mesa/x86/glapi_x86.S index 54c3670ed13..6ad65e6d5a3 100644 --- a/src/mesa/x86/glapi_x86.S +++ b/src/mesa/x86/glapi_x86.S @@ -4,5396 +4,5399 @@ #ifndef __WIN32__ -#if defined(USE_MGL_NAMESPACE) -#define GL_PREFIX(n) GLNAME(CONCAT(mgl,n)) +#if defined(STDCALL_API) +#define GL_PREFIX(n,n2) GLNAME(CONCAT(gl,n2)) +#elif defined(USE_MGL_NAMESPACE) +#define GL_PREFIX(n,n2) GLNAME(CONCAT(mgl,n)) #else -#define GL_PREFIX(n) GLNAME(CONCAT(gl,n)) +#define GL_PREFIX(n,n2) GLNAME(CONCAT(gl,n)) #endif #define GL_OFFSET(x) CODEPTR(REGOFF(4 * x, EAX)) -#if defined(GNU_ASSEMBLER) && !defined(DJGPP) +#if defined(GNU_ASSEMBLER) && !defined(__DJGPP__) && !defined(__MINGW32__) #define GLOBL_FN(x) GLOBL x ; .type x,@function #else #define GLOBL_FN(x) GLOBL x #endif +SEG_TEXT EXTERN GLNAME(_glapi_Dispatch) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(NewList)) -GL_PREFIX(NewList): +GLOBL_FN(GL_PREFIX(NewList,NewList@8)) +GL_PREFIX(NewList,NewList@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_NewList)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EndList)) -GL_PREFIX(EndList): +GLOBL_FN(GL_PREFIX(EndList,EndList@0)) +GL_PREFIX(EndList,EndList@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EndList)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CallList)) -GL_PREFIX(CallList): +GLOBL_FN(GL_PREFIX(CallList,CallList@4)) +GL_PREFIX(CallList,CallList@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CallList)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CallLists)) -GL_PREFIX(CallLists): +GLOBL_FN(GL_PREFIX(CallLists,CallLists@12)) +GL_PREFIX(CallLists,CallLists@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CallLists)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DeleteLists)) -GL_PREFIX(DeleteLists): +GLOBL_FN(GL_PREFIX(DeleteLists,DeleteLists@8)) +GL_PREFIX(DeleteLists,DeleteLists@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DeleteLists)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GenLists)) -GL_PREFIX(GenLists): +GLOBL_FN(GL_PREFIX(GenLists,GenLists@4)) +GL_PREFIX(GenLists,GenLists@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GenLists)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ListBase)) -GL_PREFIX(ListBase): +GLOBL_FN(GL_PREFIX(ListBase,ListBase@4)) +GL_PREFIX(ListBase,ListBase@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ListBase)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Begin)) -GL_PREFIX(Begin): +GLOBL_FN(GL_PREFIX(Begin,Begin@4)) +GL_PREFIX(Begin,Begin@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Begin)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Bitmap)) -GL_PREFIX(Bitmap): +GLOBL_FN(GL_PREFIX(Bitmap,Bitmap@28)) +GL_PREFIX(Bitmap,Bitmap@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Bitmap)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3b)) -GL_PREFIX(Color3b): +GLOBL_FN(GL_PREFIX(Color3b,Color3b@12)) +GL_PREFIX(Color3b,Color3b@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3b)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3bv)) -GL_PREFIX(Color3bv): +GLOBL_FN(GL_PREFIX(Color3bv,Color3bv@4)) +GL_PREFIX(Color3bv,Color3bv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3bv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3d)) -GL_PREFIX(Color3d): +GLOBL_FN(GL_PREFIX(Color3d,Color3d@24)) +GL_PREFIX(Color3d,Color3d@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3dv)) -GL_PREFIX(Color3dv): +GLOBL_FN(GL_PREFIX(Color3dv,Color3dv@4)) +GL_PREFIX(Color3dv,Color3dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3dv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3f)) -GL_PREFIX(Color3f): +GLOBL_FN(GL_PREFIX(Color3f,Color3f@12)) +GL_PREFIX(Color3f,Color3f@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3fv)) -GL_PREFIX(Color3fv): +GLOBL_FN(GL_PREFIX(Color3fv,Color3fv@4)) +GL_PREFIX(Color3fv,Color3fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3fv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3i)) -GL_PREFIX(Color3i): +GLOBL_FN(GL_PREFIX(Color3i,Color3i@12)) +GL_PREFIX(Color3i,Color3i@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3i)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3iv)) -GL_PREFIX(Color3iv): +GLOBL_FN(GL_PREFIX(Color3iv,Color3iv@4)) +GL_PREFIX(Color3iv,Color3iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3iv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3s)) -GL_PREFIX(Color3s): +GLOBL_FN(GL_PREFIX(Color3s,Color3s@12)) +GL_PREFIX(Color3s,Color3s@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3s)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3sv)) -GL_PREFIX(Color3sv): +GLOBL_FN(GL_PREFIX(Color3sv,Color3sv@4)) +GL_PREFIX(Color3sv,Color3sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3sv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3ub)) -GL_PREFIX(Color3ub): +GLOBL_FN(GL_PREFIX(Color3ub,Color3ub@12)) +GL_PREFIX(Color3ub,Color3ub@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3ub)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3ubv)) -GL_PREFIX(Color3ubv): +GLOBL_FN(GL_PREFIX(Color3ubv,Color3ubv@4)) +GL_PREFIX(Color3ubv,Color3ubv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3ubv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3ui)) -GL_PREFIX(Color3ui): +GLOBL_FN(GL_PREFIX(Color3ui,Color3ui@12)) +GL_PREFIX(Color3ui,Color3ui@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3ui)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3uiv)) -GL_PREFIX(Color3uiv): +GLOBL_FN(GL_PREFIX(Color3uiv,Color3uiv@4)) +GL_PREFIX(Color3uiv,Color3uiv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3uiv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3us)) -GL_PREFIX(Color3us): +GLOBL_FN(GL_PREFIX(Color3us,Color3us@12)) +GL_PREFIX(Color3us,Color3us@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3us)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color3usv)) -GL_PREFIX(Color3usv): +GLOBL_FN(GL_PREFIX(Color3usv,Color3usv@4)) +GL_PREFIX(Color3usv,Color3usv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color3usv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4b)) -GL_PREFIX(Color4b): +GLOBL_FN(GL_PREFIX(Color4b,Color4b@16)) +GL_PREFIX(Color4b,Color4b@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4b)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4bv)) -GL_PREFIX(Color4bv): +GLOBL_FN(GL_PREFIX(Color4bv,Color4bv@4)) +GL_PREFIX(Color4bv,Color4bv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4bv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4d)) -GL_PREFIX(Color4d): +GLOBL_FN(GL_PREFIX(Color4d,Color4d@32)) +GL_PREFIX(Color4d,Color4d@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4dv)) -GL_PREFIX(Color4dv): +GLOBL_FN(GL_PREFIX(Color4dv,Color4dv@4)) +GL_PREFIX(Color4dv,Color4dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4dv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4f)) -GL_PREFIX(Color4f): +GLOBL_FN(GL_PREFIX(Color4f,Color4f@16)) +GL_PREFIX(Color4f,Color4f@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4fv)) -GL_PREFIX(Color4fv): +GLOBL_FN(GL_PREFIX(Color4fv,Color4fv@4)) +GL_PREFIX(Color4fv,Color4fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4fv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4i)) -GL_PREFIX(Color4i): +GLOBL_FN(GL_PREFIX(Color4i,Color4i@16)) +GL_PREFIX(Color4i,Color4i@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4i)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4iv)) -GL_PREFIX(Color4iv): +GLOBL_FN(GL_PREFIX(Color4iv,Color4iv@4)) +GL_PREFIX(Color4iv,Color4iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4iv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4s)) -GL_PREFIX(Color4s): +GLOBL_FN(GL_PREFIX(Color4s,Color4s@16)) +GL_PREFIX(Color4s,Color4s@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4s)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4sv)) -GL_PREFIX(Color4sv): +GLOBL_FN(GL_PREFIX(Color4sv,Color4sv@4)) +GL_PREFIX(Color4sv,Color4sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4sv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4ub)) -GL_PREFIX(Color4ub): +GLOBL_FN(GL_PREFIX(Color4ub,Color4ub@16)) +GL_PREFIX(Color4ub,Color4ub@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4ub)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4ubv)) -GL_PREFIX(Color4ubv): +GLOBL_FN(GL_PREFIX(Color4ubv,Color4ubv@4)) +GL_PREFIX(Color4ubv,Color4ubv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4ubv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4ui)) -GL_PREFIX(Color4ui): +GLOBL_FN(GL_PREFIX(Color4ui,Color4ui@16)) +GL_PREFIX(Color4ui,Color4ui@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4ui)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4uiv)) -GL_PREFIX(Color4uiv): +GLOBL_FN(GL_PREFIX(Color4uiv,Color4uiv@4)) +GL_PREFIX(Color4uiv,Color4uiv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4uiv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4us)) -GL_PREFIX(Color4us): +GLOBL_FN(GL_PREFIX(Color4us,Color4us@16)) +GL_PREFIX(Color4us,Color4us@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4us)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Color4usv)) -GL_PREFIX(Color4usv): +GLOBL_FN(GL_PREFIX(Color4usv,Color4usv@4)) +GL_PREFIX(Color4usv,Color4usv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Color4usv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EdgeFlag)) -GL_PREFIX(EdgeFlag): +GLOBL_FN(GL_PREFIX(EdgeFlag,EdgeFlag@4)) +GL_PREFIX(EdgeFlag,EdgeFlag@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EdgeFlag)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EdgeFlagv)) -GL_PREFIX(EdgeFlagv): +GLOBL_FN(GL_PREFIX(EdgeFlagv,EdgeFlagv@4)) +GL_PREFIX(EdgeFlagv,EdgeFlagv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EdgeFlagv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(End)) -GL_PREFIX(End): +GLOBL_FN(GL_PREFIX(End,End@0)) +GL_PREFIX(End,End@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_End)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Indexd)) -GL_PREFIX(Indexd): +GLOBL_FN(GL_PREFIX(Indexd,Indexd@8)) +GL_PREFIX(Indexd,Indexd@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Indexd)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Indexdv)) -GL_PREFIX(Indexdv): +GLOBL_FN(GL_PREFIX(Indexdv,Indexdv@4)) +GL_PREFIX(Indexdv,Indexdv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Indexdv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Indexf)) -GL_PREFIX(Indexf): +GLOBL_FN(GL_PREFIX(Indexf,Indexf@4)) +GL_PREFIX(Indexf,Indexf@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Indexf)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Indexfv)) -GL_PREFIX(Indexfv): +GLOBL_FN(GL_PREFIX(Indexfv,Indexfv@4)) +GL_PREFIX(Indexfv,Indexfv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Indexfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Indexi)) -GL_PREFIX(Indexi): +GLOBL_FN(GL_PREFIX(Indexi,Indexi@4)) +GL_PREFIX(Indexi,Indexi@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Indexi)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Indexiv)) -GL_PREFIX(Indexiv): +GLOBL_FN(GL_PREFIX(Indexiv,Indexiv@4)) +GL_PREFIX(Indexiv,Indexiv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Indexiv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Indexs)) -GL_PREFIX(Indexs): +GLOBL_FN(GL_PREFIX(Indexs,Indexs@4)) +GL_PREFIX(Indexs,Indexs@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Indexs)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Indexsv)) -GL_PREFIX(Indexsv): +GLOBL_FN(GL_PREFIX(Indexsv,Indexsv@4)) +GL_PREFIX(Indexsv,Indexsv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Indexsv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Normal3b)) -GL_PREFIX(Normal3b): +GLOBL_FN(GL_PREFIX(Normal3b,Normal3b@12)) +GL_PREFIX(Normal3b,Normal3b@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Normal3b)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Normal3bv)) -GL_PREFIX(Normal3bv): +GLOBL_FN(GL_PREFIX(Normal3bv,Normal3bv@4)) +GL_PREFIX(Normal3bv,Normal3bv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Normal3bv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Normal3d)) -GL_PREFIX(Normal3d): +GLOBL_FN(GL_PREFIX(Normal3d,Normal3d@24)) +GL_PREFIX(Normal3d,Normal3d@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Normal3d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Normal3dv)) -GL_PREFIX(Normal3dv): +GLOBL_FN(GL_PREFIX(Normal3dv,Normal3dv@4)) +GL_PREFIX(Normal3dv,Normal3dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Normal3dv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Normal3f)) -GL_PREFIX(Normal3f): +GLOBL_FN(GL_PREFIX(Normal3f,Normal3f@12)) +GL_PREFIX(Normal3f,Normal3f@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Normal3f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Normal3fv)) -GL_PREFIX(Normal3fv): +GLOBL_FN(GL_PREFIX(Normal3fv,Normal3fv@4)) +GL_PREFIX(Normal3fv,Normal3fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Normal3fv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Normal3i)) -GL_PREFIX(Normal3i): +GLOBL_FN(GL_PREFIX(Normal3i,Normal3i@12)) +GL_PREFIX(Normal3i,Normal3i@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Normal3i)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Normal3iv)) -GL_PREFIX(Normal3iv): +GLOBL_FN(GL_PREFIX(Normal3iv,Normal3iv@4)) +GL_PREFIX(Normal3iv,Normal3iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Normal3iv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Normal3s)) -GL_PREFIX(Normal3s): +GLOBL_FN(GL_PREFIX(Normal3s,Normal3s@12)) +GL_PREFIX(Normal3s,Normal3s@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Normal3s)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Normal3sv)) -GL_PREFIX(Normal3sv): +GLOBL_FN(GL_PREFIX(Normal3sv,Normal3sv@4)) +GL_PREFIX(Normal3sv,Normal3sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Normal3sv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos2d)) -GL_PREFIX(RasterPos2d): +GLOBL_FN(GL_PREFIX(RasterPos2d,RasterPos2d@16)) +GL_PREFIX(RasterPos2d,RasterPos2d@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos2d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos2dv)) -GL_PREFIX(RasterPos2dv): +GLOBL_FN(GL_PREFIX(RasterPos2dv,RasterPos2dv@4)) +GL_PREFIX(RasterPos2dv,RasterPos2dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos2dv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos2f)) -GL_PREFIX(RasterPos2f): +GLOBL_FN(GL_PREFIX(RasterPos2f,RasterPos2f@8)) +GL_PREFIX(RasterPos2f,RasterPos2f@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos2f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos2fv)) -GL_PREFIX(RasterPos2fv): +GLOBL_FN(GL_PREFIX(RasterPos2fv,RasterPos2fv@4)) +GL_PREFIX(RasterPos2fv,RasterPos2fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos2fv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos2i)) -GL_PREFIX(RasterPos2i): +GLOBL_FN(GL_PREFIX(RasterPos2i,RasterPos2i@8)) +GL_PREFIX(RasterPos2i,RasterPos2i@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos2i)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos2iv)) -GL_PREFIX(RasterPos2iv): +GLOBL_FN(GL_PREFIX(RasterPos2iv,RasterPos2iv@4)) +GL_PREFIX(RasterPos2iv,RasterPos2iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos2iv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos2s)) -GL_PREFIX(RasterPos2s): +GLOBL_FN(GL_PREFIX(RasterPos2s,RasterPos2s@8)) +GL_PREFIX(RasterPos2s,RasterPos2s@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos2s)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos2sv)) -GL_PREFIX(RasterPos2sv): +GLOBL_FN(GL_PREFIX(RasterPos2sv,RasterPos2sv@4)) +GL_PREFIX(RasterPos2sv,RasterPos2sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos2sv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos3d)) -GL_PREFIX(RasterPos3d): +GLOBL_FN(GL_PREFIX(RasterPos3d,RasterPos3d@24)) +GL_PREFIX(RasterPos3d,RasterPos3d@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos3d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos3dv)) -GL_PREFIX(RasterPos3dv): +GLOBL_FN(GL_PREFIX(RasterPos3dv,RasterPos3dv@4)) +GL_PREFIX(RasterPos3dv,RasterPos3dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos3dv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos3f)) -GL_PREFIX(RasterPos3f): +GLOBL_FN(GL_PREFIX(RasterPos3f,RasterPos3f@12)) +GL_PREFIX(RasterPos3f,RasterPos3f@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos3f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos3fv)) -GL_PREFIX(RasterPos3fv): +GLOBL_FN(GL_PREFIX(RasterPos3fv,RasterPos3fv@4)) +GL_PREFIX(RasterPos3fv,RasterPos3fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos3fv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos3i)) -GL_PREFIX(RasterPos3i): +GLOBL_FN(GL_PREFIX(RasterPos3i,RasterPos3i@12)) +GL_PREFIX(RasterPos3i,RasterPos3i@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos3i)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos3iv)) -GL_PREFIX(RasterPos3iv): +GLOBL_FN(GL_PREFIX(RasterPos3iv,RasterPos3iv@4)) +GL_PREFIX(RasterPos3iv,RasterPos3iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos3iv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos3s)) -GL_PREFIX(RasterPos3s): +GLOBL_FN(GL_PREFIX(RasterPos3s,RasterPos3s@12)) +GL_PREFIX(RasterPos3s,RasterPos3s@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos3s)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos3sv)) -GL_PREFIX(RasterPos3sv): +GLOBL_FN(GL_PREFIX(RasterPos3sv,RasterPos3sv@4)) +GL_PREFIX(RasterPos3sv,RasterPos3sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos3sv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos4d)) -GL_PREFIX(RasterPos4d): +GLOBL_FN(GL_PREFIX(RasterPos4d,RasterPos4d@32)) +GL_PREFIX(RasterPos4d,RasterPos4d@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos4d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos4dv)) -GL_PREFIX(RasterPos4dv): +GLOBL_FN(GL_PREFIX(RasterPos4dv,RasterPos4dv@4)) +GL_PREFIX(RasterPos4dv,RasterPos4dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos4dv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos4f)) -GL_PREFIX(RasterPos4f): +GLOBL_FN(GL_PREFIX(RasterPos4f,RasterPos4f@16)) +GL_PREFIX(RasterPos4f,RasterPos4f@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos4f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos4fv)) -GL_PREFIX(RasterPos4fv): +GLOBL_FN(GL_PREFIX(RasterPos4fv,RasterPos4fv@4)) +GL_PREFIX(RasterPos4fv,RasterPos4fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos4fv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos4i)) -GL_PREFIX(RasterPos4i): +GLOBL_FN(GL_PREFIX(RasterPos4i,RasterPos4i@16)) +GL_PREFIX(RasterPos4i,RasterPos4i@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos4i)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos4iv)) -GL_PREFIX(RasterPos4iv): +GLOBL_FN(GL_PREFIX(RasterPos4iv,RasterPos4iv@4)) +GL_PREFIX(RasterPos4iv,RasterPos4iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos4iv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos4s)) -GL_PREFIX(RasterPos4s): +GLOBL_FN(GL_PREFIX(RasterPos4s,RasterPos4s@16)) +GL_PREFIX(RasterPos4s,RasterPos4s@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos4s)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RasterPos4sv)) -GL_PREFIX(RasterPos4sv): +GLOBL_FN(GL_PREFIX(RasterPos4sv,RasterPos4sv@4)) +GL_PREFIX(RasterPos4sv,RasterPos4sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RasterPos4sv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Rectd)) -GL_PREFIX(Rectd): +GLOBL_FN(GL_PREFIX(Rectd,Rectd@32)) +GL_PREFIX(Rectd,Rectd@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Rectd)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Rectdv)) -GL_PREFIX(Rectdv): +GLOBL_FN(GL_PREFIX(Rectdv,Rectdv@8)) +GL_PREFIX(Rectdv,Rectdv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Rectdv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Rectf)) -GL_PREFIX(Rectf): +GLOBL_FN(GL_PREFIX(Rectf,Rectf@16)) +GL_PREFIX(Rectf,Rectf@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Rectf)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Rectfv)) -GL_PREFIX(Rectfv): +GLOBL_FN(GL_PREFIX(Rectfv,Rectfv@8)) +GL_PREFIX(Rectfv,Rectfv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Rectfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Recti)) -GL_PREFIX(Recti): +GLOBL_FN(GL_PREFIX(Recti,Recti@16)) +GL_PREFIX(Recti,Recti@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Recti)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Rectiv)) -GL_PREFIX(Rectiv): +GLOBL_FN(GL_PREFIX(Rectiv,Rectiv@8)) +GL_PREFIX(Rectiv,Rectiv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Rectiv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Rects)) -GL_PREFIX(Rects): +GLOBL_FN(GL_PREFIX(Rects,Rects@16)) +GL_PREFIX(Rects,Rects@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Rects)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Rectsv)) -GL_PREFIX(Rectsv): +GLOBL_FN(GL_PREFIX(Rectsv,Rectsv@8)) +GL_PREFIX(Rectsv,Rectsv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Rectsv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord1d)) -GL_PREFIX(TexCoord1d): +GLOBL_FN(GL_PREFIX(TexCoord1d,TexCoord1d@8)) +GL_PREFIX(TexCoord1d,TexCoord1d@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord1d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord1dv)) -GL_PREFIX(TexCoord1dv): +GLOBL_FN(GL_PREFIX(TexCoord1dv,TexCoord1dv@4)) +GL_PREFIX(TexCoord1dv,TexCoord1dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord1dv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord1f)) -GL_PREFIX(TexCoord1f): +GLOBL_FN(GL_PREFIX(TexCoord1f,TexCoord1f@4)) +GL_PREFIX(TexCoord1f,TexCoord1f@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord1f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord1fv)) -GL_PREFIX(TexCoord1fv): +GLOBL_FN(GL_PREFIX(TexCoord1fv,TexCoord1fv@4)) +GL_PREFIX(TexCoord1fv,TexCoord1fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord1fv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord1i)) -GL_PREFIX(TexCoord1i): +GLOBL_FN(GL_PREFIX(TexCoord1i,TexCoord1i@4)) +GL_PREFIX(TexCoord1i,TexCoord1i@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord1i)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord1iv)) -GL_PREFIX(TexCoord1iv): +GLOBL_FN(GL_PREFIX(TexCoord1iv,TexCoord1iv@4)) +GL_PREFIX(TexCoord1iv,TexCoord1iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord1iv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord1s)) -GL_PREFIX(TexCoord1s): +GLOBL_FN(GL_PREFIX(TexCoord1s,TexCoord1s@4)) +GL_PREFIX(TexCoord1s,TexCoord1s@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord1s)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord1sv)) -GL_PREFIX(TexCoord1sv): +GLOBL_FN(GL_PREFIX(TexCoord1sv,TexCoord1sv@4)) +GL_PREFIX(TexCoord1sv,TexCoord1sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord1sv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord2d)) -GL_PREFIX(TexCoord2d): +GLOBL_FN(GL_PREFIX(TexCoord2d,TexCoord2d@16)) +GL_PREFIX(TexCoord2d,TexCoord2d@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord2d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord2dv)) -GL_PREFIX(TexCoord2dv): +GLOBL_FN(GL_PREFIX(TexCoord2dv,TexCoord2dv@4)) +GL_PREFIX(TexCoord2dv,TexCoord2dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord2dv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord2f)) -GL_PREFIX(TexCoord2f): +GLOBL_FN(GL_PREFIX(TexCoord2f,TexCoord2f@8)) +GL_PREFIX(TexCoord2f,TexCoord2f@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord2f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord2fv)) -GL_PREFIX(TexCoord2fv): +GLOBL_FN(GL_PREFIX(TexCoord2fv,TexCoord2fv@4)) +GL_PREFIX(TexCoord2fv,TexCoord2fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord2fv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord2i)) -GL_PREFIX(TexCoord2i): +GLOBL_FN(GL_PREFIX(TexCoord2i,TexCoord2i@8)) +GL_PREFIX(TexCoord2i,TexCoord2i@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord2i)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord2iv)) -GL_PREFIX(TexCoord2iv): +GLOBL_FN(GL_PREFIX(TexCoord2iv,TexCoord2iv@4)) +GL_PREFIX(TexCoord2iv,TexCoord2iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord2iv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord2s)) -GL_PREFIX(TexCoord2s): +GLOBL_FN(GL_PREFIX(TexCoord2s,TexCoord2s@8)) +GL_PREFIX(TexCoord2s,TexCoord2s@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord2s)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord2sv)) -GL_PREFIX(TexCoord2sv): +GLOBL_FN(GL_PREFIX(TexCoord2sv,TexCoord2sv@4)) +GL_PREFIX(TexCoord2sv,TexCoord2sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord2sv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord3d)) -GL_PREFIX(TexCoord3d): +GLOBL_FN(GL_PREFIX(TexCoord3d,TexCoord3d@24)) +GL_PREFIX(TexCoord3d,TexCoord3d@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord3d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord3dv)) -GL_PREFIX(TexCoord3dv): +GLOBL_FN(GL_PREFIX(TexCoord3dv,TexCoord3dv@4)) +GL_PREFIX(TexCoord3dv,TexCoord3dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord3dv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord3f)) -GL_PREFIX(TexCoord3f): +GLOBL_FN(GL_PREFIX(TexCoord3f,TexCoord3f@12)) +GL_PREFIX(TexCoord3f,TexCoord3f@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord3f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord3fv)) -GL_PREFIX(TexCoord3fv): +GLOBL_FN(GL_PREFIX(TexCoord3fv,TexCoord3fv@4)) +GL_PREFIX(TexCoord3fv,TexCoord3fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord3fv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord3i)) -GL_PREFIX(TexCoord3i): +GLOBL_FN(GL_PREFIX(TexCoord3i,TexCoord3i@12)) +GL_PREFIX(TexCoord3i,TexCoord3i@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord3i)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord3iv)) -GL_PREFIX(TexCoord3iv): +GLOBL_FN(GL_PREFIX(TexCoord3iv,TexCoord3iv@4)) +GL_PREFIX(TexCoord3iv,TexCoord3iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord3iv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord3s)) -GL_PREFIX(TexCoord3s): +GLOBL_FN(GL_PREFIX(TexCoord3s,TexCoord3s@12)) +GL_PREFIX(TexCoord3s,TexCoord3s@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord3s)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord3sv)) -GL_PREFIX(TexCoord3sv): +GLOBL_FN(GL_PREFIX(TexCoord3sv,TexCoord3sv@4)) +GL_PREFIX(TexCoord3sv,TexCoord3sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord3sv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord4d)) -GL_PREFIX(TexCoord4d): +GLOBL_FN(GL_PREFIX(TexCoord4d,TexCoord4d@32)) +GL_PREFIX(TexCoord4d,TexCoord4d@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord4d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord4dv)) -GL_PREFIX(TexCoord4dv): +GLOBL_FN(GL_PREFIX(TexCoord4dv,TexCoord4dv@4)) +GL_PREFIX(TexCoord4dv,TexCoord4dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord4dv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord4f)) -GL_PREFIX(TexCoord4f): +GLOBL_FN(GL_PREFIX(TexCoord4f,TexCoord4f@16)) +GL_PREFIX(TexCoord4f,TexCoord4f@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord4f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord4fv)) -GL_PREFIX(TexCoord4fv): +GLOBL_FN(GL_PREFIX(TexCoord4fv,TexCoord4fv@4)) +GL_PREFIX(TexCoord4fv,TexCoord4fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord4fv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord4i)) -GL_PREFIX(TexCoord4i): +GLOBL_FN(GL_PREFIX(TexCoord4i,TexCoord4i@16)) +GL_PREFIX(TexCoord4i,TexCoord4i@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord4i)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord4iv)) -GL_PREFIX(TexCoord4iv): +GLOBL_FN(GL_PREFIX(TexCoord4iv,TexCoord4iv@4)) +GL_PREFIX(TexCoord4iv,TexCoord4iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord4iv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord4s)) -GL_PREFIX(TexCoord4s): +GLOBL_FN(GL_PREFIX(TexCoord4s,TexCoord4s@16)) +GL_PREFIX(TexCoord4s,TexCoord4s@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord4s)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoord4sv)) -GL_PREFIX(TexCoord4sv): +GLOBL_FN(GL_PREFIX(TexCoord4sv,TexCoord4sv@4)) +GL_PREFIX(TexCoord4sv,TexCoord4sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoord4sv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex2d)) -GL_PREFIX(Vertex2d): +GLOBL_FN(GL_PREFIX(Vertex2d,Vertex2d@16)) +GL_PREFIX(Vertex2d,Vertex2d@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex2d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex2dv)) -GL_PREFIX(Vertex2dv): +GLOBL_FN(GL_PREFIX(Vertex2dv,Vertex2dv@4)) +GL_PREFIX(Vertex2dv,Vertex2dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex2dv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex2f)) -GL_PREFIX(Vertex2f): +GLOBL_FN(GL_PREFIX(Vertex2f,Vertex2f@8)) +GL_PREFIX(Vertex2f,Vertex2f@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex2f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex2fv)) -GL_PREFIX(Vertex2fv): +GLOBL_FN(GL_PREFIX(Vertex2fv,Vertex2fv@4)) +GL_PREFIX(Vertex2fv,Vertex2fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex2fv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex2i)) -GL_PREFIX(Vertex2i): +GLOBL_FN(GL_PREFIX(Vertex2i,Vertex2i@8)) +GL_PREFIX(Vertex2i,Vertex2i@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex2i)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex2iv)) -GL_PREFIX(Vertex2iv): +GLOBL_FN(GL_PREFIX(Vertex2iv,Vertex2iv@4)) +GL_PREFIX(Vertex2iv,Vertex2iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex2iv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex2s)) -GL_PREFIX(Vertex2s): +GLOBL_FN(GL_PREFIX(Vertex2s,Vertex2s@8)) +GL_PREFIX(Vertex2s,Vertex2s@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex2s)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex2sv)) -GL_PREFIX(Vertex2sv): +GLOBL_FN(GL_PREFIX(Vertex2sv,Vertex2sv@4)) +GL_PREFIX(Vertex2sv,Vertex2sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex2sv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex3d)) -GL_PREFIX(Vertex3d): +GLOBL_FN(GL_PREFIX(Vertex3d,Vertex3d@24)) +GL_PREFIX(Vertex3d,Vertex3d@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex3d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex3dv)) -GL_PREFIX(Vertex3dv): +GLOBL_FN(GL_PREFIX(Vertex3dv,Vertex3dv@4)) +GL_PREFIX(Vertex3dv,Vertex3dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex3dv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex3f)) -GL_PREFIX(Vertex3f): +GLOBL_FN(GL_PREFIX(Vertex3f,Vertex3f@12)) +GL_PREFIX(Vertex3f,Vertex3f@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex3f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex3fv)) -GL_PREFIX(Vertex3fv): +GLOBL_FN(GL_PREFIX(Vertex3fv,Vertex3fv@4)) +GL_PREFIX(Vertex3fv,Vertex3fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex3fv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex3i)) -GL_PREFIX(Vertex3i): +GLOBL_FN(GL_PREFIX(Vertex3i,Vertex3i@12)) +GL_PREFIX(Vertex3i,Vertex3i@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex3i)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex3iv)) -GL_PREFIX(Vertex3iv): +GLOBL_FN(GL_PREFIX(Vertex3iv,Vertex3iv@4)) +GL_PREFIX(Vertex3iv,Vertex3iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex3iv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex3s)) -GL_PREFIX(Vertex3s): +GLOBL_FN(GL_PREFIX(Vertex3s,Vertex3s@12)) +GL_PREFIX(Vertex3s,Vertex3s@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex3s)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex3sv)) -GL_PREFIX(Vertex3sv): +GLOBL_FN(GL_PREFIX(Vertex3sv,Vertex3sv@4)) +GL_PREFIX(Vertex3sv,Vertex3sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex3sv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex4d)) -GL_PREFIX(Vertex4d): +GLOBL_FN(GL_PREFIX(Vertex4d,Vertex4d@32)) +GL_PREFIX(Vertex4d,Vertex4d@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex4d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex4dv)) -GL_PREFIX(Vertex4dv): +GLOBL_FN(GL_PREFIX(Vertex4dv,Vertex4dv@4)) +GL_PREFIX(Vertex4dv,Vertex4dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex4dv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex4f)) -GL_PREFIX(Vertex4f): +GLOBL_FN(GL_PREFIX(Vertex4f,Vertex4f@16)) +GL_PREFIX(Vertex4f,Vertex4f@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex4f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex4fv)) -GL_PREFIX(Vertex4fv): +GLOBL_FN(GL_PREFIX(Vertex4fv,Vertex4fv@4)) +GL_PREFIX(Vertex4fv,Vertex4fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex4fv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex4i)) -GL_PREFIX(Vertex4i): +GLOBL_FN(GL_PREFIX(Vertex4i,Vertex4i@16)) +GL_PREFIX(Vertex4i,Vertex4i@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex4i)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex4iv)) -GL_PREFIX(Vertex4iv): +GLOBL_FN(GL_PREFIX(Vertex4iv,Vertex4iv@4)) +GL_PREFIX(Vertex4iv,Vertex4iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex4iv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex4s)) -GL_PREFIX(Vertex4s): +GLOBL_FN(GL_PREFIX(Vertex4s,Vertex4s@16)) +GL_PREFIX(Vertex4s,Vertex4s@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex4s)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Vertex4sv)) -GL_PREFIX(Vertex4sv): +GLOBL_FN(GL_PREFIX(Vertex4sv,Vertex4sv@4)) +GL_PREFIX(Vertex4sv,Vertex4sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Vertex4sv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ClipPlane)) -GL_PREFIX(ClipPlane): +GLOBL_FN(GL_PREFIX(ClipPlane,ClipPlane@8)) +GL_PREFIX(ClipPlane,ClipPlane@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ClipPlane)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ColorMaterial)) -GL_PREFIX(ColorMaterial): +GLOBL_FN(GL_PREFIX(ColorMaterial,ColorMaterial@8)) +GL_PREFIX(ColorMaterial,ColorMaterial@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ColorMaterial)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CullFace)) -GL_PREFIX(CullFace): +GLOBL_FN(GL_PREFIX(CullFace,CullFace@4)) +GL_PREFIX(CullFace,CullFace@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CullFace)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Fogf)) -GL_PREFIX(Fogf): +GLOBL_FN(GL_PREFIX(Fogf,Fogf@8)) +GL_PREFIX(Fogf,Fogf@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Fogf)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Fogfv)) -GL_PREFIX(Fogfv): +GLOBL_FN(GL_PREFIX(Fogfv,Fogfv@8)) +GL_PREFIX(Fogfv,Fogfv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Fogfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Fogi)) -GL_PREFIX(Fogi): +GLOBL_FN(GL_PREFIX(Fogi,Fogi@8)) +GL_PREFIX(Fogi,Fogi@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Fogi)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Fogiv)) -GL_PREFIX(Fogiv): +GLOBL_FN(GL_PREFIX(Fogiv,Fogiv@8)) +GL_PREFIX(Fogiv,Fogiv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Fogiv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FrontFace)) -GL_PREFIX(FrontFace): +GLOBL_FN(GL_PREFIX(FrontFace,FrontFace@4)) +GL_PREFIX(FrontFace,FrontFace@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FrontFace)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Hint)) -GL_PREFIX(Hint): +GLOBL_FN(GL_PREFIX(Hint,Hint@8)) +GL_PREFIX(Hint,Hint@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Hint)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Lightf)) -GL_PREFIX(Lightf): +GLOBL_FN(GL_PREFIX(Lightf,Lightf@12)) +GL_PREFIX(Lightf,Lightf@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Lightf)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Lightfv)) -GL_PREFIX(Lightfv): +GLOBL_FN(GL_PREFIX(Lightfv,Lightfv@12)) +GL_PREFIX(Lightfv,Lightfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Lightfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Lighti)) -GL_PREFIX(Lighti): +GLOBL_FN(GL_PREFIX(Lighti,Lighti@12)) +GL_PREFIX(Lighti,Lighti@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Lighti)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Lightiv)) -GL_PREFIX(Lightiv): +GLOBL_FN(GL_PREFIX(Lightiv,Lightiv@12)) +GL_PREFIX(Lightiv,Lightiv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Lightiv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LightModelf)) -GL_PREFIX(LightModelf): +GLOBL_FN(GL_PREFIX(LightModelf,LightModelf@8)) +GL_PREFIX(LightModelf,LightModelf@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LightModelf)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LightModelfv)) -GL_PREFIX(LightModelfv): +GLOBL_FN(GL_PREFIX(LightModelfv,LightModelfv@8)) +GL_PREFIX(LightModelfv,LightModelfv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LightModelfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LightModeli)) -GL_PREFIX(LightModeli): +GLOBL_FN(GL_PREFIX(LightModeli,LightModeli@8)) +GL_PREFIX(LightModeli,LightModeli@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LightModeli)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LightModeliv)) -GL_PREFIX(LightModeliv): +GLOBL_FN(GL_PREFIX(LightModeliv,LightModeliv@8)) +GL_PREFIX(LightModeliv,LightModeliv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LightModeliv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LineStipple)) -GL_PREFIX(LineStipple): +GLOBL_FN(GL_PREFIX(LineStipple,LineStipple@8)) +GL_PREFIX(LineStipple,LineStipple@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LineStipple)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LineWidth)) -GL_PREFIX(LineWidth): +GLOBL_FN(GL_PREFIX(LineWidth,LineWidth@4)) +GL_PREFIX(LineWidth,LineWidth@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LineWidth)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Materialf)) -GL_PREFIX(Materialf): +GLOBL_FN(GL_PREFIX(Materialf,Materialf@12)) +GL_PREFIX(Materialf,Materialf@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Materialf)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Materialfv)) -GL_PREFIX(Materialfv): +GLOBL_FN(GL_PREFIX(Materialfv,Materialfv@12)) +GL_PREFIX(Materialfv,Materialfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Materialfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Materiali)) -GL_PREFIX(Materiali): +GLOBL_FN(GL_PREFIX(Materiali,Materiali@12)) +GL_PREFIX(Materiali,Materiali@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Materiali)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Materialiv)) -GL_PREFIX(Materialiv): +GLOBL_FN(GL_PREFIX(Materialiv,Materialiv@12)) +GL_PREFIX(Materialiv,Materialiv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Materialiv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PointSize)) -GL_PREFIX(PointSize): +GLOBL_FN(GL_PREFIX(PointSize,PointSize@4)) +GL_PREFIX(PointSize,PointSize@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PointSize)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PolygonMode)) -GL_PREFIX(PolygonMode): +GLOBL_FN(GL_PREFIX(PolygonMode,PolygonMode@8)) +GL_PREFIX(PolygonMode,PolygonMode@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PolygonMode)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PolygonStipple)) -GL_PREFIX(PolygonStipple): +GLOBL_FN(GL_PREFIX(PolygonStipple,PolygonStipple@4)) +GL_PREFIX(PolygonStipple,PolygonStipple@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PolygonStipple)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Scissor)) -GL_PREFIX(Scissor): +GLOBL_FN(GL_PREFIX(Scissor,Scissor@16)) +GL_PREFIX(Scissor,Scissor@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Scissor)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ShadeModel)) -GL_PREFIX(ShadeModel): +GLOBL_FN(GL_PREFIX(ShadeModel,ShadeModel@4)) +GL_PREFIX(ShadeModel,ShadeModel@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ShadeModel)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexParameterf)) -GL_PREFIX(TexParameterf): +GLOBL_FN(GL_PREFIX(TexParameterf,TexParameterf@12)) +GL_PREFIX(TexParameterf,TexParameterf@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexParameterf)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexParameterfv)) -GL_PREFIX(TexParameterfv): +GLOBL_FN(GL_PREFIX(TexParameterfv,TexParameterfv@12)) +GL_PREFIX(TexParameterfv,TexParameterfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexParameterfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexParameteri)) -GL_PREFIX(TexParameteri): +GLOBL_FN(GL_PREFIX(TexParameteri,TexParameteri@12)) +GL_PREFIX(TexParameteri,TexParameteri@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexParameteri)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexParameteriv)) -GL_PREFIX(TexParameteriv): +GLOBL_FN(GL_PREFIX(TexParameteriv,TexParameteriv@12)) +GL_PREFIX(TexParameteriv,TexParameteriv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexParameteriv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexImage1D)) -GL_PREFIX(TexImage1D): +GLOBL_FN(GL_PREFIX(TexImage1D,TexImage1D@32)) +GL_PREFIX(TexImage1D,TexImage1D@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexImage1D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexImage2D)) -GL_PREFIX(TexImage2D): +GLOBL_FN(GL_PREFIX(TexImage2D,TexImage2D@36)) +GL_PREFIX(TexImage2D,TexImage2D@36): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexImage2D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexEnvf)) -GL_PREFIX(TexEnvf): +GLOBL_FN(GL_PREFIX(TexEnvf,TexEnvf@12)) +GL_PREFIX(TexEnvf,TexEnvf@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexEnvf)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexEnvfv)) -GL_PREFIX(TexEnvfv): +GLOBL_FN(GL_PREFIX(TexEnvfv,TexEnvfv@12)) +GL_PREFIX(TexEnvfv,TexEnvfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexEnvfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexEnvi)) -GL_PREFIX(TexEnvi): +GLOBL_FN(GL_PREFIX(TexEnvi,TexEnvi@12)) +GL_PREFIX(TexEnvi,TexEnvi@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexEnvi)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexEnviv)) -GL_PREFIX(TexEnviv): +GLOBL_FN(GL_PREFIX(TexEnviv,TexEnviv@12)) +GL_PREFIX(TexEnviv,TexEnviv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexEnviv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexGend)) -GL_PREFIX(TexGend): +GLOBL_FN(GL_PREFIX(TexGend,TexGend@16)) +GL_PREFIX(TexGend,TexGend@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexGend)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexGendv)) -GL_PREFIX(TexGendv): +GLOBL_FN(GL_PREFIX(TexGendv,TexGendv@12)) +GL_PREFIX(TexGendv,TexGendv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexGendv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexGenf)) -GL_PREFIX(TexGenf): +GLOBL_FN(GL_PREFIX(TexGenf,TexGenf@12)) +GL_PREFIX(TexGenf,TexGenf@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexGenf)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexGenfv)) -GL_PREFIX(TexGenfv): +GLOBL_FN(GL_PREFIX(TexGenfv,TexGenfv@12)) +GL_PREFIX(TexGenfv,TexGenfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexGenfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexGeni)) -GL_PREFIX(TexGeni): +GLOBL_FN(GL_PREFIX(TexGeni,TexGeni@12)) +GL_PREFIX(TexGeni,TexGeni@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexGeni)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexGeniv)) -GL_PREFIX(TexGeniv): +GLOBL_FN(GL_PREFIX(TexGeniv,TexGeniv@12)) +GL_PREFIX(TexGeniv,TexGeniv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexGeniv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FeedbackBuffer)) -GL_PREFIX(FeedbackBuffer): +GLOBL_FN(GL_PREFIX(FeedbackBuffer,FeedbackBuffer@12)) +GL_PREFIX(FeedbackBuffer,FeedbackBuffer@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FeedbackBuffer)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SelectBuffer)) -GL_PREFIX(SelectBuffer): +GLOBL_FN(GL_PREFIX(SelectBuffer,SelectBuffer@8)) +GL_PREFIX(SelectBuffer,SelectBuffer@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SelectBuffer)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RenderMode)) -GL_PREFIX(RenderMode): +GLOBL_FN(GL_PREFIX(RenderMode,RenderMode@4)) +GL_PREFIX(RenderMode,RenderMode@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RenderMode)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(InitNames)) -GL_PREFIX(InitNames): +GLOBL_FN(GL_PREFIX(InitNames,InitNames@0)) +GL_PREFIX(InitNames,InitNames@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_InitNames)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LoadName)) -GL_PREFIX(LoadName): +GLOBL_FN(GL_PREFIX(LoadName,LoadName@4)) +GL_PREFIX(LoadName,LoadName@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LoadName)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PassThrough)) -GL_PREFIX(PassThrough): +GLOBL_FN(GL_PREFIX(PassThrough,PassThrough@4)) +GL_PREFIX(PassThrough,PassThrough@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PassThrough)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PopName)) -GL_PREFIX(PopName): +GLOBL_FN(GL_PREFIX(PopName,PopName@0)) +GL_PREFIX(PopName,PopName@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PopName)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PushName)) -GL_PREFIX(PushName): +GLOBL_FN(GL_PREFIX(PushName,PushName@4)) +GL_PREFIX(PushName,PushName@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PushName)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DrawBuffer)) -GL_PREFIX(DrawBuffer): +GLOBL_FN(GL_PREFIX(DrawBuffer,DrawBuffer@4)) +GL_PREFIX(DrawBuffer,DrawBuffer@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DrawBuffer)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Clear)) -GL_PREFIX(Clear): +GLOBL_FN(GL_PREFIX(Clear,Clear@4)) +GL_PREFIX(Clear,Clear@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Clear)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ClearAccum)) -GL_PREFIX(ClearAccum): +GLOBL_FN(GL_PREFIX(ClearAccum,ClearAccum@16)) +GL_PREFIX(ClearAccum,ClearAccum@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ClearAccum)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ClearIndex)) -GL_PREFIX(ClearIndex): +GLOBL_FN(GL_PREFIX(ClearIndex,ClearIndex@4)) +GL_PREFIX(ClearIndex,ClearIndex@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ClearIndex)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ClearColor)) -GL_PREFIX(ClearColor): +GLOBL_FN(GL_PREFIX(ClearColor,ClearColor@16)) +GL_PREFIX(ClearColor,ClearColor@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ClearColor)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ClearStencil)) -GL_PREFIX(ClearStencil): +GLOBL_FN(GL_PREFIX(ClearStencil,ClearStencil@4)) +GL_PREFIX(ClearStencil,ClearStencil@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ClearStencil)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ClearDepth)) -GL_PREFIX(ClearDepth): +GLOBL_FN(GL_PREFIX(ClearDepth,ClearDepth@8)) +GL_PREFIX(ClearDepth,ClearDepth@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ClearDepth)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(StencilMask)) -GL_PREFIX(StencilMask): +GLOBL_FN(GL_PREFIX(StencilMask,StencilMask@4)) +GL_PREFIX(StencilMask,StencilMask@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_StencilMask)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ColorMask)) -GL_PREFIX(ColorMask): +GLOBL_FN(GL_PREFIX(ColorMask,ColorMask@16)) +GL_PREFIX(ColorMask,ColorMask@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ColorMask)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DepthMask)) -GL_PREFIX(DepthMask): +GLOBL_FN(GL_PREFIX(DepthMask,DepthMask@4)) +GL_PREFIX(DepthMask,DepthMask@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DepthMask)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(IndexMask)) -GL_PREFIX(IndexMask): +GLOBL_FN(GL_PREFIX(IndexMask,IndexMask@4)) +GL_PREFIX(IndexMask,IndexMask@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_IndexMask)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Accum)) -GL_PREFIX(Accum): +GLOBL_FN(GL_PREFIX(Accum,Accum@8)) +GL_PREFIX(Accum,Accum@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Accum)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Disable)) -GL_PREFIX(Disable): +GLOBL_FN(GL_PREFIX(Disable,Disable@4)) +GL_PREFIX(Disable,Disable@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Disable)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Enable)) -GL_PREFIX(Enable): +GLOBL_FN(GL_PREFIX(Enable,Enable@4)) +GL_PREFIX(Enable,Enable@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Enable)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Finish)) -GL_PREFIX(Finish): +GLOBL_FN(GL_PREFIX(Finish,Finish@0)) +GL_PREFIX(Finish,Finish@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Finish)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Flush)) -GL_PREFIX(Flush): +GLOBL_FN(GL_PREFIX(Flush,Flush@0)) +GL_PREFIX(Flush,Flush@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Flush)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PopAttrib)) -GL_PREFIX(PopAttrib): +GLOBL_FN(GL_PREFIX(PopAttrib,PopAttrib@0)) +GL_PREFIX(PopAttrib,PopAttrib@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PopAttrib)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PushAttrib)) -GL_PREFIX(PushAttrib): +GLOBL_FN(GL_PREFIX(PushAttrib,PushAttrib@4)) +GL_PREFIX(PushAttrib,PushAttrib@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PushAttrib)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Map1d)) -GL_PREFIX(Map1d): +GLOBL_FN(GL_PREFIX(Map1d,Map1d@32)) +GL_PREFIX(Map1d,Map1d@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Map1d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Map1f)) -GL_PREFIX(Map1f): +GLOBL_FN(GL_PREFIX(Map1f,Map1f@24)) +GL_PREFIX(Map1f,Map1f@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Map1f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Map2d)) -GL_PREFIX(Map2d): +GLOBL_FN(GL_PREFIX(Map2d,Map2d@56)) +GL_PREFIX(Map2d,Map2d@56): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Map2d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Map2f)) -GL_PREFIX(Map2f): +GLOBL_FN(GL_PREFIX(Map2f,Map2f@40)) +GL_PREFIX(Map2f,Map2f@40): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Map2f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MapGrid1d)) -GL_PREFIX(MapGrid1d): +GLOBL_FN(GL_PREFIX(MapGrid1d,MapGrid1d@20)) +GL_PREFIX(MapGrid1d,MapGrid1d@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MapGrid1d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MapGrid1f)) -GL_PREFIX(MapGrid1f): +GLOBL_FN(GL_PREFIX(MapGrid1f,MapGrid1f@12)) +GL_PREFIX(MapGrid1f,MapGrid1f@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MapGrid1f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MapGrid2d)) -GL_PREFIX(MapGrid2d): +GLOBL_FN(GL_PREFIX(MapGrid2d,MapGrid2d@40)) +GL_PREFIX(MapGrid2d,MapGrid2d@40): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MapGrid2d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MapGrid2f)) -GL_PREFIX(MapGrid2f): +GLOBL_FN(GL_PREFIX(MapGrid2f,MapGrid2f@24)) +GL_PREFIX(MapGrid2f,MapGrid2f@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MapGrid2f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EvalCoord1d)) -GL_PREFIX(EvalCoord1d): +GLOBL_FN(GL_PREFIX(EvalCoord1d,EvalCoord1d@8)) +GL_PREFIX(EvalCoord1d,EvalCoord1d@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EvalCoord1d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EvalCoord1dv)) -GL_PREFIX(EvalCoord1dv): +GLOBL_FN(GL_PREFIX(EvalCoord1dv,EvalCoord1dv@4)) +GL_PREFIX(EvalCoord1dv,EvalCoord1dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EvalCoord1dv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EvalCoord1f)) -GL_PREFIX(EvalCoord1f): +GLOBL_FN(GL_PREFIX(EvalCoord1f,EvalCoord1f@4)) +GL_PREFIX(EvalCoord1f,EvalCoord1f@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EvalCoord1f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EvalCoord1fv)) -GL_PREFIX(EvalCoord1fv): +GLOBL_FN(GL_PREFIX(EvalCoord1fv,EvalCoord1fv@4)) +GL_PREFIX(EvalCoord1fv,EvalCoord1fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EvalCoord1fv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EvalCoord2d)) -GL_PREFIX(EvalCoord2d): +GLOBL_FN(GL_PREFIX(EvalCoord2d,EvalCoord2d@16)) +GL_PREFIX(EvalCoord2d,EvalCoord2d@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EvalCoord2d)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EvalCoord2dv)) -GL_PREFIX(EvalCoord2dv): +GLOBL_FN(GL_PREFIX(EvalCoord2dv,EvalCoord2dv@4)) +GL_PREFIX(EvalCoord2dv,EvalCoord2dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EvalCoord2dv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EvalCoord2f)) -GL_PREFIX(EvalCoord2f): +GLOBL_FN(GL_PREFIX(EvalCoord2f,EvalCoord2f@8)) +GL_PREFIX(EvalCoord2f,EvalCoord2f@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EvalCoord2f)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EvalCoord2fv)) -GL_PREFIX(EvalCoord2fv): +GLOBL_FN(GL_PREFIX(EvalCoord2fv,EvalCoord2fv@4)) +GL_PREFIX(EvalCoord2fv,EvalCoord2fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EvalCoord2fv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EvalMesh1)) -GL_PREFIX(EvalMesh1): +GLOBL_FN(GL_PREFIX(EvalMesh1,EvalMesh1@12)) +GL_PREFIX(EvalMesh1,EvalMesh1@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EvalMesh1)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EvalPoint1)) -GL_PREFIX(EvalPoint1): +GLOBL_FN(GL_PREFIX(EvalPoint1,EvalPoint1@4)) +GL_PREFIX(EvalPoint1,EvalPoint1@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EvalPoint1)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EvalMesh2)) -GL_PREFIX(EvalMesh2): +GLOBL_FN(GL_PREFIX(EvalMesh2,EvalMesh2@20)) +GL_PREFIX(EvalMesh2,EvalMesh2@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EvalMesh2)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EvalPoint2)) -GL_PREFIX(EvalPoint2): +GLOBL_FN(GL_PREFIX(EvalPoint2,EvalPoint2@8)) +GL_PREFIX(EvalPoint2,EvalPoint2@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EvalPoint2)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(AlphaFunc)) -GL_PREFIX(AlphaFunc): +GLOBL_FN(GL_PREFIX(AlphaFunc,AlphaFunc@8)) +GL_PREFIX(AlphaFunc,AlphaFunc@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_AlphaFunc)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BlendFunc)) -GL_PREFIX(BlendFunc): +GLOBL_FN(GL_PREFIX(BlendFunc,BlendFunc@8)) +GL_PREFIX(BlendFunc,BlendFunc@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BlendFunc)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LogicOp)) -GL_PREFIX(LogicOp): +GLOBL_FN(GL_PREFIX(LogicOp,LogicOp@4)) +GL_PREFIX(LogicOp,LogicOp@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LogicOp)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(StencilFunc)) -GL_PREFIX(StencilFunc): +GLOBL_FN(GL_PREFIX(StencilFunc,StencilFunc@12)) +GL_PREFIX(StencilFunc,StencilFunc@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_StencilFunc)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(StencilOp)) -GL_PREFIX(StencilOp): +GLOBL_FN(GL_PREFIX(StencilOp,StencilOp@12)) +GL_PREFIX(StencilOp,StencilOp@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_StencilOp)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DepthFunc)) -GL_PREFIX(DepthFunc): +GLOBL_FN(GL_PREFIX(DepthFunc,DepthFunc@4)) +GL_PREFIX(DepthFunc,DepthFunc@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DepthFunc)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PixelZoom)) -GL_PREFIX(PixelZoom): +GLOBL_FN(GL_PREFIX(PixelZoom,PixelZoom@8)) +GL_PREFIX(PixelZoom,PixelZoom@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PixelZoom)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PixelTransferf)) -GL_PREFIX(PixelTransferf): +GLOBL_FN(GL_PREFIX(PixelTransferf,PixelTransferf@8)) +GL_PREFIX(PixelTransferf,PixelTransferf@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PixelTransferf)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PixelTransferi)) -GL_PREFIX(PixelTransferi): +GLOBL_FN(GL_PREFIX(PixelTransferi,PixelTransferi@8)) +GL_PREFIX(PixelTransferi,PixelTransferi@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PixelTransferi)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PixelStoref)) -GL_PREFIX(PixelStoref): +GLOBL_FN(GL_PREFIX(PixelStoref,PixelStoref@8)) +GL_PREFIX(PixelStoref,PixelStoref@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PixelStoref)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PixelStorei)) -GL_PREFIX(PixelStorei): +GLOBL_FN(GL_PREFIX(PixelStorei,PixelStorei@8)) +GL_PREFIX(PixelStorei,PixelStorei@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PixelStorei)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PixelMapfv)) -GL_PREFIX(PixelMapfv): +GLOBL_FN(GL_PREFIX(PixelMapfv,PixelMapfv@12)) +GL_PREFIX(PixelMapfv,PixelMapfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PixelMapfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PixelMapuiv)) -GL_PREFIX(PixelMapuiv): +GLOBL_FN(GL_PREFIX(PixelMapuiv,PixelMapuiv@12)) +GL_PREFIX(PixelMapuiv,PixelMapuiv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PixelMapuiv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PixelMapusv)) -GL_PREFIX(PixelMapusv): +GLOBL_FN(GL_PREFIX(PixelMapusv,PixelMapusv@12)) +GL_PREFIX(PixelMapusv,PixelMapusv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PixelMapusv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ReadBuffer)) -GL_PREFIX(ReadBuffer): +GLOBL_FN(GL_PREFIX(ReadBuffer,ReadBuffer@4)) +GL_PREFIX(ReadBuffer,ReadBuffer@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ReadBuffer)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyPixels)) -GL_PREFIX(CopyPixels): +GLOBL_FN(GL_PREFIX(CopyPixels,CopyPixels@20)) +GL_PREFIX(CopyPixels,CopyPixels@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyPixels)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ReadPixels)) -GL_PREFIX(ReadPixels): +GLOBL_FN(GL_PREFIX(ReadPixels,ReadPixels@28)) +GL_PREFIX(ReadPixels,ReadPixels@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ReadPixels)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DrawPixels)) -GL_PREFIX(DrawPixels): +GLOBL_FN(GL_PREFIX(DrawPixels,DrawPixels@20)) +GL_PREFIX(DrawPixels,DrawPixels@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DrawPixels)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetBooleanv)) -GL_PREFIX(GetBooleanv): +GLOBL_FN(GL_PREFIX(GetBooleanv,GetBooleanv@8)) +GL_PREFIX(GetBooleanv,GetBooleanv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetBooleanv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetClipPlane)) -GL_PREFIX(GetClipPlane): +GLOBL_FN(GL_PREFIX(GetClipPlane,GetClipPlane@8)) +GL_PREFIX(GetClipPlane,GetClipPlane@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetClipPlane)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetDoublev)) -GL_PREFIX(GetDoublev): +GLOBL_FN(GL_PREFIX(GetDoublev,GetDoublev@8)) +GL_PREFIX(GetDoublev,GetDoublev@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetDoublev)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetError)) -GL_PREFIX(GetError): +GLOBL_FN(GL_PREFIX(GetError,GetError@0)) +GL_PREFIX(GetError,GetError@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetError)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetFloatv)) -GL_PREFIX(GetFloatv): +GLOBL_FN(GL_PREFIX(GetFloatv,GetFloatv@8)) +GL_PREFIX(GetFloatv,GetFloatv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetFloatv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetIntegerv)) -GL_PREFIX(GetIntegerv): +GLOBL_FN(GL_PREFIX(GetIntegerv,GetIntegerv@8)) +GL_PREFIX(GetIntegerv,GetIntegerv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetIntegerv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetLightfv)) -GL_PREFIX(GetLightfv): +GLOBL_FN(GL_PREFIX(GetLightfv,GetLightfv@12)) +GL_PREFIX(GetLightfv,GetLightfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetLightfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetLightiv)) -GL_PREFIX(GetLightiv): +GLOBL_FN(GL_PREFIX(GetLightiv,GetLightiv@12)) +GL_PREFIX(GetLightiv,GetLightiv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetLightiv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetMapdv)) -GL_PREFIX(GetMapdv): +GLOBL_FN(GL_PREFIX(GetMapdv,GetMapdv@12)) +GL_PREFIX(GetMapdv,GetMapdv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetMapdv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetMapfv)) -GL_PREFIX(GetMapfv): +GLOBL_FN(GL_PREFIX(GetMapfv,GetMapfv@12)) +GL_PREFIX(GetMapfv,GetMapfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetMapfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetMapiv)) -GL_PREFIX(GetMapiv): +GLOBL_FN(GL_PREFIX(GetMapiv,GetMapiv@12)) +GL_PREFIX(GetMapiv,GetMapiv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetMapiv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetMaterialfv)) -GL_PREFIX(GetMaterialfv): +GLOBL_FN(GL_PREFIX(GetMaterialfv,GetMaterialfv@12)) +GL_PREFIX(GetMaterialfv,GetMaterialfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetMaterialfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetMaterialiv)) -GL_PREFIX(GetMaterialiv): +GLOBL_FN(GL_PREFIX(GetMaterialiv,GetMaterialiv@12)) +GL_PREFIX(GetMaterialiv,GetMaterialiv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetMaterialiv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetPixelMapfv)) -GL_PREFIX(GetPixelMapfv): +GLOBL_FN(GL_PREFIX(GetPixelMapfv,GetPixelMapfv@8)) +GL_PREFIX(GetPixelMapfv,GetPixelMapfv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetPixelMapfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetPixelMapuiv)) -GL_PREFIX(GetPixelMapuiv): +GLOBL_FN(GL_PREFIX(GetPixelMapuiv,GetPixelMapuiv@8)) +GL_PREFIX(GetPixelMapuiv,GetPixelMapuiv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetPixelMapuiv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetPixelMapusv)) -GL_PREFIX(GetPixelMapusv): +GLOBL_FN(GL_PREFIX(GetPixelMapusv,GetPixelMapusv@8)) +GL_PREFIX(GetPixelMapusv,GetPixelMapusv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetPixelMapusv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetPolygonStipple)) -GL_PREFIX(GetPolygonStipple): +GLOBL_FN(GL_PREFIX(GetPolygonStipple,GetPolygonStipple@4)) +GL_PREFIX(GetPolygonStipple,GetPolygonStipple@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetPolygonStipple)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetString)) -GL_PREFIX(GetString): +GLOBL_FN(GL_PREFIX(GetString,GetString@4)) +GL_PREFIX(GetString,GetString@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetString)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetTexEnvfv)) -GL_PREFIX(GetTexEnvfv): +GLOBL_FN(GL_PREFIX(GetTexEnvfv,GetTexEnvfv@12)) +GL_PREFIX(GetTexEnvfv,GetTexEnvfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetTexEnvfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetTexEnviv)) -GL_PREFIX(GetTexEnviv): +GLOBL_FN(GL_PREFIX(GetTexEnviv,GetTexEnviv@12)) +GL_PREFIX(GetTexEnviv,GetTexEnviv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetTexEnviv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetTexGendv)) -GL_PREFIX(GetTexGendv): +GLOBL_FN(GL_PREFIX(GetTexGendv,GetTexGendv@12)) +GL_PREFIX(GetTexGendv,GetTexGendv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetTexGendv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetTexGenfv)) -GL_PREFIX(GetTexGenfv): +GLOBL_FN(GL_PREFIX(GetTexGenfv,GetTexGenfv@12)) +GL_PREFIX(GetTexGenfv,GetTexGenfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetTexGenfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetTexGeniv)) -GL_PREFIX(GetTexGeniv): +GLOBL_FN(GL_PREFIX(GetTexGeniv,GetTexGeniv@12)) +GL_PREFIX(GetTexGeniv,GetTexGeniv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetTexGeniv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetTexImage)) -GL_PREFIX(GetTexImage): +GLOBL_FN(GL_PREFIX(GetTexImage,GetTexImage@20)) +GL_PREFIX(GetTexImage,GetTexImage@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetTexImage)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetTexParameterfv)) -GL_PREFIX(GetTexParameterfv): +GLOBL_FN(GL_PREFIX(GetTexParameterfv,GetTexParameterfv@12)) +GL_PREFIX(GetTexParameterfv,GetTexParameterfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetTexParameterfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetTexParameteriv)) -GL_PREFIX(GetTexParameteriv): +GLOBL_FN(GL_PREFIX(GetTexParameteriv,GetTexParameteriv@12)) +GL_PREFIX(GetTexParameteriv,GetTexParameteriv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetTexParameteriv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetTexLevelParameterfv)) -GL_PREFIX(GetTexLevelParameterfv): +GLOBL_FN(GL_PREFIX(GetTexLevelParameterfv,GetTexLevelParameterfv@16)) +GL_PREFIX(GetTexLevelParameterfv,GetTexLevelParameterfv@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetTexLevelParameterfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetTexLevelParameteriv)) -GL_PREFIX(GetTexLevelParameteriv): +GLOBL_FN(GL_PREFIX(GetTexLevelParameteriv,GetTexLevelParameteriv@16)) +GL_PREFIX(GetTexLevelParameteriv,GetTexLevelParameteriv@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetTexLevelParameteriv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(IsEnabled)) -GL_PREFIX(IsEnabled): +GLOBL_FN(GL_PREFIX(IsEnabled,IsEnabled@4)) +GL_PREFIX(IsEnabled,IsEnabled@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_IsEnabled)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(IsList)) -GL_PREFIX(IsList): +GLOBL_FN(GL_PREFIX(IsList,IsList@4)) +GL_PREFIX(IsList,IsList@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_IsList)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DepthRange)) -GL_PREFIX(DepthRange): +GLOBL_FN(GL_PREFIX(DepthRange,DepthRange@16)) +GL_PREFIX(DepthRange,DepthRange@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DepthRange)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Frustum)) -GL_PREFIX(Frustum): +GLOBL_FN(GL_PREFIX(Frustum,Frustum@48)) +GL_PREFIX(Frustum,Frustum@48): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Frustum)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LoadIdentity)) -GL_PREFIX(LoadIdentity): +GLOBL_FN(GL_PREFIX(LoadIdentity,LoadIdentity@0)) +GL_PREFIX(LoadIdentity,LoadIdentity@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LoadIdentity)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LoadMatrixf)) -GL_PREFIX(LoadMatrixf): +GLOBL_FN(GL_PREFIX(LoadMatrixf,LoadMatrixf@4)) +GL_PREFIX(LoadMatrixf,LoadMatrixf@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LoadMatrixf)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LoadMatrixd)) -GL_PREFIX(LoadMatrixd): +GLOBL_FN(GL_PREFIX(LoadMatrixd,LoadMatrixd@4)) +GL_PREFIX(LoadMatrixd,LoadMatrixd@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LoadMatrixd)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MatrixMode)) -GL_PREFIX(MatrixMode): +GLOBL_FN(GL_PREFIX(MatrixMode,MatrixMode@4)) +GL_PREFIX(MatrixMode,MatrixMode@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MatrixMode)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultMatrixf)) -GL_PREFIX(MultMatrixf): +GLOBL_FN(GL_PREFIX(MultMatrixf,MultMatrixf@4)) +GL_PREFIX(MultMatrixf,MultMatrixf@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultMatrixf)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultMatrixd)) -GL_PREFIX(MultMatrixd): +GLOBL_FN(GL_PREFIX(MultMatrixd,MultMatrixd@4)) +GL_PREFIX(MultMatrixd,MultMatrixd@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultMatrixd)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Ortho)) -GL_PREFIX(Ortho): +GLOBL_FN(GL_PREFIX(Ortho,Ortho@48)) +GL_PREFIX(Ortho,Ortho@48): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Ortho)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PopMatrix)) -GL_PREFIX(PopMatrix): +GLOBL_FN(GL_PREFIX(PopMatrix,PopMatrix@0)) +GL_PREFIX(PopMatrix,PopMatrix@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PopMatrix)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PushMatrix)) -GL_PREFIX(PushMatrix): +GLOBL_FN(GL_PREFIX(PushMatrix,PushMatrix@0)) +GL_PREFIX(PushMatrix,PushMatrix@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PushMatrix)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Rotated)) -GL_PREFIX(Rotated): +GLOBL_FN(GL_PREFIX(Rotated,Rotated@32)) +GL_PREFIX(Rotated,Rotated@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Rotated)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Rotatef)) -GL_PREFIX(Rotatef): +GLOBL_FN(GL_PREFIX(Rotatef,Rotatef@16)) +GL_PREFIX(Rotatef,Rotatef@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Rotatef)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Scaled)) -GL_PREFIX(Scaled): +GLOBL_FN(GL_PREFIX(Scaled,Scaled@24)) +GL_PREFIX(Scaled,Scaled@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Scaled)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Scalef)) -GL_PREFIX(Scalef): +GLOBL_FN(GL_PREFIX(Scalef,Scalef@12)) +GL_PREFIX(Scalef,Scalef@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Scalef)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Translated)) -GL_PREFIX(Translated): +GLOBL_FN(GL_PREFIX(Translated,Translated@24)) +GL_PREFIX(Translated,Translated@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Translated)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Translatef)) -GL_PREFIX(Translatef): +GLOBL_FN(GL_PREFIX(Translatef,Translatef@12)) +GL_PREFIX(Translatef,Translatef@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Translatef)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Viewport)) -GL_PREFIX(Viewport): +GLOBL_FN(GL_PREFIX(Viewport,Viewport@16)) +GL_PREFIX(Viewport,Viewport@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Viewport)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ArrayElement)) -GL_PREFIX(ArrayElement): +GLOBL_FN(GL_PREFIX(ArrayElement,ArrayElement@4)) +GL_PREFIX(ArrayElement,ArrayElement@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ArrayElement)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ColorPointer)) -GL_PREFIX(ColorPointer): +GLOBL_FN(GL_PREFIX(ColorPointer,ColorPointer@16)) +GL_PREFIX(ColorPointer,ColorPointer@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ColorPointer)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DisableClientState)) -GL_PREFIX(DisableClientState): +GLOBL_FN(GL_PREFIX(DisableClientState,DisableClientState@4)) +GL_PREFIX(DisableClientState,DisableClientState@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DisableClientState)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DrawArrays)) -GL_PREFIX(DrawArrays): +GLOBL_FN(GL_PREFIX(DrawArrays,DrawArrays@12)) +GL_PREFIX(DrawArrays,DrawArrays@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DrawArrays)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DrawElements)) -GL_PREFIX(DrawElements): +GLOBL_FN(GL_PREFIX(DrawElements,DrawElements@16)) +GL_PREFIX(DrawElements,DrawElements@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DrawElements)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EdgeFlagPointer)) -GL_PREFIX(EdgeFlagPointer): +GLOBL_FN(GL_PREFIX(EdgeFlagPointer,EdgeFlagPointer@8)) +GL_PREFIX(EdgeFlagPointer,EdgeFlagPointer@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EdgeFlagPointer)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EnableClientState)) -GL_PREFIX(EnableClientState): +GLOBL_FN(GL_PREFIX(EnableClientState,EnableClientState@4)) +GL_PREFIX(EnableClientState,EnableClientState@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EnableClientState)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetPointerv)) -GL_PREFIX(GetPointerv): +GLOBL_FN(GL_PREFIX(GetPointerv,GetPointerv@8)) +GL_PREFIX(GetPointerv,GetPointerv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetPointerv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(IndexPointer)) -GL_PREFIX(IndexPointer): +GLOBL_FN(GL_PREFIX(IndexPointer,IndexPointer@12)) +GL_PREFIX(IndexPointer,IndexPointer@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_IndexPointer)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(InterleavedArrays)) -GL_PREFIX(InterleavedArrays): +GLOBL_FN(GL_PREFIX(InterleavedArrays,InterleavedArrays@12)) +GL_PREFIX(InterleavedArrays,InterleavedArrays@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_InterleavedArrays)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(NormalPointer)) -GL_PREFIX(NormalPointer): +GLOBL_FN(GL_PREFIX(NormalPointer,NormalPointer@12)) +GL_PREFIX(NormalPointer,NormalPointer@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_NormalPointer)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoordPointer)) -GL_PREFIX(TexCoordPointer): +GLOBL_FN(GL_PREFIX(TexCoordPointer,TexCoordPointer@16)) +GL_PREFIX(TexCoordPointer,TexCoordPointer@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoordPointer)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexPointer)) -GL_PREFIX(VertexPointer): +GLOBL_FN(GL_PREFIX(VertexPointer,VertexPointer@16)) +GL_PREFIX(VertexPointer,VertexPointer@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexPointer)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PolygonOffset)) -GL_PREFIX(PolygonOffset): +GLOBL_FN(GL_PREFIX(PolygonOffset,PolygonOffset@8)) +GL_PREFIX(PolygonOffset,PolygonOffset@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PolygonOffset)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyTexImage1D)) -GL_PREFIX(CopyTexImage1D): +GLOBL_FN(GL_PREFIX(CopyTexImage1D,CopyTexImage1D@28)) +GL_PREFIX(CopyTexImage1D,CopyTexImage1D@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyTexImage1D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyTexImage2D)) -GL_PREFIX(CopyTexImage2D): +GLOBL_FN(GL_PREFIX(CopyTexImage2D,CopyTexImage2D@32)) +GL_PREFIX(CopyTexImage2D,CopyTexImage2D@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyTexImage2D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyTexSubImage1D)) -GL_PREFIX(CopyTexSubImage1D): +GLOBL_FN(GL_PREFIX(CopyTexSubImage1D,CopyTexSubImage1D@24)) +GL_PREFIX(CopyTexSubImage1D,CopyTexSubImage1D@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyTexSubImage1D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyTexSubImage2D)) -GL_PREFIX(CopyTexSubImage2D): +GLOBL_FN(GL_PREFIX(CopyTexSubImage2D,CopyTexSubImage2D@32)) +GL_PREFIX(CopyTexSubImage2D,CopyTexSubImage2D@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyTexSubImage2D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexSubImage1D)) -GL_PREFIX(TexSubImage1D): +GLOBL_FN(GL_PREFIX(TexSubImage1D,TexSubImage1D@28)) +GL_PREFIX(TexSubImage1D,TexSubImage1D@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexSubImage1D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexSubImage2D)) -GL_PREFIX(TexSubImage2D): +GLOBL_FN(GL_PREFIX(TexSubImage2D,TexSubImage2D@36)) +GL_PREFIX(TexSubImage2D,TexSubImage2D@36): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexSubImage2D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(AreTexturesResident)) -GL_PREFIX(AreTexturesResident): +GLOBL_FN(GL_PREFIX(AreTexturesResident,AreTexturesResident@12)) +GL_PREFIX(AreTexturesResident,AreTexturesResident@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_AreTexturesResident)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BindTexture)) -GL_PREFIX(BindTexture): +GLOBL_FN(GL_PREFIX(BindTexture,BindTexture@8)) +GL_PREFIX(BindTexture,BindTexture@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BindTexture)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DeleteTextures)) -GL_PREFIX(DeleteTextures): +GLOBL_FN(GL_PREFIX(DeleteTextures,DeleteTextures@8)) +GL_PREFIX(DeleteTextures,DeleteTextures@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DeleteTextures)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GenTextures)) -GL_PREFIX(GenTextures): +GLOBL_FN(GL_PREFIX(GenTextures,GenTextures@8)) +GL_PREFIX(GenTextures,GenTextures@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GenTextures)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(IsTexture)) -GL_PREFIX(IsTexture): +GLOBL_FN(GL_PREFIX(IsTexture,IsTexture@4)) +GL_PREFIX(IsTexture,IsTexture@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_IsTexture)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PrioritizeTextures)) -GL_PREFIX(PrioritizeTextures): +GLOBL_FN(GL_PREFIX(PrioritizeTextures,PrioritizeTextures@12)) +GL_PREFIX(PrioritizeTextures,PrioritizeTextures@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PrioritizeTextures)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Indexub)) -GL_PREFIX(Indexub): +GLOBL_FN(GL_PREFIX(Indexub,Indexub@4)) +GL_PREFIX(Indexub,Indexub@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Indexub)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Indexubv)) -GL_PREFIX(Indexubv): +GLOBL_FN(GL_PREFIX(Indexubv,Indexubv@4)) +GL_PREFIX(Indexubv,Indexubv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Indexubv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PopClientAttrib)) -GL_PREFIX(PopClientAttrib): +GLOBL_FN(GL_PREFIX(PopClientAttrib,PopClientAttrib@0)) +GL_PREFIX(PopClientAttrib,PopClientAttrib@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PopClientAttrib)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PushClientAttrib)) -GL_PREFIX(PushClientAttrib): +GLOBL_FN(GL_PREFIX(PushClientAttrib,PushClientAttrib@4)) +GL_PREFIX(PushClientAttrib,PushClientAttrib@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PushClientAttrib)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BlendColor)) -GL_PREFIX(BlendColor): +GLOBL_FN(GL_PREFIX(BlendColor,BlendColor@16)) +GL_PREFIX(BlendColor,BlendColor@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BlendColor)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BlendEquation)) -GL_PREFIX(BlendEquation): +GLOBL_FN(GL_PREFIX(BlendEquation,BlendEquation@4)) +GL_PREFIX(BlendEquation,BlendEquation@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BlendEquation)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DrawRangeElements)) -GL_PREFIX(DrawRangeElements): +GLOBL_FN(GL_PREFIX(DrawRangeElements,DrawRangeElements@24)) +GL_PREFIX(DrawRangeElements,DrawRangeElements@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DrawRangeElements)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ColorTable)) -GL_PREFIX(ColorTable): +GLOBL_FN(GL_PREFIX(ColorTable,ColorTable@24)) +GL_PREFIX(ColorTable,ColorTable@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ColorTable)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ColorTableParameterfv)) -GL_PREFIX(ColorTableParameterfv): +GLOBL_FN(GL_PREFIX(ColorTableParameterfv,ColorTableParameterfv@12)) +GL_PREFIX(ColorTableParameterfv,ColorTableParameterfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ColorTableParameterfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ColorTableParameteriv)) -GL_PREFIX(ColorTableParameteriv): +GLOBL_FN(GL_PREFIX(ColorTableParameteriv,ColorTableParameteriv@12)) +GL_PREFIX(ColorTableParameteriv,ColorTableParameteriv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ColorTableParameteriv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyColorTable)) -GL_PREFIX(CopyColorTable): +GLOBL_FN(GL_PREFIX(CopyColorTable,CopyColorTable@20)) +GL_PREFIX(CopyColorTable,CopyColorTable@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyColorTable)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetColorTable)) -GL_PREFIX(GetColorTable): +GLOBL_FN(GL_PREFIX(GetColorTable,GetColorTable@16)) +GL_PREFIX(GetColorTable,GetColorTable@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetColorTable)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetColorTableParameterfv)) -GL_PREFIX(GetColorTableParameterfv): +GLOBL_FN(GL_PREFIX(GetColorTableParameterfv,GetColorTableParameterfv@12)) +GL_PREFIX(GetColorTableParameterfv,GetColorTableParameterfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetColorTableParameterfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetColorTableParameteriv)) -GL_PREFIX(GetColorTableParameteriv): +GLOBL_FN(GL_PREFIX(GetColorTableParameteriv,GetColorTableParameteriv@12)) +GL_PREFIX(GetColorTableParameteriv,GetColorTableParameteriv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetColorTableParameteriv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ColorSubTable)) -GL_PREFIX(ColorSubTable): +GLOBL_FN(GL_PREFIX(ColorSubTable,ColorSubTable@24)) +GL_PREFIX(ColorSubTable,ColorSubTable@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ColorSubTable)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyColorSubTable)) -GL_PREFIX(CopyColorSubTable): +GLOBL_FN(GL_PREFIX(CopyColorSubTable,CopyColorSubTable@20)) +GL_PREFIX(CopyColorSubTable,CopyColorSubTable@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyColorSubTable)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ConvolutionFilter1D)) -GL_PREFIX(ConvolutionFilter1D): +GLOBL_FN(GL_PREFIX(ConvolutionFilter1D,ConvolutionFilter1D@24)) +GL_PREFIX(ConvolutionFilter1D,ConvolutionFilter1D@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ConvolutionFilter1D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ConvolutionFilter2D)) -GL_PREFIX(ConvolutionFilter2D): +GLOBL_FN(GL_PREFIX(ConvolutionFilter2D,ConvolutionFilter2D@28)) +GL_PREFIX(ConvolutionFilter2D,ConvolutionFilter2D@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ConvolutionFilter2D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ConvolutionParameterf)) -GL_PREFIX(ConvolutionParameterf): +GLOBL_FN(GL_PREFIX(ConvolutionParameterf,ConvolutionParameterf@12)) +GL_PREFIX(ConvolutionParameterf,ConvolutionParameterf@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ConvolutionParameterf)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ConvolutionParameterfv)) -GL_PREFIX(ConvolutionParameterfv): +GLOBL_FN(GL_PREFIX(ConvolutionParameterfv,ConvolutionParameterfv@12)) +GL_PREFIX(ConvolutionParameterfv,ConvolutionParameterfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ConvolutionParameterfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ConvolutionParameteri)) -GL_PREFIX(ConvolutionParameteri): +GLOBL_FN(GL_PREFIX(ConvolutionParameteri,ConvolutionParameteri@12)) +GL_PREFIX(ConvolutionParameteri,ConvolutionParameteri@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ConvolutionParameteri)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ConvolutionParameteriv)) -GL_PREFIX(ConvolutionParameteriv): +GLOBL_FN(GL_PREFIX(ConvolutionParameteriv,ConvolutionParameteriv@12)) +GL_PREFIX(ConvolutionParameteriv,ConvolutionParameteriv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ConvolutionParameteriv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyConvolutionFilter1D)) -GL_PREFIX(CopyConvolutionFilter1D): +GLOBL_FN(GL_PREFIX(CopyConvolutionFilter1D,CopyConvolutionFilter1D@20)) +GL_PREFIX(CopyConvolutionFilter1D,CopyConvolutionFilter1D@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyConvolutionFilter1D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyConvolutionFilter2D)) -GL_PREFIX(CopyConvolutionFilter2D): +GLOBL_FN(GL_PREFIX(CopyConvolutionFilter2D,CopyConvolutionFilter2D@24)) +GL_PREFIX(CopyConvolutionFilter2D,CopyConvolutionFilter2D@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyConvolutionFilter2D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetConvolutionFilter)) -GL_PREFIX(GetConvolutionFilter): +GLOBL_FN(GL_PREFIX(GetConvolutionFilter,GetConvolutionFilter@16)) +GL_PREFIX(GetConvolutionFilter,GetConvolutionFilter@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetConvolutionFilter)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetConvolutionParameterfv)) -GL_PREFIX(GetConvolutionParameterfv): +GLOBL_FN(GL_PREFIX(GetConvolutionParameterfv,GetConvolutionParameterfv@12)) +GL_PREFIX(GetConvolutionParameterfv,GetConvolutionParameterfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetConvolutionParameterfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetConvolutionParameteriv)) -GL_PREFIX(GetConvolutionParameteriv): +GLOBL_FN(GL_PREFIX(GetConvolutionParameteriv,GetConvolutionParameteriv@12)) +GL_PREFIX(GetConvolutionParameteriv,GetConvolutionParameteriv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetConvolutionParameteriv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetSeparableFilter)) -GL_PREFIX(GetSeparableFilter): +GLOBL_FN(GL_PREFIX(GetSeparableFilter,GetSeparableFilter@24)) +GL_PREFIX(GetSeparableFilter,GetSeparableFilter@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetSeparableFilter)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SeparableFilter2D)) -GL_PREFIX(SeparableFilter2D): +GLOBL_FN(GL_PREFIX(SeparableFilter2D,SeparableFilter2D@32)) +GL_PREFIX(SeparableFilter2D,SeparableFilter2D@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SeparableFilter2D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetHistogram)) -GL_PREFIX(GetHistogram): +GLOBL_FN(GL_PREFIX(GetHistogram,GetHistogram@20)) +GL_PREFIX(GetHistogram,GetHistogram@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetHistogram)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetHistogramParameterfv)) -GL_PREFIX(GetHistogramParameterfv): +GLOBL_FN(GL_PREFIX(GetHistogramParameterfv,GetHistogramParameterfv@12)) +GL_PREFIX(GetHistogramParameterfv,GetHistogramParameterfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetHistogramParameterfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetHistogramParameteriv)) -GL_PREFIX(GetHistogramParameteriv): +GLOBL_FN(GL_PREFIX(GetHistogramParameteriv,GetHistogramParameteriv@12)) +GL_PREFIX(GetHistogramParameteriv,GetHistogramParameteriv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetHistogramParameteriv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetMinmax)) -GL_PREFIX(GetMinmax): +GLOBL_FN(GL_PREFIX(GetMinmax,GetMinmax@20)) +GL_PREFIX(GetMinmax,GetMinmax@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetMinmax)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetMinmaxParameterfv)) -GL_PREFIX(GetMinmaxParameterfv): +GLOBL_FN(GL_PREFIX(GetMinmaxParameterfv,GetMinmaxParameterfv@12)) +GL_PREFIX(GetMinmaxParameterfv,GetMinmaxParameterfv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetMinmaxParameterfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetMinmaxParameteriv)) -GL_PREFIX(GetMinmaxParameteriv): +GLOBL_FN(GL_PREFIX(GetMinmaxParameteriv,GetMinmaxParameteriv@12)) +GL_PREFIX(GetMinmaxParameteriv,GetMinmaxParameteriv@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetMinmaxParameteriv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Histogram)) -GL_PREFIX(Histogram): +GLOBL_FN(GL_PREFIX(Histogram,Histogram@16)) +GL_PREFIX(Histogram,Histogram@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Histogram)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(Minmax)) -GL_PREFIX(Minmax): +GLOBL_FN(GL_PREFIX(Minmax,Minmax@12)) +GL_PREFIX(Minmax,Minmax@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Minmax)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ResetHistogram)) -GL_PREFIX(ResetHistogram): +GLOBL_FN(GL_PREFIX(ResetHistogram,ResetHistogram@4)) +GL_PREFIX(ResetHistogram,ResetHistogram@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ResetHistogram)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ResetMinmax)) -GL_PREFIX(ResetMinmax): +GLOBL_FN(GL_PREFIX(ResetMinmax,ResetMinmax@4)) +GL_PREFIX(ResetMinmax,ResetMinmax@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ResetMinmax)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexImage3D)) -GL_PREFIX(TexImage3D): +GLOBL_FN(GL_PREFIX(TexImage3D,TexImage3D@40)) +GL_PREFIX(TexImage3D,TexImage3D@40): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexImage3D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexSubImage3D)) -GL_PREFIX(TexSubImage3D): +GLOBL_FN(GL_PREFIX(TexSubImage3D,TexSubImage3D@44)) +GL_PREFIX(TexSubImage3D,TexSubImage3D@44): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexSubImage3D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyTexSubImage3D)) -GL_PREFIX(CopyTexSubImage3D): +GLOBL_FN(GL_PREFIX(CopyTexSubImage3D,CopyTexSubImage3D@36)) +GL_PREFIX(CopyTexSubImage3D,CopyTexSubImage3D@36): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyTexSubImage3D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ActiveTextureARB)) -GL_PREFIX(ActiveTextureARB): +GLOBL_FN(GL_PREFIX(ActiveTextureARB,ActiveTextureARB@4)) +GL_PREFIX(ActiveTextureARB,ActiveTextureARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ActiveTextureARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ClientActiveTextureARB)) -GL_PREFIX(ClientActiveTextureARB): +GLOBL_FN(GL_PREFIX(ClientActiveTextureARB,ClientActiveTextureARB@4)) +GL_PREFIX(ClientActiveTextureARB,ClientActiveTextureARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ClientActiveTextureARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1dARB)) -GL_PREFIX(MultiTexCoord1dARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord1dARB,MultiTexCoord1dARB@12)) +GL_PREFIX(MultiTexCoord1dARB,MultiTexCoord1dARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1dARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1dvARB)) -GL_PREFIX(MultiTexCoord1dvARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord1dvARB,MultiTexCoord1dvARB@8)) +GL_PREFIX(MultiTexCoord1dvARB,MultiTexCoord1dvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1dvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1fARB)) -GL_PREFIX(MultiTexCoord1fARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord1fARB,MultiTexCoord1fARB@8)) +GL_PREFIX(MultiTexCoord1fARB,MultiTexCoord1fARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1fARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1fvARB)) -GL_PREFIX(MultiTexCoord1fvARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord1fvARB,MultiTexCoord1fvARB@8)) +GL_PREFIX(MultiTexCoord1fvARB,MultiTexCoord1fvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1fvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1iARB)) -GL_PREFIX(MultiTexCoord1iARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord1iARB,MultiTexCoord1iARB@8)) +GL_PREFIX(MultiTexCoord1iARB,MultiTexCoord1iARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1iARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1ivARB)) -GL_PREFIX(MultiTexCoord1ivARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord1ivARB,MultiTexCoord1ivARB@8)) +GL_PREFIX(MultiTexCoord1ivARB,MultiTexCoord1ivARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1ivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1sARB)) -GL_PREFIX(MultiTexCoord1sARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord1sARB,MultiTexCoord1sARB@8)) +GL_PREFIX(MultiTexCoord1sARB,MultiTexCoord1sARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1sARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1svARB)) -GL_PREFIX(MultiTexCoord1svARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord1svARB,MultiTexCoord1svARB@8)) +GL_PREFIX(MultiTexCoord1svARB,MultiTexCoord1svARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1svARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2dARB)) -GL_PREFIX(MultiTexCoord2dARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord2dARB,MultiTexCoord2dARB@20)) +GL_PREFIX(MultiTexCoord2dARB,MultiTexCoord2dARB@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2dARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2dvARB)) -GL_PREFIX(MultiTexCoord2dvARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord2dvARB,MultiTexCoord2dvARB@8)) +GL_PREFIX(MultiTexCoord2dvARB,MultiTexCoord2dvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2dvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2fARB)) -GL_PREFIX(MultiTexCoord2fARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord2fARB,MultiTexCoord2fARB@12)) +GL_PREFIX(MultiTexCoord2fARB,MultiTexCoord2fARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2fARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2fvARB)) -GL_PREFIX(MultiTexCoord2fvARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord2fvARB,MultiTexCoord2fvARB@8)) +GL_PREFIX(MultiTexCoord2fvARB,MultiTexCoord2fvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2fvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2iARB)) -GL_PREFIX(MultiTexCoord2iARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord2iARB,MultiTexCoord2iARB@12)) +GL_PREFIX(MultiTexCoord2iARB,MultiTexCoord2iARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2iARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2ivARB)) -GL_PREFIX(MultiTexCoord2ivARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord2ivARB,MultiTexCoord2ivARB@8)) +GL_PREFIX(MultiTexCoord2ivARB,MultiTexCoord2ivARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2ivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2sARB)) -GL_PREFIX(MultiTexCoord2sARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord2sARB,MultiTexCoord2sARB@12)) +GL_PREFIX(MultiTexCoord2sARB,MultiTexCoord2sARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2sARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2svARB)) -GL_PREFIX(MultiTexCoord2svARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord2svARB,MultiTexCoord2svARB@8)) +GL_PREFIX(MultiTexCoord2svARB,MultiTexCoord2svARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2svARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3dARB)) -GL_PREFIX(MultiTexCoord3dARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord3dARB,MultiTexCoord3dARB@28)) +GL_PREFIX(MultiTexCoord3dARB,MultiTexCoord3dARB@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3dARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3dvARB)) -GL_PREFIX(MultiTexCoord3dvARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord3dvARB,MultiTexCoord3dvARB@8)) +GL_PREFIX(MultiTexCoord3dvARB,MultiTexCoord3dvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3dvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3fARB)) -GL_PREFIX(MultiTexCoord3fARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord3fARB,MultiTexCoord3fARB@16)) +GL_PREFIX(MultiTexCoord3fARB,MultiTexCoord3fARB@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3fARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3fvARB)) -GL_PREFIX(MultiTexCoord3fvARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord3fvARB,MultiTexCoord3fvARB@8)) +GL_PREFIX(MultiTexCoord3fvARB,MultiTexCoord3fvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3fvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3iARB)) -GL_PREFIX(MultiTexCoord3iARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord3iARB,MultiTexCoord3iARB@16)) +GL_PREFIX(MultiTexCoord3iARB,MultiTexCoord3iARB@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3iARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3ivARB)) -GL_PREFIX(MultiTexCoord3ivARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord3ivARB,MultiTexCoord3ivARB@8)) +GL_PREFIX(MultiTexCoord3ivARB,MultiTexCoord3ivARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3ivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3sARB)) -GL_PREFIX(MultiTexCoord3sARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord3sARB,MultiTexCoord3sARB@16)) +GL_PREFIX(MultiTexCoord3sARB,MultiTexCoord3sARB@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3sARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3svARB)) -GL_PREFIX(MultiTexCoord3svARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord3svARB,MultiTexCoord3svARB@8)) +GL_PREFIX(MultiTexCoord3svARB,MultiTexCoord3svARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3svARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4dARB)) -GL_PREFIX(MultiTexCoord4dARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord4dARB,MultiTexCoord4dARB@36)) +GL_PREFIX(MultiTexCoord4dARB,MultiTexCoord4dARB@36): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4dARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4dvARB)) -GL_PREFIX(MultiTexCoord4dvARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord4dvARB,MultiTexCoord4dvARB@8)) +GL_PREFIX(MultiTexCoord4dvARB,MultiTexCoord4dvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4dvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4fARB)) -GL_PREFIX(MultiTexCoord4fARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord4fARB,MultiTexCoord4fARB@20)) +GL_PREFIX(MultiTexCoord4fARB,MultiTexCoord4fARB@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4fARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4fvARB)) -GL_PREFIX(MultiTexCoord4fvARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord4fvARB,MultiTexCoord4fvARB@8)) +GL_PREFIX(MultiTexCoord4fvARB,MultiTexCoord4fvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4fvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4iARB)) -GL_PREFIX(MultiTexCoord4iARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord4iARB,MultiTexCoord4iARB@20)) +GL_PREFIX(MultiTexCoord4iARB,MultiTexCoord4iARB@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4iARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4ivARB)) -GL_PREFIX(MultiTexCoord4ivARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord4ivARB,MultiTexCoord4ivARB@8)) +GL_PREFIX(MultiTexCoord4ivARB,MultiTexCoord4ivARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4ivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4sARB)) -GL_PREFIX(MultiTexCoord4sARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord4sARB,MultiTexCoord4sARB@20)) +GL_PREFIX(MultiTexCoord4sARB,MultiTexCoord4sARB@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4sARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4svARB)) -GL_PREFIX(MultiTexCoord4svARB): +GLOBL_FN(GL_PREFIX(MultiTexCoord4svARB,MultiTexCoord4svARB@8)) +GL_PREFIX(MultiTexCoord4svARB,MultiTexCoord4svARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4svARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LoadTransposeMatrixfARB)) -GL_PREFIX(LoadTransposeMatrixfARB): +GLOBL_FN(GL_PREFIX(LoadTransposeMatrixfARB,LoadTransposeMatrixfARB@4)) +GL_PREFIX(LoadTransposeMatrixfARB,LoadTransposeMatrixfARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LoadTransposeMatrixfARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LoadTransposeMatrixdARB)) -GL_PREFIX(LoadTransposeMatrixdARB): +GLOBL_FN(GL_PREFIX(LoadTransposeMatrixdARB,LoadTransposeMatrixdARB@4)) +GL_PREFIX(LoadTransposeMatrixdARB,LoadTransposeMatrixdARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LoadTransposeMatrixdARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultTransposeMatrixfARB)) -GL_PREFIX(MultTransposeMatrixfARB): +GLOBL_FN(GL_PREFIX(MultTransposeMatrixfARB,MultTransposeMatrixfARB@4)) +GL_PREFIX(MultTransposeMatrixfARB,MultTransposeMatrixfARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultTransposeMatrixfARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultTransposeMatrixdARB)) -GL_PREFIX(MultTransposeMatrixdARB): +GLOBL_FN(GL_PREFIX(MultTransposeMatrixdARB,MultTransposeMatrixdARB@4)) +GL_PREFIX(MultTransposeMatrixdARB,MultTransposeMatrixdARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultTransposeMatrixdARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SampleCoverageARB)) -GL_PREFIX(SampleCoverageARB): +GLOBL_FN(GL_PREFIX(SampleCoverageARB,SampleCoverageARB@8)) +GL_PREFIX(SampleCoverageARB,SampleCoverageARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SampleCoverageARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(__unused413)) -GL_PREFIX(__unused413): +GLOBL_FN(GL_PREFIX(__unused413,__unused413@0)) +GL_PREFIX(__unused413,__unused413@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset___unused413)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CompressedTexImage3DARB)) -GL_PREFIX(CompressedTexImage3DARB): +GLOBL_FN(GL_PREFIX(CompressedTexImage3DARB,CompressedTexImage3DARB@36)) +GL_PREFIX(CompressedTexImage3DARB,CompressedTexImage3DARB@36): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CompressedTexImage3DARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CompressedTexImage2DARB)) -GL_PREFIX(CompressedTexImage2DARB): +GLOBL_FN(GL_PREFIX(CompressedTexImage2DARB,CompressedTexImage2DARB@32)) +GL_PREFIX(CompressedTexImage2DARB,CompressedTexImage2DARB@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CompressedTexImage2DARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CompressedTexImage1DARB)) -GL_PREFIX(CompressedTexImage1DARB): +GLOBL_FN(GL_PREFIX(CompressedTexImage1DARB,CompressedTexImage1DARB@28)) +GL_PREFIX(CompressedTexImage1DARB,CompressedTexImage1DARB@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CompressedTexImage1DARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CompressedTexSubImage3DARB)) -GL_PREFIX(CompressedTexSubImage3DARB): +GLOBL_FN(GL_PREFIX(CompressedTexSubImage3DARB,CompressedTexSubImage3DARB@44)) +GL_PREFIX(CompressedTexSubImage3DARB,CompressedTexSubImage3DARB@44): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CompressedTexSubImage3DARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CompressedTexSubImage2DARB)) -GL_PREFIX(CompressedTexSubImage2DARB): +GLOBL_FN(GL_PREFIX(CompressedTexSubImage2DARB,CompressedTexSubImage2DARB@36)) +GL_PREFIX(CompressedTexSubImage2DARB,CompressedTexSubImage2DARB@36): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CompressedTexSubImage2DARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CompressedTexSubImage1DARB)) -GL_PREFIX(CompressedTexSubImage1DARB): +GLOBL_FN(GL_PREFIX(CompressedTexSubImage1DARB,CompressedTexSubImage1DARB@28)) +GL_PREFIX(CompressedTexSubImage1DARB,CompressedTexSubImage1DARB@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CompressedTexSubImage1DARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetCompressedTexImageARB)) -GL_PREFIX(GetCompressedTexImageARB): +GLOBL_FN(GL_PREFIX(GetCompressedTexImageARB,GetCompressedTexImageARB@12)) +GL_PREFIX(GetCompressedTexImageARB,GetCompressedTexImageARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetCompressedTexImageARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ActiveTexture)) -GL_PREFIX(ActiveTexture): +GLOBL_FN(GL_PREFIX(ActiveTexture,ActiveTexture@4)) +GL_PREFIX(ActiveTexture,ActiveTexture@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ActiveTextureARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ClientActiveTexture)) -GL_PREFIX(ClientActiveTexture): +GLOBL_FN(GL_PREFIX(ClientActiveTexture,ClientActiveTexture@4)) +GL_PREFIX(ClientActiveTexture,ClientActiveTexture@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ClientActiveTextureARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1d)) -GL_PREFIX(MultiTexCoord1d): +GLOBL_FN(GL_PREFIX(MultiTexCoord1d,MultiTexCoord1d@12)) +GL_PREFIX(MultiTexCoord1d,MultiTexCoord1d@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1dARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1dv)) -GL_PREFIX(MultiTexCoord1dv): +GLOBL_FN(GL_PREFIX(MultiTexCoord1dv,MultiTexCoord1dv@8)) +GL_PREFIX(MultiTexCoord1dv,MultiTexCoord1dv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1dvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1f)) -GL_PREFIX(MultiTexCoord1f): +GLOBL_FN(GL_PREFIX(MultiTexCoord1f,MultiTexCoord1f@8)) +GL_PREFIX(MultiTexCoord1f,MultiTexCoord1f@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1fARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1fv)) -GL_PREFIX(MultiTexCoord1fv): +GLOBL_FN(GL_PREFIX(MultiTexCoord1fv,MultiTexCoord1fv@8)) +GL_PREFIX(MultiTexCoord1fv,MultiTexCoord1fv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1fvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1i)) -GL_PREFIX(MultiTexCoord1i): +GLOBL_FN(GL_PREFIX(MultiTexCoord1i,MultiTexCoord1i@8)) +GL_PREFIX(MultiTexCoord1i,MultiTexCoord1i@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1iARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1iv)) -GL_PREFIX(MultiTexCoord1iv): +GLOBL_FN(GL_PREFIX(MultiTexCoord1iv,MultiTexCoord1iv@8)) +GL_PREFIX(MultiTexCoord1iv,MultiTexCoord1iv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1ivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1s)) -GL_PREFIX(MultiTexCoord1s): +GLOBL_FN(GL_PREFIX(MultiTexCoord1s,MultiTexCoord1s@8)) +GL_PREFIX(MultiTexCoord1s,MultiTexCoord1s@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1sARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord1sv)) -GL_PREFIX(MultiTexCoord1sv): +GLOBL_FN(GL_PREFIX(MultiTexCoord1sv,MultiTexCoord1sv@8)) +GL_PREFIX(MultiTexCoord1sv,MultiTexCoord1sv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord1svARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2d)) -GL_PREFIX(MultiTexCoord2d): +GLOBL_FN(GL_PREFIX(MultiTexCoord2d,MultiTexCoord2d@20)) +GL_PREFIX(MultiTexCoord2d,MultiTexCoord2d@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2dARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2dv)) -GL_PREFIX(MultiTexCoord2dv): +GLOBL_FN(GL_PREFIX(MultiTexCoord2dv,MultiTexCoord2dv@8)) +GL_PREFIX(MultiTexCoord2dv,MultiTexCoord2dv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2dvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2f)) -GL_PREFIX(MultiTexCoord2f): +GLOBL_FN(GL_PREFIX(MultiTexCoord2f,MultiTexCoord2f@12)) +GL_PREFIX(MultiTexCoord2f,MultiTexCoord2f@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2fARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2fv)) -GL_PREFIX(MultiTexCoord2fv): +GLOBL_FN(GL_PREFIX(MultiTexCoord2fv,MultiTexCoord2fv@8)) +GL_PREFIX(MultiTexCoord2fv,MultiTexCoord2fv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2fvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2i)) -GL_PREFIX(MultiTexCoord2i): +GLOBL_FN(GL_PREFIX(MultiTexCoord2i,MultiTexCoord2i@12)) +GL_PREFIX(MultiTexCoord2i,MultiTexCoord2i@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2iARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2iv)) -GL_PREFIX(MultiTexCoord2iv): +GLOBL_FN(GL_PREFIX(MultiTexCoord2iv,MultiTexCoord2iv@8)) +GL_PREFIX(MultiTexCoord2iv,MultiTexCoord2iv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2ivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2s)) -GL_PREFIX(MultiTexCoord2s): +GLOBL_FN(GL_PREFIX(MultiTexCoord2s,MultiTexCoord2s@12)) +GL_PREFIX(MultiTexCoord2s,MultiTexCoord2s@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2sARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord2sv)) -GL_PREFIX(MultiTexCoord2sv): +GLOBL_FN(GL_PREFIX(MultiTexCoord2sv,MultiTexCoord2sv@8)) +GL_PREFIX(MultiTexCoord2sv,MultiTexCoord2sv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord2svARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3d)) -GL_PREFIX(MultiTexCoord3d): +GLOBL_FN(GL_PREFIX(MultiTexCoord3d,MultiTexCoord3d@28)) +GL_PREFIX(MultiTexCoord3d,MultiTexCoord3d@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3dARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3dv)) -GL_PREFIX(MultiTexCoord3dv): +GLOBL_FN(GL_PREFIX(MultiTexCoord3dv,MultiTexCoord3dv@8)) +GL_PREFIX(MultiTexCoord3dv,MultiTexCoord3dv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3dvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3f)) -GL_PREFIX(MultiTexCoord3f): +GLOBL_FN(GL_PREFIX(MultiTexCoord3f,MultiTexCoord3f@16)) +GL_PREFIX(MultiTexCoord3f,MultiTexCoord3f@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3fARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3fv)) -GL_PREFIX(MultiTexCoord3fv): +GLOBL_FN(GL_PREFIX(MultiTexCoord3fv,MultiTexCoord3fv@8)) +GL_PREFIX(MultiTexCoord3fv,MultiTexCoord3fv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3fvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3i)) -GL_PREFIX(MultiTexCoord3i): +GLOBL_FN(GL_PREFIX(MultiTexCoord3i,MultiTexCoord3i@16)) +GL_PREFIX(MultiTexCoord3i,MultiTexCoord3i@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3iARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3iv)) -GL_PREFIX(MultiTexCoord3iv): +GLOBL_FN(GL_PREFIX(MultiTexCoord3iv,MultiTexCoord3iv@8)) +GL_PREFIX(MultiTexCoord3iv,MultiTexCoord3iv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3ivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3s)) -GL_PREFIX(MultiTexCoord3s): +GLOBL_FN(GL_PREFIX(MultiTexCoord3s,MultiTexCoord3s@16)) +GL_PREFIX(MultiTexCoord3s,MultiTexCoord3s@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3sARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord3sv)) -GL_PREFIX(MultiTexCoord3sv): +GLOBL_FN(GL_PREFIX(MultiTexCoord3sv,MultiTexCoord3sv@8)) +GL_PREFIX(MultiTexCoord3sv,MultiTexCoord3sv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord3svARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4d)) -GL_PREFIX(MultiTexCoord4d): +GLOBL_FN(GL_PREFIX(MultiTexCoord4d,MultiTexCoord4d@36)) +GL_PREFIX(MultiTexCoord4d,MultiTexCoord4d@36): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4dARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4dv)) -GL_PREFIX(MultiTexCoord4dv): +GLOBL_FN(GL_PREFIX(MultiTexCoord4dv,MultiTexCoord4dv@8)) +GL_PREFIX(MultiTexCoord4dv,MultiTexCoord4dv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4dvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4f)) -GL_PREFIX(MultiTexCoord4f): +GLOBL_FN(GL_PREFIX(MultiTexCoord4f,MultiTexCoord4f@20)) +GL_PREFIX(MultiTexCoord4f,MultiTexCoord4f@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4fARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4fv)) -GL_PREFIX(MultiTexCoord4fv): +GLOBL_FN(GL_PREFIX(MultiTexCoord4fv,MultiTexCoord4fv@8)) +GL_PREFIX(MultiTexCoord4fv,MultiTexCoord4fv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4fvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4i)) -GL_PREFIX(MultiTexCoord4i): +GLOBL_FN(GL_PREFIX(MultiTexCoord4i,MultiTexCoord4i@20)) +GL_PREFIX(MultiTexCoord4i,MultiTexCoord4i@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4iARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4iv)) -GL_PREFIX(MultiTexCoord4iv): +GLOBL_FN(GL_PREFIX(MultiTexCoord4iv,MultiTexCoord4iv@8)) +GL_PREFIX(MultiTexCoord4iv,MultiTexCoord4iv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4ivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4s)) -GL_PREFIX(MultiTexCoord4s): +GLOBL_FN(GL_PREFIX(MultiTexCoord4s,MultiTexCoord4s@20)) +GL_PREFIX(MultiTexCoord4s,MultiTexCoord4s@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4sARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiTexCoord4sv)) -GL_PREFIX(MultiTexCoord4sv): +GLOBL_FN(GL_PREFIX(MultiTexCoord4sv,MultiTexCoord4sv@8)) +GL_PREFIX(MultiTexCoord4sv,MultiTexCoord4sv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiTexCoord4svARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LoadTransposeMatrixf)) -GL_PREFIX(LoadTransposeMatrixf): +GLOBL_FN(GL_PREFIX(LoadTransposeMatrixf,LoadTransposeMatrixf@4)) +GL_PREFIX(LoadTransposeMatrixf,LoadTransposeMatrixf@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LoadTransposeMatrixfARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LoadTransposeMatrixd)) -GL_PREFIX(LoadTransposeMatrixd): +GLOBL_FN(GL_PREFIX(LoadTransposeMatrixd,LoadTransposeMatrixd@4)) +GL_PREFIX(LoadTransposeMatrixd,LoadTransposeMatrixd@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LoadTransposeMatrixdARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultTransposeMatrixf)) -GL_PREFIX(MultTransposeMatrixf): +GLOBL_FN(GL_PREFIX(MultTransposeMatrixf,MultTransposeMatrixf@4)) +GL_PREFIX(MultTransposeMatrixf,MultTransposeMatrixf@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultTransposeMatrixfARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultTransposeMatrixd)) -GL_PREFIX(MultTransposeMatrixd): +GLOBL_FN(GL_PREFIX(MultTransposeMatrixd,MultTransposeMatrixd@4)) +GL_PREFIX(MultTransposeMatrixd,MultTransposeMatrixd@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultTransposeMatrixdARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SampleCoverage)) -GL_PREFIX(SampleCoverage): +GLOBL_FN(GL_PREFIX(SampleCoverage,SampleCoverage@8)) +GL_PREFIX(SampleCoverage,SampleCoverage@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SampleCoverageARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CompressedTexImage3D)) -GL_PREFIX(CompressedTexImage3D): +GLOBL_FN(GL_PREFIX(CompressedTexImage3D,CompressedTexImage3D@36)) +GL_PREFIX(CompressedTexImage3D,CompressedTexImage3D@36): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CompressedTexImage3DARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CompressedTexImage2D)) -GL_PREFIX(CompressedTexImage2D): +GLOBL_FN(GL_PREFIX(CompressedTexImage2D,CompressedTexImage2D@32)) +GL_PREFIX(CompressedTexImage2D,CompressedTexImage2D@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CompressedTexImage2DARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CompressedTexImage1D)) -GL_PREFIX(CompressedTexImage1D): +GLOBL_FN(GL_PREFIX(CompressedTexImage1D,CompressedTexImage1D@28)) +GL_PREFIX(CompressedTexImage1D,CompressedTexImage1D@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CompressedTexImage1DARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CompressedTexSubImage3D)) -GL_PREFIX(CompressedTexSubImage3D): +GLOBL_FN(GL_PREFIX(CompressedTexSubImage3D,CompressedTexSubImage3D@44)) +GL_PREFIX(CompressedTexSubImage3D,CompressedTexSubImage3D@44): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CompressedTexSubImage3DARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CompressedTexSubImage2D)) -GL_PREFIX(CompressedTexSubImage2D): +GLOBL_FN(GL_PREFIX(CompressedTexSubImage2D,CompressedTexSubImage2D@36)) +GL_PREFIX(CompressedTexSubImage2D,CompressedTexSubImage2D@36): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CompressedTexSubImage2DARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CompressedTexSubImage1D)) -GL_PREFIX(CompressedTexSubImage1D): +GLOBL_FN(GL_PREFIX(CompressedTexSubImage1D,CompressedTexSubImage1D@28)) +GL_PREFIX(CompressedTexSubImage1D,CompressedTexSubImage1D@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CompressedTexSubImage1DARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetCompressedTexImage)) -GL_PREFIX(GetCompressedTexImage): +GLOBL_FN(GL_PREFIX(GetCompressedTexImage,GetCompressedTexImage@12)) +GL_PREFIX(GetCompressedTexImage,GetCompressedTexImage@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetCompressedTexImageARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BlendColorEXT)) -GL_PREFIX(BlendColorEXT): +GLOBL_FN(GL_PREFIX(BlendColorEXT,BlendColorEXT@16)) +GL_PREFIX(BlendColorEXT,BlendColorEXT@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BlendColor)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PolygonOffsetEXT)) -GL_PREFIX(PolygonOffsetEXT): +GLOBL_FN(GL_PREFIX(PolygonOffsetEXT,PolygonOffsetEXT@8)) +GL_PREFIX(PolygonOffsetEXT,PolygonOffsetEXT@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PolygonOffsetEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexImage3DEXT)) -GL_PREFIX(TexImage3DEXT): +GLOBL_FN(GL_PREFIX(TexImage3DEXT,TexImage3DEXT@40)) +GL_PREFIX(TexImage3DEXT,TexImage3DEXT@40): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexImage3D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexSubImage3DEXT)) -GL_PREFIX(TexSubImage3DEXT): +GLOBL_FN(GL_PREFIX(TexSubImage3DEXT,TexSubImage3DEXT@44)) +GL_PREFIX(TexSubImage3DEXT,TexSubImage3DEXT@44): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexSubImage3D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetTexFilterFuncSGIS)) -GL_PREFIX(GetTexFilterFuncSGIS): +GLOBL_FN(GL_PREFIX(GetTexFilterFuncSGIS,GetTexFilterFuncSGIS@12)) +GL_PREFIX(GetTexFilterFuncSGIS,GetTexFilterFuncSGIS@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetTexFilterFuncSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexFilterFuncSGIS)) -GL_PREFIX(TexFilterFuncSGIS): +GLOBL_FN(GL_PREFIX(TexFilterFuncSGIS,TexFilterFuncSGIS@16)) +GL_PREFIX(TexFilterFuncSGIS,TexFilterFuncSGIS@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexFilterFuncSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexSubImage1DEXT)) -GL_PREFIX(TexSubImage1DEXT): +GLOBL_FN(GL_PREFIX(TexSubImage1DEXT,TexSubImage1DEXT@28)) +GL_PREFIX(TexSubImage1DEXT,TexSubImage1DEXT@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexSubImage1D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexSubImage2DEXT)) -GL_PREFIX(TexSubImage2DEXT): +GLOBL_FN(GL_PREFIX(TexSubImage2DEXT,TexSubImage2DEXT@36)) +GL_PREFIX(TexSubImage2DEXT,TexSubImage2DEXT@36): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexSubImage2D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyTexImage1DEXT)) -GL_PREFIX(CopyTexImage1DEXT): +GLOBL_FN(GL_PREFIX(CopyTexImage1DEXT,CopyTexImage1DEXT@28)) +GL_PREFIX(CopyTexImage1DEXT,CopyTexImage1DEXT@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyTexImage1D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyTexImage2DEXT)) -GL_PREFIX(CopyTexImage2DEXT): +GLOBL_FN(GL_PREFIX(CopyTexImage2DEXT,CopyTexImage2DEXT@32)) +GL_PREFIX(CopyTexImage2DEXT,CopyTexImage2DEXT@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyTexImage2D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyTexSubImage1DEXT)) -GL_PREFIX(CopyTexSubImage1DEXT): +GLOBL_FN(GL_PREFIX(CopyTexSubImage1DEXT,CopyTexSubImage1DEXT@24)) +GL_PREFIX(CopyTexSubImage1DEXT,CopyTexSubImage1DEXT@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyTexSubImage1D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyTexSubImage2DEXT)) -GL_PREFIX(CopyTexSubImage2DEXT): +GLOBL_FN(GL_PREFIX(CopyTexSubImage2DEXT,CopyTexSubImage2DEXT@32)) +GL_PREFIX(CopyTexSubImage2DEXT,CopyTexSubImage2DEXT@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyTexSubImage2D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyTexSubImage3DEXT)) -GL_PREFIX(CopyTexSubImage3DEXT): +GLOBL_FN(GL_PREFIX(CopyTexSubImage3DEXT,CopyTexSubImage3DEXT@36)) +GL_PREFIX(CopyTexSubImage3DEXT,CopyTexSubImage3DEXT@36): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyTexSubImage3D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetHistogramEXT)) -GL_PREFIX(GetHistogramEXT): +GLOBL_FN(GL_PREFIX(GetHistogramEXT,GetHistogramEXT@20)) +GL_PREFIX(GetHistogramEXT,GetHistogramEXT@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetHistogramEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetHistogramParameterfvEXT)) -GL_PREFIX(GetHistogramParameterfvEXT): +GLOBL_FN(GL_PREFIX(GetHistogramParameterfvEXT,GetHistogramParameterfvEXT@12)) +GL_PREFIX(GetHistogramParameterfvEXT,GetHistogramParameterfvEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetHistogramParameterfvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetHistogramParameterivEXT)) -GL_PREFIX(GetHistogramParameterivEXT): +GLOBL_FN(GL_PREFIX(GetHistogramParameterivEXT,GetHistogramParameterivEXT@12)) +GL_PREFIX(GetHistogramParameterivEXT,GetHistogramParameterivEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetHistogramParameterivEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetMinmaxEXT)) -GL_PREFIX(GetMinmaxEXT): +GLOBL_FN(GL_PREFIX(GetMinmaxEXT,GetMinmaxEXT@20)) +GL_PREFIX(GetMinmaxEXT,GetMinmaxEXT@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetMinmaxEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetMinmaxParameterfvEXT)) -GL_PREFIX(GetMinmaxParameterfvEXT): +GLOBL_FN(GL_PREFIX(GetMinmaxParameterfvEXT,GetMinmaxParameterfvEXT@12)) +GL_PREFIX(GetMinmaxParameterfvEXT,GetMinmaxParameterfvEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetMinmaxParameterfvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetMinmaxParameterivEXT)) -GL_PREFIX(GetMinmaxParameterivEXT): +GLOBL_FN(GL_PREFIX(GetMinmaxParameterivEXT,GetMinmaxParameterivEXT@12)) +GL_PREFIX(GetMinmaxParameterivEXT,GetMinmaxParameterivEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetMinmaxParameterivEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(HistogramEXT)) -GL_PREFIX(HistogramEXT): +GLOBL_FN(GL_PREFIX(HistogramEXT,HistogramEXT@16)) +GL_PREFIX(HistogramEXT,HistogramEXT@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Histogram)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MinmaxEXT)) -GL_PREFIX(MinmaxEXT): +GLOBL_FN(GL_PREFIX(MinmaxEXT,MinmaxEXT@12)) +GL_PREFIX(MinmaxEXT,MinmaxEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_Minmax)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ResetHistogramEXT)) -GL_PREFIX(ResetHistogramEXT): +GLOBL_FN(GL_PREFIX(ResetHistogramEXT,ResetHistogramEXT@4)) +GL_PREFIX(ResetHistogramEXT,ResetHistogramEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ResetHistogram)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ResetMinmaxEXT)) -GL_PREFIX(ResetMinmaxEXT): +GLOBL_FN(GL_PREFIX(ResetMinmaxEXT,ResetMinmaxEXT@4)) +GL_PREFIX(ResetMinmaxEXT,ResetMinmaxEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ResetMinmax)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ConvolutionFilter1DEXT)) -GL_PREFIX(ConvolutionFilter1DEXT): +GLOBL_FN(GL_PREFIX(ConvolutionFilter1DEXT,ConvolutionFilter1DEXT@24)) +GL_PREFIX(ConvolutionFilter1DEXT,ConvolutionFilter1DEXT@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ConvolutionFilter1D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ConvolutionFilter2DEXT)) -GL_PREFIX(ConvolutionFilter2DEXT): +GLOBL_FN(GL_PREFIX(ConvolutionFilter2DEXT,ConvolutionFilter2DEXT@28)) +GL_PREFIX(ConvolutionFilter2DEXT,ConvolutionFilter2DEXT@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ConvolutionFilter2D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ConvolutionParameterfEXT)) -GL_PREFIX(ConvolutionParameterfEXT): +GLOBL_FN(GL_PREFIX(ConvolutionParameterfEXT,ConvolutionParameterfEXT@12)) +GL_PREFIX(ConvolutionParameterfEXT,ConvolutionParameterfEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ConvolutionParameterf)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ConvolutionParameterfvEXT)) -GL_PREFIX(ConvolutionParameterfvEXT): +GLOBL_FN(GL_PREFIX(ConvolutionParameterfvEXT,ConvolutionParameterfvEXT@12)) +GL_PREFIX(ConvolutionParameterfvEXT,ConvolutionParameterfvEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ConvolutionParameterfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ConvolutionParameteriEXT)) -GL_PREFIX(ConvolutionParameteriEXT): +GLOBL_FN(GL_PREFIX(ConvolutionParameteriEXT,ConvolutionParameteriEXT@12)) +GL_PREFIX(ConvolutionParameteriEXT,ConvolutionParameteriEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ConvolutionParameteri)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ConvolutionParameterivEXT)) -GL_PREFIX(ConvolutionParameterivEXT): +GLOBL_FN(GL_PREFIX(ConvolutionParameterivEXT,ConvolutionParameterivEXT@12)) +GL_PREFIX(ConvolutionParameterivEXT,ConvolutionParameterivEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ConvolutionParameteriv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyConvolutionFilter1DEXT)) -GL_PREFIX(CopyConvolutionFilter1DEXT): +GLOBL_FN(GL_PREFIX(CopyConvolutionFilter1DEXT,CopyConvolutionFilter1DEXT@20)) +GL_PREFIX(CopyConvolutionFilter1DEXT,CopyConvolutionFilter1DEXT@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyConvolutionFilter1D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyConvolutionFilter2DEXT)) -GL_PREFIX(CopyConvolutionFilter2DEXT): +GLOBL_FN(GL_PREFIX(CopyConvolutionFilter2DEXT,CopyConvolutionFilter2DEXT@24)) +GL_PREFIX(CopyConvolutionFilter2DEXT,CopyConvolutionFilter2DEXT@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyConvolutionFilter2D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetConvolutionFilterEXT)) -GL_PREFIX(GetConvolutionFilterEXT): +GLOBL_FN(GL_PREFIX(GetConvolutionFilterEXT,GetConvolutionFilterEXT@16)) +GL_PREFIX(GetConvolutionFilterEXT,GetConvolutionFilterEXT@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetConvolutionFilterEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetConvolutionParameterfvEXT)) -GL_PREFIX(GetConvolutionParameterfvEXT): +GLOBL_FN(GL_PREFIX(GetConvolutionParameterfvEXT,GetConvolutionParameterfvEXT@12)) +GL_PREFIX(GetConvolutionParameterfvEXT,GetConvolutionParameterfvEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetConvolutionParameterfvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetConvolutionParameterivEXT)) -GL_PREFIX(GetConvolutionParameterivEXT): +GLOBL_FN(GL_PREFIX(GetConvolutionParameterivEXT,GetConvolutionParameterivEXT@12)) +GL_PREFIX(GetConvolutionParameterivEXT,GetConvolutionParameterivEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetConvolutionParameterivEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetSeparableFilterEXT)) -GL_PREFIX(GetSeparableFilterEXT): +GLOBL_FN(GL_PREFIX(GetSeparableFilterEXT,GetSeparableFilterEXT@24)) +GL_PREFIX(GetSeparableFilterEXT,GetSeparableFilterEXT@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetSeparableFilterEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SeparableFilter2DEXT)) -GL_PREFIX(SeparableFilter2DEXT): +GLOBL_FN(GL_PREFIX(SeparableFilter2DEXT,SeparableFilter2DEXT@32)) +GL_PREFIX(SeparableFilter2DEXT,SeparableFilter2DEXT@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SeparableFilter2D)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ColorTableSGI)) -GL_PREFIX(ColorTableSGI): +GLOBL_FN(GL_PREFIX(ColorTableSGI,ColorTableSGI@24)) +GL_PREFIX(ColorTableSGI,ColorTableSGI@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ColorTable)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ColorTableParameterfvSGI)) -GL_PREFIX(ColorTableParameterfvSGI): +GLOBL_FN(GL_PREFIX(ColorTableParameterfvSGI,ColorTableParameterfvSGI@12)) +GL_PREFIX(ColorTableParameterfvSGI,ColorTableParameterfvSGI@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ColorTableParameterfv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ColorTableParameterivSGI)) -GL_PREFIX(ColorTableParameterivSGI): +GLOBL_FN(GL_PREFIX(ColorTableParameterivSGI,ColorTableParameterivSGI@12)) +GL_PREFIX(ColorTableParameterivSGI,ColorTableParameterivSGI@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ColorTableParameteriv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyColorTableSGI)) -GL_PREFIX(CopyColorTableSGI): +GLOBL_FN(GL_PREFIX(CopyColorTableSGI,CopyColorTableSGI@20)) +GL_PREFIX(CopyColorTableSGI,CopyColorTableSGI@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyColorTable)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetColorTableSGI)) -GL_PREFIX(GetColorTableSGI): +GLOBL_FN(GL_PREFIX(GetColorTableSGI,GetColorTableSGI@16)) +GL_PREFIX(GetColorTableSGI,GetColorTableSGI@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetColorTableSGI)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetColorTableParameterfvSGI)) -GL_PREFIX(GetColorTableParameterfvSGI): +GLOBL_FN(GL_PREFIX(GetColorTableParameterfvSGI,GetColorTableParameterfvSGI@12)) +GL_PREFIX(GetColorTableParameterfvSGI,GetColorTableParameterfvSGI@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetColorTableParameterfvSGI)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetColorTableParameterivSGI)) -GL_PREFIX(GetColorTableParameterivSGI): +GLOBL_FN(GL_PREFIX(GetColorTableParameterivSGI,GetColorTableParameterivSGI@12)) +GL_PREFIX(GetColorTableParameterivSGI,GetColorTableParameterivSGI@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetColorTableParameterivSGI)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PixelTexGenSGIX)) -GL_PREFIX(PixelTexGenSGIX): +GLOBL_FN(GL_PREFIX(PixelTexGenSGIX,PixelTexGenSGIX@4)) +GL_PREFIX(PixelTexGenSGIX,PixelTexGenSGIX@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PixelTexGenSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PixelTexGenParameteriSGIS)) -GL_PREFIX(PixelTexGenParameteriSGIS): +GLOBL_FN(GL_PREFIX(PixelTexGenParameteriSGIS,PixelTexGenParameteriSGIS@8)) +GL_PREFIX(PixelTexGenParameteriSGIS,PixelTexGenParameteriSGIS@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PixelTexGenParameteriSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PixelTexGenParameterivSGIS)) -GL_PREFIX(PixelTexGenParameterivSGIS): +GLOBL_FN(GL_PREFIX(PixelTexGenParameterivSGIS,PixelTexGenParameterivSGIS@8)) +GL_PREFIX(PixelTexGenParameterivSGIS,PixelTexGenParameterivSGIS@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PixelTexGenParameterivSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PixelTexGenParameterfSGIS)) -GL_PREFIX(PixelTexGenParameterfSGIS): +GLOBL_FN(GL_PREFIX(PixelTexGenParameterfSGIS,PixelTexGenParameterfSGIS@8)) +GL_PREFIX(PixelTexGenParameterfSGIS,PixelTexGenParameterfSGIS@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PixelTexGenParameterfSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PixelTexGenParameterfvSGIS)) -GL_PREFIX(PixelTexGenParameterfvSGIS): +GLOBL_FN(GL_PREFIX(PixelTexGenParameterfvSGIS,PixelTexGenParameterfvSGIS@8)) +GL_PREFIX(PixelTexGenParameterfvSGIS,PixelTexGenParameterfvSGIS@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PixelTexGenParameterfvSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetPixelTexGenParameterivSGIS)) -GL_PREFIX(GetPixelTexGenParameterivSGIS): +GLOBL_FN(GL_PREFIX(GetPixelTexGenParameterivSGIS,GetPixelTexGenParameterivSGIS@8)) +GL_PREFIX(GetPixelTexGenParameterivSGIS,GetPixelTexGenParameterivSGIS@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetPixelTexGenParameterivSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetPixelTexGenParameterfvSGIS)) -GL_PREFIX(GetPixelTexGenParameterfvSGIS): +GLOBL_FN(GL_PREFIX(GetPixelTexGenParameterfvSGIS,GetPixelTexGenParameterfvSGIS@8)) +GL_PREFIX(GetPixelTexGenParameterfvSGIS,GetPixelTexGenParameterfvSGIS@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetPixelTexGenParameterfvSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexImage4DSGIS)) -GL_PREFIX(TexImage4DSGIS): +GLOBL_FN(GL_PREFIX(TexImage4DSGIS,TexImage4DSGIS@44)) +GL_PREFIX(TexImage4DSGIS,TexImage4DSGIS@44): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexImage4DSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexSubImage4DSGIS)) -GL_PREFIX(TexSubImage4DSGIS): +GLOBL_FN(GL_PREFIX(TexSubImage4DSGIS,TexSubImage4DSGIS@52)) +GL_PREFIX(TexSubImage4DSGIS,TexSubImage4DSGIS@52): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexSubImage4DSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(AreTexturesResidentEXT)) -GL_PREFIX(AreTexturesResidentEXT): +GLOBL_FN(GL_PREFIX(AreTexturesResidentEXT,AreTexturesResidentEXT@12)) +GL_PREFIX(AreTexturesResidentEXT,AreTexturesResidentEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_AreTexturesResidentEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BindTextureEXT)) -GL_PREFIX(BindTextureEXT): +GLOBL_FN(GL_PREFIX(BindTextureEXT,BindTextureEXT@8)) +GL_PREFIX(BindTextureEXT,BindTextureEXT@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BindTexture)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DeleteTexturesEXT)) -GL_PREFIX(DeleteTexturesEXT): +GLOBL_FN(GL_PREFIX(DeleteTexturesEXT,DeleteTexturesEXT@8)) +GL_PREFIX(DeleteTexturesEXT,DeleteTexturesEXT@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DeleteTextures)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GenTexturesEXT)) -GL_PREFIX(GenTexturesEXT): +GLOBL_FN(GL_PREFIX(GenTexturesEXT,GenTexturesEXT@8)) +GL_PREFIX(GenTexturesEXT,GenTexturesEXT@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GenTexturesEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(IsTextureEXT)) -GL_PREFIX(IsTextureEXT): +GLOBL_FN(GL_PREFIX(IsTextureEXT,IsTextureEXT@4)) +GL_PREFIX(IsTextureEXT,IsTextureEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_IsTextureEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PrioritizeTexturesEXT)) -GL_PREFIX(PrioritizeTexturesEXT): +GLOBL_FN(GL_PREFIX(PrioritizeTexturesEXT,PrioritizeTexturesEXT@12)) +GL_PREFIX(PrioritizeTexturesEXT,PrioritizeTexturesEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PrioritizeTextures)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DetailTexFuncSGIS)) -GL_PREFIX(DetailTexFuncSGIS): +GLOBL_FN(GL_PREFIX(DetailTexFuncSGIS,DetailTexFuncSGIS@12)) +GL_PREFIX(DetailTexFuncSGIS,DetailTexFuncSGIS@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DetailTexFuncSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetDetailTexFuncSGIS)) -GL_PREFIX(GetDetailTexFuncSGIS): +GLOBL_FN(GL_PREFIX(GetDetailTexFuncSGIS,GetDetailTexFuncSGIS@8)) +GL_PREFIX(GetDetailTexFuncSGIS,GetDetailTexFuncSGIS@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetDetailTexFuncSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SharpenTexFuncSGIS)) -GL_PREFIX(SharpenTexFuncSGIS): +GLOBL_FN(GL_PREFIX(SharpenTexFuncSGIS,SharpenTexFuncSGIS@12)) +GL_PREFIX(SharpenTexFuncSGIS,SharpenTexFuncSGIS@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SharpenTexFuncSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetSharpenTexFuncSGIS)) -GL_PREFIX(GetSharpenTexFuncSGIS): +GLOBL_FN(GL_PREFIX(GetSharpenTexFuncSGIS,GetSharpenTexFuncSGIS@8)) +GL_PREFIX(GetSharpenTexFuncSGIS,GetSharpenTexFuncSGIS@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetSharpenTexFuncSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SampleMaskSGIS)) -GL_PREFIX(SampleMaskSGIS): +GLOBL_FN(GL_PREFIX(SampleMaskSGIS,SampleMaskSGIS@8)) +GL_PREFIX(SampleMaskSGIS,SampleMaskSGIS@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SampleMaskSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SamplePatternSGIS)) -GL_PREFIX(SamplePatternSGIS): +GLOBL_FN(GL_PREFIX(SamplePatternSGIS,SamplePatternSGIS@4)) +GL_PREFIX(SamplePatternSGIS,SamplePatternSGIS@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SamplePatternSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ArrayElementEXT)) -GL_PREFIX(ArrayElementEXT): +GLOBL_FN(GL_PREFIX(ArrayElementEXT,ArrayElementEXT@4)) +GL_PREFIX(ArrayElementEXT,ArrayElementEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ArrayElement)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ColorPointerEXT)) -GL_PREFIX(ColorPointerEXT): +GLOBL_FN(GL_PREFIX(ColorPointerEXT,ColorPointerEXT@20)) +GL_PREFIX(ColorPointerEXT,ColorPointerEXT@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ColorPointerEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DrawArraysEXT)) -GL_PREFIX(DrawArraysEXT): +GLOBL_FN(GL_PREFIX(DrawArraysEXT,DrawArraysEXT@12)) +GL_PREFIX(DrawArraysEXT,DrawArraysEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DrawArrays)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EdgeFlagPointerEXT)) -GL_PREFIX(EdgeFlagPointerEXT): +GLOBL_FN(GL_PREFIX(EdgeFlagPointerEXT,EdgeFlagPointerEXT@12)) +GL_PREFIX(EdgeFlagPointerEXT,EdgeFlagPointerEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EdgeFlagPointerEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetPointervEXT)) -GL_PREFIX(GetPointervEXT): +GLOBL_FN(GL_PREFIX(GetPointervEXT,GetPointervEXT@8)) +GL_PREFIX(GetPointervEXT,GetPointervEXT@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetPointerv)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(IndexPointerEXT)) -GL_PREFIX(IndexPointerEXT): +GLOBL_FN(GL_PREFIX(IndexPointerEXT,IndexPointerEXT@16)) +GL_PREFIX(IndexPointerEXT,IndexPointerEXT@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_IndexPointerEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(NormalPointerEXT)) -GL_PREFIX(NormalPointerEXT): +GLOBL_FN(GL_PREFIX(NormalPointerEXT,NormalPointerEXT@16)) +GL_PREFIX(NormalPointerEXT,NormalPointerEXT@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_NormalPointerEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TexCoordPointerEXT)) -GL_PREFIX(TexCoordPointerEXT): +GLOBL_FN(GL_PREFIX(TexCoordPointerEXT,TexCoordPointerEXT@20)) +GL_PREFIX(TexCoordPointerEXT,TexCoordPointerEXT@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TexCoordPointerEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexPointerEXT)) -GL_PREFIX(VertexPointerEXT): +GLOBL_FN(GL_PREFIX(VertexPointerEXT,VertexPointerEXT@20)) +GL_PREFIX(VertexPointerEXT,VertexPointerEXT@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexPointerEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BlendEquationEXT)) -GL_PREFIX(BlendEquationEXT): +GLOBL_FN(GL_PREFIX(BlendEquationEXT,BlendEquationEXT@4)) +GL_PREFIX(BlendEquationEXT,BlendEquationEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BlendEquation)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SpriteParameterfSGIX)) -GL_PREFIX(SpriteParameterfSGIX): +GLOBL_FN(GL_PREFIX(SpriteParameterfSGIX,SpriteParameterfSGIX@8)) +GL_PREFIX(SpriteParameterfSGIX,SpriteParameterfSGIX@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SpriteParameterfSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SpriteParameterfvSGIX)) -GL_PREFIX(SpriteParameterfvSGIX): +GLOBL_FN(GL_PREFIX(SpriteParameterfvSGIX,SpriteParameterfvSGIX@8)) +GL_PREFIX(SpriteParameterfvSGIX,SpriteParameterfvSGIX@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SpriteParameterfvSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SpriteParameteriSGIX)) -GL_PREFIX(SpriteParameteriSGIX): +GLOBL_FN(GL_PREFIX(SpriteParameteriSGIX,SpriteParameteriSGIX@8)) +GL_PREFIX(SpriteParameteriSGIX,SpriteParameteriSGIX@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SpriteParameteriSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SpriteParameterivSGIX)) -GL_PREFIX(SpriteParameterivSGIX): +GLOBL_FN(GL_PREFIX(SpriteParameterivSGIX,SpriteParameterivSGIX@8)) +GL_PREFIX(SpriteParameterivSGIX,SpriteParameterivSGIX@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SpriteParameterivSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PointParameterfEXT)) -GL_PREFIX(PointParameterfEXT): +GLOBL_FN(GL_PREFIX(PointParameterfEXT,PointParameterfEXT@8)) +GL_PREFIX(PointParameterfEXT,PointParameterfEXT@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PointParameterfEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PointParameterfvEXT)) -GL_PREFIX(PointParameterfvEXT): +GLOBL_FN(GL_PREFIX(PointParameterfvEXT,PointParameterfvEXT@8)) +GL_PREFIX(PointParameterfvEXT,PointParameterfvEXT@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PointParameterfvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PointParameterfARB)) -GL_PREFIX(PointParameterfARB): +GLOBL_FN(GL_PREFIX(PointParameterfARB,PointParameterfARB@8)) +GL_PREFIX(PointParameterfARB,PointParameterfARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PointParameterfEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PointParameterfvARB)) -GL_PREFIX(PointParameterfvARB): +GLOBL_FN(GL_PREFIX(PointParameterfvARB,PointParameterfvARB@8)) +GL_PREFIX(PointParameterfvARB,PointParameterfvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PointParameterfvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PointParameterfSGIS)) -GL_PREFIX(PointParameterfSGIS): +GLOBL_FN(GL_PREFIX(PointParameterfSGIS,PointParameterfSGIS@8)) +GL_PREFIX(PointParameterfSGIS,PointParameterfSGIS@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PointParameterfEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PointParameterfvSGIS)) -GL_PREFIX(PointParameterfvSGIS): +GLOBL_FN(GL_PREFIX(PointParameterfvSGIS,PointParameterfvSGIS@8)) +GL_PREFIX(PointParameterfvSGIS,PointParameterfvSGIS@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PointParameterfvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetInstrumentsSGIX)) -GL_PREFIX(GetInstrumentsSGIX): +GLOBL_FN(GL_PREFIX(GetInstrumentsSGIX,GetInstrumentsSGIX@0)) +GL_PREFIX(GetInstrumentsSGIX,GetInstrumentsSGIX@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetInstrumentsSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(InstrumentsBufferSGIX)) -GL_PREFIX(InstrumentsBufferSGIX): +GLOBL_FN(GL_PREFIX(InstrumentsBufferSGIX,InstrumentsBufferSGIX@8)) +GL_PREFIX(InstrumentsBufferSGIX,InstrumentsBufferSGIX@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_InstrumentsBufferSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PollInstrumentsSGIX)) -GL_PREFIX(PollInstrumentsSGIX): +GLOBL_FN(GL_PREFIX(PollInstrumentsSGIX,PollInstrumentsSGIX@4)) +GL_PREFIX(PollInstrumentsSGIX,PollInstrumentsSGIX@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PollInstrumentsSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ReadInstrumentsSGIX)) -GL_PREFIX(ReadInstrumentsSGIX): +GLOBL_FN(GL_PREFIX(ReadInstrumentsSGIX,ReadInstrumentsSGIX@4)) +GL_PREFIX(ReadInstrumentsSGIX,ReadInstrumentsSGIX@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ReadInstrumentsSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(StartInstrumentsSGIX)) -GL_PREFIX(StartInstrumentsSGIX): +GLOBL_FN(GL_PREFIX(StartInstrumentsSGIX,StartInstrumentsSGIX@0)) +GL_PREFIX(StartInstrumentsSGIX,StartInstrumentsSGIX@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_StartInstrumentsSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(StopInstrumentsSGIX)) -GL_PREFIX(StopInstrumentsSGIX): +GLOBL_FN(GL_PREFIX(StopInstrumentsSGIX,StopInstrumentsSGIX@4)) +GL_PREFIX(StopInstrumentsSGIX,StopInstrumentsSGIX@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_StopInstrumentsSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FrameZoomSGIX)) -GL_PREFIX(FrameZoomSGIX): +GLOBL_FN(GL_PREFIX(FrameZoomSGIX,FrameZoomSGIX@4)) +GL_PREFIX(FrameZoomSGIX,FrameZoomSGIX@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FrameZoomSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TagSampleBufferSGIX)) -GL_PREFIX(TagSampleBufferSGIX): +GLOBL_FN(GL_PREFIX(TagSampleBufferSGIX,TagSampleBufferSGIX@0)) +GL_PREFIX(TagSampleBufferSGIX,TagSampleBufferSGIX@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TagSampleBufferSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ReferencePlaneSGIX)) -GL_PREFIX(ReferencePlaneSGIX): +GLOBL_FN(GL_PREFIX(ReferencePlaneSGIX,ReferencePlaneSGIX@4)) +GL_PREFIX(ReferencePlaneSGIX,ReferencePlaneSGIX@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ReferencePlaneSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FlushRasterSGIX)) -GL_PREFIX(FlushRasterSGIX): +GLOBL_FN(GL_PREFIX(FlushRasterSGIX,FlushRasterSGIX@0)) +GL_PREFIX(FlushRasterSGIX,FlushRasterSGIX@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FlushRasterSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ColorSubTableEXT)) -GL_PREFIX(ColorSubTableEXT): +GLOBL_FN(GL_PREFIX(ColorSubTableEXT,ColorSubTableEXT@24)) +GL_PREFIX(ColorSubTableEXT,ColorSubTableEXT@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ColorSubTable)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CopyColorSubTableEXT)) -GL_PREFIX(CopyColorSubTableEXT): +GLOBL_FN(GL_PREFIX(CopyColorSubTableEXT,CopyColorSubTableEXT@20)) +GL_PREFIX(CopyColorSubTableEXT,CopyColorSubTableEXT@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CopyColorSubTable)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(HintPGI)) -GL_PREFIX(HintPGI): +GLOBL_FN(GL_PREFIX(HintPGI,HintPGI@8)) +GL_PREFIX(HintPGI,HintPGI@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_HintPGI)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ColorTableEXT)) -GL_PREFIX(ColorTableEXT): +GLOBL_FN(GL_PREFIX(ColorTableEXT,ColorTableEXT@24)) +GL_PREFIX(ColorTableEXT,ColorTableEXT@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ColorTable)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetColorTableEXT)) -GL_PREFIX(GetColorTableEXT): +GLOBL_FN(GL_PREFIX(GetColorTableEXT,GetColorTableEXT@16)) +GL_PREFIX(GetColorTableEXT,GetColorTableEXT@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetColorTableEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetColorTableParameterivEXT)) -GL_PREFIX(GetColorTableParameterivEXT): +GLOBL_FN(GL_PREFIX(GetColorTableParameterivEXT,GetColorTableParameterivEXT@12)) +GL_PREFIX(GetColorTableParameterivEXT,GetColorTableParameterivEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetColorTableParameterivEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetColorTableParameterfvEXT)) -GL_PREFIX(GetColorTableParameterfvEXT): +GLOBL_FN(GL_PREFIX(GetColorTableParameterfvEXT,GetColorTableParameterfvEXT@12)) +GL_PREFIX(GetColorTableParameterfvEXT,GetColorTableParameterfvEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetColorTableParameterfvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetListParameterfvSGIX)) -GL_PREFIX(GetListParameterfvSGIX): +GLOBL_FN(GL_PREFIX(GetListParameterfvSGIX,GetListParameterfvSGIX@12)) +GL_PREFIX(GetListParameterfvSGIX,GetListParameterfvSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetListParameterfvSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetListParameterivSGIX)) -GL_PREFIX(GetListParameterivSGIX): +GLOBL_FN(GL_PREFIX(GetListParameterivSGIX,GetListParameterivSGIX@12)) +GL_PREFIX(GetListParameterivSGIX,GetListParameterivSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetListParameterivSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ListParameterfSGIX)) -GL_PREFIX(ListParameterfSGIX): +GLOBL_FN(GL_PREFIX(ListParameterfSGIX,ListParameterfSGIX@12)) +GL_PREFIX(ListParameterfSGIX,ListParameterfSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ListParameterfSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ListParameterfvSGIX)) -GL_PREFIX(ListParameterfvSGIX): +GLOBL_FN(GL_PREFIX(ListParameterfvSGIX,ListParameterfvSGIX@12)) +GL_PREFIX(ListParameterfvSGIX,ListParameterfvSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ListParameterfvSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ListParameteriSGIX)) -GL_PREFIX(ListParameteriSGIX): +GLOBL_FN(GL_PREFIX(ListParameteriSGIX,ListParameteriSGIX@12)) +GL_PREFIX(ListParameteriSGIX,ListParameteriSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ListParameteriSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ListParameterivSGIX)) -GL_PREFIX(ListParameterivSGIX): +GLOBL_FN(GL_PREFIX(ListParameterivSGIX,ListParameterivSGIX@12)) +GL_PREFIX(ListParameterivSGIX,ListParameterivSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ListParameterivSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(IndexMaterialEXT)) -GL_PREFIX(IndexMaterialEXT): +GLOBL_FN(GL_PREFIX(IndexMaterialEXT,IndexMaterialEXT@8)) +GL_PREFIX(IndexMaterialEXT,IndexMaterialEXT@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_IndexMaterialEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(IndexFuncEXT)) -GL_PREFIX(IndexFuncEXT): +GLOBL_FN(GL_PREFIX(IndexFuncEXT,IndexFuncEXT@8)) +GL_PREFIX(IndexFuncEXT,IndexFuncEXT@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_IndexFuncEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LockArraysEXT)) -GL_PREFIX(LockArraysEXT): +GLOBL_FN(GL_PREFIX(LockArraysEXT,LockArraysEXT@8)) +GL_PREFIX(LockArraysEXT,LockArraysEXT@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LockArraysEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(UnlockArraysEXT)) -GL_PREFIX(UnlockArraysEXT): +GLOBL_FN(GL_PREFIX(UnlockArraysEXT,UnlockArraysEXT@0)) +GL_PREFIX(UnlockArraysEXT,UnlockArraysEXT@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_UnlockArraysEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CullParameterdvEXT)) -GL_PREFIX(CullParameterdvEXT): +GLOBL_FN(GL_PREFIX(CullParameterdvEXT,CullParameterdvEXT@8)) +GL_PREFIX(CullParameterdvEXT,CullParameterdvEXT@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CullParameterdvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CullParameterfvEXT)) -GL_PREFIX(CullParameterfvEXT): +GLOBL_FN(GL_PREFIX(CullParameterfvEXT,CullParameterfvEXT@8)) +GL_PREFIX(CullParameterfvEXT,CullParameterfvEXT@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CullParameterfvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FragmentColorMaterialSGIX)) -GL_PREFIX(FragmentColorMaterialSGIX): +GLOBL_FN(GL_PREFIX(FragmentColorMaterialSGIX,FragmentColorMaterialSGIX@8)) +GL_PREFIX(FragmentColorMaterialSGIX,FragmentColorMaterialSGIX@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FragmentColorMaterialSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FragmentLightfSGIX)) -GL_PREFIX(FragmentLightfSGIX): +GLOBL_FN(GL_PREFIX(FragmentLightfSGIX,FragmentLightfSGIX@12)) +GL_PREFIX(FragmentLightfSGIX,FragmentLightfSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FragmentLightfSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FragmentLightfvSGIX)) -GL_PREFIX(FragmentLightfvSGIX): +GLOBL_FN(GL_PREFIX(FragmentLightfvSGIX,FragmentLightfvSGIX@12)) +GL_PREFIX(FragmentLightfvSGIX,FragmentLightfvSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FragmentLightfvSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FragmentLightiSGIX)) -GL_PREFIX(FragmentLightiSGIX): +GLOBL_FN(GL_PREFIX(FragmentLightiSGIX,FragmentLightiSGIX@12)) +GL_PREFIX(FragmentLightiSGIX,FragmentLightiSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FragmentLightiSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FragmentLightivSGIX)) -GL_PREFIX(FragmentLightivSGIX): +GLOBL_FN(GL_PREFIX(FragmentLightivSGIX,FragmentLightivSGIX@12)) +GL_PREFIX(FragmentLightivSGIX,FragmentLightivSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FragmentLightivSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FragmentLightModelfSGIX)) -GL_PREFIX(FragmentLightModelfSGIX): +GLOBL_FN(GL_PREFIX(FragmentLightModelfSGIX,FragmentLightModelfSGIX@8)) +GL_PREFIX(FragmentLightModelfSGIX,FragmentLightModelfSGIX@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FragmentLightModelfSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FragmentLightModelfvSGIX)) -GL_PREFIX(FragmentLightModelfvSGIX): +GLOBL_FN(GL_PREFIX(FragmentLightModelfvSGIX,FragmentLightModelfvSGIX@8)) +GL_PREFIX(FragmentLightModelfvSGIX,FragmentLightModelfvSGIX@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FragmentLightModelfvSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FragmentLightModeliSGIX)) -GL_PREFIX(FragmentLightModeliSGIX): +GLOBL_FN(GL_PREFIX(FragmentLightModeliSGIX,FragmentLightModeliSGIX@8)) +GL_PREFIX(FragmentLightModeliSGIX,FragmentLightModeliSGIX@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FragmentLightModeliSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FragmentLightModelivSGIX)) -GL_PREFIX(FragmentLightModelivSGIX): +GLOBL_FN(GL_PREFIX(FragmentLightModelivSGIX,FragmentLightModelivSGIX@8)) +GL_PREFIX(FragmentLightModelivSGIX,FragmentLightModelivSGIX@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FragmentLightModelivSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FragmentMaterialfSGIX)) -GL_PREFIX(FragmentMaterialfSGIX): +GLOBL_FN(GL_PREFIX(FragmentMaterialfSGIX,FragmentMaterialfSGIX@12)) +GL_PREFIX(FragmentMaterialfSGIX,FragmentMaterialfSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FragmentMaterialfSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FragmentMaterialfvSGIX)) -GL_PREFIX(FragmentMaterialfvSGIX): +GLOBL_FN(GL_PREFIX(FragmentMaterialfvSGIX,FragmentMaterialfvSGIX@12)) +GL_PREFIX(FragmentMaterialfvSGIX,FragmentMaterialfvSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FragmentMaterialfvSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FragmentMaterialiSGIX)) -GL_PREFIX(FragmentMaterialiSGIX): +GLOBL_FN(GL_PREFIX(FragmentMaterialiSGIX,FragmentMaterialiSGIX@12)) +GL_PREFIX(FragmentMaterialiSGIX,FragmentMaterialiSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FragmentMaterialiSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FragmentMaterialivSGIX)) -GL_PREFIX(FragmentMaterialivSGIX): +GLOBL_FN(GL_PREFIX(FragmentMaterialivSGIX,FragmentMaterialivSGIX@12)) +GL_PREFIX(FragmentMaterialivSGIX,FragmentMaterialivSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FragmentMaterialivSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetFragmentLightfvSGIX)) -GL_PREFIX(GetFragmentLightfvSGIX): +GLOBL_FN(GL_PREFIX(GetFragmentLightfvSGIX,GetFragmentLightfvSGIX@12)) +GL_PREFIX(GetFragmentLightfvSGIX,GetFragmentLightfvSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetFragmentLightfvSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetFragmentLightivSGIX)) -GL_PREFIX(GetFragmentLightivSGIX): +GLOBL_FN(GL_PREFIX(GetFragmentLightivSGIX,GetFragmentLightivSGIX@12)) +GL_PREFIX(GetFragmentLightivSGIX,GetFragmentLightivSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetFragmentLightivSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetFragmentMaterialfvSGIX)) -GL_PREFIX(GetFragmentMaterialfvSGIX): +GLOBL_FN(GL_PREFIX(GetFragmentMaterialfvSGIX,GetFragmentMaterialfvSGIX@12)) +GL_PREFIX(GetFragmentMaterialfvSGIX,GetFragmentMaterialfvSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetFragmentMaterialfvSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetFragmentMaterialivSGIX)) -GL_PREFIX(GetFragmentMaterialivSGIX): +GLOBL_FN(GL_PREFIX(GetFragmentMaterialivSGIX,GetFragmentMaterialivSGIX@12)) +GL_PREFIX(GetFragmentMaterialivSGIX,GetFragmentMaterialivSGIX@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetFragmentMaterialivSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LightEnviSGIX)) -GL_PREFIX(LightEnviSGIX): +GLOBL_FN(GL_PREFIX(LightEnviSGIX,LightEnviSGIX@8)) +GL_PREFIX(LightEnviSGIX,LightEnviSGIX@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LightEnviSGIX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DrawRangeElementsEXT)) -GL_PREFIX(DrawRangeElementsEXT): +GLOBL_FN(GL_PREFIX(DrawRangeElementsEXT,DrawRangeElementsEXT@24)) +GL_PREFIX(DrawRangeElementsEXT,DrawRangeElementsEXT@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DrawRangeElements)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3bEXT)) -GL_PREFIX(SecondaryColor3bEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3bEXT,SecondaryColor3bEXT@12)) +GL_PREFIX(SecondaryColor3bEXT,SecondaryColor3bEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3bEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3bvEXT)) -GL_PREFIX(SecondaryColor3bvEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3bvEXT,SecondaryColor3bvEXT@4)) +GL_PREFIX(SecondaryColor3bvEXT,SecondaryColor3bvEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3bvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3dEXT)) -GL_PREFIX(SecondaryColor3dEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3dEXT,SecondaryColor3dEXT@24)) +GL_PREFIX(SecondaryColor3dEXT,SecondaryColor3dEXT@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3dEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3dvEXT)) -GL_PREFIX(SecondaryColor3dvEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3dvEXT,SecondaryColor3dvEXT@4)) +GL_PREFIX(SecondaryColor3dvEXT,SecondaryColor3dvEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3dvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3fEXT)) -GL_PREFIX(SecondaryColor3fEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3fEXT,SecondaryColor3fEXT@12)) +GL_PREFIX(SecondaryColor3fEXT,SecondaryColor3fEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3fEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3fvEXT)) -GL_PREFIX(SecondaryColor3fvEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3fvEXT,SecondaryColor3fvEXT@4)) +GL_PREFIX(SecondaryColor3fvEXT,SecondaryColor3fvEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3fvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3iEXT)) -GL_PREFIX(SecondaryColor3iEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3iEXT,SecondaryColor3iEXT@12)) +GL_PREFIX(SecondaryColor3iEXT,SecondaryColor3iEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3iEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3ivEXT)) -GL_PREFIX(SecondaryColor3ivEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3ivEXT,SecondaryColor3ivEXT@4)) +GL_PREFIX(SecondaryColor3ivEXT,SecondaryColor3ivEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3ivEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3sEXT)) -GL_PREFIX(SecondaryColor3sEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3sEXT,SecondaryColor3sEXT@12)) +GL_PREFIX(SecondaryColor3sEXT,SecondaryColor3sEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3sEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3svEXT)) -GL_PREFIX(SecondaryColor3svEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3svEXT,SecondaryColor3svEXT@4)) +GL_PREFIX(SecondaryColor3svEXT,SecondaryColor3svEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3svEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3ubEXT)) -GL_PREFIX(SecondaryColor3ubEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3ubEXT,SecondaryColor3ubEXT@12)) +GL_PREFIX(SecondaryColor3ubEXT,SecondaryColor3ubEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3ubEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3ubvEXT)) -GL_PREFIX(SecondaryColor3ubvEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3ubvEXT,SecondaryColor3ubvEXT@4)) +GL_PREFIX(SecondaryColor3ubvEXT,SecondaryColor3ubvEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3ubvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3uiEXT)) -GL_PREFIX(SecondaryColor3uiEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3uiEXT,SecondaryColor3uiEXT@12)) +GL_PREFIX(SecondaryColor3uiEXT,SecondaryColor3uiEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3uiEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3uivEXT)) -GL_PREFIX(SecondaryColor3uivEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3uivEXT,SecondaryColor3uivEXT@4)) +GL_PREFIX(SecondaryColor3uivEXT,SecondaryColor3uivEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3uivEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3usEXT)) -GL_PREFIX(SecondaryColor3usEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3usEXT,SecondaryColor3usEXT@12)) +GL_PREFIX(SecondaryColor3usEXT,SecondaryColor3usEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3usEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3usvEXT)) -GL_PREFIX(SecondaryColor3usvEXT): +GLOBL_FN(GL_PREFIX(SecondaryColor3usvEXT,SecondaryColor3usvEXT@4)) +GL_PREFIX(SecondaryColor3usvEXT,SecondaryColor3usvEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3usvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColorPointerEXT)) -GL_PREFIX(SecondaryColorPointerEXT): +GLOBL_FN(GL_PREFIX(SecondaryColorPointerEXT,SecondaryColorPointerEXT@16)) +GL_PREFIX(SecondaryColorPointerEXT,SecondaryColorPointerEXT@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColorPointerEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiDrawArraysEXT)) -GL_PREFIX(MultiDrawArraysEXT): +GLOBL_FN(GL_PREFIX(MultiDrawArraysEXT,MultiDrawArraysEXT@16)) +GL_PREFIX(MultiDrawArraysEXT,MultiDrawArraysEXT@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiDrawArraysEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiDrawElementsEXT)) -GL_PREFIX(MultiDrawElementsEXT): +GLOBL_FN(GL_PREFIX(MultiDrawElementsEXT,MultiDrawElementsEXT@20)) +GL_PREFIX(MultiDrawElementsEXT,MultiDrawElementsEXT@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiDrawElementsEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FogCoordfEXT)) -GL_PREFIX(FogCoordfEXT): +GLOBL_FN(GL_PREFIX(FogCoordfEXT,FogCoordfEXT@4)) +GL_PREFIX(FogCoordfEXT,FogCoordfEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FogCoordfEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FogCoordfvEXT)) -GL_PREFIX(FogCoordfvEXT): +GLOBL_FN(GL_PREFIX(FogCoordfvEXT,FogCoordfvEXT@4)) +GL_PREFIX(FogCoordfvEXT,FogCoordfvEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FogCoordfvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FogCoorddEXT)) -GL_PREFIX(FogCoorddEXT): +GLOBL_FN(GL_PREFIX(FogCoorddEXT,FogCoorddEXT@8)) +GL_PREFIX(FogCoorddEXT,FogCoorddEXT@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FogCoorddEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FogCoorddvEXT)) -GL_PREFIX(FogCoorddvEXT): +GLOBL_FN(GL_PREFIX(FogCoorddvEXT,FogCoorddvEXT@4)) +GL_PREFIX(FogCoorddvEXT,FogCoorddvEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FogCoorddvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FogCoordPointerEXT)) -GL_PREFIX(FogCoordPointerEXT): +GLOBL_FN(GL_PREFIX(FogCoordPointerEXT,FogCoordPointerEXT@12)) +GL_PREFIX(FogCoordPointerEXT,FogCoordPointerEXT@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FogCoordPointerEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BlendFuncSeparateEXT)) -GL_PREFIX(BlendFuncSeparateEXT): +GLOBL_FN(GL_PREFIX(BlendFuncSeparateEXT,BlendFuncSeparateEXT@16)) +GL_PREFIX(BlendFuncSeparateEXT,BlendFuncSeparateEXT@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BlendFuncSeparateEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BlendFuncSeparateINGR)) -GL_PREFIX(BlendFuncSeparateINGR): +GLOBL_FN(GL_PREFIX(BlendFuncSeparateINGR,BlendFuncSeparateINGR@16)) +GL_PREFIX(BlendFuncSeparateINGR,BlendFuncSeparateINGR@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BlendFuncSeparateEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexWeightfEXT)) -GL_PREFIX(VertexWeightfEXT): +GLOBL_FN(GL_PREFIX(VertexWeightfEXT,VertexWeightfEXT@4)) +GL_PREFIX(VertexWeightfEXT,VertexWeightfEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexWeightfEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexWeightfvEXT)) -GL_PREFIX(VertexWeightfvEXT): +GLOBL_FN(GL_PREFIX(VertexWeightfvEXT,VertexWeightfvEXT@4)) +GL_PREFIX(VertexWeightfvEXT,VertexWeightfvEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexWeightfvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexWeightPointerEXT)) -GL_PREFIX(VertexWeightPointerEXT): +GLOBL_FN(GL_PREFIX(VertexWeightPointerEXT,VertexWeightPointerEXT@16)) +GL_PREFIX(VertexWeightPointerEXT,VertexWeightPointerEXT@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexWeightPointerEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FlushVertexArrayRangeNV)) -GL_PREFIX(FlushVertexArrayRangeNV): +GLOBL_FN(GL_PREFIX(FlushVertexArrayRangeNV,FlushVertexArrayRangeNV@0)) +GL_PREFIX(FlushVertexArrayRangeNV,FlushVertexArrayRangeNV@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FlushVertexArrayRangeNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexArrayRangeNV)) -GL_PREFIX(VertexArrayRangeNV): +GLOBL_FN(GL_PREFIX(VertexArrayRangeNV,VertexArrayRangeNV@8)) +GL_PREFIX(VertexArrayRangeNV,VertexArrayRangeNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexArrayRangeNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CombinerParameterfvNV)) -GL_PREFIX(CombinerParameterfvNV): +GLOBL_FN(GL_PREFIX(CombinerParameterfvNV,CombinerParameterfvNV@8)) +GL_PREFIX(CombinerParameterfvNV,CombinerParameterfvNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CombinerParameterfvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CombinerParameterfNV)) -GL_PREFIX(CombinerParameterfNV): +GLOBL_FN(GL_PREFIX(CombinerParameterfNV,CombinerParameterfNV@8)) +GL_PREFIX(CombinerParameterfNV,CombinerParameterfNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CombinerParameterfNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CombinerParameterivNV)) -GL_PREFIX(CombinerParameterivNV): +GLOBL_FN(GL_PREFIX(CombinerParameterivNV,CombinerParameterivNV@8)) +GL_PREFIX(CombinerParameterivNV,CombinerParameterivNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CombinerParameterivNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CombinerParameteriNV)) -GL_PREFIX(CombinerParameteriNV): +GLOBL_FN(GL_PREFIX(CombinerParameteriNV,CombinerParameteriNV@8)) +GL_PREFIX(CombinerParameteriNV,CombinerParameteriNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CombinerParameteriNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CombinerInputNV)) -GL_PREFIX(CombinerInputNV): +GLOBL_FN(GL_PREFIX(CombinerInputNV,CombinerInputNV@24)) +GL_PREFIX(CombinerInputNV,CombinerInputNV@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CombinerInputNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(CombinerOutputNV)) -GL_PREFIX(CombinerOutputNV): +GLOBL_FN(GL_PREFIX(CombinerOutputNV,CombinerOutputNV@40)) +GL_PREFIX(CombinerOutputNV,CombinerOutputNV@40): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_CombinerOutputNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FinalCombinerInputNV)) -GL_PREFIX(FinalCombinerInputNV): +GLOBL_FN(GL_PREFIX(FinalCombinerInputNV,FinalCombinerInputNV@16)) +GL_PREFIX(FinalCombinerInputNV,FinalCombinerInputNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FinalCombinerInputNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetCombinerInputParameterfvNV)) -GL_PREFIX(GetCombinerInputParameterfvNV): +GLOBL_FN(GL_PREFIX(GetCombinerInputParameterfvNV,GetCombinerInputParameterfvNV@20)) +GL_PREFIX(GetCombinerInputParameterfvNV,GetCombinerInputParameterfvNV@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetCombinerInputParameterfvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetCombinerInputParameterivNV)) -GL_PREFIX(GetCombinerInputParameterivNV): +GLOBL_FN(GL_PREFIX(GetCombinerInputParameterivNV,GetCombinerInputParameterivNV@20)) +GL_PREFIX(GetCombinerInputParameterivNV,GetCombinerInputParameterivNV@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetCombinerInputParameterivNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetCombinerOutputParameterfvNV)) -GL_PREFIX(GetCombinerOutputParameterfvNV): +GLOBL_FN(GL_PREFIX(GetCombinerOutputParameterfvNV,GetCombinerOutputParameterfvNV@16)) +GL_PREFIX(GetCombinerOutputParameterfvNV,GetCombinerOutputParameterfvNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetCombinerOutputParameterfvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetCombinerOutputParameterivNV)) -GL_PREFIX(GetCombinerOutputParameterivNV): +GLOBL_FN(GL_PREFIX(GetCombinerOutputParameterivNV,GetCombinerOutputParameterivNV@16)) +GL_PREFIX(GetCombinerOutputParameterivNV,GetCombinerOutputParameterivNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetCombinerOutputParameterivNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetFinalCombinerInputParameterfvNV)) -GL_PREFIX(GetFinalCombinerInputParameterfvNV): +GLOBL_FN(GL_PREFIX(GetFinalCombinerInputParameterfvNV,GetFinalCombinerInputParameterfvNV@12)) +GL_PREFIX(GetFinalCombinerInputParameterfvNV,GetFinalCombinerInputParameterfvNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetFinalCombinerInputParameterfvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetFinalCombinerInputParameterivNV)) -GL_PREFIX(GetFinalCombinerInputParameterivNV): +GLOBL_FN(GL_PREFIX(GetFinalCombinerInputParameterivNV,GetFinalCombinerInputParameterivNV@12)) +GL_PREFIX(GetFinalCombinerInputParameterivNV,GetFinalCombinerInputParameterivNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetFinalCombinerInputParameterivNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ResizeBuffersMESA)) -GL_PREFIX(ResizeBuffersMESA): +GLOBL_FN(GL_PREFIX(ResizeBuffersMESA,ResizeBuffersMESA@0)) +GL_PREFIX(ResizeBuffersMESA,ResizeBuffersMESA@0): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ResizeBuffersMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2dMESA)) -GL_PREFIX(WindowPos2dMESA): +GLOBL_FN(GL_PREFIX(WindowPos2dMESA,WindowPos2dMESA@16)) +GL_PREFIX(WindowPos2dMESA,WindowPos2dMESA@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2dMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2dvMESA)) -GL_PREFIX(WindowPos2dvMESA): +GLOBL_FN(GL_PREFIX(WindowPos2dvMESA,WindowPos2dvMESA@4)) +GL_PREFIX(WindowPos2dvMESA,WindowPos2dvMESA@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2dvMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2fMESA)) -GL_PREFIX(WindowPos2fMESA): +GLOBL_FN(GL_PREFIX(WindowPos2fMESA,WindowPos2fMESA@8)) +GL_PREFIX(WindowPos2fMESA,WindowPos2fMESA@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2fMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2fvMESA)) -GL_PREFIX(WindowPos2fvMESA): +GLOBL_FN(GL_PREFIX(WindowPos2fvMESA,WindowPos2fvMESA@4)) +GL_PREFIX(WindowPos2fvMESA,WindowPos2fvMESA@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2fvMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2iMESA)) -GL_PREFIX(WindowPos2iMESA): +GLOBL_FN(GL_PREFIX(WindowPos2iMESA,WindowPos2iMESA@8)) +GL_PREFIX(WindowPos2iMESA,WindowPos2iMESA@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2iMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2ivMESA)) -GL_PREFIX(WindowPos2ivMESA): +GLOBL_FN(GL_PREFIX(WindowPos2ivMESA,WindowPos2ivMESA@4)) +GL_PREFIX(WindowPos2ivMESA,WindowPos2ivMESA@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2ivMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2sMESA)) -GL_PREFIX(WindowPos2sMESA): +GLOBL_FN(GL_PREFIX(WindowPos2sMESA,WindowPos2sMESA@8)) +GL_PREFIX(WindowPos2sMESA,WindowPos2sMESA@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2sMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2svMESA)) -GL_PREFIX(WindowPos2svMESA): +GLOBL_FN(GL_PREFIX(WindowPos2svMESA,WindowPos2svMESA@4)) +GL_PREFIX(WindowPos2svMESA,WindowPos2svMESA@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2svMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3dMESA)) -GL_PREFIX(WindowPos3dMESA): +GLOBL_FN(GL_PREFIX(WindowPos3dMESA,WindowPos3dMESA@24)) +GL_PREFIX(WindowPos3dMESA,WindowPos3dMESA@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3dMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3dvMESA)) -GL_PREFIX(WindowPos3dvMESA): +GLOBL_FN(GL_PREFIX(WindowPos3dvMESA,WindowPos3dvMESA@4)) +GL_PREFIX(WindowPos3dvMESA,WindowPos3dvMESA@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3dvMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3fMESA)) -GL_PREFIX(WindowPos3fMESA): +GLOBL_FN(GL_PREFIX(WindowPos3fMESA,WindowPos3fMESA@12)) +GL_PREFIX(WindowPos3fMESA,WindowPos3fMESA@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3fMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3fvMESA)) -GL_PREFIX(WindowPos3fvMESA): +GLOBL_FN(GL_PREFIX(WindowPos3fvMESA,WindowPos3fvMESA@4)) +GL_PREFIX(WindowPos3fvMESA,WindowPos3fvMESA@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3fvMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3iMESA)) -GL_PREFIX(WindowPos3iMESA): +GLOBL_FN(GL_PREFIX(WindowPos3iMESA,WindowPos3iMESA@12)) +GL_PREFIX(WindowPos3iMESA,WindowPos3iMESA@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3iMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3ivMESA)) -GL_PREFIX(WindowPos3ivMESA): +GLOBL_FN(GL_PREFIX(WindowPos3ivMESA,WindowPos3ivMESA@4)) +GL_PREFIX(WindowPos3ivMESA,WindowPos3ivMESA@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3ivMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3sMESA)) -GL_PREFIX(WindowPos3sMESA): +GLOBL_FN(GL_PREFIX(WindowPos3sMESA,WindowPos3sMESA@12)) +GL_PREFIX(WindowPos3sMESA,WindowPos3sMESA@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3sMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3svMESA)) -GL_PREFIX(WindowPos3svMESA): +GLOBL_FN(GL_PREFIX(WindowPos3svMESA,WindowPos3svMESA@4)) +GL_PREFIX(WindowPos3svMESA,WindowPos3svMESA@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3svMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos4dMESA)) -GL_PREFIX(WindowPos4dMESA): +GLOBL_FN(GL_PREFIX(WindowPos4dMESA,WindowPos4dMESA@32)) +GL_PREFIX(WindowPos4dMESA,WindowPos4dMESA@32): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos4dMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos4dvMESA)) -GL_PREFIX(WindowPos4dvMESA): +GLOBL_FN(GL_PREFIX(WindowPos4dvMESA,WindowPos4dvMESA@4)) +GL_PREFIX(WindowPos4dvMESA,WindowPos4dvMESA@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos4dvMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos4fMESA)) -GL_PREFIX(WindowPos4fMESA): +GLOBL_FN(GL_PREFIX(WindowPos4fMESA,WindowPos4fMESA@16)) +GL_PREFIX(WindowPos4fMESA,WindowPos4fMESA@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos4fMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos4fvMESA)) -GL_PREFIX(WindowPos4fvMESA): +GLOBL_FN(GL_PREFIX(WindowPos4fvMESA,WindowPos4fvMESA@4)) +GL_PREFIX(WindowPos4fvMESA,WindowPos4fvMESA@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos4fvMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos4iMESA)) -GL_PREFIX(WindowPos4iMESA): +GLOBL_FN(GL_PREFIX(WindowPos4iMESA,WindowPos4iMESA@16)) +GL_PREFIX(WindowPos4iMESA,WindowPos4iMESA@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos4iMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos4ivMESA)) -GL_PREFIX(WindowPos4ivMESA): +GLOBL_FN(GL_PREFIX(WindowPos4ivMESA,WindowPos4ivMESA@4)) +GL_PREFIX(WindowPos4ivMESA,WindowPos4ivMESA@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos4ivMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos4sMESA)) -GL_PREFIX(WindowPos4sMESA): +GLOBL_FN(GL_PREFIX(WindowPos4sMESA,WindowPos4sMESA@16)) +GL_PREFIX(WindowPos4sMESA,WindowPos4sMESA@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos4sMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos4svMESA)) -GL_PREFIX(WindowPos4svMESA): +GLOBL_FN(GL_PREFIX(WindowPos4svMESA,WindowPos4svMESA@4)) +GL_PREFIX(WindowPos4svMESA,WindowPos4svMESA@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos4svMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiModeDrawArraysIBM)) -GL_PREFIX(MultiModeDrawArraysIBM): +GLOBL_FN(GL_PREFIX(MultiModeDrawArraysIBM,MultiModeDrawArraysIBM@20)) +GL_PREFIX(MultiModeDrawArraysIBM,MultiModeDrawArraysIBM@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiModeDrawArraysIBM)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiModeDrawElementsIBM)) -GL_PREFIX(MultiModeDrawElementsIBM): +GLOBL_FN(GL_PREFIX(MultiModeDrawElementsIBM,MultiModeDrawElementsIBM@24)) +GL_PREFIX(MultiModeDrawElementsIBM,MultiModeDrawElementsIBM@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiModeDrawElementsIBM)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TbufferMask3DFX)) -GL_PREFIX(TbufferMask3DFX): +GLOBL_FN(GL_PREFIX(TbufferMask3DFX,TbufferMask3DFX@4)) +GL_PREFIX(TbufferMask3DFX,TbufferMask3DFX@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TbufferMask3DFX)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SampleMaskEXT)) -GL_PREFIX(SampleMaskEXT): +GLOBL_FN(GL_PREFIX(SampleMaskEXT,SampleMaskEXT@8)) +GL_PREFIX(SampleMaskEXT,SampleMaskEXT@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SampleMaskSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SamplePatternEXT)) -GL_PREFIX(SamplePatternEXT): +GLOBL_FN(GL_PREFIX(SamplePatternEXT,SamplePatternEXT@4)) +GL_PREFIX(SamplePatternEXT,SamplePatternEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SamplePatternSGIS)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2dARB)) -GL_PREFIX(WindowPos2dARB): +GLOBL_FN(GL_PREFIX(WindowPos2dARB,WindowPos2dARB@16)) +GL_PREFIX(WindowPos2dARB,WindowPos2dARB@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2dMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2fARB)) -GL_PREFIX(WindowPos2fARB): +GLOBL_FN(GL_PREFIX(WindowPos2fARB,WindowPos2fARB@8)) +GL_PREFIX(WindowPos2fARB,WindowPos2fARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2fMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2iARB)) -GL_PREFIX(WindowPos2iARB): +GLOBL_FN(GL_PREFIX(WindowPos2iARB,WindowPos2iARB@8)) +GL_PREFIX(WindowPos2iARB,WindowPos2iARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2iMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2sARB)) -GL_PREFIX(WindowPos2sARB): +GLOBL_FN(GL_PREFIX(WindowPos2sARB,WindowPos2sARB@8)) +GL_PREFIX(WindowPos2sARB,WindowPos2sARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2sMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2dvARB)) -GL_PREFIX(WindowPos2dvARB): +GLOBL_FN(GL_PREFIX(WindowPos2dvARB,WindowPos2dvARB@4)) +GL_PREFIX(WindowPos2dvARB,WindowPos2dvARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2dvMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2fvARB)) -GL_PREFIX(WindowPos2fvARB): +GLOBL_FN(GL_PREFIX(WindowPos2fvARB,WindowPos2fvARB@4)) +GL_PREFIX(WindowPos2fvARB,WindowPos2fvARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2fvMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2ivARB)) -GL_PREFIX(WindowPos2ivARB): +GLOBL_FN(GL_PREFIX(WindowPos2ivARB,WindowPos2ivARB@4)) +GL_PREFIX(WindowPos2ivARB,WindowPos2ivARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2ivMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2svARB)) -GL_PREFIX(WindowPos2svARB): +GLOBL_FN(GL_PREFIX(WindowPos2svARB,WindowPos2svARB@4)) +GL_PREFIX(WindowPos2svARB,WindowPos2svARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2svMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3dARB)) -GL_PREFIX(WindowPos3dARB): +GLOBL_FN(GL_PREFIX(WindowPos3dARB,WindowPos3dARB@24)) +GL_PREFIX(WindowPos3dARB,WindowPos3dARB@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3dMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3fARB)) -GL_PREFIX(WindowPos3fARB): +GLOBL_FN(GL_PREFIX(WindowPos3fARB,WindowPos3fARB@12)) +GL_PREFIX(WindowPos3fARB,WindowPos3fARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3fMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3iARB)) -GL_PREFIX(WindowPos3iARB): +GLOBL_FN(GL_PREFIX(WindowPos3iARB,WindowPos3iARB@12)) +GL_PREFIX(WindowPos3iARB,WindowPos3iARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3iMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3sARB)) -GL_PREFIX(WindowPos3sARB): +GLOBL_FN(GL_PREFIX(WindowPos3sARB,WindowPos3sARB@12)) +GL_PREFIX(WindowPos3sARB,WindowPos3sARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3sMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3dvARB)) -GL_PREFIX(WindowPos3dvARB): +GLOBL_FN(GL_PREFIX(WindowPos3dvARB,WindowPos3dvARB@4)) +GL_PREFIX(WindowPos3dvARB,WindowPos3dvARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3dvMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3fvARB)) -GL_PREFIX(WindowPos3fvARB): +GLOBL_FN(GL_PREFIX(WindowPos3fvARB,WindowPos3fvARB@4)) +GL_PREFIX(WindowPos3fvARB,WindowPos3fvARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3fvMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3ivARB)) -GL_PREFIX(WindowPos3ivARB): +GLOBL_FN(GL_PREFIX(WindowPos3ivARB,WindowPos3ivARB@4)) +GL_PREFIX(WindowPos3ivARB,WindowPos3ivARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3ivMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3svARB)) -GL_PREFIX(WindowPos3svARB): +GLOBL_FN(GL_PREFIX(WindowPos3svARB,WindowPos3svARB@4)) +GL_PREFIX(WindowPos3svARB,WindowPos3svARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3svMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(AreProgramsResidentNV)) -GL_PREFIX(AreProgramsResidentNV): +GLOBL_FN(GL_PREFIX(AreProgramsResidentNV,AreProgramsResidentNV@12)) +GL_PREFIX(AreProgramsResidentNV,AreProgramsResidentNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_AreProgramsResidentNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BindProgramNV)) -GL_PREFIX(BindProgramNV): +GLOBL_FN(GL_PREFIX(BindProgramNV,BindProgramNV@8)) +GL_PREFIX(BindProgramNV,BindProgramNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BindProgramNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DeleteProgramsNV)) -GL_PREFIX(DeleteProgramsNV): +GLOBL_FN(GL_PREFIX(DeleteProgramsNV,DeleteProgramsNV@8)) +GL_PREFIX(DeleteProgramsNV,DeleteProgramsNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DeleteProgramsNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ExecuteProgramNV)) -GL_PREFIX(ExecuteProgramNV): +GLOBL_FN(GL_PREFIX(ExecuteProgramNV,ExecuteProgramNV@12)) +GL_PREFIX(ExecuteProgramNV,ExecuteProgramNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ExecuteProgramNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GenProgramsNV)) -GL_PREFIX(GenProgramsNV): +GLOBL_FN(GL_PREFIX(GenProgramsNV,GenProgramsNV@8)) +GL_PREFIX(GenProgramsNV,GenProgramsNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GenProgramsNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetProgramParameterdvNV)) -GL_PREFIX(GetProgramParameterdvNV): +GLOBL_FN(GL_PREFIX(GetProgramParameterdvNV,GetProgramParameterdvNV@16)) +GL_PREFIX(GetProgramParameterdvNV,GetProgramParameterdvNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetProgramParameterdvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetProgramParameterfvNV)) -GL_PREFIX(GetProgramParameterfvNV): +GLOBL_FN(GL_PREFIX(GetProgramParameterfvNV,GetProgramParameterfvNV@16)) +GL_PREFIX(GetProgramParameterfvNV,GetProgramParameterfvNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetProgramParameterfvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetProgramivNV)) -GL_PREFIX(GetProgramivNV): +GLOBL_FN(GL_PREFIX(GetProgramivNV,GetProgramivNV@12)) +GL_PREFIX(GetProgramivNV,GetProgramivNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetProgramivNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetProgramStringNV)) -GL_PREFIX(GetProgramStringNV): +GLOBL_FN(GL_PREFIX(GetProgramStringNV,GetProgramStringNV@12)) +GL_PREFIX(GetProgramStringNV,GetProgramStringNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetProgramStringNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetTrackMatrixivNV)) -GL_PREFIX(GetTrackMatrixivNV): +GLOBL_FN(GL_PREFIX(GetTrackMatrixivNV,GetTrackMatrixivNV@16)) +GL_PREFIX(GetTrackMatrixivNV,GetTrackMatrixivNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetTrackMatrixivNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetVertexAttribdvNV)) -GL_PREFIX(GetVertexAttribdvNV): +GLOBL_FN(GL_PREFIX(GetVertexAttribdvNV,GetVertexAttribdvNV@12)) +GL_PREFIX(GetVertexAttribdvNV,GetVertexAttribdvNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetVertexAttribdvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetVertexAttribfvNV)) -GL_PREFIX(GetVertexAttribfvNV): +GLOBL_FN(GL_PREFIX(GetVertexAttribfvNV,GetVertexAttribfvNV@12)) +GL_PREFIX(GetVertexAttribfvNV,GetVertexAttribfvNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetVertexAttribfvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetVertexAttribivNV)) -GL_PREFIX(GetVertexAttribivNV): +GLOBL_FN(GL_PREFIX(GetVertexAttribivNV,GetVertexAttribivNV@12)) +GL_PREFIX(GetVertexAttribivNV,GetVertexAttribivNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetVertexAttribivNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetVertexAttribPointervNV)) -GL_PREFIX(GetVertexAttribPointervNV): +GLOBL_FN(GL_PREFIX(GetVertexAttribPointervNV,GetVertexAttribPointervNV@12)) +GL_PREFIX(GetVertexAttribPointervNV,GetVertexAttribPointervNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetVertexAttribPointervNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(IsProgramNV)) -GL_PREFIX(IsProgramNV): +GLOBL_FN(GL_PREFIX(IsProgramNV,IsProgramNV@4)) +GL_PREFIX(IsProgramNV,IsProgramNV@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_IsProgramNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(LoadProgramNV)) -GL_PREFIX(LoadProgramNV): +GLOBL_FN(GL_PREFIX(LoadProgramNV,LoadProgramNV@16)) +GL_PREFIX(LoadProgramNV,LoadProgramNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_LoadProgramNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramParameter4dNV)) -GL_PREFIX(ProgramParameter4dNV): +GLOBL_FN(GL_PREFIX(ProgramParameter4dNV,ProgramParameter4dNV@40)) +GL_PREFIX(ProgramParameter4dNV,ProgramParameter4dNV@40): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramParameter4dNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramParameter4dvNV)) -GL_PREFIX(ProgramParameter4dvNV): +GLOBL_FN(GL_PREFIX(ProgramParameter4dvNV,ProgramParameter4dvNV@12)) +GL_PREFIX(ProgramParameter4dvNV,ProgramParameter4dvNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramParameter4dvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramParameter4fNV)) -GL_PREFIX(ProgramParameter4fNV): +GLOBL_FN(GL_PREFIX(ProgramParameter4fNV,ProgramParameter4fNV@24)) +GL_PREFIX(ProgramParameter4fNV,ProgramParameter4fNV@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramParameter4fNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramParameter4fvNV)) -GL_PREFIX(ProgramParameter4fvNV): +GLOBL_FN(GL_PREFIX(ProgramParameter4fvNV,ProgramParameter4fvNV@12)) +GL_PREFIX(ProgramParameter4fvNV,ProgramParameter4fvNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramParameter4fvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramParameters4dvNV)) -GL_PREFIX(ProgramParameters4dvNV): +GLOBL_FN(GL_PREFIX(ProgramParameters4dvNV,ProgramParameters4dvNV@16)) +GL_PREFIX(ProgramParameters4dvNV,ProgramParameters4dvNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramParameters4dvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramParameters4fvNV)) -GL_PREFIX(ProgramParameters4fvNV): +GLOBL_FN(GL_PREFIX(ProgramParameters4fvNV,ProgramParameters4fvNV@16)) +GL_PREFIX(ProgramParameters4fvNV,ProgramParameters4fvNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramParameters4fvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(RequestResidentProgramsNV)) -GL_PREFIX(RequestResidentProgramsNV): +GLOBL_FN(GL_PREFIX(RequestResidentProgramsNV,RequestResidentProgramsNV@8)) +GL_PREFIX(RequestResidentProgramsNV,RequestResidentProgramsNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_RequestResidentProgramsNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TrackMatrixNV)) -GL_PREFIX(TrackMatrixNV): +GLOBL_FN(GL_PREFIX(TrackMatrixNV,TrackMatrixNV@16)) +GL_PREFIX(TrackMatrixNV,TrackMatrixNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TrackMatrixNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttribPointerNV)) -GL_PREFIX(VertexAttribPointerNV): +GLOBL_FN(GL_PREFIX(VertexAttribPointerNV,VertexAttribPointerNV@20)) +GL_PREFIX(VertexAttribPointerNV,VertexAttribPointerNV@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttribPointerNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib1dNV)) -GL_PREFIX(VertexAttrib1dNV): +GLOBL_FN(GL_PREFIX(VertexAttrib1dNV,VertexAttrib1dNV@12)) +GL_PREFIX(VertexAttrib1dNV,VertexAttrib1dNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib1dNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib1dvNV)) -GL_PREFIX(VertexAttrib1dvNV): +GLOBL_FN(GL_PREFIX(VertexAttrib1dvNV,VertexAttrib1dvNV@8)) +GL_PREFIX(VertexAttrib1dvNV,VertexAttrib1dvNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib1dvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib1fNV)) -GL_PREFIX(VertexAttrib1fNV): +GLOBL_FN(GL_PREFIX(VertexAttrib1fNV,VertexAttrib1fNV@8)) +GL_PREFIX(VertexAttrib1fNV,VertexAttrib1fNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib1fNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib1fvNV)) -GL_PREFIX(VertexAttrib1fvNV): +GLOBL_FN(GL_PREFIX(VertexAttrib1fvNV,VertexAttrib1fvNV@8)) +GL_PREFIX(VertexAttrib1fvNV,VertexAttrib1fvNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib1fvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib1sNV)) -GL_PREFIX(VertexAttrib1sNV): +GLOBL_FN(GL_PREFIX(VertexAttrib1sNV,VertexAttrib1sNV@8)) +GL_PREFIX(VertexAttrib1sNV,VertexAttrib1sNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib1sNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib1svNV)) -GL_PREFIX(VertexAttrib1svNV): +GLOBL_FN(GL_PREFIX(VertexAttrib1svNV,VertexAttrib1svNV@8)) +GL_PREFIX(VertexAttrib1svNV,VertexAttrib1svNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib1svNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib2dNV)) -GL_PREFIX(VertexAttrib2dNV): +GLOBL_FN(GL_PREFIX(VertexAttrib2dNV,VertexAttrib2dNV@20)) +GL_PREFIX(VertexAttrib2dNV,VertexAttrib2dNV@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib2dNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib2dvNV)) -GL_PREFIX(VertexAttrib2dvNV): +GLOBL_FN(GL_PREFIX(VertexAttrib2dvNV,VertexAttrib2dvNV@8)) +GL_PREFIX(VertexAttrib2dvNV,VertexAttrib2dvNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib2dvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib2fNV)) -GL_PREFIX(VertexAttrib2fNV): +GLOBL_FN(GL_PREFIX(VertexAttrib2fNV,VertexAttrib2fNV@12)) +GL_PREFIX(VertexAttrib2fNV,VertexAttrib2fNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib2fNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib2fvNV)) -GL_PREFIX(VertexAttrib2fvNV): +GLOBL_FN(GL_PREFIX(VertexAttrib2fvNV,VertexAttrib2fvNV@8)) +GL_PREFIX(VertexAttrib2fvNV,VertexAttrib2fvNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib2fvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib2sNV)) -GL_PREFIX(VertexAttrib2sNV): +GLOBL_FN(GL_PREFIX(VertexAttrib2sNV,VertexAttrib2sNV@12)) +GL_PREFIX(VertexAttrib2sNV,VertexAttrib2sNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib2sNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib2svNV)) -GL_PREFIX(VertexAttrib2svNV): +GLOBL_FN(GL_PREFIX(VertexAttrib2svNV,VertexAttrib2svNV@8)) +GL_PREFIX(VertexAttrib2svNV,VertexAttrib2svNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib2svNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib3dNV)) -GL_PREFIX(VertexAttrib3dNV): +GLOBL_FN(GL_PREFIX(VertexAttrib3dNV,VertexAttrib3dNV@28)) +GL_PREFIX(VertexAttrib3dNV,VertexAttrib3dNV@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib3dNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib3dvNV)) -GL_PREFIX(VertexAttrib3dvNV): +GLOBL_FN(GL_PREFIX(VertexAttrib3dvNV,VertexAttrib3dvNV@8)) +GL_PREFIX(VertexAttrib3dvNV,VertexAttrib3dvNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib3dvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib3fNV)) -GL_PREFIX(VertexAttrib3fNV): +GLOBL_FN(GL_PREFIX(VertexAttrib3fNV,VertexAttrib3fNV@16)) +GL_PREFIX(VertexAttrib3fNV,VertexAttrib3fNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib3fNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib3fvNV)) -GL_PREFIX(VertexAttrib3fvNV): +GLOBL_FN(GL_PREFIX(VertexAttrib3fvNV,VertexAttrib3fvNV@8)) +GL_PREFIX(VertexAttrib3fvNV,VertexAttrib3fvNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib3fvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib3sNV)) -GL_PREFIX(VertexAttrib3sNV): +GLOBL_FN(GL_PREFIX(VertexAttrib3sNV,VertexAttrib3sNV@16)) +GL_PREFIX(VertexAttrib3sNV,VertexAttrib3sNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib3sNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib3svNV)) -GL_PREFIX(VertexAttrib3svNV): +GLOBL_FN(GL_PREFIX(VertexAttrib3svNV,VertexAttrib3svNV@8)) +GL_PREFIX(VertexAttrib3svNV,VertexAttrib3svNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib3svNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4dNV)) -GL_PREFIX(VertexAttrib4dNV): +GLOBL_FN(GL_PREFIX(VertexAttrib4dNV,VertexAttrib4dNV@36)) +GL_PREFIX(VertexAttrib4dNV,VertexAttrib4dNV@36): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4dNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4dvNV)) -GL_PREFIX(VertexAttrib4dvNV): +GLOBL_FN(GL_PREFIX(VertexAttrib4dvNV,VertexAttrib4dvNV@8)) +GL_PREFIX(VertexAttrib4dvNV,VertexAttrib4dvNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4dvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4fNV)) -GL_PREFIX(VertexAttrib4fNV): +GLOBL_FN(GL_PREFIX(VertexAttrib4fNV,VertexAttrib4fNV@20)) +GL_PREFIX(VertexAttrib4fNV,VertexAttrib4fNV@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4fNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4fvNV)) -GL_PREFIX(VertexAttrib4fvNV): +GLOBL_FN(GL_PREFIX(VertexAttrib4fvNV,VertexAttrib4fvNV@8)) +GL_PREFIX(VertexAttrib4fvNV,VertexAttrib4fvNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4fvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4sNV)) -GL_PREFIX(VertexAttrib4sNV): +GLOBL_FN(GL_PREFIX(VertexAttrib4sNV,VertexAttrib4sNV@20)) +GL_PREFIX(VertexAttrib4sNV,VertexAttrib4sNV@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4sNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4svNV)) -GL_PREFIX(VertexAttrib4svNV): +GLOBL_FN(GL_PREFIX(VertexAttrib4svNV,VertexAttrib4svNV@8)) +GL_PREFIX(VertexAttrib4svNV,VertexAttrib4svNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4svNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4ubNV)) -GL_PREFIX(VertexAttrib4ubNV): +GLOBL_FN(GL_PREFIX(VertexAttrib4ubNV,VertexAttrib4ubNV@20)) +GL_PREFIX(VertexAttrib4ubNV,VertexAttrib4ubNV@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4ubNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4ubvNV)) -GL_PREFIX(VertexAttrib4ubvNV): +GLOBL_FN(GL_PREFIX(VertexAttrib4ubvNV,VertexAttrib4ubvNV@8)) +GL_PREFIX(VertexAttrib4ubvNV,VertexAttrib4ubvNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4ubvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttribs1dvNV)) -GL_PREFIX(VertexAttribs1dvNV): +GLOBL_FN(GL_PREFIX(VertexAttribs1dvNV,VertexAttribs1dvNV@12)) +GL_PREFIX(VertexAttribs1dvNV,VertexAttribs1dvNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttribs1dvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttribs1fvNV)) -GL_PREFIX(VertexAttribs1fvNV): +GLOBL_FN(GL_PREFIX(VertexAttribs1fvNV,VertexAttribs1fvNV@12)) +GL_PREFIX(VertexAttribs1fvNV,VertexAttribs1fvNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttribs1fvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttribs1svNV)) -GL_PREFIX(VertexAttribs1svNV): +GLOBL_FN(GL_PREFIX(VertexAttribs1svNV,VertexAttribs1svNV@12)) +GL_PREFIX(VertexAttribs1svNV,VertexAttribs1svNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttribs1svNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttribs2dvNV)) -GL_PREFIX(VertexAttribs2dvNV): +GLOBL_FN(GL_PREFIX(VertexAttribs2dvNV,VertexAttribs2dvNV@12)) +GL_PREFIX(VertexAttribs2dvNV,VertexAttribs2dvNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttribs2dvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttribs2fvNV)) -GL_PREFIX(VertexAttribs2fvNV): +GLOBL_FN(GL_PREFIX(VertexAttribs2fvNV,VertexAttribs2fvNV@12)) +GL_PREFIX(VertexAttribs2fvNV,VertexAttribs2fvNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttribs2fvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttribs2svNV)) -GL_PREFIX(VertexAttribs2svNV): +GLOBL_FN(GL_PREFIX(VertexAttribs2svNV,VertexAttribs2svNV@12)) +GL_PREFIX(VertexAttribs2svNV,VertexAttribs2svNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttribs2svNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttribs3dvNV)) -GL_PREFIX(VertexAttribs3dvNV): +GLOBL_FN(GL_PREFIX(VertexAttribs3dvNV,VertexAttribs3dvNV@12)) +GL_PREFIX(VertexAttribs3dvNV,VertexAttribs3dvNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttribs3dvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttribs3fvNV)) -GL_PREFIX(VertexAttribs3fvNV): +GLOBL_FN(GL_PREFIX(VertexAttribs3fvNV,VertexAttribs3fvNV@12)) +GL_PREFIX(VertexAttribs3fvNV,VertexAttribs3fvNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttribs3fvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttribs3svNV)) -GL_PREFIX(VertexAttribs3svNV): +GLOBL_FN(GL_PREFIX(VertexAttribs3svNV,VertexAttribs3svNV@12)) +GL_PREFIX(VertexAttribs3svNV,VertexAttribs3svNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttribs3svNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttribs4dvNV)) -GL_PREFIX(VertexAttribs4dvNV): +GLOBL_FN(GL_PREFIX(VertexAttribs4dvNV,VertexAttribs4dvNV@12)) +GL_PREFIX(VertexAttribs4dvNV,VertexAttribs4dvNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttribs4dvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttribs4fvNV)) -GL_PREFIX(VertexAttribs4fvNV): +GLOBL_FN(GL_PREFIX(VertexAttribs4fvNV,VertexAttribs4fvNV@12)) +GL_PREFIX(VertexAttribs4fvNV,VertexAttribs4fvNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttribs4fvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttribs4svNV)) -GL_PREFIX(VertexAttribs4svNV): +GLOBL_FN(GL_PREFIX(VertexAttribs4svNV,VertexAttribs4svNV@12)) +GL_PREFIX(VertexAttribs4svNV,VertexAttribs4svNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttribs4svNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttribs4ubvNV)) -GL_PREFIX(VertexAttribs4ubvNV): +GLOBL_FN(GL_PREFIX(VertexAttribs4ubvNV,VertexAttribs4ubvNV@12)) +GL_PREFIX(VertexAttribs4ubvNV,VertexAttribs4ubvNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttribs4ubvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PointParameteriNV)) -GL_PREFIX(PointParameteriNV): +GLOBL_FN(GL_PREFIX(PointParameteriNV,PointParameteriNV@8)) +GL_PREFIX(PointParameteriNV,PointParameteriNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PointParameteriNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PointParameterivNV)) -GL_PREFIX(PointParameterivNV): +GLOBL_FN(GL_PREFIX(PointParameterivNV,PointParameterivNV@8)) +GL_PREFIX(PointParameterivNV,PointParameterivNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PointParameterivNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BlendFuncSeparate)) -GL_PREFIX(BlendFuncSeparate): +GLOBL_FN(GL_PREFIX(BlendFuncSeparate,BlendFuncSeparate@16)) +GL_PREFIX(BlendFuncSeparate,BlendFuncSeparate@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BlendFuncSeparateEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FogCoordf)) -GL_PREFIX(FogCoordf): +GLOBL_FN(GL_PREFIX(FogCoordf,FogCoordf@4)) +GL_PREFIX(FogCoordf,FogCoordf@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FogCoordfEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FogCoordfv)) -GL_PREFIX(FogCoordfv): +GLOBL_FN(GL_PREFIX(FogCoordfv,FogCoordfv@4)) +GL_PREFIX(FogCoordfv,FogCoordfv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FogCoordfvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FogCoordd)) -GL_PREFIX(FogCoordd): +GLOBL_FN(GL_PREFIX(FogCoordd,FogCoordd@8)) +GL_PREFIX(FogCoordd,FogCoordd@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FogCoorddEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FogCoorddv)) -GL_PREFIX(FogCoorddv): +GLOBL_FN(GL_PREFIX(FogCoorddv,FogCoorddv@4)) +GL_PREFIX(FogCoorddv,FogCoorddv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FogCoorddvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FogCoordPointer)) -GL_PREFIX(FogCoordPointer): +GLOBL_FN(GL_PREFIX(FogCoordPointer,FogCoordPointer@12)) +GL_PREFIX(FogCoordPointer,FogCoordPointer@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FogCoordPointerEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiDrawArrays)) -GL_PREFIX(MultiDrawArrays): +GLOBL_FN(GL_PREFIX(MultiDrawArrays,MultiDrawArrays@16)) +GL_PREFIX(MultiDrawArrays,MultiDrawArrays@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiDrawArraysEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MultiDrawElements)) -GL_PREFIX(MultiDrawElements): +GLOBL_FN(GL_PREFIX(MultiDrawElements,MultiDrawElements@20)) +GL_PREFIX(MultiDrawElements,MultiDrawElements@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MultiDrawElementsEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PointParameterf)) -GL_PREFIX(PointParameterf): +GLOBL_FN(GL_PREFIX(PointParameterf,PointParameterf@8)) +GL_PREFIX(PointParameterf,PointParameterf@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PointParameterfEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PointParameterfv)) -GL_PREFIX(PointParameterfv): +GLOBL_FN(GL_PREFIX(PointParameterfv,PointParameterfv@8)) +GL_PREFIX(PointParameterfv,PointParameterfv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PointParameterfvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PointParameteri)) -GL_PREFIX(PointParameteri): +GLOBL_FN(GL_PREFIX(PointParameteri,PointParameteri@8)) +GL_PREFIX(PointParameteri,PointParameteri@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PointParameteriNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(PointParameteriv)) -GL_PREFIX(PointParameteriv): +GLOBL_FN(GL_PREFIX(PointParameteriv,PointParameteriv@8)) +GL_PREFIX(PointParameteriv,PointParameteriv@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_PointParameterivNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3b)) -GL_PREFIX(SecondaryColor3b): +GLOBL_FN(GL_PREFIX(SecondaryColor3b,SecondaryColor3b@12)) +GL_PREFIX(SecondaryColor3b,SecondaryColor3b@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3bEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3bv)) -GL_PREFIX(SecondaryColor3bv): +GLOBL_FN(GL_PREFIX(SecondaryColor3bv,SecondaryColor3bv@4)) +GL_PREFIX(SecondaryColor3bv,SecondaryColor3bv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3bvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3d)) -GL_PREFIX(SecondaryColor3d): +GLOBL_FN(GL_PREFIX(SecondaryColor3d,SecondaryColor3d@24)) +GL_PREFIX(SecondaryColor3d,SecondaryColor3d@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3dEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3dv)) -GL_PREFIX(SecondaryColor3dv): +GLOBL_FN(GL_PREFIX(SecondaryColor3dv,SecondaryColor3dv@4)) +GL_PREFIX(SecondaryColor3dv,SecondaryColor3dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3dvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3f)) -GL_PREFIX(SecondaryColor3f): +GLOBL_FN(GL_PREFIX(SecondaryColor3f,SecondaryColor3f@12)) +GL_PREFIX(SecondaryColor3f,SecondaryColor3f@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3fEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3fv)) -GL_PREFIX(SecondaryColor3fv): +GLOBL_FN(GL_PREFIX(SecondaryColor3fv,SecondaryColor3fv@4)) +GL_PREFIX(SecondaryColor3fv,SecondaryColor3fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3fvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3i)) -GL_PREFIX(SecondaryColor3i): +GLOBL_FN(GL_PREFIX(SecondaryColor3i,SecondaryColor3i@12)) +GL_PREFIX(SecondaryColor3i,SecondaryColor3i@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3iEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3iv)) -GL_PREFIX(SecondaryColor3iv): +GLOBL_FN(GL_PREFIX(SecondaryColor3iv,SecondaryColor3iv@4)) +GL_PREFIX(SecondaryColor3iv,SecondaryColor3iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3ivEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3s)) -GL_PREFIX(SecondaryColor3s): +GLOBL_FN(GL_PREFIX(SecondaryColor3s,SecondaryColor3s@12)) +GL_PREFIX(SecondaryColor3s,SecondaryColor3s@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3sEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3sv)) -GL_PREFIX(SecondaryColor3sv): +GLOBL_FN(GL_PREFIX(SecondaryColor3sv,SecondaryColor3sv@4)) +GL_PREFIX(SecondaryColor3sv,SecondaryColor3sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3svEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3ub)) -GL_PREFIX(SecondaryColor3ub): +GLOBL_FN(GL_PREFIX(SecondaryColor3ub,SecondaryColor3ub@12)) +GL_PREFIX(SecondaryColor3ub,SecondaryColor3ub@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3ubEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3ubv)) -GL_PREFIX(SecondaryColor3ubv): +GLOBL_FN(GL_PREFIX(SecondaryColor3ubv,SecondaryColor3ubv@4)) +GL_PREFIX(SecondaryColor3ubv,SecondaryColor3ubv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3ubvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3ui)) -GL_PREFIX(SecondaryColor3ui): +GLOBL_FN(GL_PREFIX(SecondaryColor3ui,SecondaryColor3ui@12)) +GL_PREFIX(SecondaryColor3ui,SecondaryColor3ui@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3uiEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3uiv)) -GL_PREFIX(SecondaryColor3uiv): +GLOBL_FN(GL_PREFIX(SecondaryColor3uiv,SecondaryColor3uiv@4)) +GL_PREFIX(SecondaryColor3uiv,SecondaryColor3uiv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3uivEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3us)) -GL_PREFIX(SecondaryColor3us): +GLOBL_FN(GL_PREFIX(SecondaryColor3us,SecondaryColor3us@12)) +GL_PREFIX(SecondaryColor3us,SecondaryColor3us@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3usEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColor3usv)) -GL_PREFIX(SecondaryColor3usv): +GLOBL_FN(GL_PREFIX(SecondaryColor3usv,SecondaryColor3usv@4)) +GL_PREFIX(SecondaryColor3usv,SecondaryColor3usv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColor3usvEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SecondaryColorPointer)) -GL_PREFIX(SecondaryColorPointer): +GLOBL_FN(GL_PREFIX(SecondaryColorPointer,SecondaryColorPointer@16)) +GL_PREFIX(SecondaryColorPointer,SecondaryColorPointer@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SecondaryColorPointerEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2d)) -GL_PREFIX(WindowPos2d): +GLOBL_FN(GL_PREFIX(WindowPos2d,WindowPos2d@16)) +GL_PREFIX(WindowPos2d,WindowPos2d@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2dMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2dv)) -GL_PREFIX(WindowPos2dv): +GLOBL_FN(GL_PREFIX(WindowPos2dv,WindowPos2dv@4)) +GL_PREFIX(WindowPos2dv,WindowPos2dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2dvMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2f)) -GL_PREFIX(WindowPos2f): +GLOBL_FN(GL_PREFIX(WindowPos2f,WindowPos2f@8)) +GL_PREFIX(WindowPos2f,WindowPos2f@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2fMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2fv)) -GL_PREFIX(WindowPos2fv): +GLOBL_FN(GL_PREFIX(WindowPos2fv,WindowPos2fv@4)) +GL_PREFIX(WindowPos2fv,WindowPos2fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2fvMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2i)) -GL_PREFIX(WindowPos2i): +GLOBL_FN(GL_PREFIX(WindowPos2i,WindowPos2i@8)) +GL_PREFIX(WindowPos2i,WindowPos2i@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2iMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2iv)) -GL_PREFIX(WindowPos2iv): +GLOBL_FN(GL_PREFIX(WindowPos2iv,WindowPos2iv@4)) +GL_PREFIX(WindowPos2iv,WindowPos2iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2ivMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2s)) -GL_PREFIX(WindowPos2s): +GLOBL_FN(GL_PREFIX(WindowPos2s,WindowPos2s@8)) +GL_PREFIX(WindowPos2s,WindowPos2s@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2sMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos2sv)) -GL_PREFIX(WindowPos2sv): +GLOBL_FN(GL_PREFIX(WindowPos2sv,WindowPos2sv@4)) +GL_PREFIX(WindowPos2sv,WindowPos2sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos2svMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3d)) -GL_PREFIX(WindowPos3d): +GLOBL_FN(GL_PREFIX(WindowPos3d,WindowPos3d@24)) +GL_PREFIX(WindowPos3d,WindowPos3d@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3dMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3dv)) -GL_PREFIX(WindowPos3dv): +GLOBL_FN(GL_PREFIX(WindowPos3dv,WindowPos3dv@4)) +GL_PREFIX(WindowPos3dv,WindowPos3dv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3dvMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3f)) -GL_PREFIX(WindowPos3f): +GLOBL_FN(GL_PREFIX(WindowPos3f,WindowPos3f@12)) +GL_PREFIX(WindowPos3f,WindowPos3f@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3fMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3fv)) -GL_PREFIX(WindowPos3fv): +GLOBL_FN(GL_PREFIX(WindowPos3fv,WindowPos3fv@4)) +GL_PREFIX(WindowPos3fv,WindowPos3fv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3fvMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3i)) -GL_PREFIX(WindowPos3i): +GLOBL_FN(GL_PREFIX(WindowPos3i,WindowPos3i@12)) +GL_PREFIX(WindowPos3i,WindowPos3i@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3iMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3iv)) -GL_PREFIX(WindowPos3iv): +GLOBL_FN(GL_PREFIX(WindowPos3iv,WindowPos3iv@4)) +GL_PREFIX(WindowPos3iv,WindowPos3iv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3ivMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3s)) -GL_PREFIX(WindowPos3s): +GLOBL_FN(GL_PREFIX(WindowPos3s,WindowPos3s@12)) +GL_PREFIX(WindowPos3s,WindowPos3s@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3sMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(WindowPos3sv)) -GL_PREFIX(WindowPos3sv): +GLOBL_FN(GL_PREFIX(WindowPos3sv,WindowPos3sv@4)) +GL_PREFIX(WindowPos3sv,WindowPos3sv@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_WindowPos3svMESA)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ActiveStencilFaceEXT)) -GL_PREFIX(ActiveStencilFaceEXT): +GLOBL_FN(GL_PREFIX(ActiveStencilFaceEXT,ActiveStencilFaceEXT@4)) +GL_PREFIX(ActiveStencilFaceEXT,ActiveStencilFaceEXT@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ActiveStencilFaceEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DeleteFencesNV)) -GL_PREFIX(DeleteFencesNV): +GLOBL_FN(GL_PREFIX(DeleteFencesNV,DeleteFencesNV@8)) +GL_PREFIX(DeleteFencesNV,DeleteFencesNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DeleteFencesNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GenFencesNV)) -GL_PREFIX(GenFencesNV): +GLOBL_FN(GL_PREFIX(GenFencesNV,GenFencesNV@8)) +GL_PREFIX(GenFencesNV,GenFencesNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GenFencesNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(IsFenceNV)) -GL_PREFIX(IsFenceNV): +GLOBL_FN(GL_PREFIX(IsFenceNV,IsFenceNV@4)) +GL_PREFIX(IsFenceNV,IsFenceNV@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_IsFenceNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(TestFenceNV)) -GL_PREFIX(TestFenceNV): +GLOBL_FN(GL_PREFIX(TestFenceNV,TestFenceNV@4)) +GL_PREFIX(TestFenceNV,TestFenceNV@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_TestFenceNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetFenceivNV)) -GL_PREFIX(GetFenceivNV): +GLOBL_FN(GL_PREFIX(GetFenceivNV,GetFenceivNV@12)) +GL_PREFIX(GetFenceivNV,GetFenceivNV@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetFenceivNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(FinishFenceNV)) -GL_PREFIX(FinishFenceNV): +GLOBL_FN(GL_PREFIX(FinishFenceNV,FinishFenceNV@4)) +GL_PREFIX(FinishFenceNV,FinishFenceNV@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_FinishFenceNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(SetFenceNV)) -GL_PREFIX(SetFenceNV): +GLOBL_FN(GL_PREFIX(SetFenceNV,SetFenceNV@8)) +GL_PREFIX(SetFenceNV,SetFenceNV@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_SetFenceNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib1sARB)) -GL_PREFIX(VertexAttrib1sARB): +GLOBL_FN(GL_PREFIX(VertexAttrib1sARB,VertexAttrib1sARB@8)) +GL_PREFIX(VertexAttrib1sARB,VertexAttrib1sARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib1sNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib1fARB)) -GL_PREFIX(VertexAttrib1fARB): +GLOBL_FN(GL_PREFIX(VertexAttrib1fARB,VertexAttrib1fARB@8)) +GL_PREFIX(VertexAttrib1fARB,VertexAttrib1fARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib1fNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib1dARB)) -GL_PREFIX(VertexAttrib1dARB): +GLOBL_FN(GL_PREFIX(VertexAttrib1dARB,VertexAttrib1dARB@12)) +GL_PREFIX(VertexAttrib1dARB,VertexAttrib1dARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib1dNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib2sARB)) -GL_PREFIX(VertexAttrib2sARB): +GLOBL_FN(GL_PREFIX(VertexAttrib2sARB,VertexAttrib2sARB@12)) +GL_PREFIX(VertexAttrib2sARB,VertexAttrib2sARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib2sNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib2fARB)) -GL_PREFIX(VertexAttrib2fARB): +GLOBL_FN(GL_PREFIX(VertexAttrib2fARB,VertexAttrib2fARB@12)) +GL_PREFIX(VertexAttrib2fARB,VertexAttrib2fARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib2fNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib2dARB)) -GL_PREFIX(VertexAttrib2dARB): +GLOBL_FN(GL_PREFIX(VertexAttrib2dARB,VertexAttrib2dARB@20)) +GL_PREFIX(VertexAttrib2dARB,VertexAttrib2dARB@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib2dNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib3sARB)) -GL_PREFIX(VertexAttrib3sARB): +GLOBL_FN(GL_PREFIX(VertexAttrib3sARB,VertexAttrib3sARB@16)) +GL_PREFIX(VertexAttrib3sARB,VertexAttrib3sARB@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib3sNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib3fARB)) -GL_PREFIX(VertexAttrib3fARB): +GLOBL_FN(GL_PREFIX(VertexAttrib3fARB,VertexAttrib3fARB@16)) +GL_PREFIX(VertexAttrib3fARB,VertexAttrib3fARB@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib3fNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib3dARB)) -GL_PREFIX(VertexAttrib3dARB): +GLOBL_FN(GL_PREFIX(VertexAttrib3dARB,VertexAttrib3dARB@28)) +GL_PREFIX(VertexAttrib3dARB,VertexAttrib3dARB@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib3dNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4sARB)) -GL_PREFIX(VertexAttrib4sARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4sARB,VertexAttrib4sARB@20)) +GL_PREFIX(VertexAttrib4sARB,VertexAttrib4sARB@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4sNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4fARB)) -GL_PREFIX(VertexAttrib4fARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4fARB,VertexAttrib4fARB@20)) +GL_PREFIX(VertexAttrib4fARB,VertexAttrib4fARB@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4fNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4dARB)) -GL_PREFIX(VertexAttrib4dARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4dARB,VertexAttrib4dARB@36)) +GL_PREFIX(VertexAttrib4dARB,VertexAttrib4dARB@36): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4dNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4NubARB)) -GL_PREFIX(VertexAttrib4NubARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4NubARB,VertexAttrib4NubARB@20)) +GL_PREFIX(VertexAttrib4NubARB,VertexAttrib4NubARB@20): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4ubNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib1svARB)) -GL_PREFIX(VertexAttrib1svARB): +GLOBL_FN(GL_PREFIX(VertexAttrib1svARB,VertexAttrib1svARB@8)) +GL_PREFIX(VertexAttrib1svARB,VertexAttrib1svARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib1svNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib1fvARB)) -GL_PREFIX(VertexAttrib1fvARB): +GLOBL_FN(GL_PREFIX(VertexAttrib1fvARB,VertexAttrib1fvARB@8)) +GL_PREFIX(VertexAttrib1fvARB,VertexAttrib1fvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib1fvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib1dvARB)) -GL_PREFIX(VertexAttrib1dvARB): +GLOBL_FN(GL_PREFIX(VertexAttrib1dvARB,VertexAttrib1dvARB@8)) +GL_PREFIX(VertexAttrib1dvARB,VertexAttrib1dvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib1dvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib2svARB)) -GL_PREFIX(VertexAttrib2svARB): +GLOBL_FN(GL_PREFIX(VertexAttrib2svARB,VertexAttrib2svARB@8)) +GL_PREFIX(VertexAttrib2svARB,VertexAttrib2svARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib2svNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib2fvARB)) -GL_PREFIX(VertexAttrib2fvARB): +GLOBL_FN(GL_PREFIX(VertexAttrib2fvARB,VertexAttrib2fvARB@8)) +GL_PREFIX(VertexAttrib2fvARB,VertexAttrib2fvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib2fvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib2dvARB)) -GL_PREFIX(VertexAttrib2dvARB): +GLOBL_FN(GL_PREFIX(VertexAttrib2dvARB,VertexAttrib2dvARB@8)) +GL_PREFIX(VertexAttrib2dvARB,VertexAttrib2dvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib2dvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib3svARB)) -GL_PREFIX(VertexAttrib3svARB): +GLOBL_FN(GL_PREFIX(VertexAttrib3svARB,VertexAttrib3svARB@8)) +GL_PREFIX(VertexAttrib3svARB,VertexAttrib3svARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib3svNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib3fvARB)) -GL_PREFIX(VertexAttrib3fvARB): +GLOBL_FN(GL_PREFIX(VertexAttrib3fvARB,VertexAttrib3fvARB@8)) +GL_PREFIX(VertexAttrib3fvARB,VertexAttrib3fvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib3fvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib3dvARB)) -GL_PREFIX(VertexAttrib3dvARB): +GLOBL_FN(GL_PREFIX(VertexAttrib3dvARB,VertexAttrib3dvARB@8)) +GL_PREFIX(VertexAttrib3dvARB,VertexAttrib3dvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib3dvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4bvARB)) -GL_PREFIX(VertexAttrib4bvARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4bvARB,VertexAttrib4bvARB@8)) +GL_PREFIX(VertexAttrib4bvARB,VertexAttrib4bvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4bvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4svARB)) -GL_PREFIX(VertexAttrib4svARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4svARB,VertexAttrib4svARB@8)) +GL_PREFIX(VertexAttrib4svARB,VertexAttrib4svARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4svNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4ivARB)) -GL_PREFIX(VertexAttrib4ivARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4ivARB,VertexAttrib4ivARB@8)) +GL_PREFIX(VertexAttrib4ivARB,VertexAttrib4ivARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4ivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4ubvARB)) -GL_PREFIX(VertexAttrib4ubvARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4ubvARB,VertexAttrib4ubvARB@8)) +GL_PREFIX(VertexAttrib4ubvARB,VertexAttrib4ubvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4ubvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4usvARB)) -GL_PREFIX(VertexAttrib4usvARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4usvARB,VertexAttrib4usvARB@8)) +GL_PREFIX(VertexAttrib4usvARB,VertexAttrib4usvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4usvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4uivARB)) -GL_PREFIX(VertexAttrib4uivARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4uivARB,VertexAttrib4uivARB@8)) +GL_PREFIX(VertexAttrib4uivARB,VertexAttrib4uivARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4uivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4fvARB)) -GL_PREFIX(VertexAttrib4fvARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4fvARB,VertexAttrib4fvARB@8)) +GL_PREFIX(VertexAttrib4fvARB,VertexAttrib4fvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4fvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4dvARB)) -GL_PREFIX(VertexAttrib4dvARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4dvARB,VertexAttrib4dvARB@8)) +GL_PREFIX(VertexAttrib4dvARB,VertexAttrib4dvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4dvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4NbvARB)) -GL_PREFIX(VertexAttrib4NbvARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4NbvARB,VertexAttrib4NbvARB@8)) +GL_PREFIX(VertexAttrib4NbvARB,VertexAttrib4NbvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4NbvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4NsvARB)) -GL_PREFIX(VertexAttrib4NsvARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4NsvARB,VertexAttrib4NsvARB@8)) +GL_PREFIX(VertexAttrib4NsvARB,VertexAttrib4NsvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4NsvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4NivARB)) -GL_PREFIX(VertexAttrib4NivARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4NivARB,VertexAttrib4NivARB@8)) +GL_PREFIX(VertexAttrib4NivARB,VertexAttrib4NivARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4NivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4NubvARB)) -GL_PREFIX(VertexAttrib4NubvARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4NubvARB,VertexAttrib4NubvARB@8)) +GL_PREFIX(VertexAttrib4NubvARB,VertexAttrib4NubvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4ubvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4NusvARB)) -GL_PREFIX(VertexAttrib4NusvARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4NusvARB,VertexAttrib4NusvARB@8)) +GL_PREFIX(VertexAttrib4NusvARB,VertexAttrib4NusvARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4NusvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttrib4NuivARB)) -GL_PREFIX(VertexAttrib4NuivARB): +GLOBL_FN(GL_PREFIX(VertexAttrib4NuivARB,VertexAttrib4NuivARB@8)) +GL_PREFIX(VertexAttrib4NuivARB,VertexAttrib4NuivARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttrib4NuivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(VertexAttribPointerARB)) -GL_PREFIX(VertexAttribPointerARB): +GLOBL_FN(GL_PREFIX(VertexAttribPointerARB,VertexAttribPointerARB@24)) +GL_PREFIX(VertexAttribPointerARB,VertexAttribPointerARB@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_VertexAttribPointerARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EnableVertexAttribArrayARB)) -GL_PREFIX(EnableVertexAttribArrayARB): +GLOBL_FN(GL_PREFIX(EnableVertexAttribArrayARB,EnableVertexAttribArrayARB@4)) +GL_PREFIX(EnableVertexAttribArrayARB,EnableVertexAttribArrayARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EnableVertexAttribArrayARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DisableVertexAttribArrayARB)) -GL_PREFIX(DisableVertexAttribArrayARB): +GLOBL_FN(GL_PREFIX(DisableVertexAttribArrayARB,DisableVertexAttribArrayARB@4)) +GL_PREFIX(DisableVertexAttribArrayARB,DisableVertexAttribArrayARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DisableVertexAttribArrayARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramStringARB)) -GL_PREFIX(ProgramStringARB): +GLOBL_FN(GL_PREFIX(ProgramStringARB,ProgramStringARB@16)) +GL_PREFIX(ProgramStringARB,ProgramStringARB@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramStringARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BindProgramARB)) -GL_PREFIX(BindProgramARB): +GLOBL_FN(GL_PREFIX(BindProgramARB,BindProgramARB@8)) +GL_PREFIX(BindProgramARB,BindProgramARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BindProgramNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DeleteProgramsARB)) -GL_PREFIX(DeleteProgramsARB): +GLOBL_FN(GL_PREFIX(DeleteProgramsARB,DeleteProgramsARB@8)) +GL_PREFIX(DeleteProgramsARB,DeleteProgramsARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DeleteProgramsNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GenProgramsARB)) -GL_PREFIX(GenProgramsARB): +GLOBL_FN(GL_PREFIX(GenProgramsARB,GenProgramsARB@8)) +GL_PREFIX(GenProgramsARB,GenProgramsARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GenProgramsNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(IsProgramARB)) -GL_PREFIX(IsProgramARB): +GLOBL_FN(GL_PREFIX(IsProgramARB,IsProgramARB@4)) +GL_PREFIX(IsProgramARB,IsProgramARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_IsProgramNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramEnvParameter4dARB)) -GL_PREFIX(ProgramEnvParameter4dARB): +GLOBL_FN(GL_PREFIX(ProgramEnvParameter4dARB,ProgramEnvParameter4dARB@40)) +GL_PREFIX(ProgramEnvParameter4dARB,ProgramEnvParameter4dARB@40): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramEnvParameter4dARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramEnvParameter4dvARB)) -GL_PREFIX(ProgramEnvParameter4dvARB): +GLOBL_FN(GL_PREFIX(ProgramEnvParameter4dvARB,ProgramEnvParameter4dvARB@12)) +GL_PREFIX(ProgramEnvParameter4dvARB,ProgramEnvParameter4dvARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramEnvParameter4dvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramEnvParameter4fARB)) -GL_PREFIX(ProgramEnvParameter4fARB): +GLOBL_FN(GL_PREFIX(ProgramEnvParameter4fARB,ProgramEnvParameter4fARB@24)) +GL_PREFIX(ProgramEnvParameter4fARB,ProgramEnvParameter4fARB@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramEnvParameter4fARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramEnvParameter4fvARB)) -GL_PREFIX(ProgramEnvParameter4fvARB): +GLOBL_FN(GL_PREFIX(ProgramEnvParameter4fvARB,ProgramEnvParameter4fvARB@12)) +GL_PREFIX(ProgramEnvParameter4fvARB,ProgramEnvParameter4fvARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramEnvParameter4fvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramLocalParameter4dARB)) -GL_PREFIX(ProgramLocalParameter4dARB): +GLOBL_FN(GL_PREFIX(ProgramLocalParameter4dARB,ProgramLocalParameter4dARB@40)) +GL_PREFIX(ProgramLocalParameter4dARB,ProgramLocalParameter4dARB@40): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramLocalParameter4dARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramLocalParameter4dvARB)) -GL_PREFIX(ProgramLocalParameter4dvARB): +GLOBL_FN(GL_PREFIX(ProgramLocalParameter4dvARB,ProgramLocalParameter4dvARB@12)) +GL_PREFIX(ProgramLocalParameter4dvARB,ProgramLocalParameter4dvARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramLocalParameter4dvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramLocalParameter4fARB)) -GL_PREFIX(ProgramLocalParameter4fARB): +GLOBL_FN(GL_PREFIX(ProgramLocalParameter4fARB,ProgramLocalParameter4fARB@24)) +GL_PREFIX(ProgramLocalParameter4fARB,ProgramLocalParameter4fARB@24): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramLocalParameter4fARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramLocalParameter4fvARB)) -GL_PREFIX(ProgramLocalParameter4fvARB): +GLOBL_FN(GL_PREFIX(ProgramLocalParameter4fvARB,ProgramLocalParameter4fvARB@12)) +GL_PREFIX(ProgramLocalParameter4fvARB,ProgramLocalParameter4fvARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramLocalParameter4fvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetProgramEnvParameterdvARB)) -GL_PREFIX(GetProgramEnvParameterdvARB): +GLOBL_FN(GL_PREFIX(GetProgramEnvParameterdvARB,GetProgramEnvParameterdvARB@12)) +GL_PREFIX(GetProgramEnvParameterdvARB,GetProgramEnvParameterdvARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetProgramEnvParameterdvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetProgramEnvParameterfvARB)) -GL_PREFIX(GetProgramEnvParameterfvARB): +GLOBL_FN(GL_PREFIX(GetProgramEnvParameterfvARB,GetProgramEnvParameterfvARB@12)) +GL_PREFIX(GetProgramEnvParameterfvARB,GetProgramEnvParameterfvARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetProgramEnvParameterfvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetProgramLocalParameterdvARB)) -GL_PREFIX(GetProgramLocalParameterdvARB): +GLOBL_FN(GL_PREFIX(GetProgramLocalParameterdvARB,GetProgramLocalParameterdvARB@12)) +GL_PREFIX(GetProgramLocalParameterdvARB,GetProgramLocalParameterdvARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetProgramLocalParameterdvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetProgramLocalParameterfvARB)) -GL_PREFIX(GetProgramLocalParameterfvARB): +GLOBL_FN(GL_PREFIX(GetProgramLocalParameterfvARB,GetProgramLocalParameterfvARB@12)) +GL_PREFIX(GetProgramLocalParameterfvARB,GetProgramLocalParameterfvARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetProgramLocalParameterfvARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetProgramivARB)) -GL_PREFIX(GetProgramivARB): +GLOBL_FN(GL_PREFIX(GetProgramivARB,GetProgramivARB@12)) +GL_PREFIX(GetProgramivARB,GetProgramivARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetProgramivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetProgramStringARB)) -GL_PREFIX(GetProgramStringARB): +GLOBL_FN(GL_PREFIX(GetProgramStringARB,GetProgramStringARB@12)) +GL_PREFIX(GetProgramStringARB,GetProgramStringARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetProgramStringARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetVertexAttribdvARB)) -GL_PREFIX(GetVertexAttribdvARB): +GLOBL_FN(GL_PREFIX(GetVertexAttribdvARB,GetVertexAttribdvARB@12)) +GL_PREFIX(GetVertexAttribdvARB,GetVertexAttribdvARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetVertexAttribdvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetVertexAttribfvARB)) -GL_PREFIX(GetVertexAttribfvARB): +GLOBL_FN(GL_PREFIX(GetVertexAttribfvARB,GetVertexAttribfvARB@12)) +GL_PREFIX(GetVertexAttribfvARB,GetVertexAttribfvARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetVertexAttribfvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetVertexAttribivARB)) -GL_PREFIX(GetVertexAttribivARB): +GLOBL_FN(GL_PREFIX(GetVertexAttribivARB,GetVertexAttribivARB@12)) +GL_PREFIX(GetVertexAttribivARB,GetVertexAttribivARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetVertexAttribivNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetVertexAttribPointervARB)) -GL_PREFIX(GetVertexAttribPointervARB): +GLOBL_FN(GL_PREFIX(GetVertexAttribPointervARB,GetVertexAttribPointervARB@12)) +GL_PREFIX(GetVertexAttribPointervARB,GetVertexAttribPointervARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetVertexAttribPointervNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramNamedParameter4fNV)) -GL_PREFIX(ProgramNamedParameter4fNV): +GLOBL_FN(GL_PREFIX(ProgramNamedParameter4fNV,ProgramNamedParameter4fNV@28)) +GL_PREFIX(ProgramNamedParameter4fNV,ProgramNamedParameter4fNV@28): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramNamedParameter4fNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramNamedParameter4dNV)) -GL_PREFIX(ProgramNamedParameter4dNV): +GLOBL_FN(GL_PREFIX(ProgramNamedParameter4dNV,ProgramNamedParameter4dNV@44)) +GL_PREFIX(ProgramNamedParameter4dNV,ProgramNamedParameter4dNV@44): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramNamedParameter4dNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramNamedParameter4fvNV)) -GL_PREFIX(ProgramNamedParameter4fvNV): +GLOBL_FN(GL_PREFIX(ProgramNamedParameter4fvNV,ProgramNamedParameter4fvNV@16)) +GL_PREFIX(ProgramNamedParameter4fvNV,ProgramNamedParameter4fvNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramNamedParameter4fvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(ProgramNamedParameter4dvNV)) -GL_PREFIX(ProgramNamedParameter4dvNV): +GLOBL_FN(GL_PREFIX(ProgramNamedParameter4dvNV,ProgramNamedParameter4dvNV@16)) +GL_PREFIX(ProgramNamedParameter4dvNV,ProgramNamedParameter4dvNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_ProgramNamedParameter4dvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetProgramNamedParameterfvNV)) -GL_PREFIX(GetProgramNamedParameterfvNV): +GLOBL_FN(GL_PREFIX(GetProgramNamedParameterfvNV,GetProgramNamedParameterfvNV@16)) +GL_PREFIX(GetProgramNamedParameterfvNV,GetProgramNamedParameterfvNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetProgramNamedParameterfvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetProgramNamedParameterdvNV)) -GL_PREFIX(GetProgramNamedParameterdvNV): +GLOBL_FN(GL_PREFIX(GetProgramNamedParameterdvNV,GetProgramNamedParameterdvNV@16)) +GL_PREFIX(GetProgramNamedParameterdvNV,GetProgramNamedParameterdvNV@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetProgramNamedParameterdvNV)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BindBufferARB)) -GL_PREFIX(BindBufferARB): +GLOBL_FN(GL_PREFIX(BindBufferARB,BindBufferARB@8)) +GL_PREFIX(BindBufferARB,BindBufferARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BindBufferARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BufferDataARB)) -GL_PREFIX(BufferDataARB): +GLOBL_FN(GL_PREFIX(BufferDataARB,BufferDataARB@16)) +GL_PREFIX(BufferDataARB,BufferDataARB@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BufferDataARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BufferSubDataARB)) -GL_PREFIX(BufferSubDataARB): +GLOBL_FN(GL_PREFIX(BufferSubDataARB,BufferSubDataARB@16)) +GL_PREFIX(BufferSubDataARB,BufferSubDataARB@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BufferSubDataARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DeleteBuffersARB)) -GL_PREFIX(DeleteBuffersARB): +GLOBL_FN(GL_PREFIX(DeleteBuffersARB,DeleteBuffersARB@8)) +GL_PREFIX(DeleteBuffersARB,DeleteBuffersARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DeleteBuffersARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GenBuffersARB)) -GL_PREFIX(GenBuffersARB): +GLOBL_FN(GL_PREFIX(GenBuffersARB,GenBuffersARB@8)) +GL_PREFIX(GenBuffersARB,GenBuffersARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GenBuffersARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetBufferParameterivARB)) -GL_PREFIX(GetBufferParameterivARB): +GLOBL_FN(GL_PREFIX(GetBufferParameterivARB,GetBufferParameterivARB@12)) +GL_PREFIX(GetBufferParameterivARB,GetBufferParameterivARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetBufferParameterivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetBufferPointervARB)) -GL_PREFIX(GetBufferPointervARB): +GLOBL_FN(GL_PREFIX(GetBufferPointervARB,GetBufferPointervARB@12)) +GL_PREFIX(GetBufferPointervARB,GetBufferPointervARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetBufferPointervARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetBufferSubDataARB)) -GL_PREFIX(GetBufferSubDataARB): +GLOBL_FN(GL_PREFIX(GetBufferSubDataARB,GetBufferSubDataARB@16)) +GL_PREFIX(GetBufferSubDataARB,GetBufferSubDataARB@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetBufferSubDataARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(IsBufferARB)) -GL_PREFIX(IsBufferARB): +GLOBL_FN(GL_PREFIX(IsBufferARB,IsBufferARB@4)) +GL_PREFIX(IsBufferARB,IsBufferARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_IsBufferARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(MapBufferARB)) -GL_PREFIX(MapBufferARB): +GLOBL_FN(GL_PREFIX(MapBufferARB,MapBufferARB@8)) +GL_PREFIX(MapBufferARB,MapBufferARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_MapBufferARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(UnmapBufferARB)) -GL_PREFIX(UnmapBufferARB): +GLOBL_FN(GL_PREFIX(UnmapBufferARB,UnmapBufferARB@4)) +GL_PREFIX(UnmapBufferARB,UnmapBufferARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_UnmapBufferARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DepthBoundsEXT)) -GL_PREFIX(DepthBoundsEXT): +GLOBL_FN(GL_PREFIX(DepthBoundsEXT,DepthBoundsEXT@16)) +GL_PREFIX(DepthBoundsEXT,DepthBoundsEXT@16): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DepthBoundsEXT)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GenQueriesARB)) -GL_PREFIX(GenQueriesARB): +GLOBL_FN(GL_PREFIX(GenQueriesARB,GenQueriesARB@8)) +GL_PREFIX(GenQueriesARB,GenQueriesARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GenQueriesARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(DeleteQueriesARB)) -GL_PREFIX(DeleteQueriesARB): +GLOBL_FN(GL_PREFIX(DeleteQueriesARB,DeleteQueriesARB@8)) +GL_PREFIX(DeleteQueriesARB,DeleteQueriesARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_DeleteQueriesARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(IsQueryARB)) -GL_PREFIX(IsQueryARB): +GLOBL_FN(GL_PREFIX(IsQueryARB,IsQueryARB@4)) +GL_PREFIX(IsQueryARB,IsQueryARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_IsQueryARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(BeginQueryARB)) -GL_PREFIX(BeginQueryARB): +GLOBL_FN(GL_PREFIX(BeginQueryARB,BeginQueryARB@8)) +GL_PREFIX(BeginQueryARB,BeginQueryARB@8): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_BeginQueryARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(EndQueryARB)) -GL_PREFIX(EndQueryARB): +GLOBL_FN(GL_PREFIX(EndQueryARB,EndQueryARB@4)) +GL_PREFIX(EndQueryARB,EndQueryARB@4): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_EndQueryARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetQueryivARB)) -GL_PREFIX(GetQueryivARB): +GLOBL_FN(GL_PREFIX(GetQueryivARB,GetQueryivARB@12)) +GL_PREFIX(GetQueryivARB,GetQueryivARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetQueryivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetQueryObjectivARB)) -GL_PREFIX(GetQueryObjectivARB): +GLOBL_FN(GL_PREFIX(GetQueryObjectivARB,GetQueryObjectivARB@12)) +GL_PREFIX(GetQueryObjectivARB,GetQueryObjectivARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetQueryObjectivARB)) ALIGNTEXT16 -GLOBL_FN(GL_PREFIX(GetQueryObjectuivARB)) -GL_PREFIX(GetQueryObjectuivARB): +GLOBL_FN(GL_PREFIX(GetQueryObjectuivARB,GetQueryObjectuivARB@12)) +GL_PREFIX(GetQueryObjectuivARB,GetQueryObjectuivARB@12): MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX) JMP(GL_OFFSET(_gloffset_GetQueryObjectuivARB)) diff --git a/src/mesa/x86/sse.c b/src/mesa/x86/sse.c index 8e995c80c3f..e2b48626c4a 100644 --- a/src/mesa/x86/sse.c +++ b/src/mesa/x86/sse.c @@ -1,4 +1,4 @@ -/* $Id: sse.c,v 1.3 2002/04/09 14:58:03 keithw Exp $ */ +/* $Id: sse.c,v 1.3.14.1 2003/11/21 15:49:46 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -48,13 +48,13 @@ DECLARE_XFORM_GROUP( sse, 3 ) #if 1 /* Some functions are not written in SSE-assembly, because the fpu ones are faster */ -extern void _mesa_sse_transform_normals_no_rot( NORM_ARGS ); -extern void _mesa_sse_transform_rescale_normals( NORM_ARGS ); -extern void _mesa_sse_transform_rescale_normals_no_rot( NORM_ARGS ); +extern void _ASMAPI _mesa_sse_transform_normals_no_rot( NORM_ARGS ); +extern void _ASMAPI _mesa_sse_transform_rescale_normals( NORM_ARGS ); +extern void _ASMAPI _mesa_sse_transform_rescale_normals_no_rot( NORM_ARGS ); -extern void _mesa_sse_transform_points4_general( XFORM_ARGS ); -extern void _mesa_sse_transform_points4_3d( XFORM_ARGS ); -extern void _mesa_sse_transform_points4_identity( XFORM_ARGS ); +extern void _ASMAPI _mesa_sse_transform_points4_general( XFORM_ARGS ); +extern void _ASMAPI _mesa_sse_transform_points4_3d( XFORM_ARGS ); +extern void _ASMAPI _mesa_sse_transform_points4_identity( XFORM_ARGS ); #else DECLARE_NORM_GROUP( sse ) #endif |