[OPENGL32][MESA] Downgrade Mesa library to version 2.6
authorJérôme Gardou <jerome.gardou@reactos.org>
Mon, 10 Dec 2018 17:04:20 +0000 (18:04 +0100)
committerJérôme Gardou <zefklop@users.noreply.github.com>
Sat, 19 Jan 2019 13:23:54 +0000 (14:23 +0100)
With this commit, we now use a forked version of MESA which only supports OpenGL 1.1, like the windows implementation does.
It exposes :
  - The same pixel formats
  - The same set of extensions
  - Nothing more
All of this without taking 10% of your build time.
If you need a more modern option, look at the MESA package from Rapps, which is (and must be) maintained outside of this code tree.
CORE-7499

448 files changed:
dll/opengl/mesa/CMakeLists.txt
dll/opengl/mesa/accum.c [new file with mode: 0644]
dll/opengl/mesa/accum.h [new file with mode: 0644]
dll/opengl/mesa/all.h [new file with mode: 0644]
dll/opengl/mesa/alpha.c [new file with mode: 0644]
dll/opengl/mesa/alpha.h [new file with mode: 0644]
dll/opengl/mesa/alphabuf.c [new file with mode: 0644]
dll/opengl/mesa/alphabuf.h [new file with mode: 0644]
dll/opengl/mesa/api.c [new file with mode: 0644]
dll/opengl/mesa/api.h [new file with mode: 0644]
dll/opengl/mesa/asm-386.S [new file with mode: 0644]
dll/opengl/mesa/asm-386.h [new file with mode: 0644]
dll/opengl/mesa/attrib.c [new file with mode: 0644]
dll/opengl/mesa/attrib.h [new file with mode: 0644]
dll/opengl/mesa/bitmap.c [new file with mode: 0644]
dll/opengl/mesa/bitmap.h [new file with mode: 0644]
dll/opengl/mesa/blend.c [new file with mode: 0644]
dll/opengl/mesa/blend.h [new file with mode: 0644]
dll/opengl/mesa/clip.c [new file with mode: 0644]
dll/opengl/mesa/clip.h [new file with mode: 0644]
dll/opengl/mesa/colortab.c [new file with mode: 0644]
dll/opengl/mesa/colortab.h [new file with mode: 0644]
dll/opengl/mesa/config.h [new file with mode: 0644]
dll/opengl/mesa/context.c [new file with mode: 0644]
dll/opengl/mesa/context.h [new file with mode: 0644]
dll/opengl/mesa/copypix.c [new file with mode: 0644]
dll/opengl/mesa/copypix.h [new file with mode: 0644]
dll/opengl/mesa/dd.h [new file with mode: 0644]
dll/opengl/mesa/depth.c [new file with mode: 0644]
dll/opengl/mesa/depth.h [new file with mode: 0644]
dll/opengl/mesa/dlist.c [new file with mode: 0644]
dll/opengl/mesa/dlist.h [new file with mode: 0644]
dll/opengl/mesa/drawpix.c [new file with mode: 0644]
dll/opengl/mesa/drawpix.h [new file with mode: 0644]
dll/opengl/mesa/drivers/common/CMakeLists.txt [deleted file]
dll/opengl/mesa/drivers/common/driverfuncs.c [deleted file]
dll/opengl/mesa/drivers/common/driverfuncs.h [deleted file]
dll/opengl/mesa/drivers/common/meta.c [deleted file]
dll/opengl/mesa/drivers/common/meta.h [deleted file]
dll/opengl/mesa/enable.c [new file with mode: 0644]
dll/opengl/mesa/enable.h [new file with mode: 0644]
dll/opengl/mesa/eval.c [new file with mode: 0644]
dll/opengl/mesa/eval.h [new file with mode: 0644]
dll/opengl/mesa/feedback.c [new file with mode: 0644]
dll/opengl/mesa/feedback.h [new file with mode: 0644]
dll/opengl/mesa/fixed.h [new file with mode: 0644]
dll/opengl/mesa/fog.c [new file with mode: 0644]
dll/opengl/mesa/fog.h [new file with mode: 0644]
dll/opengl/mesa/get.c [new file with mode: 0644]
dll/opengl/mesa/get.h [new file with mode: 0644]
dll/opengl/mesa/hash.c [new file with mode: 0644]
dll/opengl/mesa/hash.h [new file with mode: 0644]
dll/opengl/mesa/image.c [new file with mode: 0644]
dll/opengl/mesa/image.h [new file with mode: 0644]
dll/opengl/mesa/light.c [new file with mode: 0644]
dll/opengl/mesa/light.h [new file with mode: 0644]
dll/opengl/mesa/lines.c [new file with mode: 0644]
dll/opengl/mesa/lines.h [new file with mode: 0644]
dll/opengl/mesa/linetemp.h [new file with mode: 0644]
dll/opengl/mesa/logic.c [new file with mode: 0644]
dll/opengl/mesa/logic.h [new file with mode: 0644]
dll/opengl/mesa/macros.h [new file with mode: 0644]
dll/opengl/mesa/main/CMakeLists.txt [deleted file]
dll/opengl/mesa/main/accum.c [deleted file]
dll/opengl/mesa/main/accum.h [deleted file]
dll/opengl/mesa/main/api_arrayelt.c [deleted file]
dll/opengl/mesa/main/api_arrayelt.h [deleted file]
dll/opengl/mesa/main/api_exec.c [deleted file]
dll/opengl/mesa/main/api_exec.h [deleted file]
dll/opengl/mesa/main/api_loopback.c [deleted file]
dll/opengl/mesa/main/api_loopback.h [deleted file]
dll/opengl/mesa/main/api_validate.c [deleted file]
dll/opengl/mesa/main/api_validate.h [deleted file]
dll/opengl/mesa/main/attrib.c [deleted file]
dll/opengl/mesa/main/attrib.h [deleted file]
dll/opengl/mesa/main/bitset.h [deleted file]
dll/opengl/mesa/main/blend.c [deleted file]
dll/opengl/mesa/main/blend.h [deleted file]
dll/opengl/mesa/main/bufferobj.c [deleted file]
dll/opengl/mesa/main/bufferobj.h [deleted file]
dll/opengl/mesa/main/buffers.c [deleted file]
dll/opengl/mesa/main/buffers.h [deleted file]
dll/opengl/mesa/main/clear.c [deleted file]
dll/opengl/mesa/main/clear.h [deleted file]
dll/opengl/mesa/main/clip.c [deleted file]
dll/opengl/mesa/main/clip.h [deleted file]
dll/opengl/mesa/main/colormac.h [deleted file]
dll/opengl/mesa/main/compiler.h [deleted file]
dll/opengl/mesa/main/config.h [deleted file]
dll/opengl/mesa/main/context.c [deleted file]
dll/opengl/mesa/main/context.h [deleted file]
dll/opengl/mesa/main/core.h [deleted file]
dll/opengl/mesa/main/cpuinfo.c [deleted file]
dll/opengl/mesa/main/cpuinfo.h [deleted file]
dll/opengl/mesa/main/dd.h [deleted file]
dll/opengl/mesa/main/depth.c [deleted file]
dll/opengl/mesa/main/depth.h [deleted file]
dll/opengl/mesa/main/dispatch.h [deleted file]
dll/opengl/mesa/main/dlist.c [deleted file]
dll/opengl/mesa/main/dlist.h [deleted file]
dll/opengl/mesa/main/dlopen.c [deleted file]
dll/opengl/mesa/main/dlopen.h [deleted file]
dll/opengl/mesa/main/drawpix.c [deleted file]
dll/opengl/mesa/main/drawpix.h [deleted file]
dll/opengl/mesa/main/enable.c [deleted file]
dll/opengl/mesa/main/enable.h [deleted file]
dll/opengl/mesa/main/enums.c [deleted file]
dll/opengl/mesa/main/enums.h [deleted file]
dll/opengl/mesa/main/eval.c [deleted file]
dll/opengl/mesa/main/eval.h [deleted file]
dll/opengl/mesa/main/execmem.c [deleted file]
dll/opengl/mesa/main/extensions.c [deleted file]
dll/opengl/mesa/main/extensions.h [deleted file]
dll/opengl/mesa/main/feedback.c [deleted file]
dll/opengl/mesa/main/feedback.h [deleted file]
dll/opengl/mesa/main/fog.c [deleted file]
dll/opengl/mesa/main/fog.h [deleted file]
dll/opengl/mesa/main/format_pack.c [deleted file]
dll/opengl/mesa/main/format_pack.h [deleted file]
dll/opengl/mesa/main/format_unpack.c [deleted file]
dll/opengl/mesa/main/format_unpack.h [deleted file]
dll/opengl/mesa/main/formats.c [deleted file]
dll/opengl/mesa/main/formats.h [deleted file]
dll/opengl/mesa/main/framebuffer.c [deleted file]
dll/opengl/mesa/main/framebuffer.h [deleted file]
dll/opengl/mesa/main/get.c [deleted file]
dll/opengl/mesa/main/get.h [deleted file]
dll/opengl/mesa/main/getstring.c [deleted file]
dll/opengl/mesa/main/git_sha1.h [deleted file]
dll/opengl/mesa/main/glheader.h [deleted file]
dll/opengl/mesa/main/hash.c [deleted file]
dll/opengl/mesa/main/hash.h [deleted file]
dll/opengl/mesa/main/hint.c [deleted file]
dll/opengl/mesa/main/hint.h [deleted file]
dll/opengl/mesa/main/image.c [deleted file]
dll/opengl/mesa/main/image.h [deleted file]
dll/opengl/mesa/main/imports.c [deleted file]
dll/opengl/mesa/main/imports.h [deleted file]
dll/opengl/mesa/main/light.c [deleted file]
dll/opengl/mesa/main/light.h [deleted file]
dll/opengl/mesa/main/lines.c [deleted file]
dll/opengl/mesa/main/lines.h [deleted file]
dll/opengl/mesa/main/macros.h [deleted file]
dll/opengl/mesa/main/matrix.c [deleted file]
dll/opengl/mesa/main/matrix.h [deleted file]
dll/opengl/mesa/main/mfeatures.h [deleted file]
dll/opengl/mesa/main/mm.c [deleted file]
dll/opengl/mesa/main/mm.h [deleted file]
dll/opengl/mesa/main/mtypes.h [deleted file]
dll/opengl/mesa/main/multisample.c [deleted file]
dll/opengl/mesa/main/multisample.h [deleted file]
dll/opengl/mesa/main/pack.c [deleted file]
dll/opengl/mesa/main/pack.h [deleted file]
dll/opengl/mesa/main/pack_tmp.h [deleted file]
dll/opengl/mesa/main/pixel.c [deleted file]
dll/opengl/mesa/main/pixel.h [deleted file]
dll/opengl/mesa/main/pixelstore.c [deleted file]
dll/opengl/mesa/main/pixelstore.h [deleted file]
dll/opengl/mesa/main/pixeltransfer.c [deleted file]
dll/opengl/mesa/main/pixeltransfer.h [deleted file]
dll/opengl/mesa/main/points.c [deleted file]
dll/opengl/mesa/main/points.h [deleted file]
dll/opengl/mesa/main/polygon.c [deleted file]
dll/opengl/mesa/main/polygon.h [deleted file]
dll/opengl/mesa/main/precomp.h [deleted file]
dll/opengl/mesa/main/rastpos.c [deleted file]
dll/opengl/mesa/main/rastpos.h [deleted file]
dll/opengl/mesa/main/readpix.c [deleted file]
dll/opengl/mesa/main/readpix.h [deleted file]
dll/opengl/mesa/main/renderbuffer.c [deleted file]
dll/opengl/mesa/main/renderbuffer.h [deleted file]
dll/opengl/mesa/main/scissor.c [deleted file]
dll/opengl/mesa/main/scissor.h [deleted file]
dll/opengl/mesa/main/shared.c [deleted file]
dll/opengl/mesa/main/shared.h [deleted file]
dll/opengl/mesa/main/simple_list.h [deleted file]
dll/opengl/mesa/main/state.c [deleted file]
dll/opengl/mesa/main/state.h [deleted file]
dll/opengl/mesa/main/stencil.c [deleted file]
dll/opengl/mesa/main/stencil.h [deleted file]
dll/opengl/mesa/main/texenv.c [deleted file]
dll/opengl/mesa/main/texenv.h [deleted file]
dll/opengl/mesa/main/texformat.c [deleted file]
dll/opengl/mesa/main/texformat.h [deleted file]
dll/opengl/mesa/main/texgen.c [deleted file]
dll/opengl/mesa/main/texgen.h [deleted file]
dll/opengl/mesa/main/texgetimage.c [deleted file]
dll/opengl/mesa/main/texgetimage.h [deleted file]
dll/opengl/mesa/main/teximage.c [deleted file]
dll/opengl/mesa/main/teximage.h [deleted file]
dll/opengl/mesa/main/texobj.c [deleted file]
dll/opengl/mesa/main/texobj.h [deleted file]
dll/opengl/mesa/main/texpal.c [deleted file]
dll/opengl/mesa/main/texpal.h [deleted file]
dll/opengl/mesa/main/texparam.c [deleted file]
dll/opengl/mesa/main/texparam.h [deleted file]
dll/opengl/mesa/main/texstate.c [deleted file]
dll/opengl/mesa/main/texstate.h [deleted file]
dll/opengl/mesa/main/texstorage.c [deleted file]
dll/opengl/mesa/main/texstorage.h [deleted file]
dll/opengl/mesa/main/texstore.c [deleted file]
dll/opengl/mesa/main/texstore.h [deleted file]
dll/opengl/mesa/main/varray.c [deleted file]
dll/opengl/mesa/main/varray.h [deleted file]
dll/opengl/mesa/main/version.c [deleted file]
dll/opengl/mesa/main/version.h [deleted file]
dll/opengl/mesa/main/viewport.c [deleted file]
dll/opengl/mesa/main/viewport.h [deleted file]
dll/opengl/mesa/main/vsnprintf.c [deleted file]
dll/opengl/mesa/main/vtxfmt.c [deleted file]
dll/opengl/mesa/main/vtxfmt.h [deleted file]
dll/opengl/mesa/masking.c [new file with mode: 0644]
dll/opengl/mesa/masking.h [new file with mode: 0644]
dll/opengl/mesa/math/CMakeLists.txt [deleted file]
dll/opengl/mesa/math/m_clip_tmp.h [deleted file]
dll/opengl/mesa/math/m_copy_tmp.h [deleted file]
dll/opengl/mesa/math/m_debug.h [deleted file]
dll/opengl/mesa/math/m_debug_clip.c [deleted file]
dll/opengl/mesa/math/m_debug_norm.c [deleted file]
dll/opengl/mesa/math/m_debug_util.h [deleted file]
dll/opengl/mesa/math/m_debug_xform.c [deleted file]
dll/opengl/mesa/math/m_dotprod_tmp.h [deleted file]
dll/opengl/mesa/math/m_eval.c [deleted file]
dll/opengl/mesa/math/m_eval.h [deleted file]
dll/opengl/mesa/math/m_matrix.c [deleted file]
dll/opengl/mesa/math/m_matrix.h [deleted file]
dll/opengl/mesa/math/m_norm_tmp.h [deleted file]
dll/opengl/mesa/math/m_trans_tmp.h [deleted file]
dll/opengl/mesa/math/m_translate.c [deleted file]
dll/opengl/mesa/math/m_translate.h [deleted file]
dll/opengl/mesa/math/m_vector.c [deleted file]
dll/opengl/mesa/math/m_vector.h [deleted file]
dll/opengl/mesa/math/m_xform.c [deleted file]
dll/opengl/mesa/math/m_xform.h [deleted file]
dll/opengl/mesa/math/m_xform_tmp.h [deleted file]
dll/opengl/mesa/math/precomp.h [deleted file]
dll/opengl/mesa/matrix.c [new file with mode: 0644]
dll/opengl/mesa/matrix.h [new file with mode: 0644]
dll/opengl/mesa/misc.c [new file with mode: 0644]
dll/opengl/mesa/misc.h [new file with mode: 0644]
dll/opengl/mesa/mmath.c [new file with mode: 0644]
dll/opengl/mesa/mmath.h [new file with mode: 0644]
dll/opengl/mesa/pb.c [new file with mode: 0644]
dll/opengl/mesa/pb.h [new file with mode: 0644]
dll/opengl/mesa/pixel.c [new file with mode: 0644]
dll/opengl/mesa/pixel.h [new file with mode: 0644]
dll/opengl/mesa/pointers.c [new file with mode: 0644]
dll/opengl/mesa/pointers.h [new file with mode: 0644]
dll/opengl/mesa/points.c [new file with mode: 0644]
dll/opengl/mesa/points.h [new file with mode: 0644]
dll/opengl/mesa/polygon.c [new file with mode: 0644]
dll/opengl/mesa/polygon.h [new file with mode: 0644]
dll/opengl/mesa/quads.c [new file with mode: 0644]
dll/opengl/mesa/quads.h [new file with mode: 0644]
dll/opengl/mesa/rastpos.c [new file with mode: 0644]
dll/opengl/mesa/rastpos.h [new file with mode: 0644]
dll/opengl/mesa/readpix.c [new file with mode: 0644]
dll/opengl/mesa/readpix.h [new file with mode: 0644]
dll/opengl/mesa/rect.c [new file with mode: 0644]
dll/opengl/mesa/rect.h [new file with mode: 0644]
dll/opengl/mesa/scissor.c [new file with mode: 0644]
dll/opengl/mesa/scissor.h [new file with mode: 0644]
dll/opengl/mesa/shade.c [new file with mode: 0644]
dll/opengl/mesa/shade.h [new file with mode: 0644]
dll/opengl/mesa/span.c [new file with mode: 0644]
dll/opengl/mesa/span.h [new file with mode: 0644]
dll/opengl/mesa/stencil.c [new file with mode: 0644]
dll/opengl/mesa/stencil.h [new file with mode: 0644]
dll/opengl/mesa/swrast/CMakeLists.txt [deleted file]
dll/opengl/mesa/swrast/precomp.h [deleted file]
dll/opengl/mesa/swrast/s_aaline.c [deleted file]
dll/opengl/mesa/swrast/s_aaline.h [deleted file]
dll/opengl/mesa/swrast/s_aalinetemp.h [deleted file]
dll/opengl/mesa/swrast/s_aatriangle.c [deleted file]
dll/opengl/mesa/swrast/s_aatriangle.h [deleted file]
dll/opengl/mesa/swrast/s_aatritemp.h [deleted file]
dll/opengl/mesa/swrast/s_alpha.c [deleted file]
dll/opengl/mesa/swrast/s_alpha.h [deleted file]
dll/opengl/mesa/swrast/s_bitmap.c [deleted file]
dll/opengl/mesa/swrast/s_blend.c [deleted file]
dll/opengl/mesa/swrast/s_blend.h [deleted file]
dll/opengl/mesa/swrast/s_chan.h [deleted file]
dll/opengl/mesa/swrast/s_clear.c [deleted file]
dll/opengl/mesa/swrast/s_context.c [deleted file]
dll/opengl/mesa/swrast/s_context.h [deleted file]
dll/opengl/mesa/swrast/s_copypix.c [deleted file]
dll/opengl/mesa/swrast/s_depth.c [deleted file]
dll/opengl/mesa/swrast/s_depth.h [deleted file]
dll/opengl/mesa/swrast/s_drawpix.c [deleted file]
dll/opengl/mesa/swrast/s_feedback.c [deleted file]
dll/opengl/mesa/swrast/s_feedback.h [deleted file]
dll/opengl/mesa/swrast/s_fog.c [deleted file]
dll/opengl/mesa/swrast/s_fog.h [deleted file]
dll/opengl/mesa/swrast/s_lines.c [deleted file]
dll/opengl/mesa/swrast/s_lines.h [deleted file]
dll/opengl/mesa/swrast/s_linetemp.h [deleted file]
dll/opengl/mesa/swrast/s_logic.c [deleted file]
dll/opengl/mesa/swrast/s_logic.h [deleted file]
dll/opengl/mesa/swrast/s_masking.c [deleted file]
dll/opengl/mesa/swrast/s_masking.h [deleted file]
dll/opengl/mesa/swrast/s_points.c [deleted file]
dll/opengl/mesa/swrast/s_points.h [deleted file]
dll/opengl/mesa/swrast/s_renderbuffer.c [deleted file]
dll/opengl/mesa/swrast/s_renderbuffer.h [deleted file]
dll/opengl/mesa/swrast/s_span.c [deleted file]
dll/opengl/mesa/swrast/s_span.h [deleted file]
dll/opengl/mesa/swrast/s_stencil.c [deleted file]
dll/opengl/mesa/swrast/s_stencil.h [deleted file]
dll/opengl/mesa/swrast/s_texcombine.c [deleted file]
dll/opengl/mesa/swrast/s_texcombine.h [deleted file]
dll/opengl/mesa/swrast/s_texfetch.c [deleted file]
dll/opengl/mesa/swrast/s_texfetch.h [deleted file]
dll/opengl/mesa/swrast/s_texfetch_tmp.h [deleted file]
dll/opengl/mesa/swrast/s_texfilter.c [deleted file]
dll/opengl/mesa/swrast/s_texfilter.h [deleted file]
dll/opengl/mesa/swrast/s_texture.c [deleted file]
dll/opengl/mesa/swrast/s_triangle.c [deleted file]
dll/opengl/mesa/swrast/s_triangle.h [deleted file]
dll/opengl/mesa/swrast/s_tritemp.h [deleted file]
dll/opengl/mesa/swrast/s_zoom.c [deleted file]
dll/opengl/mesa/swrast/s_zoom.h [deleted file]
dll/opengl/mesa/swrast/swrast.h [deleted file]
dll/opengl/mesa/swrast_setup/CMakeLists.txt [deleted file]
dll/opengl/mesa/swrast_setup/ss_context.c [deleted file]
dll/opengl/mesa/swrast_setup/ss_context.h [deleted file]
dll/opengl/mesa/swrast_setup/ss_triangle.c [deleted file]
dll/opengl/mesa/swrast_setup/ss_triangle.h [deleted file]
dll/opengl/mesa/swrast_setup/ss_tritmp.h [deleted file]
dll/opengl/mesa/swrast_setup/ss_vb.h [deleted file]
dll/opengl/mesa/swrast_setup/swrast_setup.h [deleted file]
dll/opengl/mesa/teximage.c [new file with mode: 0644]
dll/opengl/mesa/teximage.h [new file with mode: 0644]
dll/opengl/mesa/texobj.c [new file with mode: 0644]
dll/opengl/mesa/texobj.h [new file with mode: 0644]
dll/opengl/mesa/texstate.c [new file with mode: 0644]
dll/opengl/mesa/texstate.h [new file with mode: 0644]
dll/opengl/mesa/texture.c [new file with mode: 0644]
dll/opengl/mesa/texture.h [new file with mode: 0644]
dll/opengl/mesa/tnl/CMakeLists.txt [deleted file]
dll/opengl/mesa/tnl/precomp.h [deleted file]
dll/opengl/mesa/tnl/t_context.c [deleted file]
dll/opengl/mesa/tnl/t_context.h [deleted file]
dll/opengl/mesa/tnl/t_draw.c [deleted file]
dll/opengl/mesa/tnl/t_pipeline.c [deleted file]
dll/opengl/mesa/tnl/t_pipeline.h [deleted file]
dll/opengl/mesa/tnl/t_rasterpos.c [deleted file]
dll/opengl/mesa/tnl/t_vb_cliptmp.h [deleted file]
dll/opengl/mesa/tnl/t_vb_fog.c [deleted file]
dll/opengl/mesa/tnl/t_vb_light.c [deleted file]
dll/opengl/mesa/tnl/t_vb_lighttmp.h [deleted file]
dll/opengl/mesa/tnl/t_vb_normals.c [deleted file]
dll/opengl/mesa/tnl/t_vb_points.c [deleted file]
dll/opengl/mesa/tnl/t_vb_render.c [deleted file]
dll/opengl/mesa/tnl/t_vb_rendertmp.h [deleted file]
dll/opengl/mesa/tnl/t_vb_texgen.c [deleted file]
dll/opengl/mesa/tnl/t_vb_texmat.c [deleted file]
dll/opengl/mesa/tnl/t_vb_vertex.c [deleted file]
dll/opengl/mesa/tnl/t_vertex.c [deleted file]
dll/opengl/mesa/tnl/t_vertex.h [deleted file]
dll/opengl/mesa/tnl/t_vertex_generic.c [deleted file]
dll/opengl/mesa/tnl/t_vertex_sse.c [deleted file]
dll/opengl/mesa/tnl/tnl.h [deleted file]
dll/opengl/mesa/triangle.c [new file with mode: 0644]
dll/opengl/mesa/triangle.h [new file with mode: 0644]
dll/opengl/mesa/tritemp.h [new file with mode: 0644]
dll/opengl/mesa/types.h [new file with mode: 0644]
dll/opengl/mesa/varray.c [new file with mode: 0644]
dll/opengl/mesa/varray.h [new file with mode: 0644]
dll/opengl/mesa/vb.c [new file with mode: 0644]
dll/opengl/mesa/vb.h [new file with mode: 0644]
dll/opengl/mesa/vbfill.c [new file with mode: 0644]
dll/opengl/mesa/vbfill.h [new file with mode: 0644]
dll/opengl/mesa/vbo/CMakeLists.txt [deleted file]
dll/opengl/mesa/vbo/precomp.h [deleted file]
dll/opengl/mesa/vbo/vbo.h [deleted file]
dll/opengl/mesa/vbo/vbo_attrib.h [deleted file]
dll/opengl/mesa/vbo/vbo_attrib_tmp.h [deleted file]
dll/opengl/mesa/vbo/vbo_context.c [deleted file]
dll/opengl/mesa/vbo/vbo_context.h [deleted file]
dll/opengl/mesa/vbo/vbo_exec.c [deleted file]
dll/opengl/mesa/vbo/vbo_exec.h [deleted file]
dll/opengl/mesa/vbo/vbo_exec_api.c [deleted file]
dll/opengl/mesa/vbo/vbo_exec_array.c [deleted file]
dll/opengl/mesa/vbo/vbo_exec_draw.c [deleted file]
dll/opengl/mesa/vbo/vbo_exec_eval.c [deleted file]
dll/opengl/mesa/vbo/vbo_noop.c [deleted file]
dll/opengl/mesa/vbo/vbo_noop.h [deleted file]
dll/opengl/mesa/vbo/vbo_rebase.c [deleted file]
dll/opengl/mesa/vbo/vbo_save.c [deleted file]
dll/opengl/mesa/vbo/vbo_save.h [deleted file]
dll/opengl/mesa/vbo/vbo_save_api.c [deleted file]
dll/opengl/mesa/vbo/vbo_save_draw.c [deleted file]
dll/opengl/mesa/vbo/vbo_save_loopback.c [deleted file]
dll/opengl/mesa/vbo/vbo_split.c [deleted file]
dll/opengl/mesa/vbo/vbo_split.h [deleted file]
dll/opengl/mesa/vbo/vbo_split_copy.c [deleted file]
dll/opengl/mesa/vbo/vbo_split_inplace.c [deleted file]
dll/opengl/mesa/vbrender.c [new file with mode: 0644]
dll/opengl/mesa/vbrender.h [new file with mode: 0644]
dll/opengl/mesa/vbxform.c [new file with mode: 0644]
dll/opengl/mesa/vbxform.h [new file with mode: 0644]
dll/opengl/mesa/x86-64/calling_convention.txt [deleted file]
dll/opengl/mesa/x86-64/x86-64.c [deleted file]
dll/opengl/mesa/x86-64/x86-64.h [deleted file]
dll/opengl/mesa/x86-64/xform4.S [deleted file]
dll/opengl/mesa/x86/3dnow.c [deleted file]
dll/opengl/mesa/x86/3dnow.h [deleted file]
dll/opengl/mesa/x86/3dnow_normal.S [deleted file]
dll/opengl/mesa/x86/3dnow_xform1.S [deleted file]
dll/opengl/mesa/x86/3dnow_xform2.S [deleted file]
dll/opengl/mesa/x86/3dnow_xform3.S [deleted file]
dll/opengl/mesa/x86/3dnow_xform4.S [deleted file]
dll/opengl/mesa/x86/CMakeLists.txt [deleted file]
dll/opengl/mesa/x86/assyntax.h [deleted file]
dll/opengl/mesa/x86/clip_args.h [deleted file]
dll/opengl/mesa/x86/common_x86.c [deleted file]
dll/opengl/mesa/x86/common_x86_asm.S [deleted file]
dll/opengl/mesa/x86/common_x86_asm.h [deleted file]
dll/opengl/mesa/x86/common_x86_features.h [deleted file]
dll/opengl/mesa/x86/gen_matypes.c [deleted file]
dll/opengl/mesa/x86/matypes.h [deleted file]
dll/opengl/mesa/x86/mmx.h [deleted file]
dll/opengl/mesa/x86/mmx_blend.S [deleted file]
dll/opengl/mesa/x86/mmx_blendtmp.h [deleted file]
dll/opengl/mesa/x86/norm_args.h [deleted file]
dll/opengl/mesa/x86/read_rgba_span_x86.S [deleted file]
dll/opengl/mesa/x86/read_rgba_span_x86.h [deleted file]
dll/opengl/mesa/x86/rtasm/x86sse.c [deleted file]
dll/opengl/mesa/x86/rtasm/x86sse.h [deleted file]
dll/opengl/mesa/x86/sse.c [deleted file]
dll/opengl/mesa/x86/sse.h [deleted file]
dll/opengl/mesa/x86/sse_normal.S [deleted file]
dll/opengl/mesa/x86/sse_xform1.S [deleted file]
dll/opengl/mesa/x86/sse_xform2.S [deleted file]
dll/opengl/mesa/x86/sse_xform3.S [deleted file]
dll/opengl/mesa/x86/sse_xform4.S [deleted file]
dll/opengl/mesa/x86/x86_cliptest.S [deleted file]
dll/opengl/mesa/x86/x86_xform.c [deleted file]
dll/opengl/mesa/x86/x86_xform.h [deleted file]
dll/opengl/mesa/x86/x86_xform2.S [deleted file]
dll/opengl/mesa/x86/x86_xform3.S [deleted file]
dll/opengl/mesa/x86/x86_xform4.S [deleted file]
dll/opengl/mesa/x86/xform_args.h [deleted file]
dll/opengl/mesa/xform.c [new file with mode: 0644]
dll/opengl/mesa/xform.h [new file with mode: 0644]
dll/opengl/opengl32/CMakeLists.txt
dll/opengl/opengl32/glfuncs.h
dll/opengl/opengl32/swimpl.c

index 004d505..20f8d31 100644 (file)
@@ -1,36 +1,71 @@
 
 include_directories(.)
 
-# our DBG definitions conflict with mesa source code
-remove_definitions(-DDBG=1 -DDBG=0)
+add_definitions(-DFAST_MATH -DTHREADS)
 
-add_definitions(
-    -DWIN32
-    -D_WINDOWS
-    -D_DLL
-    -DFEATURE_GL=1
-    -D_GDI32_           # prevent gl* being declared __declspec(dllimport) in MS headers
-    -DBUILD_GL32        # declare gl* as __declspec(dllexport) in Mesa headers
-    -D_GLAPI_NO_EXPORTS # prevent _glapi_* from being declared __declspec(dllimport)
-)
-
-if(OPENGL32_USE_TLS)
-    add_definitions(-DOPENGL32_USE_TLS)
+if(ARCH STREQUAL "i386")
+    list(APPEND ASM_SOURCE asm-386.S)
+    add_definitions(-DUSE_ASM)
 endif()
 
-if((ARCH STREQUAL "i386") AND (NOT MSVC))
-    add_definitions(
-        -DUSE_X86_ASM
-        -DUSE_MMX_ASM
-        -DUSE_3DNOW_ASM
-        -DUSE_SSE_ASM)
-    add_subdirectory(x86)
-endif()
+add_asm_files(mesa_asm ${ASM_SOURCE})
+
+list(APPEND SOURCE
+    accum.c
+    alpha.c
+    alphabuf.c
+    api.c
+    attrib.c
+    bitmap.c
+    blend.c
+    clip.c
+    colortab.c
+    context.c
+    copypix.c
+    depth.c
+    dlist.c
+    drawpix.c
+    enable.c
+    eval.c
+    feedback.c
+    fog.c
+    get.c
+    hash.c
+    image.c
+    light.c
+    lines.c
+    logic.c
+    masking.c
+    matrix.c
+    misc.c
+    mmath.c
+    pb.c
+    pixel.c
+    pointers.c
+    points.c
+    polygon.c
+    quads.c
+    rastpos.c
+    readpix.c
+    rect.c
+    scissor.c
+    shade.c
+    span.c
+    stencil.c
+    teximage.c
+    texobj.c
+    texstate.c
+    texture.c
+    triangle.c
+    varray.c
+    vb.c
+    vbfill.c
+    vbrender.c
+    vbxform.c
+    xform.c
+)
+
+add_library(mesa STATIC ${SOURCE} ${mesa_asm})
+add_dependencies(mesa psdk)
 
-add_subdirectory(drivers/common)
-add_subdirectory(main)
-add_subdirectory(math)
-add_subdirectory(swrast)
-add_subdirectory(swrast_setup)
-add_subdirectory(tnl)
-add_subdirectory(vbo)
+    
diff --git a/dll/opengl/mesa/accum.c b/dll/opengl/mesa/accum.c
new file mode 100644 (file)
index 0000000..1d24902
--- /dev/null
@@ -0,0 +1,373 @@
+/* $Id: accum.c,v 1.5 1997/07/24 01:24:28 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.4
+ * Copyright (C) 1995-1997  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: accum.c,v $
+ * Revision 1.5  1997/07/24 01:24:28  brianp
+ * changed precompiled header symbol from PCH to PC_HEADER
+ *
+ * Revision 1.4  1997/05/28 03:23:09  brianp
+ * added precompiled header (PCH) support
+ *
+ * Revision 1.3  1997/04/30 01:54:48  brianp
+ * call gl_warning() if calling gl_Accum w/out accum buffer
+ *
+ * Revision 1.2  1996/09/15 14:19:44  brianp
+ * now use GLframebuffer and GLvisual
+ * added gl_alloc_accum_buffer()
+ *
+ * Revision 1.1  1996/09/13 01:38:16  brianp
+ * Initial revision
+ *
+ */
+
+
+#ifdef PC_HEADER
+#include "all.h"
+#else
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include "accum.h"
+#include "context.h"
+#include "dlist.h"
+#include "macros.h"
+#include "types.h"
+#endif
+
+
+void gl_alloc_accum_buffer( GLcontext *ctx )
+{
+   GLint n;
+
+   if (ctx->Buffer->Accum) {
+      free( ctx->Buffer->Accum );
+      ctx->Buffer->Accum = NULL;
+   }
+
+   /* allocate accumulation buffer if not already present */
+   n = ctx->Buffer->Width * ctx->Buffer->Height * 4 * sizeof(GLaccum);
+   ctx->Buffer->Accum = (GLaccum *) malloc( n );
+   if (!ctx->Buffer->Accum) {
+      /* unable to setup accumulation buffer */
+      gl_error( ctx, GL_OUT_OF_MEMORY, "glAccum" );
+   }
+}
+
+
+
+void gl_ClearAccum( GLcontext *ctx,
+                    GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha )
+{
+   if (INSIDE_BEGIN_END(ctx)) {
+      gl_error( ctx, GL_INVALID_OPERATION, "glAccum" );
+      return;
+   }
+   ctx->Accum.ClearColor[0] = CLAMP( red, -1.0, 1.0 );
+   ctx->Accum.ClearColor[1] = CLAMP( green, -1.0, 1.0 );
+   ctx->Accum.ClearColor[2] = CLAMP( blue, -1.0, 1.0 );
+   ctx->Accum.ClearColor[3] = CLAMP( alpha, -1.0, 1.0 );
+}
+
+
+
+
+void gl_Accum( GLcontext *ctx, GLenum op, GLfloat value )
+{
+   GLuint xpos, ypos, width, height;
+   GLfloat acc_scale;
+
+   if (INSIDE_BEGIN_END(ctx)) {
+      gl_error( ctx, GL_INVALID_OPERATION, "glAccum" );
+      return;
+   }
+
+   if (ctx->Visual->AccumBits==0 || !ctx->Buffer->Accum) {
+      /* No accumulation buffer! */
+      gl_warning(ctx, "Calling glAccum() without an accumulation buffer");
+      return;
+   }
+
+   if (sizeof(GLaccum)==1) {
+      acc_scale = 127.0;
+   }
+   else if (sizeof(GLaccum)==2) {
+      acc_scale = 32767.0;
+   }
+   else {
+      /* sizeof(GLaccum) > 2 (Cray) */
+      acc_scale = (float) SHRT_MAX;
+   }
+
+   /* Determine region to operate upon. */
+   if (ctx->Scissor.Enabled) {
+      xpos = ctx->Scissor.X;
+      ypos = ctx->Scissor.Y;
+      width = ctx->Scissor.Width;
+      height = ctx->Scissor.Height;
+   }
+   else {
+      /* whole window */
+      xpos = 0;
+      ypos = 0;
+      width = ctx->Buffer->Width;
+      height = ctx->Buffer->Height;
+   }
+
+   switch (op) {
+      case GL_ADD:
+         {
+           GLaccum ival, *acc;
+           GLuint i, j;
+
+           ival = (GLaccum) (value * acc_scale);
+           for (j=0;j<height;j++) {
+              acc = ctx->Buffer->Accum
+                     + (ypos * ctx->Buffer->Width + xpos) * 4;
+              for (i=0;i<width;i++) {
+                 *acc += ival;   acc++;   /* red */
+                 *acc += ival;   acc++;   /* green */
+                 *acc += ival;   acc++;   /* blue */
+                 *acc += ival;   acc++;   /* alpha */
+              }
+              ypos++;
+           }
+        }
+        break;
+      case GL_MULT:
+        {
+           GLaccum *acc;
+           GLuint i, j;
+
+           for (j=0;j<height;j++) {
+              acc = ctx->Buffer->Accum
+                     + (ypos * ctx->Buffer->Width + xpos) * 4;
+              for (i=0;i<width;i++) {
+                 *acc = (GLaccum) ( (GLfloat) *acc * value );    acc++; /*r*/
+                 *acc = (GLaccum) ( (GLfloat) *acc * value );    acc++; /*g*/
+                 *acc = (GLaccum) ( (GLfloat) *acc * value );    acc++; /*g*/
+                 *acc = (GLaccum) ( (GLfloat) *acc * value );    acc++; /*a*/
+              }
+              ypos++;
+           }
+        }
+        break;
+      case GL_ACCUM:
+        {
+           GLaccum *acc;
+           GLubyte red[MAX_WIDTH], green[MAX_WIDTH];
+           GLubyte blue[MAX_WIDTH], alpha[MAX_WIDTH];
+           GLfloat rscale, gscale, bscale, ascale;
+           GLuint i, j;
+
+           (void) (*ctx->Driver.SetBuffer)( ctx, ctx->Pixel.ReadBuffer );
+
+           /* Accumulate */
+           rscale = value * acc_scale * ctx->Visual->InvRedScale;
+           gscale = value * acc_scale * ctx->Visual->InvGreenScale;
+           bscale = value * acc_scale * ctx->Visual->InvBlueScale;
+           ascale = value * acc_scale * ctx->Visual->InvAlphaScale;
+           for (j=0;j<height;j++) {
+              (*ctx->Driver.ReadColorSpan)( ctx, width, xpos, ypos,
+                                             red, green, blue, alpha);
+              acc = ctx->Buffer->Accum
+                     + (ypos * ctx->Buffer->Width + xpos) * 4;
+              for (i=0;i<width;i++) {
+                 *acc += (GLaccum) ( (GLfloat) red[i]   * rscale );  acc++;
+                 *acc += (GLaccum) ( (GLfloat) green[i] * gscale );  acc++;
+                 *acc += (GLaccum) ( (GLfloat) blue[i]  * bscale );  acc++;
+                 *acc += (GLaccum) ( (GLfloat) alpha[i] * ascale );  acc++;
+              }
+              ypos++;
+           }
+
+           (void) (*ctx->Driver.SetBuffer)( ctx, ctx->Color.DrawBuffer );
+        }
+        break;
+      case GL_LOAD:
+        {
+           GLaccum *acc;
+           GLubyte red[MAX_WIDTH], green[MAX_WIDTH];
+           GLubyte blue[MAX_WIDTH], alpha[MAX_WIDTH];
+           GLfloat rscale, gscale, bscale, ascale;
+           GLuint i, j;
+
+           (void) (*ctx->Driver.SetBuffer)( ctx, ctx->Pixel.ReadBuffer );
+
+           /* Load accumulation buffer */
+           rscale = value * acc_scale * ctx->Visual->InvRedScale;
+           gscale = value * acc_scale * ctx->Visual->InvGreenScale;
+           bscale = value * acc_scale * ctx->Visual->InvBlueScale;
+           ascale = value * acc_scale * ctx->Visual->InvAlphaScale;
+           for (j=0;j<height;j++) {
+              (*ctx->Driver.ReadColorSpan)( ctx, width, xpos, ypos,
+                                             red, green, blue, alpha);
+              acc = ctx->Buffer->Accum
+                     + (ypos * ctx->Buffer->Width + xpos) * 4;
+              for (i=0;i<width;i++) {
+                 *acc++ = (GLaccum) ( (GLfloat) red[i]   * rscale );
+                 *acc++ = (GLaccum) ( (GLfloat) green[i] * gscale );
+                 *acc++ = (GLaccum) ( (GLfloat) blue[i]  * bscale );
+                 *acc++ = (GLaccum) ( (GLfloat) alpha[i] * ascale );
+              }
+              ypos++;
+           }
+
+           (void) (*ctx->Driver.SetBuffer)( ctx, ctx->Color.DrawBuffer );
+        }
+        break;
+      case GL_RETURN:
+        {
+           GLubyte red[MAX_WIDTH], green[MAX_WIDTH];
+           GLubyte blue[MAX_WIDTH], alpha[MAX_WIDTH];
+           GLaccum *acc;
+           GLfloat rscale, gscale, bscale, ascale;
+           GLint rmax, gmax, bmax, amax;
+           GLuint i, j;
+
+           rscale = value / acc_scale * ctx->Visual->RedScale;
+           gscale = value / acc_scale * ctx->Visual->GreenScale;
+           bscale = value / acc_scale * ctx->Visual->BlueScale;
+           ascale = value / acc_scale * ctx->Visual->AlphaScale;
+           rmax = (GLint) ctx->Visual->RedScale;
+           gmax = (GLint) ctx->Visual->GreenScale;
+           bmax = (GLint) ctx->Visual->BlueScale;
+           amax = (GLint) ctx->Visual->AlphaScale;
+           for (j=0;j<height;j++) {
+              acc = ctx->Buffer->Accum
+                     + (ypos * ctx->Buffer->Width + xpos) * 4;
+              for (i=0;i<width;i++) {
+                 GLint r, g, b, a;
+                 r = (GLint) ( (GLfloat) (*acc++) * rscale + 0.5F );
+                 g = (GLint) ( (GLfloat) (*acc++) * gscale + 0.5F );
+                 b = (GLint) ( (GLfloat) (*acc++) * bscale + 0.5F );
+                 a = (GLint) ( (GLfloat) (*acc++) * ascale + 0.5F );
+                 red[i]   = CLAMP( r, 0, rmax );
+                 green[i] = CLAMP( g, 0, gmax );
+                 blue[i]  = CLAMP( b, 0, bmax );
+                 alpha[i] = CLAMP( a, 0, amax );
+              }
+              (*ctx->Driver.WriteColorSpan)( ctx, width, xpos, ypos,
+                                              red, green, blue, alpha, NULL );
+              ypos++;
+           }
+        }
+        break;
+      default:
+         gl_error( ctx, GL_INVALID_ENUM, "glAccum" );
+   }
+}
+
+
+
+
+/*
+ * Clear the accumulation Buffer->
+ */
+void gl_clear_accum_buffer( GLcontext *ctx )
+{
+   GLuint buffersize;
+   GLfloat acc_scale;
+
+   if (ctx->Visual->AccumBits==0) {
+      /* No accumulation buffer! */
+      return;
+   }
+
+   if (sizeof(GLaccum)==1) {
+      acc_scale = 127.0;
+   }
+   else if (sizeof(GLaccum)==2) {
+      acc_scale = 32767.0;
+   }
+   else {
+      /* sizeof(GLaccum) > 2 (Cray) */
+      acc_scale = (float) SHRT_MAX;
+   }
+
+   /* number of pixels */
+   buffersize = ctx->Buffer->Width * ctx->Buffer->Height;
+
+   if (!ctx->Buffer->Accum) {
+      /* try to alloc accumulation buffer */
+      ctx->Buffer->Accum = (GLaccum *)
+                          malloc( buffersize * 4 * sizeof(GLaccum) );
+   }
+
+   if (ctx->Buffer->Accum) {
+      if (ctx->Scissor.Enabled) {
+        /* Limit clear to scissor box */
+        GLaccum r, g, b, a;
+        GLint i, j;
+         GLint width, height;
+         GLaccum *row;
+        r = (GLaccum) (ctx->Accum.ClearColor[0] * acc_scale);
+        g = (GLaccum) (ctx->Accum.ClearColor[1] * acc_scale);
+        b = (GLaccum) (ctx->Accum.ClearColor[2] * acc_scale);
+        a = (GLaccum) (ctx->Accum.ClearColor[3] * acc_scale);
+         /* size of region to clear */
+         width = 4 * (ctx->Buffer->Xmax - ctx->Buffer->Xmin + 1);
+         height = ctx->Buffer->Ymax - ctx->Buffer->Ymin + 1;
+         /* ptr to first element to clear */
+         row = ctx->Buffer->Accum
+               + 4 * (ctx->Buffer->Ymin * ctx->Buffer->Width
+                      + ctx->Buffer->Xmin);
+         for (j=0;j<height;j++) {
+            for (i=0;i<width;i+=4) {
+               row[i+0] = r;
+               row[i+1] = g;
+               row[i+2] = b;
+               row[i+3] = a;
+           }
+            row += 4 * ctx->Buffer->Width;
+        }
+      }
+      else {
+        /* clear whole buffer */
+        if (ctx->Accum.ClearColor[0]==0.0 &&
+            ctx->Accum.ClearColor[1]==0.0 &&
+            ctx->Accum.ClearColor[2]==0.0 &&
+            ctx->Accum.ClearColor[3]==0.0) {
+           /* Black */
+           MEMSET( ctx->Buffer->Accum, 0, buffersize * 4 * sizeof(GLaccum) );
+        }
+        else {
+           /* Not black */
+           GLaccum *acc, r, g, b, a;
+           GLuint i;
+
+           acc = ctx->Buffer->Accum;
+           r = (GLaccum) (ctx->Accum.ClearColor[0] * acc_scale);
+           g = (GLaccum) (ctx->Accum.ClearColor[1] * acc_scale);
+           b = (GLaccum) (ctx->Accum.ClearColor[2] * acc_scale);
+           a = (GLaccum) (ctx->Accum.ClearColor[3] * acc_scale);
+           for (i=0;i<buffersize;i++) {
+              *acc++ = r;
+              *acc++ = g;
+              *acc++ = b;
+              *acc++ = a;
+           }
+        }
+      }
+   }
+}
diff --git a/dll/opengl/mesa/accum.h b/dll/opengl/mesa/accum.h
new file mode 100644 (file)
index 0000000..76a603b
--- /dev/null
@@ -0,0 +1,55 @@
+/* $Id: accum.h,v 1.2 1996/09/15 14:19:57 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.0
+ * Copyright (C) 1995-1996  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: accum.h,v $
+ * Revision 1.2  1996/09/15 14:19:57  brianp
+ * added gl_alloc_accum_buffer()
+ *
+ * Revision 1.1  1996/09/13 01:38:16  brianp
+ * Initial revision
+ *
+ */
+
+
+#ifndef ACCUM_H
+#define ACCUM_H
+
+
+#include "types.h"
+
+
+extern void gl_alloc_accum_buffer( GLcontext *ctx );
+
+
+extern void gl_Accum( GLcontext* ctx, GLenum op, GLfloat value );
+
+
+extern void gl_ClearAccum( GLcontext* ctx, GLfloat red, GLfloat green,
+                           GLfloat blue, GLfloat alpha );
+
+
+extern void gl_clear_accum_buffer( GLcontext* ctx );
+
+
+#endif
diff --git a/dll/opengl/mesa/all.h b/dll/opengl/mesa/all.h
new file mode 100644 (file)
index 0000000..8040d3e
--- /dev/null
@@ -0,0 +1,136 @@
+/* $Id: all.h,v 1.6 1997/12/15 03:40:05 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.6
+ * Copyright (C) 1995-1997  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: all.h,v $
+ * Revision 1.6  1997/12/15 03:40:05  brianp
+ * added asm-386.h file
+ *
+ * Revision 1.5  1997/11/20 00:23:21  brianp
+ * added rect.h
+ *
+ * Revision 1.4  1997/09/27 00:16:04  brianp
+ * added colortab.h
+ *
+ * Revision 1.3  1997/08/22 01:42:48  brianp
+ * added api.h and hash.h
+ *
+ * Revision 1.2  1997/05/28 03:22:27  brianp
+ * added a few more headers
+ *
+ * Revision 1.1  1997/04/02 03:49:26  brianp
+ * Initial revision
+ *
+ */
+
+
+/* The purpose of this file is to collect all the header files that Mesa
+ * uses into a single header so that we can get new compilers that support
+ * pre-compiled headers to compile much faster.
+ * All we do is list all the internal headers used by Mesa in this one
+ * main header file, and most compilers will pre-compile all these headers
+ * and use them over and over again for each source module. This makes a
+ * big difference for Win32 support, because the <windows.h> headers take
+ * a *long* time to compile.
+ */
+
+
+#ifndef SRC_ALL_H
+#define SRC_ALL_H
+
+
+#ifndef PC_HEADER
+  This is an error.  all.h should be included only if PC_HEADER is defined.
+#endif
+
+
+#include <assert.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <float.h>
+#include <math.h>
+#include "GL/gl.h"
+#include "GL/osmesa.h"
+#include "accum.h"
+#include "alpha.h"
+#include "alphabuf.h"
+#include "api.h"
+#include "asm-386.h"
+#include "attrib.h"
+#include "bitmap.h"
+#include "blend.h"
+#include "clip.h"
+#include "colortab.h"
+#include "context.h"
+#include "config.h"
+#include "copypix.h"
+#include "dd.h"
+#include "depth.h"
+#include "dlist.h"
+#include "drawpix.h"
+#include "enable.h"
+#include "eval.h"
+#include "feedback.h"
+#include "fixed.h"
+#include "fog.h"
+#include "get.h"
+#include "hash.h"
+#include "image.h"
+#include "light.h"
+#include "lines.h"
+#include "logic.h"
+#include "macros.h"
+#include "masking.h"
+#include "matrix.h"
+#include "misc.h"
+#include "mmath.h"
+#include "pb.h"
+#include "pixel.h"
+#include "pointers.h"
+#include "points.h"
+#include "polygon.h"
+#include "rastpos.h"
+#include "readpix.h"
+#include "rect.h"
+#include "scissor.h"
+#include "shade.h"
+#include "span.h"
+#include "stencil.h"
+#include "teximage.h"
+#include "texobj.h"
+#include "texstate.h"
+#include "texture.h"
+#include "triangle.h"
+#include "types.h"
+#include "varray.h"
+#include "vb.h"
+#include "vbfill.h"
+#include "vbrender.h"
+#include "vbxform.h"
+#include "winpos.h"
+#include "xform.h"
+
+
+#endif /*SRC_ALL_H*/
diff --git a/dll/opengl/mesa/alpha.c b/dll/opengl/mesa/alpha.c
new file mode 100644 (file)
index 0000000..c99a6d4
--- /dev/null
@@ -0,0 +1,142 @@
+/* $Id: alpha.c,v 1.5 1997/07/24 01:24:28 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.4
+ * Copyright (C) 1995-1997  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: alpha.c,v $
+ * Revision 1.5  1997/07/24 01:24:28  brianp
+ * changed precompiled header symbol from PCH to PC_HEADER
+ *
+ * Revision 1.4  1997/05/28 03:23:09  brianp
+ * added precompiled header (PCH) support
+ *
+ * Revision 1.3  1997/03/13 03:07:53  brianp
+ * optimized gl_alpha_test() by removing conditional from inside loops
+ *
+ * Revision 1.2  1996/09/15 14:15:54  brianp
+ * now use GLframebuffer and GLvisual
+ *
+ * Revision 1.1  1996/09/13 01:38:16  brianp
+ * Initial revision
+ *
+ */
+
+
+#ifdef PC_HEADER
+#include "all.h"
+#else
+#include "alpha.h"
+#include "context.h"
+#include "types.h"
+#include "dlist.h"
+#include "macros.h"
+#endif
+
+
+
+void gl_AlphaFunc( GLcontext* ctx, GLenum func, GLclampf ref )
+{
+   if (INSIDE_BEGIN_END(ctx)) {
+      gl_error( ctx, GL_INVALID_OPERATION, "glAlphaFunc" );
+      return;
+   }
+   switch (func) {
+      case GL_NEVER:
+      case GL_LESS:
+      case GL_EQUAL:
+      case GL_LEQUAL:
+      case GL_GREATER:
+      case GL_NOTEQUAL:
+      case GL_GEQUAL:
+      case GL_ALWAYS:
+         ctx->Color.AlphaFunc = func;
+         ctx->Color.AlphaRef = CLAMP( ref, 0.0F, 1.0F );
+         ctx->Color.AlphaRefUbyte = (GLubyte) (ctx->Color.AlphaRef
+                                              * ctx->Visual->AlphaScale);
+         break;
+      default:
+         gl_error( ctx, GL_INVALID_ENUM, "glAlphaFunc(func)" );
+         break;
+   }
+}
+
+
+
+
+/*
+ * Apply the alpha test to a span of pixels.
+ * In/Out:  mask - current pixel mask.  Pixels which fail the alpha test
+ *                 will set the corresponding mask flag to 0.
+ * Return:  0 = all pixels in the span failed the alpha test.
+ *          1 = one or more pixels passed the alpha test.
+ */
+GLint gl_alpha_test( GLcontext* ctx,
+                     GLuint n, const GLubyte alpha[], GLubyte mask[] )
+{
+   GLuint i;
+   GLubyte ref = ctx->Color.AlphaRefUbyte;
+
+   /* switch cases ordered from most frequent to less frequent */
+   switch (ctx->Color.AlphaFunc) {
+      case GL_LESS:
+         for (i=0;i<n;i++) {
+           mask[i] &= (alpha[i] < ref);
+        }
+        return 1;
+      case GL_LEQUAL:
+         for (i=0;i<n;i++) {
+           mask[i] &= (alpha[i] <= ref);
+        }
+        return 1;
+      case GL_GEQUAL:
+         for (i=0;i<n;i++) {
+           mask[i] &= (alpha[i] >= ref);
+        }
+        return 1;
+      case GL_GREATER:
+         for (i=0;i<n;i++) {
+           mask[i] &= (alpha[i] > ref);
+        }
+        return 1;
+      case GL_NOTEQUAL:
+         for (i=0;i<n;i++) {
+           mask[i] &= (alpha[i] != ref);
+        }
+        return 1;
+      case GL_EQUAL:
+         for (i=0;i<n;i++) {
+           mask[i] &= (alpha[i] == ref);
+        }
+        return 1;
+      case GL_ALWAYS:
+        /* do nothing */
+        return 1;
+      case GL_NEVER:
+         /* caller should check for zero! */
+        return 0;
+      default:
+        gl_problem( ctx, "Invalid alpha test in gl_alpha_test" );
+         return 0;
+   }
+   /* Never get here */
+   return 1;
+}
diff --git a/dll/opengl/mesa/alpha.h b/dll/opengl/mesa/alpha.h
new file mode 100644 (file)
index 0000000..4e0a55a
--- /dev/null
@@ -0,0 +1,46 @@
+/* $Id: alpha.h,v 1.1 1996/09/13 01:38:16 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.0
+ * Copyright (C) 1995-1996  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: alpha.h,v $
+ * Revision 1.1  1996/09/13 01:38:16  brianp
+ * Initial revision
+ *
+ */
+
+
+#ifndef ALPHA_H
+#define ALPHA_H
+
+
+#include "types.h"
+
+
+extern GLint gl_alpha_test( GLcontext* ctx,
+                            GLuint n, const GLubyte alpha[], GLubyte mask[] );
+
+
+extern void gl_AlphaFunc( GLcontext* ctx, GLenum func, GLclampf ref );
+
+
+#endif
diff --git a/dll/opengl/mesa/alphabuf.c b/dll/opengl/mesa/alphabuf.c
new file mode 100644 (file)
index 0000000..786f187
--- /dev/null
@@ -0,0 +1,271 @@
+/* $Id: alphabuf.c,v 1.5 1997/07/24 01:24:28 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.4
+ * Copyright (C) 1995-1997  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: alphabuf.c,v $
+ * Revision 1.5  1997/07/24 01:24:28  brianp
+ * changed precompiled header symbol from PCH to PC_HEADER
+ *
+ * Revision 1.4  1997/05/28 03:23:09  brianp
+ * added precompiled header (PCH) support
+ *
+ * Revision 1.3  1996/10/02 02:51:07  brianp
+ * in gl_clear_alpha_buffers() check for GL_FRONT_AND_BACK draw mode
+ *
+ * Revision 1.2  1996/09/15 14:15:54  brianp
+ * now use GLframebuffer and GLvisual
+ *
+ * Revision 1.1  1996/09/13 01:38:16  brianp
+ * Initial revision
+ *
+ */
+
+
+
+/*
+ * Software alpha planes.  Many frame buffers don't have alpha bits so
+ * we simulate them in software.
+ */
+
+
+#ifdef PC_HEADER
+#include "all.h"
+#else
+#include <stdlib.h>
+#include <string.h>
+#include "alphabuf.h"
+#include "context.h"
+#include "macros.h"
+#include "types.h"
+#endif
+
+
+
+#define ALPHA_ADDR(X,Y)  (ctx->Buffer->Alpha + (Y) * ctx->Buffer->Width + (X))
+
+
+
+/*
+ * Allocate a new front and back alpha buffer.
+ */
+void gl_alloc_alpha_buffers( GLcontext* ctx )
+{
+   GLint bytes = ctx->Buffer->Width * ctx->Buffer->Height * sizeof(GLubyte);
+
+   if (ctx->Visual->FrontAlphaEnabled) {
+      if (ctx->Buffer->FrontAlpha) {
+         free( ctx->Buffer->FrontAlpha );
+      }
+      ctx->Buffer->FrontAlpha = (GLubyte *) malloc( bytes );
+      if (!ctx->Buffer->FrontAlpha) {
+         /* out of memory */
+         gl_error( ctx, GL_OUT_OF_MEMORY, "Couldn't allocate front alpha buffer" );
+      }
+   }
+   if (ctx->Visual->BackAlphaEnabled) {
+      if (ctx->Buffer->BackAlpha) {
+         free( ctx->Buffer->BackAlpha );
+      }
+      ctx->Buffer->BackAlpha = (GLubyte *) malloc( bytes );
+      if (!ctx->Buffer->BackAlpha) {
+         /* out of memory */
+         gl_error( ctx, GL_OUT_OF_MEMORY, "Couldn't allocate back alpha buffer" );
+      }
+   }
+   if (ctx->Color.DrawBuffer==GL_FRONT) {
+      ctx->Buffer->Alpha = ctx->Buffer->FrontAlpha;
+   }
+   if (ctx->Color.DrawBuffer==GL_BACK) {
+      ctx->Buffer->Alpha = ctx->Buffer->BackAlpha;
+   }
+}
+
+
+
+/*
+ * Clear the front and/or back alpha planes.
+ */
+void gl_clear_alpha_buffers( GLcontext* ctx )
+{
+   GLint buffer;
+
+   /* Loop over front and back buffers */
+   for (buffer=0;buffer<2;buffer++) {
+
+      /* Get pointer to front or back buffer */
+      GLubyte *abuffer = NULL;
+      if (buffer==0
+          && (   ctx->Color.DrawBuffer==GL_FRONT
+              || ctx->Color.DrawBuffer==GL_FRONT_AND_BACK)
+          && ctx->Visual->FrontAlphaEnabled && ctx->Buffer->FrontAlpha) {
+         abuffer = ctx->Buffer->FrontAlpha;
+      }
+      else if (buffer==1
+               && (   ctx->Color.DrawBuffer==GL_BACK
+                   || ctx->Color.DrawBuffer==GL_FRONT_AND_BACK)
+               && ctx->Visual->BackAlphaEnabled && ctx->Buffer->BackAlpha) {
+         abuffer = ctx->Buffer->BackAlpha;
+      }
+
+      /* Clear the alpha buffer */
+      if (abuffer) {
+         GLubyte aclear = (GLint) (ctx->Color.ClearColor[3]
+                                   * ctx->Visual->AlphaScale);
+         if (ctx->Scissor.Enabled) {
+            /* clear scissor region */
+            GLint i, j;
+            for (j=0;j<ctx->Scissor.Height;j++) {
+               GLubyte *aptr = ALPHA_ADDR(ctx->Buffer->Xmin,
+                                          ctx->Buffer->Ymin+j);
+               for (i=0;i<ctx->Scissor.Width;i++) {
+                  *aptr++ = aclear;
+               }
+            }
+         }
+         else {
+            /* clear whole buffer */
+            MEMSET( abuffer, aclear, ctx->Buffer->Width*ctx->Buffer->Height );
+         }
+      }
+   }
+}
+
+
+
+void gl_write_alpha_span( GLcontext* ctx, GLuint n, GLint x, GLint y,
+                          GLubyte alpha[], GLubyte mask[] )
+{
+   GLubyte *aptr = ALPHA_ADDR( x, y );
+   GLuint i;
+
+   if (mask) {
+      for (i=0;i<n;i++) {
+         if (mask[i]) {
+            *aptr = alpha[i];
+         }
+         aptr++;
+      }
+   }
+   else {
+      for (i=0;i<n;i++) {
+         *aptr++ = alpha[i];
+      }
+   }
+}
+
+
+void gl_write_mono_alpha_span( GLcontext* ctx, GLuint n, GLint x, GLint y,
+                               GLubyte alpha, GLubyte mask[] )
+{
+   GLubyte *aptr = ALPHA_ADDR( x, y );
+   GLuint i;
+
+   if (mask) {
+      for (i=0;i<n;i++) {
+         if (mask[i]) {
+            *aptr = alpha;
+         }
+         aptr++;
+      }
+   }
+   else {
+      for (i=0;i<n;i++) {
+         *aptr++ = alpha;
+      }
+   }
+}
+
+
+void gl_write_alpha_pixels( GLcontext* ctx,
+                            GLuint n, const GLint x[], const GLint y[],
+                            const GLubyte alpha[], const GLubyte mask[] )
+{
+   GLuint i;
+
+   if (mask) {
+      for (i=0;i<n;i++) {
+         if (mask[i]) {
+            GLubyte *aptr = ALPHA_ADDR( x[i], y[i] );
+            *aptr = alpha[i];
+         }
+      }
+   }
+   else {
+      for (i=0;i<n;i++) {
+         GLubyte *aptr = ALPHA_ADDR( x[i], y[i] );
+         *aptr = alpha[i];
+      }
+   }
+}
+
+
+void gl_write_mono_alpha_pixels( GLcontext* ctx,
+                                 GLuint n, const GLint x[], const GLint y[],
+                                 GLubyte alpha, const GLubyte mask[] )
+{
+   GLuint i;
+
+   if (mask) {
+      for (i=0;i<n;i++) {
+         if (mask[i]) {
+            GLubyte *aptr = ALPHA_ADDR( x[i], y[i] );
+            *aptr = alpha;
+         }
+      }
+   }
+   else {
+      for (i=0;i<n;i++) {
+         GLubyte *aptr = ALPHA_ADDR( x[i], y[i] );
+         *aptr = alpha;
+      }
+   }
+}
+
+
+
+void gl_read_alpha_span( GLcontext* ctx,
+                         GLuint n, GLint x, GLint y, GLubyte alpha[] )
+{
+   GLubyte *aptr = ALPHA_ADDR( x, y );
+   GLuint i;
+   for (i=0;i<n;i++) {
+      alpha[i] = *aptr++;
+   }
+}
+
+
+void gl_read_alpha_pixels( GLcontext* ctx,
+                           GLuint n, const GLint x[], const GLint y[],
+                           GLubyte alpha[], const GLubyte mask[] )
+{
+   GLuint i;
+   for (i=0;i<n;i++) {
+      if (mask[i]) {
+         GLubyte *aptr = ALPHA_ADDR( x[i], y[i] );
+         alpha[i] = *aptr;
+      }
+   }
+}
+
+
+
diff --git a/dll/opengl/mesa/alphabuf.h b/dll/opengl/mesa/alphabuf.h
new file mode 100644 (file)
index 0000000..e2f6ef8
--- /dev/null
@@ -0,0 +1,78 @@
+/* $Id: alphabuf.h,v 1.1 1996/09/13 01:38:16 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.0
+ * Copyright (C) 1995-1996  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: alphabuf.h,v $
+ * Revision 1.1  1996/09/13 01:38:16  brianp
+ * Initial revision
+ *
+ */
+
+
+
+#ifndef ALPHABUF_H
+#define ALPHABUF_H
+
+
+#include "types.h"
+
+
+extern void gl_alloc_alpha_buffers( GLcontext* ctx );
+
+
+extern void gl_clear_alpha_buffers( GLcontext* ctx );
+
+
+extern void gl_write_alpha_span( GLcontext* ctx, GLuint n, GLint x, GLint y,
+                                 GLubyte alpha[], GLubyte mask[] );
+
+
+extern void gl_write_mono_alpha_span( GLcontext* ctx,
+                                      GLuint n, GLint x, GLint y,
+                                      GLubyte alpha, GLubyte mask[] );
+
+
+
+extern void gl_write_alpha_pixels( GLcontext* ctx,
+                                   GLuint n, const GLint x[], const GLint y[],
+                                   const GLubyte alpha[],
+                                   const GLubyte mask[] );
+
+
+extern void gl_write_mono_alpha_pixels( GLcontext* ctx,
+                                        GLuint n, const GLint x[],
+                                        const GLint y[], GLubyte alpha,
+                                        const GLubyte mask[] );
+
+
+extern void  gl_read_alpha_span( GLcontext* ctx,
+                                 GLuint n, GLint x, GLint y, GLubyte alpha[] );
+
+
+extern void gl_read_alpha_pixels( GLcontext* ctx,
+                                  GLuint n, const GLint x[], const GLint y[],
+                                  GLubyte alpha[], const GLubyte mask[] );
+
+
+#endif
+
diff --git a/dll/opengl/mesa/api.c b/dll/opengl/mesa/api.c
new file mode 100644 (file)
index 0000000..b594b23
--- /dev/null
@@ -0,0 +1,2874 @@
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.5
+ * Copyright (C) 1995-1997  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifdef PC_HEADER
+#include "all.h"
+#else
+#include <stdio.h>
+#include <stdlib.h>
+#include "api.h"
+#include "bitmap.h"
+#include "context.h"
+
+#include "drawpix.h"
+
+#include "eval.h"
+#include "image.h"
+#include "macros.h"
+#include "matrix.h"
+#include "teximage.h"
+#include "types.h"
+#include "vb.h"
+#endif
+
+void APIENTRY _mesa_Accum( GLenum op, GLfloat value )
+{
+   GET_CONTEXT;
+   (*CC->API.Accum)(CC, op, value);
+}
+
+void APIENTRY _mesa_AlphaFunc( GLenum func, GLclampf ref )
+{
+   GET_CONTEXT;
+   (*CC->API.AlphaFunc)(CC, func, ref);
+}
+
+
+GLboolean APIENTRY _mesa_AreTexturesResident( GLsizei n, const GLuint *textures,
+                                 GLboolean *residences )
+{
+   GET_CONTEXT;
+   return (*CC->API.AreTexturesResident)(CC, n, textures, residences);
+}
+
+void APIENTRY _mesa_ArrayElement( GLint i )
+{
+   GET_CONTEXT;
+   (*CC->API.ArrayElement)(CC, i);
+}
+
+
+void APIENTRY _mesa_Begin( GLenum mode )
+{
+   GET_CONTEXT;
+   (*CC->API.Begin)( CC, mode );
+}
+
+
+void APIENTRY _mesa_BindTexture( GLenum target, GLuint texture )
+{
+   GET_CONTEXT;
+   (*CC->API.BindTexture)(CC, target, texture);
+}
+
+
+void APIENTRY _mesa_Bitmap( GLsizei width, GLsizei height,
+               GLfloat xorig, GLfloat yorig,
+               GLfloat xmove, GLfloat ymove,
+               const GLubyte *bitmap )
+{
+   GET_CONTEXT;
+   if (!CC->CompileFlag) {
+      /* execute only, try optimized case where no unpacking needed */
+      if (   CC->Unpack.LsbFirst==GL_FALSE
+          && CC->Unpack.Alignment==1
+          && CC->Unpack.RowLength==0
+          && CC->Unpack.SkipPixels==0
+          && CC->Unpack.SkipRows==0) {
+         /* Special case: no unpacking needed */
+         struct gl_image image;
+         image.Width = width;
+         image.Height = height;
+         image.Components = 0;
+         image.Type = GL_BITMAP;
+         image.Format = GL_COLOR_INDEX;
+         image.Data = (GLvoid *) bitmap;
+         (*CC->Exec.Bitmap)( CC, width, height, xorig, yorig,
+                             xmove, ymove, &image );
+      }
+      else {
+         struct gl_image *image;
+         image = gl_unpack_bitmap( CC, width, height, bitmap );
+         (*CC->Exec.Bitmap)( CC, width, height, xorig, yorig,
+                             xmove, ymove, image );
+         if (image) {
+            gl_free_image( image );
+         }
+      }
+   }
+   else {
+      /* compile and maybe execute */
+      struct gl_image *image;
+      image = gl_unpack_bitmap( CC, width, height, bitmap );
+      (*CC->API.Bitmap)(CC, width, height, xorig, yorig, xmove, ymove, image );
+   }
+}
+
+
+void APIENTRY _mesa_BlendFunc( GLenum sfactor, GLenum dfactor )
+{
+   GET_CONTEXT;
+   (*CC->API.BlendFunc)(CC, sfactor, dfactor);
+}
+
+
+void APIENTRY _mesa_CallList( GLuint list )
+{
+   GET_CONTEXT;
+   (*CC->API.CallList)(CC, list);
+}
+
+
+void APIENTRY _mesa_CallLists( GLsizei n, GLenum type, const GLvoid *lists )
+{
+   GET_CONTEXT;
+   (*CC->API.CallLists)(CC, n, type, lists);
+}
+
+
+void APIENTRY _mesa_Clear( GLbitfield mask )
+{
+   GET_CONTEXT;
+   (*CC->API.Clear)(CC, mask);
+}
+
+
+void APIENTRY _mesa_ClearAccum( GLfloat red, GLfloat green,
+              GLfloat blue, GLfloat alpha )
+{
+   GET_CONTEXT;
+   (*CC->API.ClearAccum)(CC, red, green, blue, alpha);
+}
+
+
+
+void APIENTRY _mesa_ClearIndex( GLfloat c )
+{
+   GET_CONTEXT;
+   (*CC->API.ClearIndex)(CC, c);
+}
+
+
+void APIENTRY _mesa_ClearColor( GLclampf red,
+              GLclampf green,
+              GLclampf blue,
+              GLclampf alpha )
+{
+   GET_CONTEXT;
+   (*CC->API.ClearColor)(CC, red, green, blue, alpha);
+}
+
+
+void APIENTRY _mesa_ClearDepth( GLclampd depth )
+{
+   GET_CONTEXT;
+   (*CC->API.ClearDepth)( CC, depth );
+}
+
+
+void APIENTRY _mesa_ClearStencil( GLint s )
+{
+   GET_CONTEXT;
+   (*CC->API.ClearStencil)(CC, s);
+}
+
+
+void APIENTRY _mesa_ClipPlane( GLenum plane, const GLdouble *equation )
+{
+   GLfloat eq[4];
+   GET_CONTEXT;
+   eq[0] = (GLfloat) equation[0];
+   eq[1] = (GLfloat) equation[1];
+   eq[2] = (GLfloat) equation[2];
+   eq[3] = (GLfloat) equation[3];
+   (*CC->API.ClipPlane)(CC, plane, eq );
+}
+
+
+void APIENTRY _mesa_Color3b( GLbyte red, GLbyte green, GLbyte blue )
+{
+   GET_CONTEXT;
+   (*CC->API.Color3f)( CC, BYTE_TO_FLOAT(red), BYTE_TO_FLOAT(green),
+                       BYTE_TO_FLOAT(blue) );
+}
+
+
+void APIENTRY _mesa_Color3d( GLdouble red, GLdouble green, GLdouble blue )
+{
+   GET_CONTEXT;
+   (*CC->API.Color3f)( CC, (GLfloat) red, (GLfloat) green, (GLfloat) blue );
+}
+
+
+void APIENTRY _mesa_Color3f( GLfloat red, GLfloat green, GLfloat blue )
+{
+   GET_CONTEXT;
+   (*CC->API.Color3f)( CC, red, green, blue );
+}
+
+
+void APIENTRY _mesa_Color3i( GLint red, GLint green, GLint blue )
+{
+   GET_CONTEXT;
+   (*CC->API.Color3f)( CC, INT_TO_FLOAT(red), INT_TO_FLOAT(green),
+                       INT_TO_FLOAT(blue) );
+}
+
+
+void APIENTRY _mesa_Color3s( GLshort red, GLshort green, GLshort blue )
+{
+   GET_CONTEXT;
+   (*CC->API.Color3f)( CC, SHORT_TO_FLOAT(red), SHORT_TO_FLOAT(green),
+                       SHORT_TO_FLOAT(blue) );
+}
+
+
+void APIENTRY _mesa_Color3ub( GLubyte red, GLubyte green, GLubyte blue )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4ub)( CC, red, green, blue, 255 );
+}
+
+
+void APIENTRY _mesa_Color3ui( GLuint red, GLuint green, GLuint blue )
+{
+   GET_CONTEXT;
+   (*CC->API.Color3f)( CC, UINT_TO_FLOAT(red), UINT_TO_FLOAT(green),
+                       UINT_TO_FLOAT(blue) );
+}
+
+
+void APIENTRY _mesa_Color3us( GLushort red, GLushort green, GLushort blue )
+{
+   GET_CONTEXT;
+   (*CC->API.Color3f)( CC, USHORT_TO_FLOAT(red), USHORT_TO_FLOAT(green),
+                       USHORT_TO_FLOAT(blue) );
+}
+
+
+void APIENTRY _mesa_Color4b( GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4f)( CC, BYTE_TO_FLOAT(red), BYTE_TO_FLOAT(green),
+                       BYTE_TO_FLOAT(blue), BYTE_TO_FLOAT(alpha) );
+}
+
+
+void APIENTRY _mesa_Color4d( GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4f)( CC, (GLfloat) red, (GLfloat) green,
+                       (GLfloat) blue, (GLfloat) alpha );
+}
+
+
+void APIENTRY _mesa_Color4f( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4f)( CC, red, green, blue, alpha );
+}
+
+void APIENTRY _mesa_Color4i( GLint red, GLint green, GLint blue, GLint alpha )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4f)( CC, INT_TO_FLOAT(red), INT_TO_FLOAT(green),
+                       INT_TO_FLOAT(blue), INT_TO_FLOAT(alpha) );
+}
+
+
+void APIENTRY _mesa_Color4s( GLshort red, GLshort green, GLshort blue, GLshort alpha )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4f)( CC, SHORT_TO_FLOAT(red), SHORT_TO_FLOAT(green),
+                       SHORT_TO_FLOAT(blue), SHORT_TO_FLOAT(alpha) );
+}
+
+void APIENTRY _mesa_Color4ub( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4ub)( CC, red, green, blue, alpha );
+}
+
+void APIENTRY _mesa_Color4ui( GLuint red, GLuint green, GLuint blue, GLuint alpha )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4f)( CC, UINT_TO_FLOAT(red), UINT_TO_FLOAT(green),
+                       UINT_TO_FLOAT(blue), UINT_TO_FLOAT(alpha) );
+}
+
+void APIENTRY _mesa_Color4us( GLushort red, GLushort green, GLushort blue, GLushort alpha )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4f)( CC, USHORT_TO_FLOAT(red), USHORT_TO_FLOAT(green),
+                       USHORT_TO_FLOAT(blue), USHORT_TO_FLOAT(alpha) );
+}
+
+
+void APIENTRY _mesa_Color3bv( const GLbyte *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color3f)( CC, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]),
+                       BYTE_TO_FLOAT(v[2]) );
+}
+
+
+void APIENTRY _mesa_Color3dv( const GLdouble *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color3f)( CC, (GLdouble) v[0], (GLdouble) v[1], (GLdouble) v[2] );
+}
+
+
+void APIENTRY _mesa_Color3fv( const GLfloat *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color3fv)( CC, v );
+}
+
+
+void APIENTRY _mesa_Color3iv( const GLint *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color3f)( CC, INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]),
+                       INT_TO_FLOAT(v[2]) );
+}
+
+
+void APIENTRY _mesa_Color3sv( const GLshort *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color3f)( CC, SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]),
+                       SHORT_TO_FLOAT(v[2]) );
+}
+
+
+void APIENTRY _mesa_Color3ubv( const GLubyte *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4ub)( CC, v[0], v[1], v[2], 255 );
+}
+
+
+void APIENTRY _mesa_Color3uiv( const GLuint *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color3f)( CC, UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1]),
+                       UINT_TO_FLOAT(v[2]) );
+}
+
+
+void APIENTRY _mesa_Color3usv( const GLushort *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color3f)( CC, USHORT_TO_FLOAT(v[0]), USHORT_TO_FLOAT(v[1]),
+                       USHORT_TO_FLOAT(v[2]) );
+
+}
+
+
+void APIENTRY _mesa_Color4bv( const GLbyte *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4f)( CC, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]),
+                       BYTE_TO_FLOAT(v[2]), BYTE_TO_FLOAT(v[3]) );
+}
+
+
+void APIENTRY _mesa_Color4dv( const GLdouble *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4f)( CC, (GLdouble) v[0], (GLdouble) v[1],
+                       (GLdouble) v[2], (GLdouble) v[3] );
+}
+
+
+void APIENTRY _mesa_Color4fv( const GLfloat *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4f)( CC, v[0], v[1], v[2], v[3] );
+}
+
+
+void APIENTRY _mesa_Color4iv( const GLint *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4f)( CC, INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]),
+                       INT_TO_FLOAT(v[2]), INT_TO_FLOAT(v[3]) );
+}
+
+
+void APIENTRY _mesa_Color4sv( const GLshort *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4f)( CC, SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]),
+                       SHORT_TO_FLOAT(v[2]), SHORT_TO_FLOAT(v[3]) );
+}
+
+
+void APIENTRY _mesa_Color4ubv( const GLubyte *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4ubv)( CC, v );
+}
+
+
+void APIENTRY _mesa_Color4uiv( const GLuint *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4f)( CC, UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1]),
+                       UINT_TO_FLOAT(v[2]), UINT_TO_FLOAT(v[3]) );
+}
+
+
+void APIENTRY _mesa_Color4usv( const GLushort *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Color4f)( CC, USHORT_TO_FLOAT(v[0]), USHORT_TO_FLOAT(v[1]),
+                       USHORT_TO_FLOAT(v[2]), USHORT_TO_FLOAT(v[3]) );
+}
+
+
+void APIENTRY _mesa_ColorMask( GLboolean red, GLboolean green,
+             GLboolean blue, GLboolean alpha )
+{
+   GET_CONTEXT;
+          (*CC->API.ColorMask)(CC, red, green, blue, alpha);
+}
+
+
+void APIENTRY _mesa_ColorMaterial( GLenum face, GLenum mode )
+{
+   GET_CONTEXT;
+          (*CC->API.ColorMaterial)(CC, face, mode);
+}
+
+
+void APIENTRY _mesa_ColorPointer( GLint size, GLenum type, GLsizei stride,
+                     const GLvoid *ptr )
+{
+   GET_CONTEXT;
+          (*CC->API.ColorPointer)(CC, size, type, stride, ptr);
+}
+
+
+void APIENTRY _mesa_CopyPixels( GLint x, GLint y, GLsizei width, GLsizei height,
+              GLenum type )
+{
+   GET_CONTEXT;
+          (*CC->API.CopyPixels)(CC, x, y, width, height, type);
+}
+
+
+void APIENTRY _mesa_CopyTexImage1D( GLenum target, GLint level,
+                                GLenum internalformat,
+                                GLint x, GLint y,
+                                GLsizei width, GLint border )
+{
+   GET_CONTEXT;
+          (*CC->API.CopyTexImage1D)( CC, target, level, internalformat,
+                                 x, y, width, border );
+}
+
+
+void APIENTRY _mesa_CopyTexImage2D( GLenum target, GLint level,
+                                GLenum internalformat,
+                                GLint x, GLint y,
+                                GLsizei width, GLsizei height, GLint border )
+{
+   GET_CONTEXT;
+          (*CC->API.CopyTexImage2D)( CC, target, level, internalformat,
+                              x, y, width, height, border );
+}
+
+
+void APIENTRY _mesa_CopyTexSubImage1D( GLenum target, GLint level,
+                                   GLint xoffset, GLint x, GLint y,
+                                   GLsizei width )
+{
+   GET_CONTEXT;
+          (*CC->API.CopyTexSubImage1D)( CC, target, level, xoffset, x, y, width );
+}
+
+
+void APIENTRY _mesa_CopyTexSubImage2D( GLenum target, GLint level,
+                                   GLint xoffset, GLint yoffset,
+                                   GLint x, GLint y,
+                                   GLsizei width, GLsizei height )
+{
+   GET_CONTEXT;
+          (*CC->API.CopyTexSubImage2D)( CC, target, level, xoffset, yoffset,
+                                 x, y, width, height );
+}
+
+
+
+void APIENTRY _mesa_CullFace( GLenum mode )
+{
+   GET_CONTEXT;
+          (*CC->API.CullFace)(CC, mode);
+}
+
+
+void APIENTRY _mesa_DepthFunc( GLenum func )
+{
+   GET_CONTEXT;
+          (*CC->API.DepthFunc)( CC, func );
+}
+
+
+void APIENTRY _mesa_DepthMask( GLboolean flag )
+{
+   GET_CONTEXT;
+          (*CC->API.DepthMask)( CC, flag );
+}
+
+
+void APIENTRY _mesa_DepthRange( GLclampd near_val, GLclampd far_val )
+{
+   GET_CONTEXT;
+          (*CC->API.DepthRange)( CC, near_val, far_val );
+}
+
+
+void APIENTRY _mesa_DeleteLists( GLuint list, GLsizei range )
+{
+   GET_CONTEXT;
+          (*CC->API.DeleteLists)(CC, list, range);
+}
+
+
+void APIENTRY _mesa_DeleteTextures( GLsizei n, const GLuint *textures)
+{
+   GET_CONTEXT;
+          (*CC->API.DeleteTextures)(CC, n, textures);
+}
+
+
+void APIENTRY _mesa_Disable( GLenum cap )
+{
+   GET_CONTEXT;
+          (*CC->API.Disable)( CC, cap );
+}
+
+
+void APIENTRY _mesa_DisableClientState( GLenum cap )
+{
+   GET_CONTEXT;
+          (*CC->API.DisableClientState)( CC, cap );
+}
+
+
+void APIENTRY _mesa_DrawArrays( GLenum mode, GLint first, GLsizei count )
+{
+   GET_CONTEXT;
+          (*CC->API.DrawArrays)(CC, mode, first, count);
+}
+
+
+void APIENTRY _mesa_DrawBuffer( GLenum mode )
+{
+   GET_CONTEXT;
+          (*CC->API.DrawBuffer)(CC, mode);
+}
+
+
+void APIENTRY _mesa_DrawElements( GLenum mode, GLsizei count,
+                              GLenum type, const GLvoid *indices )
+{
+   GET_CONTEXT;
+          (*CC->API.DrawElements)( CC, mode, count, type, indices );
+}
+
+
+void APIENTRY _mesa_DrawPixels( GLsizei width, GLsizei height,
+                            GLenum format, GLenum type, const GLvoid *pixels )
+{
+   GET_CONTEXT;
+          (*CC->API.DrawPixels)( CC, width, height, format, type, pixels );
+}
+
+
+void APIENTRY _mesa_Enable( GLenum cap )
+{
+   GET_CONTEXT;
+          (*CC->API.Enable)( CC, cap );
+}
+
+
+void APIENTRY _mesa_EnableClientState( GLenum cap )
+{
+   GET_CONTEXT;
+          (*CC->API.EnableClientState)( CC, cap );
+}
+
+
+void APIENTRY _mesa_End( void )
+{
+   GET_CONTEXT;
+          (*CC->API.End)( CC );
+}
+
+
+void APIENTRY _mesa_EndList( void )
+{
+   GET_CONTEXT;
+          (*CC->API.EndList)(CC);
+}
+
+
+
+
+void APIENTRY _mesa_EvalCoord1d( GLdouble u )
+{
+   GET_CONTEXT;
+          (*CC->API.EvalCoord1f)( CC, (GLfloat) u );
+}
+
+
+void APIENTRY _mesa_EvalCoord1f( GLfloat u )
+{
+   GET_CONTEXT;
+          (*CC->API.EvalCoord1f)( CC, u );
+}
+
+
+void APIENTRY _mesa_EvalCoord1dv( const GLdouble *u )
+{
+   GET_CONTEXT;
+          (*CC->API.EvalCoord1f)( CC, (GLfloat) *u );
+}
+
+
+void APIENTRY _mesa_EvalCoord1fv( const GLfloat *u )
+{
+   GET_CONTEXT;
+          (*CC->API.EvalCoord1f)( CC, (GLfloat) *u );
+}
+
+
+void APIENTRY _mesa_EvalCoord2d( GLdouble u, GLdouble v )
+{
+   GET_CONTEXT;
+          (*CC->API.EvalCoord2f)( CC, (GLfloat) u, (GLfloat) v );
+}
+
+
+void APIENTRY _mesa_EvalCoord2f( GLfloat u, GLfloat v )
+{
+   GET_CONTEXT;
+          (*CC->API.EvalCoord2f)( CC, u, v );
+}
+
+
+void APIENTRY _mesa_EvalCoord2dv( const GLdouble *u )
+{
+   GET_CONTEXT;
+          (*CC->API.EvalCoord2f)( CC, (GLfloat) u[0], (GLfloat) u[1] );
+}
+
+
+void APIENTRY _mesa_EvalCoord2fv( const GLfloat *u )
+{
+   GET_CONTEXT;
+          (*CC->API.EvalCoord2f)( CC, u[0], u[1] );
+}
+
+
+void APIENTRY _mesa_EvalPoint1( GLint i )
+{
+   GET_CONTEXT;
+          (*CC->API.EvalPoint1)( CC, i );
+}
+
+
+void APIENTRY _mesa_EvalPoint2( GLint i, GLint j )
+{
+   GET_CONTEXT;
+          (*CC->API.EvalPoint2)( CC, i, j );
+}
+
+
+void APIENTRY _mesa_EvalMesh1( GLenum mode, GLint i1, GLint i2 )
+{
+   GET_CONTEXT;
+          (*CC->API.EvalMesh1)( CC, mode, i1, i2 );
+}
+
+
+void APIENTRY _mesa_EdgeFlag( GLboolean flag )
+{
+   GET_CONTEXT;
+          (*CC->API.EdgeFlag)(CC, flag);
+}
+
+
+void APIENTRY _mesa_EdgeFlagv( const GLboolean *flag )
+{
+   GET_CONTEXT;
+          (*CC->API.EdgeFlag)(CC, *flag);
+}
+
+
+void APIENTRY _mesa_EdgeFlagPointer( GLsizei stride, const GLboolean *ptr )
+{
+   GET_CONTEXT;
+          (*CC->API.EdgeFlagPointer)(CC, stride, ptr);
+}
+
+
+void APIENTRY _mesa_EvalMesh2( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 )
+{
+   GET_CONTEXT;
+          (*CC->API.EvalMesh2)( CC, mode, i1, i2, j1, j2 );
+}
+
+
+void APIENTRY _mesa_FeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer )
+{
+   GET_CONTEXT;
+          (*CC->API.FeedbackBuffer)(CC, size, type, buffer);
+}
+
+
+void APIENTRY _mesa_Finish( void )
+{
+   GET_CONTEXT;
+          (*CC->API.Finish)(CC);
+}
+
+
+void APIENTRY _mesa_Flush( void )
+{
+   GET_CONTEXT;
+          (*CC->API.Flush)(CC);
+}
+
+
+void APIENTRY _mesa_Fogf( GLenum pname, GLfloat param )
+{
+   GET_CONTEXT;
+          (*CC->API.Fogfv)(CC, pname, &param);
+}
+
+
+void APIENTRY _mesa_Fogi( GLenum pname, GLint param )
+{
+   GLfloat fparam = (GLfloat) param;
+   GET_CONTEXT;
+          (*CC->API.Fogfv)(CC, pname, &fparam);
+}
+
+
+void APIENTRY _mesa_Fogfv( GLenum pname, const GLfloat *params )
+{
+   GET_CONTEXT;
+          (*CC->API.Fogfv)(CC, pname, params);
+}
+
+
+void APIENTRY _mesa_Fogiv( GLenum pname, const GLint *params )
+{
+   GLfloat p[4];
+   GET_CONTEXT;
+
+   switch (pname) {
+      case GL_FOG_MODE:
+      case GL_FOG_DENSITY:
+      case GL_FOG_START:
+      case GL_FOG_END:
+      case GL_FOG_INDEX:
+     p[0] = (GLfloat) *params;
+     break;
+      case GL_FOG_COLOR:
+     p[0] = INT_TO_FLOAT( params[0] );
+     p[1] = INT_TO_FLOAT( params[1] );
+     p[2] = INT_TO_FLOAT( params[2] );
+     p[3] = INT_TO_FLOAT( params[3] );
+     break;
+      default:
+         /* Error will be caught later in gl_Fogfv */
+         ;
+   }
+   (*CC->API.Fogfv)( CC, pname, p );
+}
+
+
+
+void APIENTRY _mesa_FrontFace( GLenum mode )
+{
+   GET_CONTEXT;
+          (*CC->API.FrontFace)(CC, mode);
+}
+
+
+void APIENTRY _mesa_Frustum( GLdouble left, GLdouble right,
+                         GLdouble bottom, GLdouble top,
+                         GLdouble nearval, GLdouble farval )
+{
+   GET_CONTEXT;
+          (*CC->API.Frustum)(CC, left, right, bottom, top, nearval, farval);
+}
+
+
+GLuint APIENTRY _mesa_GenLists( GLsizei range )
+{
+   GET_CONTEXT;
+          return (*CC->API.GenLists)(CC, range);
+}
+
+
+void APIENTRY _mesa_GenTextures( GLsizei n, GLuint *textures )
+{
+   GET_CONTEXT;
+          (*CC->API.GenTextures)(CC, n, textures);
+}
+
+
+void APIENTRY _mesa_GetBooleanv( GLenum pname, GLboolean *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetBooleanv)(CC, pname, params);
+}
+
+
+void APIENTRY _mesa_GetClipPlane( GLenum plane, GLdouble *equation )
+{
+   GET_CONTEXT;
+          (*CC->API.GetClipPlane)(CC, plane, equation);
+}
+
+void APIENTRY _mesa_GetDoublev( GLenum pname, GLdouble *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetDoublev)(CC, pname, params);
+}
+
+
+GLenum APIENTRY _mesa_GetError( void )
+{
+   GET_CONTEXT;
+   if (!CC) {
+      /* No current context */
+      return GL_NO_ERROR;
+   }
+   return (*CC->API.GetError)(CC);
+}
+
+
+void APIENTRY _mesa_GetFloatv( GLenum pname, GLfloat *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetFloatv)(CC, pname, params);
+}
+
+
+void APIENTRY _mesa_GetIntegerv( GLenum pname, GLint *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetIntegerv)(CC, pname, params);
+}
+
+
+void APIENTRY _mesa_GetLightfv( GLenum light, GLenum pname, GLfloat *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetLightfv)(CC, light, pname, params);
+}
+
+
+void APIENTRY _mesa_GetLightiv( GLenum light, GLenum pname, GLint *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetLightiv)(CC, light, pname, params);
+}
+
+
+void APIENTRY _mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v )
+{
+   GET_CONTEXT;
+          (*CC->API.GetMapdv)( CC, target, query, v );
+}
+
+
+void APIENTRY _mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v )
+{
+   GET_CONTEXT;
+          (*CC->API.GetMapfv)( CC, target, query, v );
+}
+
+
+void APIENTRY _mesa_GetMapiv( GLenum target, GLenum query, GLint *v )
+{
+   GET_CONTEXT;
+          (*CC->API.GetMapiv)( CC, target, query, v );
+}
+
+
+void APIENTRY _mesa_GetMaterialfv( GLenum face, GLenum pname, GLfloat *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetMaterialfv)(CC, face, pname, params);
+}
+
+
+void APIENTRY _mesa_GetMaterialiv( GLenum face, GLenum pname, GLint *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetMaterialiv)(CC, face, pname, params);
+}
+
+
+void APIENTRY _mesa_GetPixelMapfv( GLenum map, GLfloat *values )
+{
+   GET_CONTEXT;
+          (*CC->API.GetPixelMapfv)(CC, map, values);
+}
+
+
+void APIENTRY _mesa_GetPixelMapuiv( GLenum map, GLuint *values )
+{
+   GET_CONTEXT;
+          (*CC->API.GetPixelMapuiv)(CC, map, values);
+}
+
+
+void APIENTRY _mesa_GetPixelMapusv( GLenum map, GLushort *values )
+{
+   GET_CONTEXT;
+          (*CC->API.GetPixelMapusv)(CC, map, values);
+}
+
+
+void APIENTRY _mesa_GetPointerv( GLenum pname, GLvoid **params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetPointerv)(CC, pname, params);
+}
+
+
+void APIENTRY _mesa_GetPolygonStipple( GLubyte *mask )
+{
+   GET_CONTEXT;
+          (*CC->API.GetPolygonStipple)(CC, mask);
+}
+
+
+const GLubyte * APIENTRY _mesa_GetString( GLenum name )
+{
+   GET_CONTEXT;
+          return (*CC->API.GetString)(CC, name);
+}
+
+
+
+void APIENTRY _mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetTexEnvfv)(CC, target, pname, params);
+}
+
+
+void APIENTRY _mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetTexEnviv)(CC, target, pname, params);
+}
+
+
+void APIENTRY _mesa_GetTexGeniv( GLenum coord, GLenum pname, GLint *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetTexGeniv)(CC, coord, pname, params);
+}
+
+
+void APIENTRY _mesa_GetTexGendv( GLenum coord, GLenum pname, GLdouble *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetTexGendv)(CC, coord, pname, params);
+}
+
+
+void APIENTRY _mesa_GetTexGenfv( GLenum coord, GLenum pname, GLfloat *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetTexGenfv)(CC, coord, pname, params);
+}
+
+
+
+void APIENTRY _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
+                             GLenum type, GLvoid *pixels )
+{
+   GET_CONTEXT;
+          (*CC->API.GetTexImage)(CC, target, level, format, type, pixels);
+}
+
+
+void APIENTRY _mesa_GetTexLevelParameterfv( GLenum target, GLint level,
+                                        GLenum pname, GLfloat *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetTexLevelParameterfv)(CC, target, level, pname, params);
+}
+
+
+void APIENTRY _mesa_GetTexLevelParameteriv( GLenum target, GLint level,
+                                        GLenum pname, GLint *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetTexLevelParameteriv)(CC, target, level, pname, params);
+}
+
+
+
+
+void APIENTRY _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params)
+{
+   GET_CONTEXT;
+          (*CC->API.GetTexParameterfv)(CC, target, pname, params);
+}
+
+
+void APIENTRY _mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params )
+{
+   GET_CONTEXT;
+          (*CC->API.GetTexParameteriv)(CC, target, pname, params);
+}
+
+
+void APIENTRY _mesa_Hint( GLenum target, GLenum mode )
+{
+   GET_CONTEXT;
+          (*CC->API.Hint)(CC, target, mode);
+}
+
+
+void APIENTRY _mesa_Indexd( GLdouble c )
+{
+   GET_CONTEXT;
+   (*CC->API.Indexf)( CC, (GLfloat) c );
+}
+
+
+void APIENTRY _mesa_Indexf( GLfloat c )
+{
+   GET_CONTEXT;
+   (*CC->API.Indexf)( CC, c );
+}
+
+
+void APIENTRY _mesa_Indexi( GLint c )
+{
+   GET_CONTEXT;
+   (*CC->API.Indexi)( CC, c );
+}
+
+
+void APIENTRY _mesa_Indexs( GLshort c )
+{
+   GET_CONTEXT;
+   (*CC->API.Indexi)( CC, (GLint) c );
+}
+
+
+#ifdef GL_VERSION_1_1
+void APIENTRY _mesa_Indexub( GLubyte c )
+{
+   GET_CONTEXT;
+   (*CC->API.Indexi)( CC, (GLint) c );
+}
+#endif
+
+
+void APIENTRY _mesa_Indexdv( const GLdouble *c )
+{
+   GET_CONTEXT;
+   (*CC->API.Indexf)( CC, (GLfloat) *c );
+}
+
+
+void APIENTRY _mesa_Indexfv( const GLfloat *c )
+{
+   GET_CONTEXT;
+   (*CC->API.Indexf)( CC, *c );
+}
+
+
+void APIENTRY _mesa_Indexiv( const GLint *c )
+{
+   GET_CONTEXT;
+   (*CC->API.Indexi)( CC, *c );
+}
+
+
+void APIENTRY _mesa_Indexsv( const GLshort *c )
+{
+   GET_CONTEXT;
+   (*CC->API.Indexi)( CC, (GLint) *c );
+}
+
+
+#ifdef GL_VERSION_1_1
+void APIENTRY _mesa_Indexubv( const GLubyte *c )
+{
+   GET_CONTEXT;
+   (*CC->API.Indexi)( CC, (GLint) *c );
+}
+#endif
+
+
+void APIENTRY _mesa_IndexMask( GLuint mask )
+{
+   GET_CONTEXT;
+   (*CC->API.IndexMask)(CC, mask);
+}
+
+
+void APIENTRY _mesa_IndexPointer( GLenum type, GLsizei stride, const GLvoid *ptr )
+{
+   GET_CONTEXT;
+          (*CC->API.IndexPointer)(CC, type, stride, ptr);
+}
+
+
+void APIENTRY _mesa_InterleavedArrays( GLenum format, GLsizei stride,
+                                   const GLvoid *pointer )
+{
+   GET_CONTEXT;
+          (*CC->API.InterleavedArrays)( CC, format, stride, pointer );
+}
+
+
+void APIENTRY _mesa_InitNames( void )
+{
+   GET_CONTEXT;
+          (*CC->API.InitNames)(CC);
+}
+
+
+GLboolean APIENTRY _mesa_IsList( GLuint list )
+{
+   GET_CONTEXT;
+          return (*CC->API.IsList)(CC, list);
+}
+
+
+GLboolean APIENTRY _mesa_IsTexture( GLuint texture )
+{
+   GET_CONTEXT;
+          return (*CC->API.IsTexture)(CC, texture);
+}
+
+
+void APIENTRY _mesa_Lightf( GLenum light, GLenum pname, GLfloat param )
+{
+   GET_CONTEXT;
+          (*CC->API.Lightfv)( CC, light, pname, &param, 1 );
+}
+
+
+
+void APIENTRY _mesa_Lighti( GLenum light, GLenum pname, GLint param )
+{
+   GLfloat fparam = (GLfloat) param;
+   GET_CONTEXT;
+          (*CC->API.Lightfv)( CC, light, pname, &fparam, 1 );
+}
+
+
+
+void APIENTRY _mesa_Lightfv( GLenum light, GLenum pname, const GLfloat *params )
+{
+   GET_CONTEXT;
+          (*CC->API.Lightfv)( CC, light, pname, params, 4 );
+}
+
+
+
+void APIENTRY _mesa_Lightiv( GLenum light, GLenum pname, const GLint *params )
+{
+   GLfloat fparam[4];
+   GET_CONTEXT;
+
+   switch (pname) {
+      case GL_AMBIENT:
+      case GL_DIFFUSE:
+      case GL_SPECULAR:
+         fparam[0] = INT_TO_FLOAT( params[0] );
+         fparam[1] = INT_TO_FLOAT( params[1] );
+         fparam[2] = INT_TO_FLOAT( params[2] );
+         fparam[3] = INT_TO_FLOAT( params[3] );
+         break;
+      case GL_POSITION:
+         fparam[0] = (GLfloat) params[0];
+         fparam[1] = (GLfloat) params[1];
+         fparam[2] = (GLfloat) params[2];
+         fparam[3] = (GLfloat) params[3];
+         break;
+      case GL_SPOT_DIRECTION:
+         fparam[0] = (GLfloat) params[0];
+         fparam[1] = (GLfloat) params[1];
+         fparam[2] = (GLfloat) params[2];
+         break;
+      case GL_SPOT_EXPONENT:
+      case GL_SPOT_CUTOFF:
+      case GL_CONSTANT_ATTENUATION:
+      case GL_LINEAR_ATTENUATION:
+      case GL_QUADRATIC_ATTENUATION:
+         fparam[0] = (GLfloat) params[0];
+         break;
+      default:
+         /* error will be caught later in gl_Lightfv */
+         ;
+   }
+   (*CC->API.Lightfv)( CC, light, pname, fparam, 4 );
+}
+
+
+
+void APIENTRY _mesa_LightModelf( GLenum pname, GLfloat param )
+{
+   GET_CONTEXT;
+          (*CC->API.LightModelfv)( CC, pname, &param );
+}
+
+
+void APIENTRY _mesa_LightModeli( GLenum pname, GLint param )
+{
+   GLfloat fparam[4];
+   GET_CONTEXT;
+          fparam[0] = (GLfloat) param;
+   (*CC->API.LightModelfv)( CC, pname, fparam );
+}
+
+
+void APIENTRY _mesa_LightModelfv( GLenum pname, const GLfloat *params )
+{
+   GET_CONTEXT;
+          (*CC->API.LightModelfv)( CC, pname, params );
+}
+
+
+void APIENTRY _mesa_LightModeliv( GLenum pname, const GLint *params )
+{
+   GLfloat fparam[4];
+   GET_CONTEXT;
+
+   switch (pname) {
+      case GL_LIGHT_MODEL_AMBIENT:
+         fparam[0] = INT_TO_FLOAT( params[0] );
+         fparam[1] = INT_TO_FLOAT( params[1] );
+         fparam[2] = INT_TO_FLOAT( params[2] );
+         fparam[3] = INT_TO_FLOAT( params[3] );
+         break;
+      case GL_LIGHT_MODEL_LOCAL_VIEWER:
+      case GL_LIGHT_MODEL_TWO_SIDE:
+         fparam[0] = (GLfloat) params[0];
+         break;
+      default:
+         /* Error will be caught later in gl_LightModelfv */
+         ;
+   }
+   (*CC->API.LightModelfv)( CC, pname, fparam );
+}
+
+
+void APIENTRY _mesa_LineWidth( GLfloat width )
+{
+   GET_CONTEXT;
+          (*CC->API.LineWidth)(CC, width);
+}
+
+
+void APIENTRY _mesa_LineStipple( GLint factor, GLushort pattern )
+{
+   GET_CONTEXT;
+          (*CC->API.LineStipple)(CC, factor, pattern);
+}
+
+
+void APIENTRY _mesa_ListBase( GLuint base )
+{
+   GET_CONTEXT;
+          (*CC->API.ListBase)(CC, base);
+}
+
+
+void APIENTRY _mesa_LoadIdentity( void )
+{
+   GET_CONTEXT;
+          (*CC->API.LoadIdentity)( CC );
+}
+
+
+void APIENTRY _mesa_LoadMatrixd( const GLdouble *m )
+{
+   GLfloat fm[16];
+   GLuint i;
+   GET_CONTEXT;
+
+   for (i=0;i<16;i++) {
+      fm[i] = (GLfloat) m[i];
+   }
+
+   (*CC->API.LoadMatrixf)( CC, fm );
+}
+
+
+void APIENTRY _mesa_LoadMatrixf( const GLfloat *m )
+{
+   GET_CONTEXT;
+          (*CC->API.LoadMatrixf)( CC, m );
+}
+
+
+void APIENTRY _mesa_LoadName( GLuint name )
+{
+   GET_CONTEXT;
+          (*CC->API.LoadName)(CC, name);
+}
+
+
+void APIENTRY _mesa_LogicOp( GLenum opcode )
+{
+   GET_CONTEXT;
+          (*CC->API.LogicOp)(CC, opcode);
+}
+
+
+
+void APIENTRY _mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride,
+                       GLint order, const GLdouble *points )
+{
+   GLfloat *pnts;
+   GLboolean retain;
+   GET_CONTEXT;
+
+   pnts = gl_copy_map_points1d( target, stride, order, points );
+   retain = CC->CompileFlag;
+   (*CC->API.Map1f)( CC, target, u1, u2, stride, order, pnts, retain );
+}
+
+
+void APIENTRY _mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride,
+                       GLint order, const GLfloat *points )
+{
+   GLfloat *pnts;
+   GLboolean retain;
+   GET_CONTEXT;
+
+   pnts = gl_copy_map_points1f( target, stride, order, points );
+   retain = CC->CompileFlag;
+   (*CC->API.Map1f)( CC, target, u1, u2, stride, order, pnts, retain );
+}
+
+
+void APIENTRY _mesa_Map2d( GLenum target,
+                       GLdouble u1, GLdouble u2, GLint ustride, GLint uorder,
+                       GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,
+                       const GLdouble *points )
+{
+   GLfloat *pnts;
+   GLboolean retain;
+   GET_CONTEXT;
+
+   pnts = gl_copy_map_points2d( target, ustride, uorder,
+                                vstride, vorder, points );
+   retain = CC->CompileFlag;
+   (*CC->API.Map2f)( CC, target, u1, u2, ustride, uorder,
+                     v1, v2, vstride, vorder, pnts, retain );
+}
+
+
+void APIENTRY _mesa_Map2f( GLenum target,
+                       GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
+                       GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
+                       const GLfloat *points )
+{
+   GLfloat *pnts;
+   GLboolean retain;
+   GET_CONTEXT;
+
+   pnts = gl_copy_map_points2f( target, ustride, uorder,
+                                vstride, vorder, points );
+   retain = CC->CompileFlag;
+   (*CC->API.Map2f)( CC, target, u1, u2, ustride, uorder,
+                     v1, v2, vstride, vorder, pnts, retain );
+}
+
+
+void APIENTRY _mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 )
+{
+   GET_CONTEXT;
+          (*CC->API.MapGrid1f)( CC, un, (GLfloat) u1, (GLfloat) u2 );
+}
+
+
+void APIENTRY _mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 )
+{
+   GET_CONTEXT;
+          (*CC->API.MapGrid1f)( CC, un, u1, u2 );
+}
+
+
+void APIENTRY _mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2,
+                           GLint vn, GLdouble v1, GLdouble v2 )
+{
+   GET_CONTEXT;
+          (*CC->API.MapGrid2f)( CC, un, (GLfloat) u1, (GLfloat) u2,
+                         vn, (GLfloat) v1, (GLfloat) v2 );
+}
+
+
+void APIENTRY _mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2,
+                           GLint vn, GLfloat v1, GLfloat v2 )
+{
+   GET_CONTEXT;
+          (*CC->API.MapGrid2f)( CC, un, u1, u2, vn, v1, v2 );
+}
+
+
+void APIENTRY _mesa_Materialf( GLenum face, GLenum pname, GLfloat param )
+{
+   GET_CONTEXT;
+          (*CC->API.Materialfv)( CC, face, pname, &param );
+}
+
+
+
+void APIENTRY _mesa_Materiali( GLenum face, GLenum pname, GLint param )
+{
+   GLfloat fparam[4];
+   GET_CONTEXT;
+          fparam[0] = (GLfloat) param;
+   (*CC->API.Materialfv)( CC, face, pname, fparam );
+}
+
+
+void APIENTRY _mesa_Materialfv( GLenum face, GLenum pname, const GLfloat *params )
+{
+   GET_CONTEXT;
+          (*CC->API.Materialfv)( CC, face, pname, params );
+}
+
+
+void APIENTRY _mesa_Materialiv( GLenum face, GLenum pname, const GLint *params )
+{
+   GLfloat fparam[4];
+   GET_CONTEXT;
+          switch (pname) {
+      case GL_AMBIENT:
+      case GL_DIFFUSE:
+      case GL_SPECULAR:
+      case GL_EMISSION:
+      case GL_AMBIENT_AND_DIFFUSE:
+         fparam[0] = INT_TO_FLOAT( params[0] );
+         fparam[1] = INT_TO_FLOAT( params[1] );
+         fparam[2] = INT_TO_FLOAT( params[2] );
+         fparam[3] = INT_TO_FLOAT( params[3] );
+         break;
+      case GL_SHININESS:
+         fparam[0] = (GLfloat) params[0];
+         break;
+      case GL_COLOR_INDEXES:
+         fparam[0] = (GLfloat) params[0];
+         fparam[1] = (GLfloat) params[1];
+         fparam[2] = (GLfloat) params[2];
+         break;
+      default:
+         /* Error will be caught later in gl_Materialfv */
+         ;
+   }
+   (*CC->API.Materialfv)( CC, face, pname, fparam );
+}
+
+
+void APIENTRY _mesa_MatrixMode( GLenum mode )
+{
+   GET_CONTEXT;
+          (*CC->API.MatrixMode)( CC, mode );
+}
+
+
+void APIENTRY _mesa_MultMatrixd( const GLdouble *m )
+{
+   GLfloat fm[16];
+   GLuint i;
+   GET_CONTEXT;
+
+   for (i=0;i<16;i++) {
+      fm[i] = (GLfloat) m[i];
+   }
+
+   (*CC->API.MultMatrixf)( CC, fm );
+}
+
+
+void APIENTRY _mesa_MultMatrixf( const GLfloat *m )
+{
+   GET_CONTEXT;
+          (*CC->API.MultMatrixf)( CC, m );
+}
+
+
+void APIENTRY _mesa_NewList( GLuint list, GLenum mode )
+{
+   GET_CONTEXT;
+          (*CC->API.NewList)(CC, list, mode);
+}
+
+void APIENTRY _mesa_Normal3b( GLbyte nx, GLbyte ny, GLbyte nz )
+{
+   GET_CONTEXT;
+   (*CC->API.Normal3f)( CC, BYTE_TO_FLOAT(nx),
+                        BYTE_TO_FLOAT(ny), BYTE_TO_FLOAT(nz) );
+}
+
+
+void APIENTRY _mesa_Normal3d( GLdouble nx, GLdouble ny, GLdouble nz )
+{
+   GLfloat fx, fy, fz;
+   GET_CONTEXT;
+   if (ABSD(nx)<0.00001)   fx = 0.0F;   else  fx = nx;
+   if (ABSD(ny)<0.00001)   fy = 0.0F;   else  fy = ny;
+   if (ABSD(nz)<0.00001)   fz = 0.0F;   else  fz = nz;
+   (*CC->API.Normal3f)( CC, fx, fy, fz );
+}
+
+
+void APIENTRY _mesa_Normal3f( GLfloat nx, GLfloat ny, GLfloat nz )
+{
+   GET_CONTEXT;
+#ifdef SHORTCUT
+   if (CC->CompileFlag) {
+      (*CC->Save.Normal3f)( CC, nx, ny, nz );
+   }
+   else {
+      /* Execute */
+      CC->Current.Normal[0] = nx;
+      CC->Current.Normal[1] = ny;
+      CC->Current.Normal[2] = nz;
+      CC->VB->MonoNormal = GL_FALSE;
+   }
+#else
+   (*CC->API.Normal3f)( CC, nx, ny, nz );
+#endif
+}
+
+
+void APIENTRY _mesa_Normal3i( GLint nx, GLint ny, GLint nz )
+{
+   GET_CONTEXT;
+   (*CC->API.Normal3f)( CC, INT_TO_FLOAT(nx),
+                        INT_TO_FLOAT(ny), INT_TO_FLOAT(nz) );
+}
+
+
+void APIENTRY _mesa_Normal3s( GLshort nx, GLshort ny, GLshort nz )
+{
+   GET_CONTEXT;
+   (*CC->API.Normal3f)( CC, SHORT_TO_FLOAT(nx),
+                        SHORT_TO_FLOAT(ny), SHORT_TO_FLOAT(nz) );
+}
+
+
+void APIENTRY _mesa_Normal3bv( const GLbyte *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Normal3f)( CC, BYTE_TO_FLOAT(v[0]),
+                        BYTE_TO_FLOAT(v[1]), BYTE_TO_FLOAT(v[2]) );
+}
+
+
+void APIENTRY _mesa_Normal3dv( const GLdouble *v )
+{
+   GLfloat fx, fy, fz;
+   GET_CONTEXT;
+   if (ABSD(v[0])<0.00001)   fx = 0.0F;   else  fx = v[0];
+   if (ABSD(v[1])<0.00001)   fy = 0.0F;   else  fy = v[1];
+   if (ABSD(v[2])<0.00001)   fz = 0.0F;   else  fz = v[2];
+   (*CC->API.Normal3f)( CC, fx, fy, fz );
+}
+
+
+void APIENTRY _mesa_Normal3fv( const GLfloat *v )
+{
+   GET_CONTEXT;
+#ifdef SHORTCUT
+   if (CC->CompileFlag) {
+      (*CC->Save.Normal3fv)( CC, v );
+   }
+   else {
+      /* Execute */
+      GLfloat *n = CC->Current.Normal;
+      n[0] = v[0];
+      n[1] = v[1];
+      n[2] = v[2];
+      CC->VB->MonoNormal = GL_FALSE;
+   }
+#else
+   (*CC->API.Normal3fv)( CC, v );
+#endif
+}
+
+
+void APIENTRY _mesa_Normal3iv( const GLint *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Normal3f)( CC, INT_TO_FLOAT(v[0]),
+                        INT_TO_FLOAT(v[1]), INT_TO_FLOAT(v[2]) );
+}
+
+
+void APIENTRY _mesa_Normal3sv( const GLshort *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Normal3f)( CC, SHORT_TO_FLOAT(v[0]),
+                        SHORT_TO_FLOAT(v[1]), SHORT_TO_FLOAT(v[2]) );
+}
+
+
+void APIENTRY _mesa_NormalPointer( GLenum type, GLsizei stride, const GLvoid *ptr )
+{
+   GET_CONTEXT;
+          (*CC->API.NormalPointer)(CC, type, stride, ptr);
+}
+void APIENTRY _mesa_Ortho( GLdouble left, GLdouble right,
+                       GLdouble bottom, GLdouble top,
+                       GLdouble nearval, GLdouble farval )
+{
+   GET_CONTEXT;
+          (*CC->API.Ortho)(CC, left, right, bottom, top, nearval, farval);
+}
+
+
+void APIENTRY _mesa_PassThrough( GLfloat token )
+{
+   GET_CONTEXT;
+          (*CC->API.PassThrough)(CC, token);
+}
+
+
+void APIENTRY _mesa_PixelMapfv( GLenum map, GLint mapsize, const GLfloat *values )
+{
+   GET_CONTEXT;
+          (*CC->API.PixelMapfv)( CC, map, mapsize, values );
+}
+
+
+void APIENTRY _mesa_PixelMapuiv( GLenum map, GLint mapsize, const GLuint *values )
+{
+   GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
+   GLuint i;
+   GET_CONTEXT;
+
+   if (map==GL_PIXEL_MAP_I_TO_I || map==GL_PIXEL_MAP_S_TO_S) {
+      for (i=0;i<mapsize;i++) {
+         fvalues[i] = (GLfloat) values[i];
+      }
+   }
+   else {
+      for (i=0;i<mapsize;i++) {
+         fvalues[i] = UINT_TO_FLOAT( values[i] );
+      }
+   }
+   (*CC->API.PixelMapfv)( CC, map, mapsize, fvalues );
+}
+
+
+
+void APIENTRY _mesa_PixelMapusv( GLenum map, GLint mapsize, const GLushort *values )
+{
+   GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
+   GLuint i;
+   GET_CONTEXT;
+
+   if (map==GL_PIXEL_MAP_I_TO_I || map==GL_PIXEL_MAP_S_TO_S) {
+      for (i=0;i<mapsize;i++) {
+         fvalues[i] = (GLfloat) values[i];
+      }
+   }
+   else {
+      for (i=0;i<mapsize;i++) {
+         fvalues[i] = USHORT_TO_FLOAT( values[i] );
+      }
+   }
+   (*CC->API.PixelMapfv)( CC, map, mapsize, fvalues );
+}
+
+
+void APIENTRY _mesa_PixelStoref( GLenum pname, GLfloat param )
+{
+   GET_CONTEXT;
+          (*CC->API.PixelStorei)( CC, pname, (GLint) param );
+}
+
+
+void APIENTRY _mesa_PixelStorei( GLenum pname, GLint param )
+{
+   GET_CONTEXT;
+          (*CC->API.PixelStorei)( CC, pname, param );
+}
+
+
+void APIENTRY _mesa_PixelTransferf( GLenum pname, GLfloat param )
+{
+   GET_CONTEXT;
+          (*CC->API.PixelTransferf)(CC, pname, param);
+}
+
+
+void APIENTRY _mesa_PixelTransferi( GLenum pname, GLint param )
+{
+   GET_CONTEXT;
+          (*CC->API.PixelTransferf)(CC, pname, (GLfloat) param);
+}
+
+
+void APIENTRY _mesa_PixelZoom( GLfloat xfactor, GLfloat yfactor )
+{
+   GET_CONTEXT;
+          (*CC->API.PixelZoom)(CC, xfactor, yfactor);
+}
+
+
+void APIENTRY _mesa_PointSize( GLfloat size )
+{
+   GET_CONTEXT;
+          (*CC->API.PointSize)(CC, size);
+}
+
+
+void APIENTRY _mesa_PolygonMode( GLenum face, GLenum mode )
+{
+   GET_CONTEXT;
+          (*CC->API.PolygonMode)(CC, face, mode);
+}
+
+
+void APIENTRY _mesa_PolygonOffset( GLfloat factor, GLfloat units )
+{
+   GET_CONTEXT;
+          (*CC->API.PolygonOffset)( CC, factor, units );
+}
+
+void APIENTRY _mesa_PolygonStipple( const GLubyte *mask )
+{
+   GET_CONTEXT;
+          (*CC->API.PolygonStipple)(CC, mask);
+}
+
+
+void APIENTRY _mesa_PopAttrib( void )
+{
+   GET_CONTEXT;
+          (*CC->API.PopAttrib)(CC);
+}
+
+
+void APIENTRY _mesa_PopClientAttrib( void )
+{
+   GET_CONTEXT;
+          (*CC->API.PopClientAttrib)(CC);
+}
+
+
+void APIENTRY _mesa_PopMatrix( void )
+{
+   GET_CONTEXT;
+          (*CC->API.PopMatrix)( CC );
+}
+
+
+void APIENTRY _mesa_PopName( void )
+{
+   GET_CONTEXT;
+          (*CC->API.PopName)(CC);
+}
+
+
+void APIENTRY _mesa_PrioritizeTextures( GLsizei n, const GLuint *textures,
+                                    const GLclampf *priorities )
+{
+   GET_CONTEXT;
+          (*CC->API.PrioritizeTextures)(CC, n, textures, priorities);
+}
+
+
+void APIENTRY _mesa_PushMatrix( void )
+{
+   GET_CONTEXT;
+          (*CC->API.PushMatrix)( CC );
+}
+
+
+void APIENTRY _mesa_RasterPos2d( GLdouble x, GLdouble y )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) x, (GLfloat) y, 0.0F, 1.0F );
+}
+
+
+void APIENTRY _mesa_RasterPos2f( GLfloat x, GLfloat y )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) x, (GLfloat) y, 0.0F, 1.0F );
+}
+
+
+void APIENTRY _mesa_RasterPos2i( GLint x, GLint y )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) x, (GLfloat) y, 0.0F, 1.0F );
+}
+
+
+void APIENTRY _mesa_RasterPos2s( GLshort x, GLshort y )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) x, (GLfloat) y, 0.0F, 1.0F );
+}
+
+
+void APIENTRY _mesa_RasterPos3d( GLdouble x, GLdouble y, GLdouble z )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F );
+}
+
+
+void APIENTRY _mesa_RasterPos3f( GLfloat x, GLfloat y, GLfloat z )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F );
+}
+
+
+void APIENTRY _mesa_RasterPos3i( GLint x, GLint y, GLint z )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F );
+}
+
+
+void APIENTRY _mesa_RasterPos3s( GLshort x, GLshort y, GLshort z )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F );
+}
+
+
+void APIENTRY _mesa_RasterPos4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) x, (GLfloat) y,
+                               (GLfloat) z, (GLfloat) w );
+}
+
+
+void APIENTRY _mesa_RasterPos4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, x, y, z, w );
+}
+
+
+void APIENTRY _mesa_RasterPos4i( GLint x, GLint y, GLint z, GLint w )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) x, (GLfloat) y,
+                           (GLfloat) z, (GLfloat) w );
+}
+
+
+void APIENTRY _mesa_RasterPos4s( GLshort x, GLshort y, GLshort z, GLshort w )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) x, (GLfloat) y,
+                           (GLfloat) z, (GLfloat) w );
+}
+
+
+void APIENTRY _mesa_RasterPos2dv( const GLdouble *v )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F );
+}
+
+
+void APIENTRY _mesa_RasterPos2fv( const GLfloat *v )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F );
+}
+
+
+void APIENTRY _mesa_RasterPos2iv( const GLint *v )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F );
+}
+
+
+void APIENTRY _mesa_RasterPos2sv( const GLshort *v )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F );
+}
+
+
+/*** 3 element vector ***/
+
+void APIENTRY _mesa_RasterPos3dv( const GLdouble *v )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                           (GLfloat) v[2], 1.0F );
+}
+
+
+void APIENTRY _mesa_RasterPos3fv( const GLfloat *v )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                               (GLfloat) v[2], 1.0F );
+}
+
+
+void APIENTRY _mesa_RasterPos3iv( const GLint *v )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                           (GLfloat) v[2], 1.0F );
+}
+
+
+void APIENTRY _mesa_RasterPos3sv( const GLshort *v )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                           (GLfloat) v[2], 1.0F );
+}
+
+
+void APIENTRY _mesa_RasterPos4dv( const GLdouble *v )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                           (GLfloat) v[2], (GLfloat) v[3] );
+}
+
+
+void APIENTRY _mesa_RasterPos4fv( const GLfloat *v )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, v[0], v[1], v[2], v[3] );
+}
+
+
+void APIENTRY _mesa_RasterPos4iv( const GLint *v )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                           (GLfloat) v[2], (GLfloat) v[3] );
+}
+
+
+void APIENTRY _mesa_RasterPos4sv( const GLshort *v )
+{
+   GET_CONTEXT;
+          (*CC->API.RasterPos4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                           (GLfloat) v[2], (GLfloat) v[3] );
+}
+
+
+void APIENTRY _mesa_ReadBuffer( GLenum mode )
+{
+   GET_CONTEXT;
+          (*CC->API.ReadBuffer)( CC, mode );
+}
+
+
+void APIENTRY _mesa_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height,
+           GLenum format, GLenum type, GLvoid *pixels )
+{
+   GET_CONTEXT;
+          (*CC->API.ReadPixels)( CC, x, y, width, height, format, type, pixels );
+}
+
+
+void APIENTRY _mesa_Rectd( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 )
+{
+   GET_CONTEXT;
+          (*CC->API.Rectf)( CC, (GLfloat) x1, (GLfloat) y1,
+                     (GLfloat) x2, (GLfloat) y2 );
+}
+
+
+void APIENTRY _mesa_Rectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 )
+{
+   GET_CONTEXT;
+          (*CC->API.Rectf)( CC, x1, y1, x2, y2 );
+}
+
+
+void APIENTRY _mesa_Recti( GLint x1, GLint y1, GLint x2, GLint y2 )
+{
+   GET_CONTEXT;
+          (*CC->API.Rectf)( CC, (GLfloat) x1, (GLfloat) y1,
+                         (GLfloat) x2, (GLfloat) y2 );
+}
+
+
+void APIENTRY _mesa_Rects( GLshort x1, GLshort y1, GLshort x2, GLshort y2 )
+{
+   GET_CONTEXT;
+          (*CC->API.Rectf)( CC, (GLfloat) x1, (GLfloat) y1,
+                     (GLfloat) x2, (GLfloat) y2 );
+}
+
+
+void APIENTRY _mesa_Rectdv( const GLdouble *v1, const GLdouble *v2 )
+{
+   GET_CONTEXT;
+          (*CC->API.Rectf)(CC, (GLfloat) v1[0], (GLfloat) v1[1],
+                    (GLfloat) v2[0], (GLfloat) v2[1]);
+}
+
+
+void APIENTRY _mesa_Rectfv( const GLfloat *v1, const GLfloat *v2 )
+{
+   GET_CONTEXT;
+          (*CC->API.Rectf)(CC, v1[0], v1[1], v2[0], v2[1]);
+}
+
+
+void APIENTRY _mesa_Rectiv( const GLint *v1, const GLint *v2 )
+{
+   GET_CONTEXT;
+          (*CC->API.Rectf)( CC, (GLfloat) v1[0], (GLfloat) v1[1],
+                     (GLfloat) v2[0], (GLfloat) v2[1] );
+}
+
+
+void APIENTRY _mesa_Rectsv( const GLshort *v1, const GLshort *v2 )
+{
+   GET_CONTEXT;
+          (*CC->API.Rectf)(CC, (GLfloat) v1[0], (GLfloat) v1[1],
+        (GLfloat) v2[0], (GLfloat) v2[1]);
+}
+
+
+void APIENTRY _mesa_Scissor( GLint x, GLint y, GLsizei width, GLsizei height)
+{
+   GET_CONTEXT;
+          (*CC->API.Scissor)(CC, x, y, width, height);
+}
+
+
+GLboolean APIENTRY _mesa_IsEnabled( GLenum cap )
+{
+   GET_CONTEXT;
+          return (*CC->API.IsEnabled)( CC, cap );
+}
+
+
+
+void APIENTRY _mesa_PushAttrib( GLbitfield mask )
+{
+   GET_CONTEXT;
+          (*CC->API.PushAttrib)(CC, mask);
+}
+
+
+void APIENTRY _mesa_PushClientAttrib( GLbitfield mask )
+{
+   GET_CONTEXT;
+          (*CC->API.PushClientAttrib)(CC, mask);
+}
+
+
+void APIENTRY _mesa_PushName( GLuint name )
+{
+   GET_CONTEXT;
+          (*CC->API.PushName)(CC, name);
+}
+
+
+GLint APIENTRY _mesa_RenderMode( GLenum mode )
+{
+   GET_CONTEXT;
+          return (*CC->API.RenderMode)(CC, mode);
+}
+
+
+void APIENTRY _mesa_Rotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z )
+{
+   GET_CONTEXT;
+          (*CC->API.Rotatef)( CC, (GLfloat) angle,
+                       (GLfloat) x, (GLfloat) y, (GLfloat) z );
+}
+
+
+void APIENTRY _mesa_Rotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z )
+{
+   GET_CONTEXT;
+          (*CC->API.Rotatef)( CC, angle, x, y, z );
+}
+
+
+void APIENTRY _mesa_SelectBuffer( GLsizei size, GLuint *buffer )
+{
+   GET_CONTEXT;
+          (*CC->API.SelectBuffer)(CC, size, buffer);
+}
+
+
+void APIENTRY _mesa_Scaled( GLdouble x, GLdouble y, GLdouble z )
+{
+   GET_CONTEXT;
+          (*CC->API.Scalef)( CC, (GLfloat) x, (GLfloat) y, (GLfloat) z );
+}
+
+
+void APIENTRY _mesa_Scalef( GLfloat x, GLfloat y, GLfloat z )
+{
+   GET_CONTEXT;
+          (*CC->API.Scalef)( CC, x, y, z );
+}
+
+
+void APIENTRY _mesa_ShadeModel( GLenum mode )
+{
+   GET_CONTEXT;
+          (*CC->API.ShadeModel)(CC, mode);
+}
+
+
+void APIENTRY _mesa_StencilFunc( GLenum func, GLint ref, GLuint mask )
+{
+   GET_CONTEXT;
+          (*CC->API.StencilFunc)(CC, func, ref, mask);
+}
+
+
+void APIENTRY _mesa_StencilMask( GLuint mask )
+{
+   GET_CONTEXT;
+          (*CC->API.StencilMask)(CC, mask);
+}
+
+
+void APIENTRY _mesa_StencilOp( GLenum fail, GLenum zfail, GLenum zpass )
+{
+   GET_CONTEXT;
+          (*CC->API.StencilOp)(CC, fail, zfail, zpass);
+}
+
+
+void APIENTRY _mesa_TexCoord1d( GLdouble s )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) s, 0.0, 0.0, 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord1f( GLfloat s )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, s, 0.0, 0.0, 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord1i( GLint s )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) s, 0.0, 0.0, 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord1s( GLshort s )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) s, 0.0, 0.0, 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord2d( GLdouble s, GLdouble t )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord2f)( CC, (GLfloat) s, (GLfloat) t );
+}
+
+
+void APIENTRY _mesa_TexCoord2f( GLfloat s, GLfloat t )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord2f)( CC, s, t );
+}
+
+
+void APIENTRY _mesa_TexCoord2i( GLint s, GLint t )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord2f)( CC, (GLfloat) s, (GLfloat) t );
+}
+
+
+void APIENTRY _mesa_TexCoord2s( GLshort s, GLshort t )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord2f)( CC, (GLfloat) s, (GLfloat) t );
+}
+
+
+void APIENTRY _mesa_TexCoord3d( GLdouble s, GLdouble t, GLdouble r )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) s, (GLfloat) t, (GLfloat) r, 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord3f( GLfloat s, GLfloat t, GLfloat r )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, s, t, r, 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord3i( GLint s, GLint t, GLint r )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) s, (GLfloat) t,
+                               (GLfloat) r, 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord3s( GLshort s, GLshort t, GLshort r )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) s, (GLfloat) t,
+                               (GLfloat) r, 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord4d( GLdouble s, GLdouble t, GLdouble r, GLdouble q )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) s, (GLfloat) t,
+                               (GLfloat) r, (GLfloat) q );
+}
+
+
+void APIENTRY _mesa_TexCoord4f( GLfloat s, GLfloat t, GLfloat r, GLfloat q )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, s, t, r, q );
+}
+
+
+void APIENTRY _mesa_TexCoord4i( GLint s, GLint t, GLint r, GLint q )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) s, (GLfloat) t,
+                               (GLfloat) r, (GLfloat) q );
+}
+
+
+void APIENTRY _mesa_TexCoord4s( GLshort s, GLshort t, GLshort r, GLshort q )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) s, (GLfloat) t,
+                               (GLfloat) r, (GLfloat) q );
+}
+
+
+void APIENTRY _mesa_TexCoord1dv( const GLdouble *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) *v, 0.0, 0.0, 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord1fv( const GLfloat *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, *v, 0.0, 0.0, 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord1iv( const GLint *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, *v, 0.0, 0.0, 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord1sv( const GLshort *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) *v, 0.0, 0.0, 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord2dv( const GLdouble *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord2f)( CC, (GLfloat) v[0], (GLfloat) v[1] );
+}
+
+
+void APIENTRY _mesa_TexCoord2fv( const GLfloat *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord2f)( CC, v[0], v[1] );
+}
+
+
+void APIENTRY _mesa_TexCoord2iv( const GLint *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord2f)( CC, (GLfloat) v[0], (GLfloat) v[1] );
+}
+
+
+void APIENTRY _mesa_TexCoord2sv( const GLshort *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord2f)( CC, (GLfloat) v[0], (GLfloat) v[1] );
+}
+
+
+void APIENTRY _mesa_TexCoord3dv( const GLdouble *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                               (GLfloat) v[2], 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord3fv( const GLfloat *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, v[0], v[1], v[2], 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord3iv( const GLint *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                          (GLfloat) v[2], 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord3sv( const GLshort *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                               (GLfloat) v[2], 1.0 );
+}
+
+
+void APIENTRY _mesa_TexCoord4dv( const GLdouble *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                               (GLfloat) v[2], (GLfloat) v[3] );
+}
+
+
+void APIENTRY _mesa_TexCoord4fv( const GLfloat *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, v[0], v[1], v[2], v[3] );
+}
+
+
+void APIENTRY _mesa_TexCoord4iv( const GLint *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                               (GLfloat) v[2], (GLfloat) v[3] );
+}
+
+
+void APIENTRY _mesa_TexCoord4sv( const GLshort *v )
+{
+   GET_CONTEXT;
+   (*CC->API.TexCoord4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                               (GLfloat) v[2], (GLfloat) v[3] );
+}
+
+
+void APIENTRY _mesa_TexCoordPointer( GLint size, GLenum type, GLsizei stride,
+                        const GLvoid *ptr )
+{
+   GET_CONTEXT;
+          (*CC->API.TexCoordPointer)(CC, size, type, stride, ptr);
+}
+
+
+void APIENTRY _mesa_TexGend( GLenum coord, GLenum pname, GLdouble param )
+{
+   GLfloat p = (GLfloat) param;
+   GET_CONTEXT;
+          (*CC->API.TexGenfv)( CC, coord, pname, &p );
+}
+
+
+void APIENTRY _mesa_TexGenf( GLenum coord, GLenum pname, GLfloat param )
+{
+   GET_CONTEXT;
+          (*CC->API.TexGenfv)( CC, coord, pname, &param );
+}
+
+
+void APIENTRY _mesa_TexGeni( GLenum coord, GLenum pname, GLint param )
+{
+   GLfloat p = (GLfloat) param;
+   GET_CONTEXT;
+          (*CC->API.TexGenfv)( CC, coord, pname, &p );
+}
+
+
+void APIENTRY _mesa_TexGendv( GLenum coord, GLenum pname, const GLdouble *params )
+{
+   GLfloat p[4];
+   GET_CONTEXT;
+          p[0] = params[0];
+   p[1] = params[1];
+   p[2] = params[2];
+   p[3] = params[3];
+   (*CC->API.TexGenfv)( CC, coord, pname, p );
+}
+
+
+void APIENTRY _mesa_TexGeniv( GLenum coord, GLenum pname, const GLint *params )
+{
+   GLfloat p[4];
+   GET_CONTEXT;
+          p[0] = params[0];
+   p[1] = params[1];
+   p[2] = params[2];
+   p[3] = params[3];
+   (*CC->API.TexGenfv)( CC, coord, pname, p );
+}
+
+
+void APIENTRY _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
+{
+   GET_CONTEXT;
+          (*CC->API.TexGenfv)( CC, coord, pname, params );
+}
+
+
+
+
+void APIENTRY _mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param )
+{
+   GET_CONTEXT;
+          (*CC->API.TexEnvfv)( CC, target, pname, &param );
+}
+
+
+
+void APIENTRY _mesa_TexEnvi( GLenum target, GLenum pname, GLint param )
+{
+   GLfloat p[4];
+   GET_CONTEXT;
+   p[0] = (GLfloat) param;
+   p[1] = p[2] = p[3] = 0.0;
+          (*CC->API.TexEnvfv)( CC, target, pname, p );
+}
+
+
+
+void APIENTRY _mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param )
+{
+   GET_CONTEXT;
+          (*CC->API.TexEnvfv)( CC, target, pname, param );
+}
+
+
+
+void APIENTRY _mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param )
+{
+   GLfloat p[4];
+   GET_CONTEXT;
+   p[0] = INT_TO_FLOAT( param[0] );
+   p[1] = INT_TO_FLOAT( param[1] );
+   p[2] = INT_TO_FLOAT( param[2] );
+   p[3] = INT_TO_FLOAT( param[3] );
+          (*CC->API.TexEnvfv)( CC, target, pname, p );
+}
+
+
+void APIENTRY _mesa_TexImage1D( GLenum target, GLint level, GLint internalformat,
+                            GLsizei width, GLint border,
+                            GLenum format, GLenum type, const GLvoid *pixels )
+{
+   struct gl_image *teximage;
+   GET_CONTEXT;
+          teximage = gl_unpack_image( CC, width, 1, format, type, pixels );
+   (*CC->API.TexImage1D)( CC, target, level, internalformat,
+                          width, border, format, type, teximage );
+}
+
+
+
+void APIENTRY _mesa_TexImage2D( GLenum target, GLint level, GLint internalformat,
+                            GLsizei width, GLsizei height, GLint border,
+                            GLenum format, GLenum type, const GLvoid *pixels )
+{
+  struct gl_image *teximage;
+
+  GET_CONTEXT;
+
+  teximage = gl_unpack_image( CC, width, height, format, type, pixels );
+  (*CC->API.TexImage2D)( CC, target, level, internalformat,
+             width, height, border, format, type, teximage );
+}
+
+
+void APIENTRY _mesa_TexParameterf( GLenum target, GLenum pname, GLfloat param )
+{
+   GET_CONTEXT;
+          (*CC->API.TexParameterfv)( CC, target, pname, &param );
+}
+
+
+void APIENTRY _mesa_TexParameteri( GLenum target, GLenum pname, GLint param )
+{
+   GLfloat fparam[4];
+   GET_CONTEXT;
+   fparam[0] = (GLfloat) param;
+   fparam[1] = fparam[2] = fparam[3] = 0.0;
+          (*CC->API.TexParameterfv)( CC, target, pname, fparam );
+}
+
+
+void APIENTRY _mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params )
+{
+   GET_CONTEXT;
+          (*CC->API.TexParameterfv)( CC, target, pname, params );
+}
+
+
+void APIENTRY _mesa_TexParameteriv( GLenum target, GLenum pname, const GLint *params )
+{
+   GLfloat p[4];
+   GET_CONTEXT;
+          if (pname==GL_TEXTURE_BORDER_COLOR) {
+      p[0] = INT_TO_FLOAT( params[0] );
+      p[1] = INT_TO_FLOAT( params[1] );
+      p[2] = INT_TO_FLOAT( params[2] );
+      p[3] = INT_TO_FLOAT( params[3] );
+   }
+   else {
+      p[0] = (GLfloat) params[0];
+      p[1] = (GLfloat) params[1];
+      p[2] = (GLfloat) params[2];
+      p[3] = (GLfloat) params[3];
+   }
+   (*CC->API.TexParameterfv)( CC, target, pname, p );
+}
+
+
+void APIENTRY _mesa_TexSubImage1D( GLenum target, GLint level, GLint xoffset,
+                               GLsizei width, GLenum format,
+                               GLenum type, const GLvoid *pixels )
+{
+   struct gl_image *image;
+   GET_CONTEXT;
+   image = gl_unpack_texsubimage( CC, width, 1, format, type, pixels );
+   (*CC->API.TexSubImage1D)( CC, target, level, xoffset, width,
+                             format, type, image );
+}
+
+
+void APIENTRY _mesa_TexSubImage2D( GLenum target, GLint level,
+                               GLint xoffset, GLint yoffset,
+                               GLsizei width, GLsizei height,
+                               GLenum format, GLenum type,
+                               const GLvoid *pixels )
+{
+   struct gl_image *image;
+   GET_CONTEXT;
+   image = gl_unpack_texsubimage( CC, width, height, format, type, pixels );
+   (*CC->API.TexSubImage2D)( CC, target, level, xoffset, yoffset,
+                             width, height, format, type, image );
+}
+
+
+void APIENTRY _mesa_Translated( GLdouble x, GLdouble y, GLdouble z )
+{
+   GET_CONTEXT;
+   (*CC->API.Translatef)( CC, (GLfloat) x, (GLfloat) y, (GLfloat) z );
+}
+
+
+void APIENTRY _mesa_Translatef( GLfloat x, GLfloat y, GLfloat z )
+{
+   GET_CONTEXT;
+   (*CC->API.Translatef)( CC, x, y, z );
+}
+
+
+void APIENTRY _mesa_Vertex2d( GLdouble x, GLdouble y )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex2f)( CC, (GLfloat) x, (GLfloat) y );
+}
+
+
+void APIENTRY _mesa_Vertex2f( GLfloat x, GLfloat y )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex2f)( CC, x, y );
+}
+
+
+void APIENTRY _mesa_Vertex2i( GLint x, GLint y )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex2f)( CC, (GLfloat) x, (GLfloat) y );
+}
+
+
+void APIENTRY _mesa_Vertex2s( GLshort x, GLshort y )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex2f)( CC, (GLfloat) x, (GLfloat) y );
+}
+
+
+void APIENTRY _mesa_Vertex3d( GLdouble x, GLdouble y, GLdouble z )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex3f)( CC, (GLfloat) x, (GLfloat) y, (GLfloat) z );
+}
+
+
+void APIENTRY _mesa_Vertex3f( GLfloat x, GLfloat y, GLfloat z )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex3f)( CC, x, y, z );
+}
+
+
+void APIENTRY _mesa_Vertex3i( GLint x, GLint y, GLint z )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex3f)( CC, (GLfloat) x, (GLfloat) y, (GLfloat) z );
+}
+
+
+void APIENTRY _mesa_Vertex3s( GLshort x, GLshort y, GLshort z )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex3f)( CC, (GLfloat) x, (GLfloat) y, (GLfloat) z );
+}
+
+
+void APIENTRY _mesa_Vertex4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex4f)( CC, (GLfloat) x, (GLfloat) y,
+                            (GLfloat) z, (GLfloat) w );
+}
+
+
+void APIENTRY _mesa_Vertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex4f)( CC, x, y, z, w );
+}
+
+
+void APIENTRY _mesa_Vertex4i( GLint x, GLint y, GLint z, GLint w )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex4f)( CC, (GLfloat) x, (GLfloat) y,
+                            (GLfloat) z, (GLfloat) w );
+}
+
+
+void APIENTRY _mesa_Vertex4s( GLshort x, GLshort y, GLshort z, GLshort w )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex4f)( CC, (GLfloat) x, (GLfloat) y,
+                            (GLfloat) z, (GLfloat) w );
+}
+
+
+void APIENTRY _mesa_Vertex2dv( const GLdouble *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex2f)( CC, (GLfloat) v[0], (GLfloat) v[1] );
+}
+
+
+void APIENTRY _mesa_Vertex2fv( const GLfloat *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex2f)( CC, v[0], v[1] );
+}
+
+
+void APIENTRY _mesa_Vertex2iv( const GLint *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex2f)( CC, (GLfloat) v[0], (GLfloat) v[1] );
+}
+
+
+void APIENTRY _mesa_Vertex2sv( const GLshort *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex2f)( CC, (GLfloat) v[0], (GLfloat) v[1] );
+}
+
+
+void APIENTRY _mesa_Vertex3dv( const GLdouble *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex3f)( CC, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] );
+}
+
+
+void APIENTRY _mesa_Vertex3fv( const GLfloat *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex3fv)( CC, v );
+}
+
+
+void APIENTRY _mesa_Vertex3iv( const GLint *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex3f)( CC, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] );
+}
+
+
+void APIENTRY _mesa_Vertex3sv( const GLshort *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex3f)( CC, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2] );
+}
+
+
+void APIENTRY _mesa_Vertex4dv( const GLdouble *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                            (GLfloat) v[2], (GLfloat) v[3] );
+}
+
+
+void APIENTRY _mesa_Vertex4fv( const GLfloat *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex4f)( CC, v[0], v[1], v[2], v[3] );
+}
+
+
+void APIENTRY _mesa_Vertex4iv( const GLint *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                            (GLfloat) v[2], (GLfloat) v[3] );
+}
+
+
+void APIENTRY _mesa_Vertex4sv( const GLshort *v )
+{
+   GET_CONTEXT;
+   (*CC->API.Vertex4f)( CC, (GLfloat) v[0], (GLfloat) v[1],
+                            (GLfloat) v[2], (GLfloat) v[3] );
+}
+
+
+void APIENTRY _mesa_VertexPointer( GLint size, GLenum type, GLsizei stride,
+                               const GLvoid *ptr )
+{
+   GET_CONTEXT;
+   (*CC->API.VertexPointer)(CC, size, type, stride, ptr);
+}
+
+
+void APIENTRY _mesa_Viewport( GLint x, GLint y, GLsizei width, GLsizei height )
+{
+   GET_CONTEXT;
+   (*CC->API.Viewport)( CC, x, y, width, height );
+}
+
+/* GL_EXT_paletted_texture */
+
+void APIENTRY _mesa_ColorTableEXT( GLenum target, GLenum internalFormat,
+                               GLsizei width, GLenum format, GLenum type,
+                               const GLvoid *table )
+{
+   struct gl_image *image;
+   GET_CONTEXT;
+   image = gl_unpack_image( CC, width, 1, format, type, table );
+   (*CC->API.ColorTable)( CC, target, internalFormat, image );
+   if (image->RefCount == 0)
+      gl_free_image(image);
+}
+
+
+void APIENTRY _mesa_ColorSubTableEXT( GLenum target, GLsizei start, GLsizei count,
+                                  GLenum format, GLenum type,
+                                  const GLvoid *data )
+{
+   struct gl_image *image;
+   GET_CONTEXT;
+   image = gl_unpack_image( CC, count, 1, format, type, data );
+   (*CC->API.ColorSubTable)( CC, target, start, image );
+   if (image->RefCount == 0)
+      gl_free_image(image);
+}
+
+void APIENTRY _mesa_GetColorTableEXT( GLenum target, GLenum format,
+                                  GLenum type, GLvoid *table )
+{
+   GET_CONTEXT;
+   (*CC->API.GetColorTable)(CC, target, format, type, table);
+}
+
+
+void APIENTRY _mesa_GetColorTableParameterivEXT( GLenum target, GLenum pname,
+                                             GLint *params )
+{
+   GET_CONTEXT;
+   (*CC->API.GetColorTableParameteriv)(CC, target, pname, params);
+}
+
+
+void APIENTRY _mesa_GetColorTableParameterfvEXT( GLenum target, GLenum pname,
+                                             GLfloat *params )
+{
+   GLint iparams;
+   _mesa_GetColorTableParameterivEXT( target, pname, &iparams );
+   *params = (GLfloat) iparams;
+}
+/* End GL_EXT_paletted_texture */
diff --git a/dll/opengl/mesa/api.h b/dll/opengl/mesa/api.h
new file mode 100644 (file)
index 0000000..0d0064f
--- /dev/null
@@ -0,0 +1,83 @@
+/* $Id: api.h,v 1.4 1998/02/04 00:38:24 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.4
+ * Copyright (C) 1995-1997  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: api.h,v $
+ * Revision 1.4  1998/02/04 00:38:24  brianp
+ * WIN32 patch from Oleg Letsinsky
+ *
+ * Revision 1.3  1998/02/04 00:13:35  brianp
+ * updated for Cygnus (Stephane Rehel)
+ *
+ * Revision 1.2  1997/11/25 03:20:09  brianp
+ * simple clean-ups for multi-threading (John Stone)
+ *
+ * Revision 1.1  1997/08/22 01:42:26  brianp
+ * Initial revision
+ *
+ */
+
+
+/*
+ * The original api.c file has been split into two files:  api1.c and api2.c
+ * because some compilers complained that api.c was too big.
+ *
+ * This header contains stuff only included by api1.c and api2.c
+ */
+
+
+#ifndef API_H
+#define API_H
+
+
+/*
+ * Single/multiple thread context selection.
+ */
+#ifdef THREADS
+
+/* Get the context associated with the calling thread */
+#define GET_CONTEXT    GLcontext *CC = gl_get_thread_context()
+
+#else
+
+/* CC is a global pointer for all threads in the address space */
+#define GET_CONTEXT
+
+#endif /* THREADS */
+
+
+/*
+ * An optimization in a few performance-critical functions.
+ */
+#define SHORTCUT
+
+
+/*
+ * Windows 95/NT DLL stuff.
+ */
+#if !defined(WIN32) && !defined(WINDOWS_NT) && !defined(__CYGWIN32__)
+#define APIENTRY
+#endif
+
+
+#endif
diff --git a/dll/opengl/mesa/asm-386.S b/dll/opengl/mesa/asm-386.S
new file mode 100644 (file)
index 0000000..c4979b8
--- /dev/null
@@ -0,0 +1,1644 @@
+/* $Id: asm-386.S,v 1.8 1997/12/17 00:50:51 brianp Exp $ */
+
+/*
+ * asm-386.S - special (hopefully faster) transformation functions for x86
+ *
+ * by Josh Vanderhoof
+ *
+ * This file is in the public domain.
+ */
+
+/*
+ * $Log: asm-386.S,v $
+ * Revision 1.8  1997/12/17 00:50:51  brianp
+ * applied Josh's patch to fix texture coordinate transformation bugs
+ *
+ * Revision 1.7  1997/12/17 00:27:11  brianp
+ * applied Josh's patch to fix bfris
+ *
+ * Revision 1.6  1997/12/01 01:02:41  brianp
+ * added FreeBSD patches (Daniel J. O'Connor)
+ *
+ * Revision 1.5  1997/11/19 23:52:17  brianp
+ * added missing "cld" instruction in asm_transform_points4_identity()
+ *
+ * Revision 1.4  1997/11/11 02:22:41  brianp
+ * small change per Josh to ensure U/V pairing
+ *
+ * Revision 1.3  1997/11/07 03:37:24  brianp
+ * added missing line from Stephane Rehel
+ *
+ * Revision 1.2  1997/11/07 03:30:37  brianp
+ * added Josh's 11-5-97 patches
+ *
+ * Revision 1.1  1997/10/30 06:00:33  brianp
+ * Initial revision
+ */
+
+#include <asm.inc>
+
+#define S(x)    dword ptr [esi + 4*x]
+#define D(x)    dword ptr [edi + 4*x]
+#define M(x, y) dword ptr [edx + 16*x + 4*y]
+
+.code
+
+/*
+ * void asm_transform_points3_general( GLuint n, GLfloat d[][4],
+ *                                     GLfloat m[16], GLfloat s[][4] );
+ */
+PUBLIC _asm_transform_points3_general
+_asm_transform_points3_general:
+.align 4
+       push esi
+       push edi
+
+       mov ecx, [esp + 12]         /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov edx, [esp + 20]     /* edx = m */
+       mov esi, [esp + 24]     /* esi = s */
+
+       test ecx, ecx
+       jz _asm_transform_points3_general_end
+
+.align 4
+_asm_transform_points3_general_loop:
+       fld S(0)
+       fmul M(0, 0)
+       fld S(0)
+       fmul M(0, 1)
+       fld S(0)
+       fmul M(0, 2)
+       fld S(0)
+       fmul M(0, 3)
+
+       fld S(1)
+       fmul M(1, 0)
+       fld S(1)
+       fmul M(1, 1)
+       fld S(1)
+       fmul M(1, 2)
+       fld S(1)
+       fmul M(1, 3)
+
+       /*
+        * The FPU stack should now look like this:
+        *
+        * st(7) = S(0) * M(0, 0)
+        * st(6) = S(0) * M(0, 1)
+        * st(5) = S(0) * M(0, 2)
+        * st(4) = S(0) * M(0, 3)
+        * st(3) = S(1) * M(1, 0)
+        * st(2) = S(1) * M(1, 1)
+        * st(1) = S(1) * M(1, 2)
+        * st(0) = S(1) * M(1, 3)
+        */
+
+       fxch st(3)              /* 3 1 2 0 4 5 6 7 */
+       faddp st(7), st         /* 1 2 0 4 5 6 7 */
+       fxch st(1)              /* 2 1 0 4 5 6 7 */
+       faddp st(5), st         /* 1 0 4 5 6 7 */
+       faddp st(3), st         /* 0 4 5 6 7 */
+       faddp st(1), st         /* 4 5 6 7 */
+
+       /*
+        * st(3) = S(0) * M(0, 0) + S(1) * M(1, 0)
+        * st(2) = S(0) * M(0, 1) + S(1) * M(1, 1)
+        * st(1) = S(0) * M(0, 2) + S(1) * M(1, 2)
+        * st(0) = S(0) * M(0, 3) + S(1) * M(1, 3)
+        */
+
+       fld S(2)
+       fmul M(2, 0)
+       fld S(2)
+       fmul M(2, 1)
+       fld S(2)
+       fmul M(2, 2)
+       fld S(2)
+       fmul M(2, 3)
+
+       /*
+        * st(7) = S(0) * M(0, 0) + S(1) * M(1, 0)
+        * st(6) = S(0) * M(0, 1) + S(1) * M(1, 1)
+        * st(5) = S(0) * M(0, 2) + S(1) * M(1, 2)
+        * st(4) = S(0) * M(0, 3) + S(1) * M(1, 3)
+        * st(3) = S(2) * M(2, 0)
+        * st(2) = S(2) * M(2, 1)
+        * st(1) = S(2) * M(2, 2)
+        * st(0) = S(2) * M(2, 3)
+        */
+
+       fxch st(3)          /* 3 1 2 0 4 5 6 7 */
+       faddp st(7), st         /* 1 2 0 4 5 6 7 */
+       fxch st(1)          /* 2 1 0 4 5 6 7 */
+       faddp st(5), st     /* 1 0 4 5 6 7 */
+       faddp st(3), st     /* 0 4 5 6 7 */
+       faddp st(1), st     /* 4 5 6 7 */
+
+       /*
+        * st(3) = S(0) * M(0, 0) + S(1) * M(1, 0) + S(2) * M(2, 0)
+        * st(2) = S(0) * M(0, 1) + S(1) * M(1, 1) + S(2) * M(2, 1)
+        * st(1) = S(0) * M(0, 2) + S(1) * M(1, 2) + S(2) * M(2, 2)
+        * st(0) = S(0) * M(0, 3) + S(1) * M(1, 3) + S(2) * M(2, 3)
+        */
+
+       fxch st(3)      /* 3 1 2 0 */
+       fadd M(3, 0)
+       fxch st(2)      /* 2 1 3 0 */
+       fadd M(3, 1)
+       fxch st(1)      /* 1 2 3 0 */
+       fadd M(3, 2)
+       fxch st(3)      /* 0 2 3 1 */
+       fadd M(3, 3)
+
+       /*
+        * st(3) = S(0) * M(0, 2) + S(1) * M(1, 2) + S(2) * M(2, 2) + M(3, 2)
+        * st(2) = S(0) * M(0, 0) + S(1) * M(1, 0) + S(2) * M(2, 0) + M(3, 0)
+        * st(1) = S(0) * M(0, 1) + S(1) * M(1, 1) + S(2) * M(2, 1) + M(3, 1)
+        * st(0) = S(0) * M(0, 3) + S(1) * M(1, 3) + S(2) * M(2, 3) + M(3, 3)
+        */
+
+       fxch st(3)      /* 3 1 2 0 */
+       fstp D(2)       /* 1 2 0 */
+       fxch st(1)      /* 2 1 0 */
+       fstp D(0)       /* 1 0 */
+       lea esi, S(4)
+       fstp D(1)       /* 0 */
+       dec ecx
+       fstp D(3)       /* */
+
+       lea edi, D(4)
+
+       jnz _asm_transform_points3_general_loop
+
+_asm_transform_points3_general_end:
+       pop edi
+       pop esi
+       ret
+
+
+/*
+ * void asm_transform_points3_identity( GLuint n, GLfloat d[][4],
+ *                                      GLfloat s[][4] );
+ */
+PUBLIC _asm_transform_points3_identity
+_asm_transform_points3_identity:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov esi, [esp + 20]     /* esi = s */
+       push ebx
+       push ebp
+
+       test ecx, ecx
+       jz _asm_transform_points3_identity_end
+
+       mov ebp, HEX(3f800000)
+
+.align 4
+_asm_transform_points3_identity_loop:
+       mov eax, S(0)
+       mov edx, S(1)
+       mov ebx, S(2)
+       lea esi, S(4)
+       mov D(0), eax
+       mov D(1), edx
+       mov D(2), ebx
+       mov D(3), ebp
+       dec ecx
+       lea edi, D(4)
+       jnz _asm_transform_points3_identity_loop
+
+_asm_transform_points3_identity_end:
+       pop ebp
+       pop ebx
+       pop edi
+       pop esi
+       ret
+
+
+/*
+ * void asm_transform_points3_2d( GLuint n, GLfloat d[][4], GLfloat m[16],
+ *                                GLfloat s[][4] );
+ */
+PUBLIC _asm_transform_points3_2d
+_asm_transform_points3_2d:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov edx, [esp + 20]     /* edx = m */
+       mov esi, [esp + 24]     /* esi = s */
+       push ebp
+
+       mov ebp, HEX(3f800000)
+
+       test cl, DEC(1)
+       jz _asm_transform_points3_2d_step
+
+       dec ecx
+
+       fld S(0)
+       fmul M(0, 0)
+       fld S(0)
+       fmul M(0, 1)
+       fld S(1)
+       fmul M(1, 0)
+       fld S(1)
+       fmul M(1, 1)
+
+       /*
+        * st(3) = S(0) * M(0, 0)
+        * st(2) = S(0) * M(0, 1)
+        * st(1) = S(1) * M(1, 0)
+        * st(0) = S(1) * M(1, 1)
+        */
+
+       fxch st(1)      /* 1 0 2 3 */
+       fadd M(3, 0)
+       fxch st(1)      /* 0 1 2 3 */
+       fadd M(3, 1)
+       fxch st(1)      /* 1 0 2 3 */
+       faddp st(3), st         /* 0 2 3 */
+       faddp st(1), st         /* 2 3 */
+       fstp D(1)       /* 3 */
+       fstp D(0)       /* */
+       mov eax, S(2)
+       lea esi, S(4)
+       mov D(3), ebp
+       mov D(2), eax
+       lea edi, D(4)
+
+_asm_transform_points3_2d_step:
+       test ecx, ecx
+       jz _asm_transform_points3_2d_end
+
+.align 4
+_asm_transform_points3_2d_loop:
+       fld S(0)
+       fmul M(0, 0)
+       fld S(0)
+       fmul M(0, 1)
+       fld S(4)
+       fmul M(0, 0)
+       fld S(4)
+       fmul M(0, 1)
+       fld S(1)
+       fmul M(1, 0)
+       fld S(1)
+       fmul M(1, 1)
+       fld S(5)
+       fmul M(1, 0)
+       fld S(5)
+       fmul M(1, 1)
+
+       /*
+        * st(7) = S(0) * M(0, 0)
+        * st(6) = S(0) * M(0, 1)
+        * st(5) = S(4) * M(0, 0)
+        * st(4) = S(4) * M(0, 1)
+        * st(3) = S(1) * M(1, 0)
+        * st(2) = S(1) * M(1, 1)
+        * st(1) = S(5) * M(1, 0)
+        * st(0) = S(5) * M(1, 1)
+        */
+
+       fxch st(7)      /* 7 1 2 3 4 5 6 0 */
+       fadd M(3, 0)
+       fxch st(6)      /* 6 1 2 3 4 5 7 0 */
+       fadd M(3, 1)
+       fxch st(5)      /* 5 1 2 3 4 6 7 0 */
+       fadd M(3, 0)
+       fxch st(4)      /* 4 1 2 3 5 6 7 0 */
+       fadd M(3, 1)
+
+       mov eax, S(2)
+       mov D(3), ebp
+       mov D(2), eax
+       mov eax, S(6)
+       mov D(7), ebp
+       mov D(6), eax
+       lea esi, S(8)
+       sub ecx, DEC(2)
+
+       /*
+        * st(7) = S(5) * M(1, 1)
+        * st(6) = S(0) * M(0, 0) + M(3, 0)
+        * st(5) = S(0) * M(0, 1) + M(3, 1)
+        * st(4) = S(4) * M(0, 0) + M(3, 0)
+        * st(3) = S(1) * M(1, 0)
+        * st(2) = S(1) * M(1, 1)
+        * st(1) = S(5) * M(1, 0)
+        * st(0) = S(4) * M(0, 1) + M(3, 1)
+        */
+
+       faddp st(7), st         /* 1 2 3 4 5 6 7 */
+       faddp st(3), st         /* 2 3 4 5 6 7 */
+       faddp st(3), st         /* 3 4 5 6 7 */
+       faddp st(3), st         /* 4 5 6 7 */
+       fxch st(3)      /* 7 5 6 4 */
+       fstp D(5)       /* 5 6 4 */
+       fstp D(1)       /* 6 4 */
+       fstp D(0)       /* 4 */
+       fstp D(4)       /* */
+
+       lea edi, D(8)
+       jnz _asm_transform_points3_2d_loop
+
+_asm_transform_points3_2d_end:
+       pop ebp
+       pop edi
+       pop esi
+       ret
+
+
+/*
+ * void asm_transform_points3_2d_no_rot( GLuint n, GLfloat d[][4],
+ *                                       GLfloat m[16], GLfloat s[][4] );
+ *
+ */
+PUBLIC _asm_transform_points3_2d_no_rot
+_asm_transform_points3_2d_no_rot:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov edx, [esp + 20]     /* edx = m */
+       mov esi, [esp + 24]     /* esi = s */
+       push ebp
+
+       test ecx, ecx
+       jz _asm_transform_points3_2d_no_rot_end
+
+       mov ebp, HEX(3f800000)
+
+.align 4
+_asm_transform_points3_2d_no_rot_loop:
+       fld S(0)
+       fmul M(0, 0)
+       fld S(1)
+       fmul M(1, 1)
+       fxch st(1)
+       fadd M(3, 0)
+       fxch st(1)
+       fadd M(3, 1)
+       fxch st(1)
+       fstp D(0)
+       fstp D(1)
+
+       mov eax, S(2)   /* cycle 1: U pipe */
+       mov D(3), ebp   /*          V pipe */
+       mov D(2), eax   /* cycle 2: U pipe */
+
+       dec ecx
+       lea esi, S(4)
+       lea edi, D(4)
+       jnz _asm_transform_points3_2d_no_rot_loop
+
+_asm_transform_points3_2d_no_rot_end:
+       pop ebp
+       pop edi
+       pop esi
+       ret
+
+
+
+/*
+ * void asm_transform_points3_3d( GLuint n, GLfloat d[][4], GLfloat m[16],
+ *                                GLfloat s[][4] );
+ */
+PUBLIC _asm_transform_points3_3d
+_asm_transform_points3_3d:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov edx, [esp + 20]     /* edx = m */
+       mov esi, [esp + 24]     /* esi = s */
+
+       test ecx, ecx
+       jz _asm_transform_points3_3d_end
+
+       mov eax, HEX(3f800000)
+
+.align 4
+_asm_transform_points3_3d_loop:
+       fld S(0)
+       fmul M(0, 0)
+       fld S(0)
+       fmul M(0, 1)
+       fld S(0)
+       fmul M(0, 2)
+
+       fld S(1)
+       fmul M(1, 0)
+       fld S(1)
+       fmul M(1, 1)
+       fld S(1)
+       fmul M(1, 2)
+
+       /*
+        * st(5) = S(0) * M(0, 0)
+        * st(4) = S(0) * M(0, 1)
+        * st(3) = S(0) * M(0, 2)
+        * st(2) = S(1) * M(1, 0)
+        * st(1) = S(1) * M(1, 1)
+        * st(0) = S(1) * M(1, 2)
+        */
+
+       fxch st(2)              /* 2 1 0 3 4 5 */
+       faddp st(5), st /* 1 0 3 4 5 */
+       faddp st(3), st /* 0 3 4 5 */
+       faddp st(1), st /* 3 4 5 */
+
+       /*
+        * st(2) = S(0) * M(0, 0) + S(1) * M(1, 0)
+        * st(1) = S(0) * M(0, 1) + S(1) * M(1, 1)
+        * st(0) = S(0) * M(0, 2) + S(1) * M(1, 2)
+        */
+
+       fld S(2)
+       fmul M(2, 0)
+       fld S(2)
+       fmul M(2, 1)
+       fld S(2)
+       fmul M(2, 2)
+
+       /*
+        * st(5) = S(0) * M(0, 0) + S(1) * M(1, 0)
+        * st(4) = S(0) * M(0, 1) + S(1) * M(1, 1)
+        * st(3) = S(0) * M(0, 2) + S(1) * M(1, 2)
+        * st(2) = S(2) * M(2, 0)
+        * st(1) = S(2) * M(2, 1)
+        * st(0) = S(2) * M(2, 2)
+        */
+
+       fxch st(2)              /* 2 1 0 3 4 5 */
+       faddp st(5), st /* 1 0 3 4 5 */
+       faddp st(3), st /* 0 3 4 5 */
+       faddp st(1), st /* 3 4 5 */
+
+       /*
+        * st(2) = S(0) * M(0, 0) + S(1) * M(1, 0) + S(2) * M(2, 0)
+        * st(1) = S(0) * M(0, 1) + S(1) * M(1, 1) + S(2) * M(2, 1)
+        * st(0) = S(0) * M(0, 2) + S(1) * M(1, 2) + S(2) * M(2, 2)
+        */
+
+       fxch st(2)      /* 2 1 0 */
+       fadd M(3, 0)
+       fxch st(1)      /* 1 2 0 */
+       fadd M(3, 1)
+       fxch st(2)      /* 0 2 1 */
+       fadd M(3, 2)
+
+       fxch st(1)      /* 2 0 1 */
+       fstp D(0)       /* 0 1 */
+       fstp D(2)       /* 1 */
+       fstp D(1)       /* */
+       mov D(3), eax
+
+       lea esi, S(4)
+       dec ecx
+
+       lea edi, D(4)
+
+       jnz _asm_transform_points3_3d_loop
+
+_asm_transform_points3_3d_end:
+       pop edi
+       pop esi
+       ret
+
+
+
+/*
+ * void asm_transform_points4_general( GLuint n, GLfloat d[][4],
+ *                                     GLfloat m[16], GLfloat s[][4] );
+ */
+PUBLIC _asm_transform_points4_general
+_asm_transform_points4_general:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov edx, [esp + 20]     /* edx = m */
+       mov esi, [esp + 24]     /* esi = s */
+
+       test ecx, ecx
+       jz _asm_transform_points4_general_end
+
+.align 4
+_asm_transform_points4_general_loop:
+       fld S(0)
+       fmul M(0, 0)
+       fld S(0)
+       fmul M(0, 1)
+       fld S(0)
+       fmul M(0, 2)
+       fld S(0)
+       fmul M(0, 3)
+
+       fld S(1)
+       fmul M(1, 0)
+       fld S(1)
+       fmul M(1, 1)
+       fld S(1)
+       fmul M(1, 2)
+       fld S(1)
+       fmul M(1, 3)
+
+       /*
+        * st(7) = S(0) * M(0, 0)
+        * st(6) = S(0) * M(0, 1)
+        * st(5) = S(0) * M(0, 2)
+        * st(4) = S(0) * M(0, 3)
+        * st(3) = S(1) * M(1, 0)
+        * st(2) = S(1) * M(1, 1)
+        * st(1) = S(1) * M(1, 2)
+        * st(0) = S(1) * M(1, 3)
+        */
+
+       fxch st(3)              /* 3 1 2 0 4 5 6 7 */
+       faddp st(7), st /* 1 2 0 4 5 6 7 */
+       fxch st(1)              /* 2 1 0 4 5 6 7 */
+       faddp st(5), st /* 1 0 4 5 6 7 */
+       faddp st(3), st /* 0 4 5 6 7 */
+       faddp st(1), st /* 4 5 6 7 */
+
+       /*
+        * st(3) = S(0) * M(0, 0) + S(1) * M(1, 0)
+        * st(2) = S(0) * M(0, 1) + S(1) * M(1, 1)
+        * st(1) = S(0) * M(0, 2) + S(1) * M(1, 2)
+        * st(0) = S(0) * M(0, 3) + S(1) * M(1, 3)
+        */
+
+       fld S(2)
+       fmul M(2, 0)
+       fld S(2)
+       fmul M(2, 1)
+       fld S(2)
+       fmul M(2, 2)
+       fld S(2)
+       fmul M(2, 3)
+
+       /*
+        * st(7) = S(0) * M(0, 0) + S(1) * M(1, 0)
+        * st(6) = S(0) * M(0, 1) + S(1) * M(1, 1)
+        * st(5) = S(0) * M(0, 2) + S(1) * M(1, 2)
+        * st(4) = S(0) * M(0, 3) + S(1) * M(1, 3)
+        * st(3) = S(2) * M(2, 0)
+        * st(2) = S(2) * M(2, 1)
+        * st(1) = S(2) * M(2, 2)
+        * st(0) = S(2) * M(2, 3)
+        */
+
+       fxch st(3)              /* 3 1 2 0 4 5 6 7 */
+       faddp st(7), st /* 1 2 0 4 5 6 7 */
+       fxch st(1)              /* 2 1 0 4 5 6 7 */
+       faddp st(5), st /* 1 0 4 5 6 7 */
+       faddp st(3), st /* 0 4 5 6 7 */
+       faddp st(1), st /* 4 5 6 7 */
+
+       /*
+        * st(3) = S(0) * M(0, 0) + S(1) * M(1, 0) + S(2) * M(2, 0)
+        * st(2) = S(0) * M(0, 1) + S(1) * M(1, 1) + S(2) * M(2, 1)
+        * st(1) = S(0) * M(0, 2) + S(1) * M(1, 2) + S(2) * M(2, 2)
+        * st(0) = S(0) * M(0, 3) + S(1) * M(1, 3) + S(2) * M(2, 3)
+        */
+
+       fld S(3)
+       fmul M(3, 0)
+       fld S(3)
+       fmul M(3, 1)
+       fld S(3)
+       fmul M(3, 2)
+       fld S(3)
+       fmul M(3, 3)
+
+       /*
+        * st(7) = S(0) * M(0, 0) + S(1) * M(1, 0) + S(2) * M(2, 0)
+        * st(6) = S(0) * M(0, 1) + S(1) * M(1, 1) + S(2) * M(2, 1)
+        * st(5) = S(0) * M(0, 2) + S(1) * M(1, 2) + S(2) * M(2, 2)
+        * st(4) = S(0) * M(0, 3) + S(1) * M(1, 3) + S(2) * M(2, 3)
+        * st(3) = S(3) * M(3, 0)
+        * st(2) = S(3) * M(3, 1)
+        * st(1) = S(3) * M(3, 2)
+        * st(0) = S(3) * M(3, 3)
+        */
+
+       fxch st(3)              /* 3 1 2 0 4 5 6 7 */
+       faddp st(7), st /* 1 2 0 4 5 6 7 */
+       fxch st(1)              /* 2 1 0 4 5 6 7 */
+       faddp st(5), st /* 1 0 4 5 6 7 */
+       faddp st(3), st /* 0 4 5 6 7 */
+
+       lea esi, S(4)
+       dec ecx
+
+       faddp st(1), st         /* 4 5 6 7 */
+
+       /*
+        * st(3) = S(0) * M(0, 0) + S(1) * M(1, 0) + S(2) * M(2, 0) + S(3) * M(3, 0)
+        * st(2) = S(0) * M(0, 1) + S(1) * M(1, 1) + S(2) * M(2, 1) + S(3) * M(3, 1)
+        * st(1) = S(0) * M(0, 2) + S(1) * M(1, 2) + S(2) * M(2, 2) + S(3) * M(3, 2)
+        * st(0) = S(0) * M(0, 3) + S(1) * M(1, 3) + S(2) * M(2, 3) + S(3) * M(3, 3)
+        */
+
+       fxch st(3)      /* 3 1 2 0 */
+       fstp D(0)       /* 1 2 0 */
+       fxch st(1)      /* 2 1 0 */
+       fstp D(1)       /* 1 0 */
+       fstp D(2)       /* 0 */
+       fstp D(3)       /* */
+
+       lea edi, D(4)
+
+       jnz _asm_transform_points4_general_loop
+
+_asm_transform_points4_general_end:
+       pop edi
+       pop esi
+       ret
+
+
+
+/*
+ * void asm_transform_points4_identity( GLuint n, GLfloat d[][4],
+ *                                      GLfloat s[][4] );
+ */
+PUBLIC _asm_transform_points4_identity
+_asm_transform_points4_identity:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov esi, [esp + 20]     /* esi = s */
+
+       lea ecx,  [ecx * 4]
+
+       cld
+       rep movsd
+
+       pop edi
+       pop esi
+       ret
+
+
+
+/*
+ * void asm_transform_points4_2d( GLuint n, GLfloat d[][4], GLfloat m[16],
+ *                                GLfloat s[][4] );
+ */
+PUBLIC _asm_transform_points4_2d
+_asm_transform_points4_2d:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov edx, [esp + 20]     /* edx = m */
+       mov esi, [esp + 24]     /* esi = s */
+
+       test ecx, ecx
+       jz _asm_transform_points4_2d_end
+
+       push ebx
+
+.align 4
+_asm_transform_points4_2d_loop:
+       fld S(0)
+       fmul M(0, 0)
+       fld S(0)
+       fmul M(0, 1)
+       fld S(1)
+       fmul M(1, 0)
+       fld S(1)
+       fmul M(1, 1)
+       fld S(3)
+       fmul M(3, 0)
+       fld S(3)
+       fmul M(3, 1)
+
+       /*
+        * st(5) = S(0) * M(0, 0)
+        * st(4) = S(0) * M(0, 1)
+        * st(3) = S(1) * M(1, 0)
+        * st(2) = S(1) * M(1, 1)
+        * st(1) = S(3) * M(3, 0)
+        * st(0) = S(3) * M(3, 1)
+        */
+
+       mov eax, S(2)
+       mov ebx, S(3)
+       lea esi, S(4)
+       dec ecx
+       mov D(2), eax
+       mov D(3), ebx
+       faddp st(4), st
+       faddp st(4), st
+       faddp st(2), st
+       faddp st(2), st
+       fstp D(1)
+       fstp D(0)
+       lea edi, D(4)
+       jnz _asm_transform_points4_2d_loop
+
+       pop ebx
+
+_asm_transform_points4_2d_end:
+       pop edi
+       pop esi
+       ret
+
+
+
+/*
+ * void asm_transform_points4_2d_no_rot( GLuint n, GLfloat d[][4],
+ *                                       GLfloat m[16], GLfloat s[][4] );
+ */
+PUBLIC _asm_transform_points4_2d_no_rot
+_asm_transform_points4_2d_no_rot:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov edx, [esp + 20]     /* edx = m */
+       mov esi, [esp + 24]     /* esi = s */
+
+       test ecx, ecx
+       jz _asm_transform_points4_2d_no_rot_end
+       push ebx
+
+.align 4
+_asm_transform_points4_2d_no_rot_loop:
+       fld S(0)
+       fmul M(0, 0)
+       fld S(1)
+       fmul M(1, 1)
+       fld S(3)
+       fmul M(3, 0)
+       fld S(3)
+       fmul M(3, 1)
+       mov eax, S(2)
+       mov ebx, S(3)
+       lea esi, S(4)
+       dec ecx
+       mov D(2), eax
+       mov D(3), ebx
+       faddp st(2), st
+       faddp st(2), st
+       fstp D(1)
+       fstp D(0)
+       lea edi, D(4)
+       jnz _asm_transform_points4_2d_no_rot_loop
+
+       pop ebx
+
+_asm_transform_points4_2d_no_rot_end:
+       pop edi
+       pop esi
+       ret
+
+
+
+/*
+ * void asm_transform_points4_3d( GLuint n, GLfloat d[][4], GLfloat m[16],
+ *                                GLfloat s[][4] );
+ */
+PUBLIC _asm_transform_points4_3d
+_asm_transform_points4_3d:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov edx, [esp + 20]     /* edx = m */
+       mov esi, [esp + 24]     /* esi = s */
+
+       test ecx, ecx
+       jz _asm_transform_points4_3d_end
+
+.align 4
+_asm_transform_points4_3d_loop:
+       fld S(3)
+
+       fld S(0)
+       fmul M(0, 0)
+       fld S(0)
+       fmul M(0, 1)
+       fld S(0)
+       fmul M(0, 2)
+
+       fld S(1)
+       fmul M(1, 0)
+       fld S(1)
+       fmul M(1, 1)
+       fld S(1)
+       fmul M(1, 2)
+
+       /*
+        * st(5) = S(0) * M(0, 0)
+        * st(4) = S(0) * M(0, 1)
+        * st(3) = S(0) * M(0, 2)
+        * st(2) = S(1) * M(1, 0)
+        * st(1) = S(1) * M(1, 1)
+        * st(0) = S(1) * M(1, 2)
+        */
+
+       fxch st(2)              /* 2 1 0 3 4 5 */
+       faddp st(5), st         /* 1 0 3 4 5 */
+       faddp st(3), st         /* 0 3 4 5 */
+       faddp st(1), st         /* 3 4 5 */
+
+       /*
+        * st(2) = S(0) * M(0, 0) + S(1) * M(1, 0)
+        * st(1) = S(0) * M(0, 1) + S(1) * M(1, 1)
+        * st(0) = S(0) * M(0, 2) + S(1) * M(1, 2)
+        */
+
+       fld S(2)
+       fmul M(2, 0)
+       fld S(2)
+       fmul M(2, 1)
+       fld S(2)
+       fmul M(2, 2)
+
+       /*
+        * st(5) = S(0) * M(0, 0) + S(1) * M(1, 0)
+        * st(4) = S(0) * M(0, 1) + S(1) * M(1, 1)
+        * st(3) = S(0) * M(0, 2) + S(1) * M(1, 2)
+        * st(2) = S(2) * M(2, 0)
+        * st(1) = S(2) * M(2, 1)
+        * st(0) = S(2) * M(2, 2)
+        */
+
+       fxch st(2)              /* 2 1 0 3 4 5 */
+       faddp st(5), st         /* 1 0 3 4 5 */
+       faddp st(3), st         /* 0 3 4 5 */
+       faddp st(1), st         /* 3 4 5 */
+
+       /*
+        * st(2) = S(0) * M(0, 0) + S(1) * M(1, 0) + S(2) * M(2, 0)
+        * st(1) = S(0) * M(0, 1) + S(1) * M(1, 1) + S(2) * M(2, 1)
+        * st(0) = S(0) * M(0, 2) + S(1) * M(1, 2) + S(2) * M(2, 2)
+        */
+
+       fld S(3)
+       fmul M(3, 0)
+       fld S(3)
+       fmul M(3, 1)
+       fld S(3)
+       fmul M(3, 2)
+
+       /*
+        * st(5) = S(0) * M(0, 0) + S(1) * M(1, 0) + S(2) * M(2, 0)
+        * st(4) = S(0) * M(0, 1) + S(1) * M(1, 1) + S(2) * M(2, 1)
+        * st(3) = S(0) * M(0, 2) + S(1) * M(1, 2) + S(2) * M(2, 2)
+        * st(2) = S(3) * M(3, 0)
+        * st(1) = S(3) * M(3, 1)
+        * st(0) = S(3) * M(3, 2)
+        */
+
+       fxch st(2)      /* 2 1 0 3 4 5 */
+       faddp st(5), st /* 1 0 3 4 5 */
+       faddp st(3), st /* 0 3 4 5 */
+
+       lea esi, S(4)
+       dec ecx
+
+       faddp st(1), st         /* 3 4 5 */
+
+       /*
+        * st(2) = S(0) * M(0, 0) + S(1) * M(1, 0) + S(2) * M(2, 0) + S(3) * M(3, 0)
+        * st(1) = S(0) * M(0, 1) + S(1) * M(1, 1) + S(2) * M(2, 1) + S(3) * M(3, 1)
+        * st(0) = S(0) * M(0, 2) + S(1) * M(1, 2) + S(2) * M(2, 2) + S(3) * M(3, 2)
+        */
+
+       fxch st(2)      /* 2 1 0 */
+       fstp D(0)       /* 1 0 */
+       fstp D(1)       /* 0 */
+       fstp D(2)       /* */
+       fstp D(3)
+
+       lea edi, D(4)
+
+       jnz _asm_transform_points4_3d_loop
+
+_asm_transform_points4_3d_end:
+       pop edi
+       pop esi
+       ret
+
+/*
+ * void asm_transform_points4_ortho( GLuint n, GLfloat d[][4],
+ *                                   GLfloat m[16], GLfloat s[][4] );
+ */
+PUBLIC _asm_transform_points4_ortho
+_asm_transform_points4_ortho:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov edx, [esp + 20]     /* edx = m */
+       mov esi, [esp + 24]     /* esi = s */
+
+       test ecx, ecx
+       jz _asm_transform_points4_ortho_end
+
+.align 4
+_asm_transform_points4_ortho_loop:
+       fld S(0)
+       fmul M(0, 0)
+       fld S(1)
+       fmul M(1, 1)
+       fld S(2)
+       fmul M(2, 2)
+
+       fld S(3)
+       fmul M(3, 0)
+       fld S(3)
+       fmul M(3, 1)
+       fld S(3)
+       fmul M(3, 2)
+
+       mov eax, S(3)
+       lea esi, S(4)
+       dec ecx
+       mov D(3), eax
+
+       faddp st(3), st
+       faddp st(3), st
+       faddp st(3), st
+
+       fstp D(2)
+       fstp D(1)
+       fstp D(0)
+
+       lea edi, D(4)
+       jnz _asm_transform_points4_ortho_loop
+
+_asm_transform_points4_ortho_end:
+       pop edi
+       pop esi
+       ret
+
+/*
+ * void asm_transform_points4_perspective( GLuint n, GLfloat d[][4],
+ *                                         GLfloat m[16], GLfloat s[][4] );
+ */
+PUBLIC _asm_transform_points4_perspective
+_asm_transform_points4_perspective:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov edx, [esp + 20]     /* edx = m */
+       mov esi, [esp + 24]     /* esi = s */
+
+       test ecx, ecx
+       jz _asm_transform_points4_perspective_end
+
+.align 4
+_asm_transform_points4_perspective_loop:
+       fld S(0)
+       fmul M(0, 0)
+       fld S(1)
+       fmul M(1, 1)
+       fld S(2)
+       fmul M(2, 2)
+
+       fld S(2)
+       fmul M(2, 0)
+       fld S(2)
+       fmul M(2, 1)
+       fld S(3)
+       fmul M(3, 2)
+
+       mov eax, S(2)
+       lea esi, S(4)
+       xor eax, HEX(80000000)
+       dec ecx
+
+       faddp st(3), st
+       faddp st(3), st
+       faddp st(3), st
+
+       fstp D(2)
+       fstp D(1)
+       fstp D(0)
+
+       mov D(3), eax
+       lea edi, D(4)
+       jnz _asm_transform_points4_perspective_loop
+
+_asm_transform_points4_perspective_end:
+       pop edi
+       pop esi
+       ret
+
+
+
+/*
+ * Table for clip test.
+ *
+ *     bit6 = S(3) < 0
+ *     bit5 = S(2) < 0
+ *     bit4 = abs(S(2)) > abs(S(3))
+ *     bit3 = S(1) < 0
+ *     bit2 = abs(S(1)) > abs(S(3))
+ *     bit1 = S(0) < 0
+ *     bit0 = abs(S(0)) > abs(S(3))
+ */
+
+/* Vertex buffer clipping flags (from vb.h) */
+#if 0
+
+#define CLIP_RIGHT_BIT   0x01
+#define CLIP_LEFT_BIT    0x02
+#define CLIP_TOP_BIT     0x04
+#define CLIP_BOTTOM_BIT  0x08
+#define CLIP_NEAR_BIT    0x10
+#define CLIP_FAR_BIT     0x20
+#define CLIP_USER_BIT    0x40
+#define CLIP_ALL_BITS    0x3f
+
+#define MAGN_X(i)      (~(((i) & 1) - 1))
+#define SIGN_X(i)      (~((((i) >> 1) & 1) - 1))
+#define MAGN_Y(i)      (~((((i) >> 2) & 1) - 1))
+#define SIGN_Y(i)      (~((((i) >> 3) & 1) - 1))
+#define MAGN_Z(i)      (~((((i) >> 4) & 1) - 1))
+#define SIGN_Z(i)      (~((((i) >> 5) & 1) - 1))
+#define SIGN_W(i)      (~((((i) >> 6) & 1) - 1))
+
+#define CLIP_VALUE(i)                                          \
+        (CLIP_RIGHT_BIT                                        \
+         & ((~SIGN_X(i) & SIGN_W(i))                           \
+            | (~SIGN_X(i) & ~SIGN_W(i) & MAGN_X(i))            \
+            | (SIGN_X(i) & SIGN_W(i) & ~MAGN_X(i))))           \
+        | (CLIP_LEFT_BIT                                       \
+           & ((SIGN_X(i) & SIGN_W(i))                          \
+              | (~SIGN_X(i) & SIGN_W(i) & ~MAGN_X(i))          \
+              | (SIGN_X(i) & ~SIGN_W(i) & MAGN_X(i))))         \
+        | (CLIP_TOP_BIT                                        \
+           & ((~SIGN_Y(i) & SIGN_W(i))                         \
+              | (~SIGN_Y(i) & ~SIGN_W(i) & MAGN_Y(i))          \
+              | (SIGN_Y(i) & SIGN_W(i) & ~MAGN_Y(i))))         \
+        | (CLIP_BOTTOM_BIT                                     \
+           & ((SIGN_Y(i) & SIGN_W(i))                          \
+              | (~SIGN_Y(i) & SIGN_W(i) & ~MAGN_Y(i))          \
+              | (SIGN_Y(i) & ~SIGN_W(i) & MAGN_Y(i))))         \
+        | (CLIP_FAR_BIT                                        \
+           & ((~SIGN_Z(i) & SIGN_W(i))                         \
+              | (~SIGN_Z(i) & ~SIGN_W(i) & MAGN_Z(i))          \
+              | (SIGN_Z(i) & SIGN_W(i) & ~MAGN_Z(i))))         \
+        | (CLIP_NEAR_BIT                                       \
+           & ((SIGN_Z(i) & SIGN_W(i))                          \
+              | (~SIGN_Z(i) & SIGN_W(i) & ~MAGN_Z(i))          \
+              | (SIGN_Z(i) & ~SIGN_W(i) & MAGN_Z(i))))
+
+#define CLIP_VALUE8(i) \
+       CLIP_VALUE(i + 0), CLIP_VALUE(i + 1), CLIP_VALUE(i + 2), CLIP_VALUE(i + 3), \
+       CLIP_VALUE(i + 4), CLIP_VALUE(i + 5), CLIP_VALUE(i + 6), CLIP_VALUE(i + 7)
+
+.rodata
+
+clip_table:
+       .byte CLIP_VALUE8(0x00)
+       .byte CLIP_VALUE8(0x08)
+       .byte CLIP_VALUE8(0x10)
+       .byte CLIP_VALUE8(0x18)
+       .byte CLIP_VALUE8(0x20)
+       .byte CLIP_VALUE8(0x28)
+       .byte CLIP_VALUE8(0x30)
+       .byte CLIP_VALUE8(0x38)
+       .byte CLIP_VALUE8(0x40)
+       .byte CLIP_VALUE8(0x48)
+       .byte CLIP_VALUE8(0x50)
+       .byte CLIP_VALUE8(0x58)
+       .byte CLIP_VALUE8(0x60)
+       .byte CLIP_VALUE8(0x68)
+       .byte CLIP_VALUE8(0x70)
+       .byte CLIP_VALUE8(0x78)
+#else
+
+.const
+ASSUME NOTHING
+
+clip_table:
+       .byte HEX(0), HEX(1), HEX(0), HEX(2), HEX(4), HEX(5), HEX(4), HEX(6)
+       .byte HEX(0), HEX(1), HEX(0), HEX(2), HEX(8), HEX(9), HEX(8), HEX(a)
+       .byte HEX(20), HEX(21), HEX(20), HEX(22), HEX(24), HEX(25), HEX(24), HEX(26)
+       .byte HEX(20), HEX(21), HEX(20), HEX(22), HEX(28), HEX(29), HEX(28), HEX(2a)
+       .byte HEX(0), HEX(1), HEX(0), HEX(2), HEX(4), HEX(5), HEX(4), HEX(6)
+       .byte HEX(0), HEX(1), HEX(0), HEX(2), HEX(8), HEX(9), HEX(8), HEX(a)
+       .byte HEX(10), HEX(11), HEX(10), HEX(12), HEX(14), HEX(15), HEX(14), HEX(16)
+       .byte HEX(10), HEX(11), HEX(10), HEX(12), HEX(18), HEX(19), HEX(18), HEX(1a)
+       .byte HEX(3f), HEX(3d), HEX(3f), HEX(3e), HEX(37), HEX(35), HEX(37), HEX(36)
+       .byte HEX(3f), HEX(3d), HEX(3f), HEX(3e), HEX(3b), HEX(39), HEX(3b), HEX(3a)
+       .byte HEX(2f), HEX(2d), HEX(2f), HEX(2e), HEX(27), HEX(25), HEX(27), HEX(26)
+       .byte HEX(2f), HEX(2d), HEX(2f), HEX(2e), HEX(2b), HEX(29), HEX(2b), HEX(2a)
+       .byte HEX(3f), HEX(3d), HEX(3f), HEX(3e), HEX(37), HEX(35), HEX(37), HEX(36)
+       .byte HEX(3f), HEX(3d), HEX(3f), HEX(3e), HEX(3b), HEX(39), HEX(3b), HEX(3a)
+       .byte HEX(1f), HEX(1d), HEX(1f), HEX(1e), HEX(17), HEX(15), HEX(17), HEX(16)
+       .byte HEX(1f), HEX(1d), HEX(1f), HEX(1e), HEX(1b), HEX(19), HEX(1b), HEX(1a)
+
+#endif
+
+.code
+
+/*
+ * cliptest -
+ *
+ * inputs:
+ *     ecx = # points
+ *     esi = points
+ *     edi = clipmask[]
+ *
+ * inputs/outputs:
+ *     al = ormask
+ *     ah = andmask
+ */
+
+cliptest:
+       test ecx, ecx
+       jz cliptest_end
+
+       push ebp
+       push ebx
+
+.align 4
+cliptest_loop:
+       mov ebp, S(3)
+       mov ebx, S(2)
+
+       xor edx, edx
+       add ebp, ebp    /* %ebp = abs(S(3))*2 ; carry = sign of S(3) */
+
+       adc edx, edx
+       add ebx, ebx    /* %ebx = abs(S(2))*2 ; carry = sign of S(2) */
+
+       adc edx, edx
+       cmp ebp, ebx    /* carry = abs(S(2))*2 > abs(S(3))*2 */
+
+       adc edx, edx
+       mov ebx, S(1)
+
+       add ebx, ebx    /* %ebx = abs(S(1))*2 ; carry = sign of S(1) */
+
+       adc edx, edx
+       cmp ebp, ebx    /* carry = abs(S(1))*2 > abs(S(3))*2 */
+
+       adc edx, edx
+       mov ebx, S(0)
+
+       add ebx, ebx    /* %ebx = abs(S(0))*2 ; carry = sign of S(0) */
+
+       adc edx, edx
+       cmp ebp, ebx    /* carry = abs(S(0))*2 > abs(S(3))*2 */
+
+       adc edx, edx
+
+       lea esi, S(4)
+
+       mov bl, byte ptr [edi]
+       mov dl, byte ptr [clip_table + edx]
+
+       or bl, dl
+       or al, dl
+
+       and ah, dl
+       mov [edi], bl
+
+       inc edi
+       dec ecx
+
+       jnz cliptest_loop
+
+       pop ebx
+       pop ebp
+cliptest_end:
+       ret
+
+/*
+ * void asm_project_and_cliptest_general( GLuint n, GLfloat d[][4], GLfloat m[16],
+ *                                        GLfloat s[][4], GLubyte clipmask[],
+ *                                        GLubyte *ormask, GLubyte *andmask );
+ */
+PUBLIC _asm_project_and_cliptest_general
+_asm_project_and_cliptest_general:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov edx, [esp + 20]     /* edx = m */
+       mov esi, [esp + 24]     /* esi = s */
+
+       push esi
+       push edx
+       push edi
+       push ecx
+       call _asm_transform_points4_general
+       add esp, DEC(16)
+
+       mov edi, [esp + 32]     /* ormask */
+       mov esi, [esp + 36]     /* andmask */
+       mov al, [edi]
+       mov ah, [esi]
+
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 28]     /* edi = clipmask */
+       mov esi, [esp + 16]     /* esi = d */
+
+       call cliptest
+
+       mov edi, [esp + 32]     /* ormask */
+       mov esi, [esp + 36]     /* andmask */
+       mov [edi], al
+       mov [esi], ah
+
+       pop edi
+       pop esi
+       ret
+
+
+/*
+ * void asm_project_and_cliptest_identity( GLuint n, GLfloat d[][4],
+ *                                         GLfloat s[][4], GLubyte clipmask[],
+ *                                         GLubyte *ormask, GLubyte *andmask );
+ */
+PUBLIC _asm_project_and_cliptest_identity
+_asm_project_and_cliptest_identity:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov esi, [esp + 20]     /* esi = s */
+
+       push esi
+       push edi
+       push ecx
+
+       call _asm_transform_points4_identity
+
+       add esp, DEC(12)
+
+       mov edi, [esp + 28]     /* ormask */
+       mov esi, [esp + 32]     /* andmask */
+       mov al, [edi]
+       mov ah, [esi]
+
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 24]     /* edi = clipmask */
+       mov esi, [esp + 16]     /* esi = d */
+
+       call cliptest
+
+       mov edi, [esp + 28]     /* ormask */
+       mov esi, [esp + 32]     /* andmask */
+       mov [edi], al
+       mov [esi], ah
+
+       pop edi
+       pop esi
+       ret
+
+/*
+ * void asm_project_and_cliptest_ortho( GLuint n, GLfloat d[][4], GLfloat m[16],
+ *                                      GLfloat s[][4], GLubyte clipmask[],
+ *                                      GLubyte *ormask, GLubyte *andmask );
+ */
+PUBLIC _asm_project_and_cliptest_ortho
+_asm_project_and_cliptest_ortho:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov edx, [esp + 20]     /* edx = m */
+       mov esi, [esp + 24]     /* esi = s */
+
+       push esi
+       push edx
+       push edi
+       push ecx
+
+       call _asm_transform_points4_ortho
+
+       add esp, DEC(16)
+
+       mov edi, [esp + 32]     /* ormask */
+       mov esi, [esp + 36]     /* andmask */
+       mov al, [edi]
+       mov ah, [esi]
+
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 28]     /* edi = clipmask */
+       mov esi, [esp + 16]     /* esi = d */
+
+       call cliptest
+
+       mov edi, [esp + 32]     /* ormask */
+       mov esi, [esp + 36]     /* andmask */
+       mov [edi], al
+       mov [esi], ah
+
+       pop edi
+       pop esi
+       ret
+
+/*
+ * void asm_project_and_cliptest_perspective( GLuint n, GLfloat d[][4], GLfloat m[16],
+ *                                            GLfloat s[][4], GLubyte clipmask[],
+ *                                            GLubyte *ormask, GLubyte *andmask );
+ */
+PUBLIC _asm_project_and_cliptest_perspective
+_asm_project_and_cliptest_perspective:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov edx, [esp + 20]     /* edx = m */
+       mov esi, [esp + 24]     /* esi = s */
+
+       push esi
+       push edx
+       push edi
+       push ecx
+
+       call _asm_transform_points4_perspective
+
+       add esp, DEC(16)
+
+       mov edi, [esp + 32]     /* ormask */
+       mov esi, [esp + 36]     /* andmask */
+       mov al, [edi]
+       mov ah, [esi]
+
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 28]     /* edi = clipmask */
+       mov esi, [esp + 16]     /* esi = d */
+
+       call cliptest
+
+       mov edi, [esp + 32]     /* ormask */
+       mov esi, [esp + 36]             /* andmask */
+       mov byte ptr [edi], al
+       mov byte ptr [esi], ah
+
+       pop edi
+       pop esi
+       ret
+
+
+/*
+ * unsigned int inverse_nofp( float f );
+ *
+ * Calculate the inverse of a float without using the FPU.
+ * This function returns a float in eax, so it's return
+ * type should be 'int' when called from C (and converted
+ * to float with pointer/union abuse).
+ */
+.align 4
+inverse_nofp:
+
+       /* get mantissa in eax */
+       mov ecx, [esp + 4]
+       and ecx, HEX(7fffff)
+
+       /* set implicit integer */
+       or ecx, HEX(800000)
+
+       /* div 0x10000:0x00000000 by mantissa */
+       xor eax, eax
+       mov edx, HEX(10000)
+
+       div ecx
+       
+       /* round result */
+       shr eax, DEC(1)
+       adc eax, DEC(0)
+
+       /* get exponent in ecx */
+       mov ecx, HEX(7f800000)
+       mov edx, [esp + 4]
+       and ecx, edx
+
+       /* negate exponent and decrement it */
+       mov edx, HEX(7E800000)
+       sub edx, ecx
+
+       /* if bit 24 is set, shift and adjust exponent */
+       test eax, HEX(1000000)
+       jz inverse_nofp_combine
+
+       shr eax, HEX(1)
+       add edx, HEX(800000)
+
+       /* combine mantissa and exponent, then set sign */
+inverse_nofp_combine:
+       and eax, HEX(7fffff)
+       mov ecx, [esp + 4]
+       or eax, edx
+       and ecx, HEX(80000000)
+       or eax, ecx
+
+       ret
+
+
+/*
+ * void gl_xform_normals_3fv( GLuint n, GLfloat d[][4], GLfloat m[16],
+ *                             GLfloat s[][4], GLboolean normalize );
+ */
+PUBLIC _gl_xform_normals_3fv
+_gl_xform_normals_3fv:
+.align 4
+       push esi
+       push edi
+       mov ecx, [esp + 12]     /* ecx = n */
+       mov edi, [esp + 16]     /* edi = d */
+       mov edx, [esp + 20]     /* edx = m */
+       mov esi, [esp + 24]     /* esi = s */
+
+       test ecx, ecx
+       jz _gl_xform_normals_3fv_end
+
+.align 4
+_gl_xform_normals_3fv_loop:
+       fld S(0)
+       fmul M(0, 0)
+       fld S(0)
+       fmul M(1, 0)
+       fld S(0)
+       fmul M(2, 0)
+
+       fld S(1)
+       fmul M(0, 1)
+       fld S(1)
+       fmul M(1, 1)
+       fld S(1)
+       fmul M(2, 1)
+
+       /*
+        * st(5) = S(0) * M(0, 0)
+        * st(4) = S(0) * M(1, 0)
+        * st(3) = S(0) * M(2, 0)
+        * st(2) = S(1) * M(0, 1)
+        * st(1) = S(1) * M(1, 1)
+        * st(0) = S(1) * M(2, 1)
+        */
+
+       fxch st(2)                      /* 2 1 0 3 4 5 */
+       faddp st(5), st         /* 1 0 3 4 5 */
+       faddp st(3), st         /* 0 3 4 5 */
+       faddp st(1), st         /* 3 4 5 */
+
+       /*
+        * st(2) = S(0) * M(0, 0) + S(1) * M(0, 1)
+        * st(1) = S(0) * M(1, 0) + S(1) * M(1, 1)
+        * st(0) = S(0) * M(2, 0) + S(1) * M(2, 1)
+        */
+
+       fld S(2)
+       fmul M(0, 2)
+       fld S(2)
+       fmul M(1, 2)
+       fld S(2)
+       fmul M(2, 2)
+
+       /*
+        * st(5) = S(0) * M(0, 0) + S(1) * M(0, 1)
+        * st(4) = S(0) * M(1, 0) + S(1) * M(1, 1)
+        * st(3) = S(0) * M(2, 0) + S(1) * M(2, 1)
+        * st(2) = S(2) * M(0, 2)
+        * st(1) = S(2) * M(1, 2)
+        * st(0) = S(2) * M(2, 2)
+        */
+
+       fxch st(2)                      /* 2 1 0 3 4 5 */
+       faddp st(5), st         /* 1 0 3 4 5 */
+       faddp st(3), st         /* 0 3 4 5 */
+       faddp st(1), st         /* 3 4 5 */
+
+       /*
+        * st(2) = S(0) * M(0, 0) + S(1) * M(0, 1) + S(2) * M(0, 2)
+        * st(1) = S(0) * M(1, 0) + S(1) * M(1, 1) + S(2) * M(1, 2)
+        * st(0) = S(0) * M(2, 0) + S(1) * M(2, 1) + S(2) * M(2, 2)
+        */
+
+       fxch st(2)      /* 2 1 0 */
+       fstp D(0)       /* 1 0 */
+       fstp D(1)       /* 0 */
+       fstp D(2)       /* */
+
+       lea esi, S(3)
+
+       dec ecx
+       lea edi, D(3)
+
+       jnz _gl_xform_normals_3fv_loop
+
+       /*
+        * Skip normalize if it isn't needed
+        */
+       cmp dword ptr [esp + 28], DEC(0)
+       jz _gl_xform_normals_3fv_end
+
+       /* Normalize required */
+
+       mov esi, [esp + 12]             /* esi = n */
+       mov edi, [esp + 16]             /* edi = d */
+
+       sub esp, DEC(4) /* temp var for 1.0 / len */
+
+       /*
+        * (%esp) = length of first normal
+        */
+       fld D(0)
+       fmul D(0)
+       fld D(1)
+       fmul D(1)
+       fld D(2)
+       fmul D(2)
+       fxch st(2)
+       faddp st(1), st
+       faddp st(1), st
+       fsqrt
+       fstp dword ptr [esp]
+
+       jmp _gl_xform_normals_3fv_loop2_end
+
+.align 4
+_gl_xform_normals_3fv_loop2:
+       /* %st(0) = length of next normal */
+       fld D(3)
+       fmul D(3)
+       fld D(4)
+       fmul D(4)
+       fld D(5)
+       fmul D(5)
+       fxch st(2)
+       faddp st(1), st
+       faddp st(1), st
+       fsqrt
+
+       /*
+        * inverse the length of the current normal, which is
+        * already at (%esp).  This should overlap the prev
+        * fsqrt nicely.
+        */
+       call inverse_nofp
+       mov [esp], eax
+
+       /* multiply normal by 1/len */
+       fld D(0)
+       fmul dword ptr [esp]
+       fld D(1)
+       fmul dword ptr [esp]
+       fld D(2)
+       fmul dword ptr [esp]
+       fxch st(3)
+       fstp dword ptr [esp]    /* store length of next normal */
+       fstp D(1)
+       fstp D(0)
+       fstp D(2)
+       lea edi, D(3)
+
+_gl_xform_normals_3fv_loop2_end:
+       dec esi
+       jnz _gl_xform_normals_3fv_loop2
+
+       /* finish up the last normal */
+       call inverse_nofp
+       mov [esp], eax
+       fld D(0)
+       fmul dword ptr [esp]
+       fld D(1)
+       fmul dword ptr [esp]
+       fld D(2)
+       fmul dword ptr [esp]
+       fxch st(2)
+       fstp D(0)
+       fstp D(1)
+       fstp D(2)
+
+       add esp, DEC(4)
+
+_gl_xform_normals_3fv_end:
+       pop edi
+       pop esi
+       ret
+
+END
diff --git a/dll/opengl/mesa/asm-386.h b/dll/opengl/mesa/asm-386.h
new file mode 100644 (file)
index 0000000..fa4ba51
--- /dev/null
@@ -0,0 +1,99 @@
+/* $Id: asm-386.h,v 1.1 1997/12/15 03:39:14 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.6
+ * Copyright (C) 1995-1997  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: asm-386.h,v $
+ * Revision 1.1  1997/12/15 03:39:14  brianp
+ * Initial revision
+ *
+ */
+
+
+#ifndef ASM_386_H
+#define ASM_386_H
+
+
+#include "GL/gl.h"
+
+
+/*
+ * Prototypes for assembly functions.
+ */
+
+
+extern void asm_transform_points3_general( GLuint n, GLfloat d[][4],
+                                           GLfloat m[16], GLfloat s[][4] );
+
+extern void asm_transform_points3_identity( GLuint n, GLfloat d[][4],
+                                            GLfloat s[][4] );
+
+extern void asm_transform_points3_2d( GLuint n, GLfloat d[][4],
+                                      GLfloat m[16], GLfloat s[][4] );
+
+extern void asm_transform_points3_2d_no_rot( GLuint n, GLfloat d[][4],
+                                             GLfloat m[16], GLfloat s[][4] );
+
+extern void asm_transform_points3_3d( GLuint n, GLfloat d[][4], GLfloat m[16],
+                                      GLfloat s[][4] );
+
+extern void asm_transform_points4_general( GLuint n, GLfloat d[][4],
+                                           GLfloat m[16], GLfloat s[][4] );
+
+extern void asm_transform_points4_identity( GLuint n, GLfloat d[][4],
+                                            GLfloat s[][4] );
+
+extern void asm_transform_points4_2d( GLuint n, GLfloat d[][4], GLfloat m[16],
+                                      GLfloat s[][4] );
+
+extern void asm_transform_points4_2d_no_rot( GLuint n, GLfloat d[][4],
+                                             GLfloat m[16], GLfloat s[][4] );
+
+extern void asm_transform_points4_3d( GLuint n, GLfloat d[][4], GLfloat m[16],
+                                      GLfloat s[][4] );
+
+extern void asm_transform_points4_ortho( GLuint n, GLfloat d[][4],
+                                         GLfloat m[16], GLfloat s[][4] );
+
+extern void asm_transform_points4_perspective( GLuint n, GLfloat d[][4],
+                                               GLfloat m[16], GLfloat s[][4] );
+
+extern void asm_project_and_cliptest_general( GLuint n, GLfloat d[][4],
+                                          GLfloat m[16],
+                                          GLfloat s[][4], GLubyte clipmask[],
+                                          GLubyte *ormask, GLubyte *andmask );
+
+extern void asm_project_and_cliptest_identity( GLuint n, GLfloat d[][4],
+                                          GLfloat s[][4], GLubyte clipmask[],
+                                          GLubyte *ormask, GLubyte *andmask );
+
+extern void asm_project_and_cliptest_ortho( GLuint n, GLfloat d[][4],
+                                          GLfloat m[16],
+                                          GLfloat s[][4], GLubyte clipmask[],
+                                          GLubyte *ormask, GLubyte *andmask );
+
+extern void asm_project_and_cliptest_perspective( GLuint n, GLfloat d[][4],
+                                          GLfloat m[16],
+                                          GLfloat s[][4], GLubyte clipmask[],
+                                          GLubyte *ormask, GLubyte *andmask );
+
+#endif
diff --git a/dll/opengl/mesa/attrib.c b/dll/opengl/mesa/attrib.c
new file mode 100644 (file)
index 0000000..79cd928
--- /dev/null
@@ -0,0 +1,624 @@
+/* $Id: attrib.c,v 1.9 1997/07/24 01:24:28 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.4
+ * Copyright (C) 1995-1997  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: attrib.c,v $
+ * Revision 1.9  1997/07/24 01:24:28  brianp
+ * changed precompiled header symbol from PCH to PC_HEADER
+ *
+ * Revision 1.8  1997/05/28 03:23:09  brianp
+ * added precompiled header (PCH) support
+ *
+ * Revision 1.7  1997/04/20 19:49:57  brianp
+ * replaced abort() calls with gl_problem()
+ *
+ * Revision 1.6  1997/04/01 04:18:28  brianp
+ * removed #include "draw.h"
+ *
+ * Revision 1.5  1997/01/28 22:13:02  brianp
+ * now there's separate state for CI and RGBA logic op enabled
+ *
+ * Revision 1.4  1996/10/01 03:30:01  brianp
+ * added #include "misc.h"
+ *
+ * Revision 1.3  1996/09/30 23:55:06  brianp
+ * call gl_DrawBuffer() when glPopAttrib(GL_COLOR_BUFFER_BIT)
+ *
+ * Revision 1.2  1996/09/27 01:24:14  brianp
+ * removed unused variables
+ *
+ * Revision 1.1  1996/09/13 01:38:16  brianp
+ * Initial revision
+ *
+ */
+
+
+#ifdef PC_HEADER
+#include "all.h"
+#else
+#include <stdlib.h>
+#include <string.h>
+#include "attrib.h"
+#include "context.h"
+#include "dlist.h"
+#include "macros.h"
+#include "misc.h"
+#include "types.h"
+#endif
+
+
+#define MALLOC_STRUCT(T)  (struct T *) malloc( sizeof(struct T) )
+
+
+
+static struct gl_attrib_node *new_attrib_node( GLbitfield kind )
+{
+   struct gl_attrib_node *an;
+
+   an = (struct gl_attrib_node *) malloc( sizeof(struct gl_attrib_node) );
+   if (an) {
+      an->kind = kind;
+   }
+   return an;
+}
+
+
+
+void gl_PushAttrib( GLcontext* ctx, GLbitfield mask )
+{
+   struct gl_attrib_node *newnode;
+   struct gl_attrib_node *head;
+
+   if (INSIDE_BEGIN_END(ctx)) {
+      gl_error( ctx, GL_INVALID_OPERATION, "glPushAttrib" );
+      return;
+   }
+
+   if (ctx->AttribStackDepth>=MAX_ATTRIB_STACK_DEPTH) {
+      gl_error( ctx, GL_STACK_OVERFLOW, "glPushAttrib" );
+      return;
+   }
+
+   /* Build linked list of attribute nodes which save all attribute */
+   /* groups specified by the mask. */
+   head = NULL;
+
+   if (mask & GL_ACCUM_BUFFER_BIT) {
+      struct gl_accum_attrib *attr;
+
+      attr = MALLOC_STRUCT( gl_accum_attrib );
+      MEMCPY( attr, &ctx->Accum, sizeof(struct gl_accum_attrib) );
+      newnode = new_attrib_node( GL_ACCUM_BUFFER_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_COLOR_BUFFER_BIT) {
+      struct gl_colorbuffer_attrib *attr;
+      attr = MALLOC_STRUCT( gl_colorbuffer_attrib );
+      MEMCPY( attr, &ctx->Color, sizeof(struct gl_colorbuffer_attrib) );
+      newnode = new_attrib_node( GL_COLOR_BUFFER_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_CURRENT_BIT) {
+      struct gl_current_attrib *attr;
+      attr = MALLOC_STRUCT( gl_current_attrib );
+      MEMCPY( attr, &ctx->Current, sizeof(struct gl_current_attrib) );
+      newnode = new_attrib_node( GL_CURRENT_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_DEPTH_BUFFER_BIT) {
+      struct gl_depthbuffer_attrib *attr;
+      attr = MALLOC_STRUCT( gl_depthbuffer_attrib );
+      MEMCPY( attr, &ctx->Depth, sizeof(struct gl_depthbuffer_attrib) );
+      newnode = new_attrib_node( GL_DEPTH_BUFFER_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_ENABLE_BIT) {
+      struct gl_enable_attrib *attr;
+      GLuint i;
+      attr = MALLOC_STRUCT( gl_enable_attrib );
+      /* Copy enable flags from all other attributes into the enable struct. */
+      attr->AlphaTest = ctx->Color.AlphaEnabled;
+      attr->AutoNormal = ctx->Eval.AutoNormal;
+      attr->Blend = ctx->Color.BlendEnabled;
+      for (i=0;i<MAX_CLIP_PLANES;i++) {
+         attr->ClipPlane[i] = ctx->Transform.ClipEnabled[i];
+      }
+      attr->ColorMaterial = ctx->Light.ColorMaterialEnabled;
+      attr->CullFace = ctx->Polygon.CullFlag;
+      attr->DepthTest = ctx->Depth.Test;
+      attr->Dither = ctx->Color.DitherFlag;
+      attr->Fog = ctx->Fog.Enabled;
+      for (i=0;i<MAX_LIGHTS;i++) {
+         attr->Light[i] = ctx->Light.Light[i].Enabled;
+      }
+      attr->Lighting = ctx->Light.Enabled;
+      attr->LineSmooth = ctx->Line.SmoothFlag;
+      attr->LineStipple = ctx->Line.StippleFlag;
+      attr->IndexLogicOp = ctx->Color.IndexLogicOpEnabled;
+      attr->ColorLogicOp = ctx->Color.ColorLogicOpEnabled;
+      attr->Map1Color4 = ctx->Eval.Map1Color4;
+      attr->Map1Index = ctx->Eval.Map1Index;
+      attr->Map1Normal = ctx->Eval.Map1Normal;
+      attr->Map1TextureCoord1 = ctx->Eval.Map1TextureCoord1;
+      attr->Map1TextureCoord2 = ctx->Eval.Map1TextureCoord2;
+      attr->Map1TextureCoord3 = ctx->Eval.Map1TextureCoord3;
+      attr->Map1TextureCoord4 = ctx->Eval.Map1TextureCoord4;
+      attr->Map1Vertex3 = ctx->Eval.Map1Vertex3;
+      attr->Map1Vertex4 = ctx->Eval.Map1Vertex4;
+      attr->Map2Color4 = ctx->Eval.Map2Color4;
+      attr->Map2Index = ctx->Eval.Map2Index;
+      attr->Map2Normal = ctx->Eval.Map2Normal;
+      attr->Map2TextureCoord1 = ctx->Eval.Map2TextureCoord1;
+      attr->Map2TextureCoord2 = ctx->Eval.Map2TextureCoord2;
+      attr->Map2TextureCoord3 = ctx->Eval.Map2TextureCoord3;
+      attr->Map2TextureCoord4 = ctx->Eval.Map2TextureCoord4;
+      attr->Map2Vertex3 = ctx->Eval.Map2Vertex3;
+      attr->Map2Vertex4 = ctx->Eval.Map2Vertex4;
+      attr->Normalize = ctx->Transform.Normalize;
+      attr->PointSmooth = ctx->Point.SmoothFlag;
+      attr->PolygonOffsetPoint = ctx->Polygon.OffsetPoint;
+      attr->PolygonOffsetLine = ctx->Polygon.OffsetLine;
+      attr->PolygonOffsetFill = ctx->Polygon.OffsetFill;
+      attr->PolygonSmooth = ctx->Polygon.SmoothFlag;
+      attr->PolygonStipple = ctx->Polygon.StippleFlag;
+      attr->Scissor = ctx->Scissor.Enabled;
+      attr->Stencil = ctx->Stencil.Enabled;
+      attr->Texture = ctx->Texture.Enabled;
+      attr->TexGen = ctx->Texture.TexGenEnabled;
+      newnode = new_attrib_node( GL_ENABLE_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_EVAL_BIT) {
+      struct gl_eval_attrib *attr;
+      attr = MALLOC_STRUCT( gl_eval_attrib );
+      MEMCPY( attr, &ctx->Eval, sizeof(struct gl_eval_attrib) );
+      newnode = new_attrib_node( GL_EVAL_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_FOG_BIT) {
+      struct gl_fog_attrib *attr;
+      attr = MALLOC_STRUCT( gl_fog_attrib );
+      MEMCPY( attr, &ctx->Fog, sizeof(struct gl_fog_attrib) );
+      newnode = new_attrib_node( GL_FOG_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_HINT_BIT) {
+      struct gl_hint_attrib *attr;
+      attr = MALLOC_STRUCT( gl_hint_attrib );
+      MEMCPY( attr, &ctx->Hint, sizeof(struct gl_hint_attrib) );
+      newnode = new_attrib_node( GL_HINT_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_LIGHTING_BIT) {
+      struct gl_light_attrib *attr;
+      attr = MALLOC_STRUCT( gl_light_attrib );
+      MEMCPY( attr, &ctx->Light, sizeof(struct gl_light_attrib) );
+      newnode = new_attrib_node( GL_LIGHTING_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_LINE_BIT) {
+      struct gl_line_attrib *attr;
+      attr = MALLOC_STRUCT( gl_line_attrib );
+      MEMCPY( attr, &ctx->Line, sizeof(struct gl_line_attrib) );
+      newnode = new_attrib_node( GL_LINE_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_LIST_BIT) {
+      struct gl_list_attrib *attr;
+      attr = MALLOC_STRUCT( gl_list_attrib );
+      MEMCPY( attr, &ctx->List, sizeof(struct gl_list_attrib) );
+      newnode = new_attrib_node( GL_LIST_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_PIXEL_MODE_BIT) {
+      struct gl_pixel_attrib *attr;
+      attr = MALLOC_STRUCT( gl_pixel_attrib );
+      MEMCPY( attr, &ctx->Pixel, sizeof(struct gl_pixel_attrib) );
+      newnode = new_attrib_node( GL_PIXEL_MODE_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_POINT_BIT) {
+      struct gl_point_attrib *attr;
+      attr = MALLOC_STRUCT( gl_point_attrib );
+      MEMCPY( attr, &ctx->Point, sizeof(struct gl_point_attrib) );
+      newnode = new_attrib_node( GL_POINT_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_POLYGON_BIT) {
+      struct gl_polygon_attrib *attr;
+      attr = MALLOC_STRUCT( gl_polygon_attrib );
+      MEMCPY( attr, &ctx->Polygon, sizeof(struct gl_polygon_attrib) );
+      newnode = new_attrib_node( GL_POLYGON_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_POLYGON_STIPPLE_BIT) {
+      GLuint *stipple;
+      stipple = (GLuint *) malloc( 32*sizeof(GLuint) );
+      MEMCPY( stipple, ctx->PolygonStipple, 32*sizeof(GLuint) );
+      newnode = new_attrib_node( GL_POLYGON_STIPPLE_BIT );
+      newnode->data = stipple;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_SCISSOR_BIT) {
+      struct gl_scissor_attrib *attr;
+      attr = MALLOC_STRUCT( gl_scissor_attrib );
+      MEMCPY( attr, &ctx->Scissor, sizeof(struct gl_scissor_attrib) );
+      newnode = new_attrib_node( GL_SCISSOR_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_STENCIL_BUFFER_BIT) {
+      struct gl_stencil_attrib *attr;
+      attr = MALLOC_STRUCT( gl_stencil_attrib );
+      MEMCPY( attr, &ctx->Stencil, sizeof(struct gl_stencil_attrib) );
+      newnode = new_attrib_node( GL_STENCIL_BUFFER_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_TEXTURE_BIT) {
+      struct gl_texture_attrib *attr;
+      attr = MALLOC_STRUCT( gl_texture_attrib );
+      MEMCPY( attr, &ctx->Texture, sizeof(struct gl_texture_attrib) );
+      newnode = new_attrib_node( GL_TEXTURE_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_TRANSFORM_BIT) {
+      struct gl_transform_attrib *attr;
+      attr = MALLOC_STRUCT( gl_transform_attrib );
+      MEMCPY( attr, &ctx->Transform, sizeof(struct gl_transform_attrib) );
+      newnode = new_attrib_node( GL_TRANSFORM_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   if (mask & GL_VIEWPORT_BIT) {
+      struct gl_viewport_attrib *attr;
+      attr = MALLOC_STRUCT( gl_viewport_attrib );
+      MEMCPY( attr, &ctx->Viewport, sizeof(struct gl_viewport_attrib) );
+      newnode = new_attrib_node( GL_VIEWPORT_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   /* etc... */
+
+   ctx->AttribStack[ctx->AttribStackDepth] = head;
+   ctx->AttribStackDepth++;
+}
+
+
+
+void gl_PopAttrib( GLcontext* ctx )
+{
+   struct gl_attrib_node *attr, *next;
+   struct gl_enable_attrib *enable;
+   GLuint i, oldDrawBuffer;
+
+   if (INSIDE_BEGIN_END(ctx)) {
+      gl_error( ctx, GL_INVALID_OPERATION, "glPopAttrib" );
+      return;
+   }
+
+   if (ctx->AttribStackDepth==0) {
+      gl_error( ctx, GL_STACK_UNDERFLOW, "glPopAttrib" );
+      return;
+   }
+
+   ctx->AttribStackDepth--;
+   attr = ctx->AttribStack[ctx->AttribStackDepth];
+
+   while (attr) {
+      switch (attr->kind) {
+         case GL_ACCUM_BUFFER_BIT:
+            MEMCPY( &ctx->Accum, attr->data, sizeof(struct gl_accum_attrib) );
+            break;
+         case GL_COLOR_BUFFER_BIT:
+           oldDrawBuffer = ctx->Color.DrawBuffer;
+            MEMCPY( &ctx->Color, attr->data,
+                   sizeof(struct gl_colorbuffer_attrib) );
+           if (ctx->Color.DrawBuffer != oldDrawBuffer) {
+              gl_DrawBuffer(ctx, ctx->Color.DrawBuffer);
+            }
+            break;
+         case GL_CURRENT_BIT:
+            MEMCPY( &ctx->Current, attr->data,
+                   sizeof(struct gl_current_attrib) );
+            break;
+         case GL_DEPTH_BUFFER_BIT:
+            MEMCPY( &ctx->Depth, attr->data,
+                   sizeof(struct gl_depthbuffer_attrib) );
+            break;
+         case GL_ENABLE_BIT:
+            enable = (struct gl_enable_attrib *) attr->data;
+            ctx->Color.AlphaEnabled = enable->AlphaTest;
+            ctx->Transform.Normalize = enable->AutoNormal;
+            ctx->Color.BlendEnabled = enable->Blend;
+           for (i=0;i<MAX_CLIP_PLANES;i++) {
+               ctx->Transform.ClipEnabled[i] = enable->ClipPlane[i];
+           }
+           ctx->Light.ColorMaterialEnabled = enable->ColorMaterial;
+           ctx->Polygon.CullFlag = enable->CullFace;
+           ctx->Depth.Test = enable->DepthTest;
+           ctx->Color.DitherFlag = enable->Dither;
+           ctx->Fog.Enabled = enable->Fog;
+           ctx->Light.Enabled = enable->Lighting;
+           ctx->Line.SmoothFlag = enable->LineSmooth;
+           ctx->Line.StippleFlag = enable->LineStipple;
+           ctx->Color.IndexLogicOpEnabled = enable->IndexLogicOp;
+           ctx->Color.ColorLogicOpEnabled = enable->ColorLogicOp;
+           ctx->Eval.Map1Color4 = enable->Map1Color4;
+           ctx->Eval.Map1Index = enable->Map1Index;
+           ctx->Eval.Map1Normal = enable->Map1Normal;
+           ctx->Eval.Map1TextureCoord1 = enable->Map1TextureCoord1;
+           ctx->Eval.Map1TextureCoord2 = enable->Map1TextureCoord2;
+           ctx->Eval.Map1TextureCoord3 = enable->Map1TextureCoord3;
+           ctx->Eval.Map1TextureCoord4 = enable->Map1TextureCoord4;
+           ctx->Eval.Map1Vertex3 = enable->Map1Vertex3;
+           ctx->Eval.Map1Vertex4 = enable->Map1Vertex4;
+           ctx->Eval.Map2Color4 = enable->Map2Color4;
+           ctx->Eval.Map2Index = enable->Map2Index;
+           ctx->Eval.Map2Normal = enable->Map2Normal;
+           ctx->Eval.Map2TextureCoord1 = enable->Map2TextureCoord1;
+           ctx->Eval.Map2TextureCoord2 = enable->Map2TextureCoord2;
+           ctx->Eval.Map2TextureCoord3 = enable->Map2TextureCoord3;
+           ctx->Eval.Map2TextureCoord4 = enable->Map2TextureCoord4;
+           ctx->Eval.Map2Vertex3 = enable->Map2Vertex3;
+           ctx->Eval.Map2Vertex4 = enable->Map2Vertex4;
+           ctx->Transform.Normalize = enable->Normalize;
+           ctx->Point.SmoothFlag = enable->PointSmooth;
+           ctx->Polygon.OffsetPoint = enable->PolygonOffsetPoint;
+           ctx->Polygon.OffsetLine = enable->PolygonOffsetLine;
+           ctx->Polygon.OffsetFill = enable->PolygonOffsetFill;
+            ctx->Polygon.OffsetAny = ctx->Polygon.OffsetPoint ||
+                                     ctx->Polygon.OffsetLine ||
+                                     ctx->Polygon.OffsetFill;
+           ctx->Polygon.SmoothFlag = enable->PolygonSmooth;
+           ctx->Polygon.StippleFlag = enable->PolygonStipple;
+           ctx->Scissor.Enabled = enable->Scissor;
+           ctx->Stencil.Enabled = enable->Stencil;
+           ctx->Texture.Enabled = enable->Texture;
+           ctx->Texture.TexGenEnabled = enable->TexGen;
+            break;
+         case GL_EVAL_BIT:
+            MEMCPY( &ctx->Eval, attr->data, sizeof(struct gl_eval_attrib) );
+            break;
+         case GL_FOG_BIT:
+            MEMCPY( &ctx->Fog, attr->data, sizeof(struct gl_fog_attrib) );
+            break;
+         case GL_HINT_BIT:
+            MEMCPY( &ctx->Hint, attr->data, sizeof(struct gl_hint_attrib) );
+            break;
+         case GL_LIGHTING_BIT:
+            MEMCPY( &ctx->Light, attr->data, sizeof(struct gl_light_attrib) );
+            break;
+         case GL_LINE_BIT:
+            MEMCPY( &ctx->Line, attr->data, sizeof(struct gl_line_attrib) );
+            break;
+         case GL_LIST_BIT:
+            MEMCPY( &ctx->List, attr->data, sizeof(struct gl_list_attrib) );
+            break;
+         case GL_PIXEL_MODE_BIT:
+            MEMCPY( &ctx->Pixel, attr->data, sizeof(struct gl_pixel_attrib) );
+            break;
+         case GL_POINT_BIT:
+            MEMCPY( &ctx->Point, attr->data, sizeof(struct gl_point_attrib) );
+            break;
+         case GL_POLYGON_BIT:
+            MEMCPY( &ctx->Polygon, attr->data,
+                   sizeof(struct gl_polygon_attrib) );
+            break;
+        case GL_POLYGON_STIPPLE_BIT:
+           MEMCPY( ctx->PolygonStipple, attr->data, 32*sizeof(GLuint) );
+           break;
+         case GL_SCISSOR_BIT:
+            MEMCPY( &ctx->Scissor, attr->data,
+                   sizeof(struct gl_scissor_attrib) );
+            break;
+         case GL_STENCIL_BUFFER_BIT:
+            MEMCPY( &ctx->Stencil, attr->data,
+                   sizeof(struct gl_stencil_attrib) );
+            break;
+         case GL_TRANSFORM_BIT:
+            MEMCPY( &ctx->Transform, attr->data,
+                   sizeof(struct gl_transform_attrib) );
+            break;
+         case GL_TEXTURE_BIT:
+            MEMCPY( &ctx->Texture, attr->data,
+                   sizeof(struct gl_texture_attrib) );
+            break;
+         case GL_VIEWPORT_BIT:
+            MEMCPY( &ctx->Viewport, attr->data,
+                   sizeof(struct gl_viewport_attrib) );
+            break;
+         default:
+            gl_problem( ctx, "Bad attrib flag in PopAttrib");
+            break;
+      }
+
+      next = attr->next;
+      free( (void *) attr->data );
+      free( (void *) attr );
+      attr = next;
+   }
+
+   ctx->NewState = NEW_ALL;
+}
+
+
+#define GL_CLIENT_PACK_BIT (1<<20)
+#define GL_CLIENT_UNPACK_BIT (1<<21)
+
+
+void gl_PushClientAttrib( GLcontext *ctx, GLbitfield mask )
+{
+   struct gl_attrib_node *newnode;
+   struct gl_attrib_node *head;
+
+   if (INSIDE_BEGIN_END(ctx)) {
+      gl_error( ctx, GL_INVALID_OPERATION, "glPushClientAttrib" );
+      return;
+   }
+
+   if (ctx->ClientAttribStackDepth>=MAX_CLIENT_ATTRIB_STACK_DEPTH) {
+      gl_error( ctx, GL_STACK_OVERFLOW, "glPushClientAttrib" );
+      return;
+   }
+
+   /* Build linked list of attribute nodes which save all attribute */
+   /* groups specified by the mask. */
+   head = NULL;
+
+   if (mask & GL_CLIENT_PIXEL_STORE_BIT) {
+      struct gl_pixelstore_attrib *attr;
+      /* packing attribs */
+      attr = MALLOC_STRUCT( gl_pixelstore_attrib );
+      MEMCPY( attr, &ctx->Pack, sizeof(struct gl_pixelstore_attrib) );
+      newnode = new_attrib_node( GL_CLIENT_PACK_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+      /* unpacking attribs */
+      attr = MALLOC_STRUCT( gl_pixelstore_attrib );
+      MEMCPY( attr, &ctx->Unpack, sizeof(struct gl_pixelstore_attrib) );
+      newnode = new_attrib_node( GL_CLIENT_UNPACK_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+   if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
+      struct gl_array_attrib *attr;
+      attr = MALLOC_STRUCT( gl_array_attrib );
+      MEMCPY( attr, &ctx->Array, sizeof(struct gl_array_attrib) );
+      newnode = new_attrib_node( GL_CLIENT_VERTEX_ARRAY_BIT );
+      newnode->data = attr;
+      newnode->next = head;
+      head = newnode;
+   }
+
+   /* etc... */
+
+   ctx->ClientAttribStack[ctx->ClientAttribStackDepth] = head;
+   ctx->ClientAttribStackDepth++;
+}
+
+
+
+
+void gl_PopClientAttrib( GLcontext *ctx )
+{
+   struct gl_attrib_node *attr, *next;
+
+   if (INSIDE_BEGIN_END(ctx)) {
+      gl_error( ctx, GL_INVALID_OPERATION, "glPopClientAttrib" );
+      return;
+   }
+
+   if (ctx->ClientAttribStackDepth==0) {
+      gl_error( ctx, GL_STACK_UNDERFLOW, "glPopClientAttrib" );
+      return;
+   }
+
+   ctx->ClientAttribStackDepth--;
+   attr = ctx->ClientAttribStack[ctx->ClientAttribStackDepth];
+
+   while (attr) {
+      switch (attr->kind) {
+         case GL_CLIENT_PACK_BIT:
+            MEMCPY( &ctx->Pack, attr->data,
+                    sizeof(struct gl_pixelstore_attrib) );
+            break;
+         case GL_CLIENT_UNPACK_BIT:
+            MEMCPY( &ctx->Unpack, attr->data,
+                    sizeof(struct gl_pixelstore_attrib) );
+            break;
+         case GL_CLIENT_VERTEX_ARRAY_BIT:
+            MEMCPY( &ctx->Array, attr->data,
+                   sizeof(struct gl_array_attrib) );
+            break;
+         default:
+            gl_problem( ctx, "Bad attrib flag in PopClientAttrib");
+            break;
+      }
+
+      next = attr->next;
+      free( (void *) attr->data );
+      free( (void *) attr );
+      attr = next;
+   }
+
+   ctx->NewState = NEW_ALL;
+}
+
diff --git a/dll/opengl/mesa/attrib.h b/dll/opengl/mesa/attrib.h
new file mode 100644 (file)
index 0000000..80df20e
--- /dev/null
@@ -0,0 +1,48 @@
+/* $Id: attrib.h,v 1.1 1996/09/13 01:38:16 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.0
+ * Copyright (C) 1995-1996  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: attrib.h,v $
+ * Revision 1.1  1996/09/13 01:38:16  brianp
+ * Initial revision
+ *
+ */
+
+
+#ifndef ATTRIB_H
+#define ATTRIB_h
+
+
+#include "types.h"
+
+
+extern void gl_PushAttrib( GLcontext* ctx, GLbitfield mask );
+
+extern void gl_PopAttrib( GLcontext* ctx );
+
+extern void gl_PushClientAttrib( GLcontext *ctx, GLbitfield mask );
+
+extern void gl_PopClientAttrib( GLcontext *ctx );
+
+
+#endif
diff --git a/dll/opengl/mesa/bitmap.c b/dll/opengl/mesa/bitmap.c
new file mode 100644 (file)
index 0000000..06e9707
--- /dev/null
@@ -0,0 +1,221 @@
+/* $Id: bitmap.c,v 1.9 1998/02/03 23:45:02 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.5
+ * Copyright (C) 1995-1997  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: bitmap.c,v $
+ * Revision 1.9  1998/02/03 23:45:02  brianp
+ * added casts to prevent warnings with Amiga StormC compiler
+ *
+ * Revision 1.8  1997/10/02 03:06:42  brianp
+ * added #include <assert.h>
+ *
+ * Revision 1.7  1997/09/27 00:15:39  brianp
+ * changed parameters to gl_unpack_image()
+ *
+ * Revision 1.6  1997/07/24 01:24:45  brianp
+ * changed precompiled header symbol from PCH to PC_HEADER
+ *
+ * Revision 1.5  1997/06/20 02:18:09  brianp
+ * replaced Current.IntColor with Current.ByteColor
+ *
+ * Revision 1.4  1997/05/28 03:23:48  brianp
+ * added precompiled header (PCH) support
+ *
+ * Revision 1.3  1996/11/06 04:23:18  brianp
+ * replaced 0 with GL_COLOR_INDEX in gl_unpack_bitmap()
+ *
+ * Revision 1.2  1996/09/15 14:18:10  brianp
+ * now use GLframebuffer and GLvisual
+ *
+ * Revision 1.1  1996/09/13 01:38:16  brianp
+ * Initial revision
+ *
+ */
+
+
+#ifdef PC_HEADER
+#include "all.h"
+#else
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include "bitmap.h"
+#include "context.h"
+#include "feedback.h"
+#include "image.h"
+#include "macros.h"
+#include "pb.h"
+#include "types.h"
+#endif
+
+
+
+/*
+ * Unpack a bitmap image
+ */
+struct gl_image *gl_unpack_bitmap( GLcontext* ctx,
+                                   GLsizei width, GLsizei height,
+                                   const GLubyte *bitmap )
+{
+   return gl_unpack_image( ctx, width, height,
+                           GL_COLOR_INDEX, GL_BITMAP, bitmap );
+}
+
+
+
+
+/*
+ * Do actual rendering of a bitmap.
+ */
+void gl_render_bitmap( GLcontext* ctx,
+                       GLsizei width, GLsizei height,
+                       GLfloat xorig, GLfloat yorig,
+                       GLfloat xmove, GLfloat ymove,
+                       const struct gl_image *bitmap )
+{
+   struct pixel_buffer *PB = ctx->PB;
+   GLint bx, by;      /* bitmap position */
+   GLint px, py, pz;  /* pixel position */
+   GLubyte *ptr;
+
+   assert(bitmap);
+   assert(bitmap->Type == GL_BITMAP);
+   assert(bitmap->Format == GL_COLOR_INDEX);
+
+   if (ctx->NewState) {
+      gl_update_state(ctx);
+      PB_INIT( PB, GL_BITMAP );
+   }
+
+   if (ctx->Visual->RGBAflag) {
+      GLint r, g, b, a;
+      r = (GLint) (ctx->Current.RasterColor[0] * ctx->Visual->RedScale);
+      g = (GLint) (ctx->Current.RasterColor[1] * ctx->Visual->GreenScale);
+      b = (GLint) (ctx->Current.RasterColor[2] * ctx->Visual->BlueScale);
+      a = (GLint) (ctx->Current.RasterColor[3] * ctx->Visual->AlphaScale);
+      PB_SET_COLOR( ctx, PB, r, g, b, a );
+   }
+   else {
+      PB_SET_INDEX( ctx, PB, ctx->Current.RasterIndex );
+   }
+
+   px = (GLint) ( (ctx->Current.RasterPos[0] - xorig) + 0.0F );
+   py = (GLint) ( (ctx->Current.RasterPos[1] - yorig) + 0.0F );
+   pz = (GLint) ( ctx->Current.RasterPos[2] * DEPTH_SCALE );
+   ptr = (GLubyte *) bitmap->Data;
+
+   for (by=0;by<height;by++) {
+      GLubyte bitmask;
+
+      /* do a row */
+      bitmask = 128;
+      for (bx=0;bx<width;bx++) {
+         if (*ptr&bitmask) {
+            PB_WRITE_PIXEL( PB, px+bx, py+by, pz );
+         }
+         bitmask = bitmask >> 1;
+         if (bitmask==0) {
+            ptr++;
+            bitmask = 128;
+         }
+      }
+
+      PB_CHECK_FLUSH( ctx, PB )
+
+      /* get ready for next row */
+      if (bitmask!=128)  ptr++;
+   }
+
+   gl_flush_pb(ctx);
+}
+
+
+
+
+/*
+ * Execute a glBitmap command:
+ *   1. check for errors
+ *   2. feedback/render/select
+ *   3. advance raster position
+ */
+void gl_Bitmap( GLcontext* ctx,
+                GLsizei width, GLsizei height,
+               GLfloat xorig, GLfloat yorig,
+               GLfloat xmove, GLfloat ymove,
+                const struct gl_image *bitmap )
+{
+   if (width<0 || height<0) {
+      gl_error( ctx, GL_INVALID_VALUE, "glBitmap" );
+      return;
+   }
+   if (INSIDE_BEGIN_END(ctx)) {
+      gl_error( ctx, GL_INVALID_OPERATION, "glBitmap" );
+      return;
+   }
+   if (ctx->Current.RasterPosValid==GL_FALSE) {
+      /* do nothing */
+      return;
+   }
+
+   if (ctx->RenderMode==GL_RENDER) {
+      GLboolean completed = GL_FALSE;
+      if (ctx->Driver.Bitmap) {
+         /* let device driver try to render the bitmap */
+         completed = (*ctx->Driver.Bitmap)( ctx, width, height, xorig, yorig,
+                                            xmove, ymove, bitmap );
+      }
+      if (!completed) {
+         /* use generic function */
+         gl_render_bitmap( ctx, width, height, xorig, yorig,
+                           xmove, ymove, bitmap );
+      }
+   }
+   else if (ctx->RenderMode==GL_FEEDBACK) {
+      GLfloat color[4], texcoord[4], invq;
+      color[0] = ctx->Current.ByteColor[0] * ctx->Visual->InvRedScale;
+      color[1] = ctx->Current.ByteColor[1] * ctx->Visual->InvGreenScale;
+      color[2] = ctx->Current.ByteColor[2] * ctx->Visual->InvBlueScale;
+      color[3] = ctx->Current.ByteColor[3] * ctx->Visual->InvAlphaScale;
+      invq = 1.0F / ctx->Current.TexCoord[3];
+      texcoord[0] = ctx->Current.TexCoord[0] * invq;
+      texcoord[1] = ctx->Current.TexCoord[1] * invq;
+      texcoord[2] = ctx->Current.TexCoord[2] * invq;
+      texcoord[3] = ctx->Current.TexCoord[3];
+      FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_BITMAP_TOKEN );
+      /* TODO: Verify XYZW values are correct: */
+      gl_feedback_vertex( ctx, ctx->Current.RasterPos[0] - xorig,
+                         ctx->Current.RasterPos[1] - yorig,
+                         ctx->Current.RasterPos[2],
+                         ctx->Current.RasterPos[3],
+                         color, ctx->Current.Index, texcoord );
+   }
+   else if (ctx->RenderMode==GL_SELECT) {
+      /* Bitmaps don't generate selection hits.  See appendix B of 1.1 spec. */
+   }
+
+   /* update raster position */
+   ctx->Current.RasterPos[0] += xmove;
+   ctx->Current.RasterPos[1] += ymove;
+}
+
+
diff --git a/dll/opengl/mesa/bitmap.h b/dll/opengl/mesa/bitmap.h
new file mode 100644 (file)
index 0000000..e0b0314
--- /dev/null
@@ -0,0 +1,59 @@
+/* $Id: bitmap.h,v 1.1 1996/09/13 01:38:16 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.0
+ * Copyright (C) 1995-1996  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: bitmap.h,v $
+ * Revision 1.1  1996/09/13 01:38:16  brianp
+ * Initial revision
+ *
+ */
+
+
+#ifndef BITMAP_H
+#define BITMAP_H
+
+
+#include "types.h"
+
+
+extern struct gl_image *gl_unpack_bitmap( GLcontext* ctx,
+                                          GLsizei width, GLsizei height,
+                                          const GLubyte *bitmap );
+
+
+
+extern void gl_render_bitmap( GLcontext* ctx,
+                              GLsizei width, GLsizei height,
+                              GLfloat xorig, GLfloat yorig,
+                              GLfloat xmove, GLfloat ymove,
+                              const struct gl_image *bitmap );
+
+
+extern void gl_Bitmap( GLcontext* ctx,
+                       GLsizei width, GLsizei height,
+                       GLfloat xorig, GLfloat yorig,
+                       GLfloat xmove, GLfloat ymove,
+                       const struct gl_image *bitmap );
+
+
+#endif
diff --git a/dll/opengl/mesa/blend.c b/dll/opengl/mesa/blend.c
new file mode 100644 (file)
index 0000000..3cfe2c9
--- /dev/null
@@ -0,0 +1,547 @@
+/* $Id: blend.c,v 1.10 1998/01/27 03:42:40 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.6
+ * Copyright (C) 1995-1997  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: blend.c,v $
+ * Revision 1.10  1998/01/27 03:42:40  brianp
+ * optimized more blending modes (Kai Schuetz)
+ *
+ * Revision 1.9  1997/07/24 01:24:45  brianp
+ * changed precompiled header symbol from PCH to PC_HEADER
+ *
+ * Revision 1.8  1997/05/28 03:23:48  brianp
+ * added precompiled header (PCH) support
+ *
+ * Revision 1.7  1997/04/20 19:51:57  brianp
+ * replaced abort() with gl_problem()
+ *
+ * Revision 1.6  1997/02/15 18:27:56  brianp
+ * fixed a few error messages
+ *
+ * Revision 1.5  1997/01/28 22:17:19  brianp
+ * moved logic op blending into logic.c
+ *
+ * Revision 1.4  1997/01/04 00:13:11  brianp
+ * was using ! instead of ~ to invert pixel bits (ugh!)
+ *
+ * Revision 1.3  1996/09/19 00:53:31  brianp
+ * added missing returns after some gl_error() calls
+ *
+ * Revision 1.2  1996/09/15 14:18:10  brianp
+ * now use GLframebuffer and GLvisual
+ *
+ * Revision 1.1  1996/09/13 01:38:16  brianp
+ * Initial revision
+ *
+ */
+
+
+#ifdef PC_HEADER
+#include "all.h"
+#else
+#include <assert.h>
+#include <stdlib.h>
+#include "alphabuf.h"
+#include "blend.h"
+#include "context.h"
+#include "dlist.h"
+#include "macros.h"
+#include "pb.h"
+#include "span.h"
+#include "types.h"
+#endif
+
+
+
+void gl_BlendFunc( GLcontext* ctx, GLenum sfactor, GLenum dfactor )
+{
+   if (INSIDE_BEGIN_END(ctx)) {
+      gl_error( ctx, GL_INVALID_OPERATION, "glBlendFunc" );
+      return;
+   }
+
+   switch (sfactor) {
+      case GL_ZERO:
+      case GL_ONE:
+      case GL_DST_COLOR:
+      case GL_ONE_MINUS_DST_COLOR:
+      case GL_SRC_ALPHA:
+      case GL_ONE_MINUS_SRC_ALPHA:
+      case GL_DST_ALPHA:
+      case GL_ONE_MINUS_DST_ALPHA:
+      case GL_SRC_ALPHA_SATURATE:
+         ctx->Color.BlendSrc = sfactor;
+         break;
+      default:
+         gl_error( ctx, GL_INVALID_ENUM, "glBlendFunc(sfactor)" );
+         return;
+   }
+
+   switch (dfactor) {
+      case GL_ZERO:
+      case GL_ONE:
+      case GL_SRC_COLOR:
+      case GL_ONE_MINUS_SRC_COLOR:
+      case GL_SRC_ALPHA:
+      case GL_ONE_MINUS_SRC_ALPHA:
+      case GL_DST_ALPHA:
+      case GL_ONE_MINUS_DST_ALPHA:
+         ctx->Color.BlendDst = dfactor;
+         break;
+      default:
+         gl_error( ctx, GL_INVALID_ENUM, "glBlendFunc(dfactor)" );
+   }
+
+   ctx->NewState |= NEW_RASTER_OPS;
+}
+
+
+
+/*
+ * Do the real work of gl_blend_span() and gl_blend_pixels().
+ * Input:  n - number of pixels
+ *         mask - the usual write mask
+ * In/Out:  red, green, blue, alpha - the incoming and modified pixels
+ * Input:  rdest, gdest, bdest, adest - the pixels from the dest color buffer
+ */
+static void do_blend( GLcontext* ctx, GLuint n, const GLubyte mask[],
+                      GLubyte red[], GLubyte green[],
+                      GLubyte blue[], GLubyte alpha[],
+                      const GLubyte rdest[], const GLubyte gdest[],
+                      const GLubyte bdest[], const GLubyte adest[] )
+{
+   GLuint i;
+
+   if (ctx->Color.BlendSrc==GL_SRC_ALPHA
+       && ctx->Color.BlendDst==GL_ONE_MINUS_SRC_ALPHA) {
+      /* Alpha blending */
+      GLfloat ascale = 256.0f * ctx->Visual->InvAlphaScale;
+      GLint rmax = (GLint) ctx->Visual->RedScale;
+      GLint gmax = (GLint) ctx->Visual->GreenScale;
+      GLint bmax = (GLint) ctx->Visual->BlueScale;
+      GLint amax = (GLint) ctx->Visual->AlphaScale;
+      for (i=0;i<n;i++) {
+        if (mask[i]) {
+           GLint r, g, b, a;
+            GLint t = (GLint) ( alpha[i] * ascale );  /* t in [0,256] */
+            GLint s = 256 - t;
+           r = (red[i]   * t + rdest[i] * s) >> 8;
+           g = (green[i] * t + gdest[i] * s) >> 8;
+           b = (blue[i]  * t + bdest[i] * s) >> 8;
+           a = (alpha[i] * t + adest[i] * s) >> 8;
+
+           /* kai: I think the following clamping is not needed: */
+
+           red[i]   = MIN2( r, rmax );
+           green[i] = MIN2( g, gmax );
+           blue[i]  = MIN2( b, bmax );
+           alpha[i] = MIN2( a, amax );
+        }
+      }
+   }
+   else {
+
+      /* clipped sum */
+      if (ctx->Color.BlendSrc==GL_ONE
+         && ctx->Color.BlendDst==GL_ONE) {
+        GLint rmax = (GLint) ctx->Visual->RedScale;
+        GLint gmax = (GLint) ctx->Visual->GreenScale;
+        GLint bmax = (GLint) ctx->Visual->BlueScale;
+        GLint amax = (GLint) ctx->Visual->AlphaScale;
+        for (i=0; i < n; i++) {
+           if (mask[i]) {
+              red[i]   = MIN2(rmax, red[i]   + rdest[i]);
+              green[i] = MIN2(gmax, green[i] + gdest[i]);
+              blue[i]  = MIN2(bmax, blue[i]  + bdest[i]);
+              alpha[i] = MIN2(amax, alpha[i] + adest[i]);
+           }
+        }
+      }
+
+      /* modulation */
+      else if ((ctx->Color.BlendSrc==GL_ZERO &&
+                   ctx->Color.BlendDst==GL_SRC_COLOR)
+              ||
+              (ctx->Color.BlendSrc==GL_DST_COLOR &&
+                   ctx->Color.BlendDst==GL_ZERO)) {
+        if (ctx->Visual->EightBitColor) {
+           for (i=0; i < n; i++) {
+              if (mask[i]) {
+                 red[i]   = (red[i]   * rdest[i]) / 255;
+                 green[i] = (green[i] * gdest[i]) / 255;
+                 blue[i]  = (blue[i]  * bdest[i]) / 255;
+                 alpha[i] = (alpha[i] * adest[i]) / 255;
+              }
+           }
+        }
+         else {
+           GLint rmax = (GLint) ctx->Visual->RedScale;
+           GLint gmax = (GLint) ctx->Visual->GreenScale;
+           GLint bmax = (GLint) ctx->Visual->BlueScale;
+           GLint amax = (GLint) ctx->Visual->AlphaScale;
+           for (i=0; i < n; i++) {
+              if (mask[i]) {
+                 red[i]   = (red[i]   * rdest[i]) / rmax;
+                 green[i] = (green[i] * gdest[i]) / gmax;
+                 blue[i]  = (blue[i]  * bdest[i]) / bmax;
+                 alpha[i] = (alpha[i] * adest[i]) / amax;
+              }
+           }
+        }
+      }else{
+
+        /* General cases: */
+
+        if (ctx->Visual->EightBitColor) {
+           for (i=0;i<n;i++) {
+              if (mask[i]) {
+                 GLint Rs, Gs, Bs, As;  /* Source colors */
+                 GLint Rd, Gd, Bd, Ad;  /* Dest colors */
+                 GLint Rss, Gss, Bss, Ass;  /* Source colors scaled */
+                 GLint Rds, Gds, Bds, Ads;  /* Dest colors scaled */
+
+                 /* Source Color */
+                 Rs = red[i];
+                 Gs = green[i];
+                 Bs = blue[i];
+                 As = alpha[i];
+
+                 /* Frame buffer color */
+                 Rd = rdest[i];
+                 Gd = gdest[i];
+                 Bd = bdest[i];
+                 Ad = adest[i];
+
+                 /* Source scaling */
+                 switch (ctx->Color.BlendSrc) {
+                    case GL_ZERO:
+                       Rss = Gss = Bss = Ass = 0;
+                       break;
+                    case GL_ONE:
+                       Rss = Rs * 255;
+                       Gss = Gs * 255;
+                       Bss = Bs * 255;
+                       Ass = As * 255;
+                       break;
+                    case GL_DST_COLOR:
+                       Rss = Rs * Rd;
+                       Gss = Gs * Gd;
+                       Bss = Bs * Bd;
+                       Ass = As * Ad;
+                       break;
+                    case GL_ONE_MINUS_DST_COLOR:
+                       Rss = Rs * (255 - Rd);
+                       Gss = Gs * (255 - Gd);
+                       Bss = Bs * (255 - Bd);
+                       Ass = As * (255 - Ad);
+                       break;
+                    case GL_SRC_ALPHA:
+                       Rss = Rs * As;
+                       Gss = Gs * As;
+                       Bss = Bs * As;
+                       Ass = As * As;
+                       break;
+                    case GL_ONE_MINUS_SRC_ALPHA:
+                       Rss = Rs * (255 - As);
+                       Gss = Gs * (255 - As);
+                       Bss = Bs * (255 - As);
+                       Ass = As * (255 - As);
+                       break;
+                    case GL_DST_ALPHA:
+                       Rss = Rs * Ad;
+                       Gss = Gs * Ad;
+                       Bss = Bs * Ad;
+                       Ass = As * Ad;
+                       break;
+                    case GL_ONE_MINUS_DST_ALPHA:
+                       Rss = Rs * (255 - Ad);
+                       Gss = Gs * (255 - Ad);
+                       Bss = Bs * (255 - Ad);
+                       Ass = As * (255 - Ad);
+                       break;
+                    case GL_SRC_ALPHA_SATURATE:
+                    {
+                GLint sA = MIN2(As, 255 - Ad);
+                Rss = Rs * sA;
+                Gss = Gs * sA;
+                Bss = Bs * sA;
+                Ass = As * 255;
+                break;
+                    }
+                    default:
+                       /* this should never happen */
+                       gl_problem(ctx, "Bad blend source factor in do_blend");
+                 }
+
+                 /* Dest scaling */
+                 switch (ctx->Color.BlendDst) {
+                    case GL_ZERO:
+                       Rds = Gds = Bds = Ads = 0;
+                       break;
+                    case GL_ONE:
+                       Rds = Rd * 255;
+                       Gds = Gd * 255;
+                       Bds = Bd * 255;
+                       Ads = Ad * 255;
+                       break;
+                    case GL_SRC_COLOR:
+                       Rds = Rd * Rs;
+                       Gds = Gd * Gs;
+                       Bds = Bd * Bs;
+                       Ads = Ad * As;
+                       break;
+                    case GL_ONE_MINUS_SRC_COLOR:
+                       Rds = Rs * (255 - Rs);
+                       Gds = Gs * (255 - Gs);
+                       Bds = Bs * (255 - Bs);
+                       Ads = As * (255 - As);
+                       break;
+                    case GL_SRC_ALPHA:
+                       Rds = Rd * As;
+                       Gds = Gd * As;
+                       Bds = Bd * As;
+                       Ads = Ad * As;
+                       break;
+                    case GL_ONE_MINUS_SRC_ALPHA:
+                       Rds = Rd * (255 - As);
+                       Gds = Gd * (255 - As);
+                       Bds = Bd * (255 - As);
+                       Ads = Ad * (255 - As);
+                       break;
+                    case GL_DST_ALPHA:
+                       Rds = Rd * Ad;
+                       Gds = Gd * Ad;
+                       Bds = Bd * Ad;
+                       Ads = Ad * Ad;
+                       break;
+                    case GL_ONE_MINUS_DST_ALPHA:
+                       Rds = Rd * (255 - Ad);
+                       Gds = Gd * (255 - Ad);
+                       Bds = Bd * (255 - Ad);
+                       Ads = Ad * (255 - Ad);
+                       break;
+                    default:
+                       /* this should never happen */
+                       gl_problem(ctx, "Bad blend dest factor in do_blend");
+                 }
+
+                 /* compute blended color */
+                       red[i]   = MIN2((Rss + Rds) / 255, 255);
+                       green[i] = MIN2((Gss + Gds) / 255, 255);
+                       blue[i]  = MIN2((Bss + Bds) / 255, 255);
+                       alpha[i] = MIN2((Ass + Ads) / 255, 255);
+              }
+           }
+        }else{                 /* !EightBitColor */
+           GLfloat rmax = ctx->Visual->RedScale;
+           GLfloat gmax = ctx->Visual->GreenScale;
+           GLfloat bmax = ctx->Visual->BlueScale;
+           GLfloat amax = ctx->Visual->AlphaScale;
+           GLfloat rscale = 1.0f / rmax;
+           GLfloat gscale = 1.0f / gmax;
+           GLfloat bscale = 1.0f / bmax;
+           GLfloat ascale = 1.0f / amax;
+
+           for (i=0;i<n;i++) {
+              if (mask[i]) {
+                 GLint Rs, Gs, Bs, As;  /* Source colors */
+                 GLint Rd, Gd, Bd, Ad;  /* Dest colors */
+                 GLfloat sR, sG, sB, sA;  /* Source scaling */
+                 GLfloat dR, dG, dB, dA;  /* Dest scaling */
+                 GLfloat r, g, b, a;
+
+                 /* Source Color */
+                 Rs = red[i];
+                 Gs = green[i];
+                 Bs = blue[i];
+                 As = alpha[i];
+
+                 /* Frame buffer color */
+                 Rd = rdest[i];
+                 Gd = gdest[i];
+                 Bd = bdest[i];
+                 Ad = adest[i];
+
+                 /* Source scaling */
+                 switch (ctx->Color.BlendSrc) {
+                    case GL_ZERO:
+                       sR = sG = sB = sA = 0.0F;
+                       break;
+                    case GL_ONE:
+                       sR = sG = sB = sA = 1.0F;
+                       break;
+                    case GL_DST_COLOR:
+                       sR = (GLfloat) Rd * rscale;
+                       sG = (GLfloat) Gd * gscale;
+                       sB = (GLfloat) Bd * bscale;
+                       sA = (GLfloat) Ad * ascale;
+                       break;
+                    case GL_ONE_MINUS_DST_COLOR:
+                       sR = 1.0F - (GLfloat) Rd * rscale;
+                       sG = 1.0F - (GLfloat) Gd * gscale;
+                       sB = 1.0F - (GLfloat) Bd * bscale;
+                       sA = 1.0F - (GLfloat) Ad * ascale;
+                       break;
+                    case GL_SRC_ALPHA:
+                       sR = sG = sB = sA = (GLfloat) As * ascale;
+                       break;
+                    case GL_ONE_MINUS_SRC_ALPHA:
+                       sR = sG = sB = sA = (GLfloat) 1.0F - (GLfloat) As * ascale;
+                       break;
+                    case GL_DST_ALPHA:
+                       sR = sG = sB = sA =(GLfloat) Ad * ascale;
+                       break;
+                    case GL_ONE_MINUS_DST_ALPHA:
+                       sR = sG = sB = sA = 1.0F - (GLfloat) Ad * ascale;
+                       break;
+                    case GL_SRC_ALPHA_SATURATE:
+                       if (As < 1.0F - (GLfloat) Ad * ascale) {
+                          sR = sG = sB = (GLfloat) As * ascale;
+                       }
+                       else {
+                          sR = sG = sB = 1.0F - (GLfloat) Ad * ascale;
+                       }
+                       sA = 1.0;
+                       break;
+                    default:
+                       /* this should never happen */
+                       gl_problem(ctx, "Bad blend source factor in do_blend");
+                 }
+
+                 /* Dest scaling */
+                 switch (ctx->Color.BlendDst) {
+                    case GL_ZERO:
+                       dR = dG = dB = dA = 0.0F;
+                       break;
+                    case GL_ONE:
+                       dR = dG = dB = dA = 1.0F;
+                       break;
+                    case GL_SRC_COLOR:
+                       dR = (GLfloat) Rs * rscale;
+                       dG = (GLfloat) Gs * gscale;
+                       dB = (GLfloat) Bs * bscale;
+                       dA = (GLfloat) As * ascale;
+                       break;
+                    case GL_ONE_MINUS_SRC_COLOR:
+                       dR = 1.0F - (GLfloat) Rs * rscale;
+                       dG = 1.0F - (GLfloat) Gs * gscale;
+                       dB = 1.0F - (GLfloat) Bs * bscale;
+                       dA = 1.0F - (GLfloat) As * ascale;
+                       break;
+                    case GL_SRC_ALPHA:
+                       dR = dG = dB = dA = (GLfloat) As * ascale;
+                       break;
+                    case GL_ONE_MINUS_SRC_ALPHA:
+                       dR = dG = dB = dA = (GLfloat) 1.0F - (GLfloat) As * ascale;
+                       break;
+                    case GL_DST_ALPHA:
+                       dR = dG = dB = dA = (GLfloat) Ad * ascale;
+                       break;
+                    case GL_ONE_MINUS_DST_ALPHA:
+                       dR = dG = dB = dA = 1.0F - (GLfloat) Ad * ascale;
+                       break;
+                    default:
+                       /* this should never happen */
+                       gl_problem(ctx, "Bad blend dest factor in do_blend");
+                 }
+
+#ifdef DEBUG
+                 assert( sR>= 0.0 && sR<=1.0 );
+                 assert( sG>= 0.0 && sG<=1.0 );
+                 assert( sB>= 0.0 && sB<=1.0 );
+                 assert( sA>= 0.0 && sA<=1.0 );
+                 assert( dR>= 0.0 && dR<=1.0 );
+                 assert( dG>= 0.0 && dG<=1.0 );
+                 assert( dB>= 0.0 && dB<=1.0 );
+                 assert( dA>= 0.0 && dA<=1.0 );
+#endif
+
+                 /* compute blended color */
+                 r = Rs * sR + Rd * dR;
+                 g = Gs * sG + Gd * dG;
+                 b = Bs * sB + Bd * dB;
+                 a = As * sA + Ad * dA;
+                 red[i]   = (GLint) CLAMP( r, 0.0F, rmax );
+                 green[i] = (GLint) CLAMP( g, 0.0F, gmax );
+                 blue[i]  = (GLint) CLAMP( b, 0.0F, bmax );
+                 alpha[i] = (GLint) CLAMP( a, 0.0F, amax );
+              }
+           }
+        }
+      }
+   }
+
+}
+
+
+
+
+
+/*
+ * Apply the blending operator to a span of pixels.
+ * Input:  n - number of pixels in span
+ *         x, y - location of leftmost pixel in span in window coords.
+ *         mask - boolean mask indicating which pixels to blend.
+ * In/Out:  red, green, blue, alpha - pixel values
+ */
+void gl_blend_span( GLcontext* ctx, GLuint n, GLint x, GLint y,
+                   GLubyte red[], GLubyte green[],
+                   GLubyte blue[], GLubyte alpha[],
+                   GLubyte mask[] )
+{
+   GLubyte rdest[MAX_WIDTH], gdest[MAX_WIDTH];
+   GLubyte bdest[MAX_WIDTH], adest[MAX_WIDTH];
+
+   /* Read span of current frame buffer pixels */
+   gl_read_color_span( ctx, n, x, y, rdest, gdest, bdest, adest );
+
+   do_blend( ctx, n, mask, red, green, blue, alpha, rdest, gdest, bdest, adest );
+}
+
+
+
+
+
+/*
+ * Apply the blending operator to an array of pixels.
+ * Input:  n - number of pixels in span
+ *         x, y - array of pixel locations
+ *         mask - boolean mask indicating which pixels to blend.
+ * In/Out:  red, green, blue, alpha - array of pixel values
+ */
+void gl_blend_pixels( GLcontext* ctx,
+                      GLuint n, const GLint x[], const GLint y[],
+                     GLubyte red[], GLubyte green[],
+                     GLubyte blue[], GLubyte alpha[],
+                     GLubyte mask[] )
+{
+   GLubyte rdest[PB_SIZE], gdest[PB_SIZE], bdest[PB_SIZE], adest[PB_SIZE];
+
+   /* Read pixels from current color buffer */
+   (*ctx->Driver.ReadColorPixels)( ctx, n, x, y, rdest, gdest, bdest, adest, mask );
+   if (ctx->RasterMask & ALPHABUF_BIT) {
+      gl_read_alpha_pixels( ctx, n, x, y, adest, mask );
+   }
+
+   do_blend( ctx, n, mask, red, green, blue, alpha, rdest, gdest, bdest, adest );
+}
diff --git a/dll/opengl/mesa/blend.h b/dll/opengl/mesa/blend.h
new file mode 100644 (file)
index 0000000..b933c55
--- /dev/null
@@ -0,0 +1,54 @@
+/* $Id: blend.h,v 1.1 1996/09/13 01:38:16 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.0
+ * Copyright (C) 1995-1996  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: blend.h,v $
+ * Revision 1.1  1996/09/13 01:38:16  brianp
+ * Initial revision
+ *
+ */
+
+
+#ifndef BLEND_H
+#define BLEND_H
+
+
+#include "types.h"
+
+
+
+extern void gl_blend_span( GLcontext* ctx, GLuint n, GLint x, GLint y,
+                          GLubyte red[], GLubyte green[],
+                          GLubyte blue[], GLubyte alpha[],
+                          GLubyte mask[] );
+
+
+extern void gl_blend_pixels( GLcontext* ctx,
+                             GLuint n, const GLint x[], const GLint y[],
+                            GLubyte red[], GLubyte green[],
+                            GLubyte blue[], GLubyte alpha[],
+                            GLubyte mask[] );
+
+extern void gl_BlendFunc( GLcontext* ctx, GLenum sfactor, GLenum dfactor );
+
+#endif
diff --git a/dll/opengl/mesa/clip.c b/dll/opengl/mesa/clip.c
new file mode 100644 (file)
index 0000000..18dee9c
--- /dev/null
@@ -0,0 +1,1055 @@
+/* $Id: clip.c,v 1.16 1998/02/03 23:45:36 brianp Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  2.6
+ * Copyright (C) 1995-1997  Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ * $Log: clip.c,v $
+ * Revision 1.16  1998/02/03 23:45:36  brianp
+ * added space parameter to clip interpolation functions
+ *
+ * Revision 1.15  1998/01/06 02:40:52  brianp
+ * added DavidB's clipping interpolation optimization
+ *
+ * Revision 1.14  1997/07/24 01:24:45  brianp
+ * changed precompiled header symbol from PCH to PC_HEADER
+ *
+ * Revision 1.13  1997/05/28 03:23:48  brianp
+ * added precompiled header (PCH) support
+ *
+ * Revision 1.12  1997/04/02 03:10:06  brianp
+ * call gl_analyze_modelview_matrix instead of gl_compute_modelview_inverse
+ *
+ * Revision 1.11  1997/02/13 21:16:09  brianp
+ * if too many vertices in polygon return VB_SIZE-1, not VB_SIZE
+ *
+ * Revision 1.10  1997/02/10 21:16:12  brianp
+ * added checks in polygon clippers to prevent array overflows
+ *
+ * Revision 1.9  1997/02/04 19:39:39  brianp
+ * changed size of vlist2[] arrays to VB_SIZE per Randy Frank
+ *
+ * Revision 1.8  1996/12/02 20:10:07  brianp
+ * changed the macros in gl_viewclip_polygon() to be like gl_viewclip_line()
+ *
+ * Revision 1.7  1996/10/29 02:55:02  brianp
+ * fixed duplicate vertex bug in gl_viewclip_polygon()
+ *
+ * Revision 1.6  1996/10/07 23:48:33  brianp
+ * changed temporaries to GLdouble in gl_viewclip_polygon()
+ *
+ * Revision 1.5  1996/10/03 01:43:45  brianp
+ * changed INSIDE() macro in gl_viewclip_polygon() to work like other macros
+ *
+ * Revision 1.4  1996/10/03 01:36:33  brianp
+ * changed COMPUTE_INTERSECTION macros in gl_viewclip_polygon to avoid
+ * potential roundoff errors
+ *
+ * Revision 1.3  1996/09/27 01:24:23  brianp
+ * removed unused variables
+ *
+ * Revision 1.2  1996/09/15 01:48:58  brianp
+ * removed #define NULL 0
+ *
+ * Revision 1.1  1996/09/13 01:38:16  brianp
+ * Initial revision
+ *
+ */
+
+
+#ifdef PC_HEADER
+#include "all.h"
+#else
+#include <string.h>
+#include "clip.h"
+#include "context.h"
+#include "dlist.h"
+#include "macros.h"
+#include "matrix.h"
+#include "types.h"
+#include "vb.h"
+#include "xform.h"
+#endif
+
+
+
+
+/* Linear interpolation between A and B: */
+#define LINTERP( T, A, B )   ( (A) + (T) * ( (B) - (A) ) )
+
+
+/* Clipping coordinate spaces */
+#define EYE_SPACE 1
+#define CLIP_SPACE 2
+
+
+
+/*
+ * This function is used to interpolate colors, indexes, and texture
+ * coordinates when clipping has to be done.  In general, we compute
+ *     aux[dst] = aux[in] + t * (aux[out] - aux[in])
+ * where aux is the quantity to be interpolated.
+ * Input:  space - either EYE_SPACE or CLIP_SPACE
+ *         dst - index of array position to store interpolated value
+ *         t - a value in [0,1]
+ *         in - index of array position corresponding to 'inside' vertex
+ *         out - index of array position corresponding to 'outside' vertex
+ */
+void interpolate_aux( GLcontext* ctx, GLuint space,
+                      GLuint dst, GLfloat t, GLuint in, GLuint out )
+{
+   struct vertex_buffer* VB = ctx->VB;
+
+   if (ctx->ClipMask & CLIP_FCOLOR_BIT) {
+      VB->Fcolor[dst][0] = LINTERP( t, VB->Fcolor[in][0], VB->Fcolor[out][0] );
+      VB->Fcolor[dst][1] = LINTERP( t, VB->Fcolor[in][1], VB->Fcolor[out][1] );
+      VB->Fcolor[dst][2] = LINTERP( t, VB->Fcolor[in][2], VB->Fcolor[out][2] );
+      VB->Fcolor[dst][3] = LINTERP( t, VB->Fcolor[in][3], VB->Fcolor[out][3] );
+   }
+   else if (ctx->ClipMask & CLIP_FINDEX_BIT) {
+      VB->Findex[dst] = (GLuint) (GLint) LINTERP( t, (GLfloat) VB->Findex[in],
+                                                 (GLfloat) VB->Findex[out] );
+   }
+
+   if (ctx->ClipMask & CLIP_BCOLOR_BIT) {
+      VB->Bcolor[dst][0] = LINTERP( t, VB->Bcolor[in][0], VB->Bcolor[out][0] );
+      VB->Bcolor[dst][1] = LINTERP( t, VB->Bcolor[in][1], VB->Bcolor[out][1] );
+      VB->Bcolor[dst][2] = LINTERP( t, VB->Bcolor[in][2], VB->Bcolor[out][2] );
+      VB->Bcolor[dst][3] = LINTERP( t, VB->Bcolor[in][3], VB->Bcolor[out][3] );
+   }
+   else if (ctx->ClipMask & CLIP_BINDEX_BIT) {
+      VB->Bindex[dst] = (GLuint) (GLint) LINTERP( t, (GLfloat) VB->Bindex[in],
+                                                 (GLfloat) VB->Bindex[out] );
+   }
+
+   if (ctx->ClipMask & CLIP_TEXTURE_BIT) {
+      /* TODO: is more sophisticated texture coord interpolation needed?? */
+      if (space==CLIP_SPACE) {
+        /* also interpolate eye Z component */
+        VB->Eye[dst][2] = LINTERP( t, VB->Eye[in][2], VB->Eye[out][2] );
+      }
+      VB->TexCoord[dst][0] = LINTERP(t,VB->TexCoord[in][0],VB->TexCoord[out][0]);
+      VB->TexCoord[dst][1] = LINTERP(t,VB->TexCoord[in][1],VB->TexCoord[out][1]);
+      VB->TexCoord[dst][2] = LINTERP(t,VB->TexCoord[in][2],VB->TexCoord[out][2]);
+      VB->TexCoord[dst][3] = LINTERP(t,VB->TexCoord[in][3],VB->TexCoord[out][3]);
+   }
+
+}
+
+
+/*
+ * Some specialized version of the interpolate_aux
+ *
+ */
+
+void interpolate_aux_color_tex2( GLcontext* ctx, GLuint space,
+     &n