Merge branch 'master' into asm-shader-rework-1
authorIan Romanick <ian.d.romanick@intel.com>
Tue, 18 Aug 2009 19:20:36 +0000 (12:20 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Tue, 18 Aug 2009 19:20:36 +0000 (12:20 -0700)
Conflicts:
src/mesa/shader/arbprogparse.c

616 files changed:
Makefile
bin/mklib
configure.ac
docs/dispatch.html
docs/faq.html
docs/relnotes-7.5.1.html [new file with mode: 0644]
docs/relnotes-7.5.html
docs/relnotes-7.6.html
docs/relnotes.html
include/GL/glext.h
include/GL/glxext.h
include/GL/wglext.h
progs/demos/cubemap.c
progs/egl/Makefile
progs/egl/xeglbindtex.c [new file with mode: 0644]
progs/glsl/.gitignore
progs/glsl/Makefile
progs/glsl/brick.c
progs/glsl/brick.shtest [new file with mode: 0644]
progs/glsl/bump.c
progs/glsl/convolutions.c
progs/glsl/deriv.c
progs/glsl/fragcoord.c
progs/glsl/identity.c
progs/glsl/mandelbrot.c
progs/glsl/mandelbrot.shtest [new file with mode: 0644]
progs/glsl/multinoise.c
progs/glsl/multitex.c
progs/glsl/multitex.shtest [new file with mode: 0644]
progs/glsl/noise.c
progs/glsl/noise2.c
progs/glsl/pointcoord.c
progs/glsl/shadow_sampler.c
progs/glsl/shtest.c [new file with mode: 0644]
progs/glsl/texaaline.c
progs/glsl/texdemo1.c
progs/glsl/toyball.c
progs/glsl/toyball.shtest [new file with mode: 0644]
progs/glsl/trirast.c
progs/glsl/twoside.c
progs/glsl/vert-or-frag-only.c
progs/glsl/vert-tex.c
progs/tests/SConscript
progs/tests/floattex.c
progs/tests/getprocaddress.c
progs/tests/getprocaddress.py
progs/tests/getteximage.c
progs/tests/texcompsub.c
progs/tests/texwrap.c
progs/trivial/.gitignore
progs/trivial/Makefile
progs/util/shaderutil.c
progs/util/shaderutil.h
progs/vp/arl-static.txt
progs/vp/arl-unused.txt
progs/xdemos/Makefile
progs/xdemos/glxcontexts.c
progs/xdemos/glxgears.c
progs/xdemos/glxswapcontrol.c
progs/xdemos/multictx.c [new file with mode: 0644]
scons/gallium.py
src/egl/drivers/demo/Makefile
src/egl/drivers/demo/demo.c
src/egl/drivers/dri/Makefile
src/egl/drivers/dri/egldri.c
src/egl/drivers/glx/egl_glx.c
src/egl/drivers/xdri/egl_xdri.c
src/egl/main/Makefile
src/egl/main/eglapi.c
src/egl/main/eglcompiler.h
src/egl/main/eglconfig.c
src/egl/main/eglconfigutil.c
src/egl/main/eglcontext.c
src/egl/main/eglcontext.h
src/egl/main/eglcurrent.c
src/egl/main/eglcurrent.h
src/egl/main/egldisplay.c
src/egl/main/egldisplay.h
src/egl/main/eglglobals.c
src/egl/main/eglglobals.h
src/egl/main/eglmutex.h [new file with mode: 0644]
src/egl/main/eglsurface.c
src/egl/main/eglsurface.h
src/gallium/Makefile.template
src/gallium/auxiliary/draw/draw_pipe.c
src/gallium/auxiliary/draw/draw_pipe_pstipple.c
src/gallium/auxiliary/draw/draw_pipe_wide_point.c
src/gallium/auxiliary/draw/draw_vs_aos.c
src/gallium/auxiliary/draw/draw_vs_llvm.c
src/gallium/auxiliary/gallivm/instructionssoa.cpp
src/gallium/auxiliary/gallivm/tgsitollvm.cpp
src/gallium/auxiliary/tgsi/Makefile
src/gallium/auxiliary/tgsi/SConscript
src/gallium/auxiliary/tgsi/tgsi-instruction-set.txt
src/gallium/auxiliary/tgsi/tgsi_build.c
src/gallium/auxiliary/tgsi/tgsi_build.h
src/gallium/auxiliary/tgsi/tgsi_dump.c
src/gallium/auxiliary/tgsi/tgsi_dump_c.c
src/gallium/auxiliary/tgsi/tgsi_exec.c
src/gallium/auxiliary/tgsi/tgsi_info.c
src/gallium/auxiliary/tgsi/tgsi_info.h
src/gallium/auxiliary/tgsi/tgsi_opcode_tmp.h [new file with mode: 0644]
src/gallium/auxiliary/tgsi/tgsi_parse.c
src/gallium/auxiliary/tgsi/tgsi_parse.h
src/gallium/auxiliary/tgsi/tgsi_ppc.c
src/gallium/auxiliary/tgsi/tgsi_sanity.c
src/gallium/auxiliary/tgsi/tgsi_sse2.c
src/gallium/auxiliary/tgsi/tgsi_text.c
src/gallium/auxiliary/tgsi/tgsi_ureg.c [new file with mode: 0644]
src/gallium/auxiliary/tgsi/tgsi_ureg.h [new file with mode: 0644]
src/gallium/auxiliary/util/u_blit.c
src/gallium/auxiliary/util/u_debug.c
src/gallium/auxiliary/util/u_gen_mipmap.c
src/gallium/auxiliary/util/u_math.h
src/gallium/auxiliary/util/u_memory.h
src/gallium/auxiliary/util/u_mm.c
src/gallium/auxiliary/util/u_mm.h
src/gallium/auxiliary/util/u_simple_screen.c
src/gallium/auxiliary/util/u_simple_shaders.c
src/gallium/auxiliary/util/u_surface.h
src/gallium/auxiliary/util/u_tile.c
src/gallium/auxiliary/util/u_time.c
src/gallium/auxiliary/util/u_time.h
src/gallium/auxiliary/util/u_timed_winsys.c
src/gallium/drivers/cell/ppu/cell_gen_fp.c
src/gallium/drivers/cell/ppu/cell_texture.c
src/gallium/drivers/cell/spu/spu_exec.c
src/gallium/drivers/i915simple/i915_batch.h
src/gallium/drivers/i915simple/i915_context.c
src/gallium/drivers/i915simple/i915_fpc_translate.c
src/gallium/drivers/i915simple/i915_screen.c
src/gallium/drivers/i915simple/i915_texture.c
src/gallium/drivers/i915simple/i915_winsys.h
src/gallium/drivers/i965simple/brw_tex_layout.c
src/gallium/drivers/i965simple/brw_vs_emit.c
src/gallium/drivers/i965simple/brw_wm_glsl.c
src/gallium/drivers/identity/id_context.c
src/gallium/drivers/identity/id_drm.c
src/gallium/drivers/identity/id_screen.c
src/gallium/drivers/nouveau/nouveau_screen.c
src/gallium/drivers/nv04/nv04_surface_2d.c
src/gallium/drivers/nv20/nv20_vertprog.c
src/gallium/drivers/nv30/nv30_fragprog.c
src/gallium/drivers/nv30/nv30_screen.c
src/gallium/drivers/nv30/nv30_vertprog.c
src/gallium/drivers/nv40/nv40_fragprog.c
src/gallium/drivers/nv40/nv40_vertprog.c
src/gallium/drivers/nv50/nv50_context.c
src/gallium/drivers/nv50/nv50_context.h
src/gallium/drivers/nv50/nv50_miptree.c
src/gallium/drivers/nv50/nv50_program.c
src/gallium/drivers/nv50/nv50_query.c
src/gallium/drivers/nv50/nv50_screen.c
src/gallium/drivers/nv50/nv50_state.c
src/gallium/drivers/nv50/nv50_state_validate.c
src/gallium/drivers/nv50/nv50_surface.c
src/gallium/drivers/nv50/nv50_tex.c
src/gallium/drivers/nv50/nv50_texture.h
src/gallium/drivers/nv50/nv50_transfer.c
src/gallium/drivers/nv50/nv50_vbo.c
src/gallium/drivers/r300/Makefile
src/gallium/drivers/r300/r300_context.c
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_debug.c [deleted file]
src/gallium/drivers/r300/r300_debug.h [deleted file]
src/gallium/drivers/r300/r300_emit.c
src/gallium/drivers/r300/r300_emit.h
src/gallium/drivers/r300/r300_fs.c
src/gallium/drivers/r300/r300_fs.h
src/gallium/drivers/r300/r300_fs_inlines.h [deleted file]
src/gallium/drivers/r300/r300_screen.c
src/gallium/drivers/r300/r300_state.c
src/gallium/drivers/r300/r300_state_derived.c
src/gallium/drivers/r300/r300_state_invariant.c
src/gallium/drivers/r300/r300_surface.c
src/gallium/drivers/r300/r300_texture.c
src/gallium/drivers/r300/r300_tgsi_to_rc.c [new file with mode: 0644]
src/gallium/drivers/r300/r300_tgsi_to_rc.h [new file with mode: 0644]
src/gallium/drivers/r300/r300_vs.c
src/gallium/drivers/r300/r300_vs.h
src/gallium/drivers/r300/r3xx_fs.c
src/gallium/drivers/r300/r3xx_fs.h
src/gallium/drivers/r300/r5xx_fs.c
src/gallium/drivers/r300/r5xx_fs.h
src/gallium/drivers/softpipe/sp_texture.c
src/gallium/drivers/trace/tr_drm.c
src/gallium/drivers/trace/tr_screen.c
src/gallium/include/pipe/internal/p_winsys_screen.h
src/gallium/include/pipe/p_defines.h
src/gallium/include/pipe/p_screen.h
src/gallium/include/pipe/p_shader_tokens.h
src/gallium/state_trackers/dri/dri_context.c
src/gallium/state_trackers/dri/dri_drawable.c
src/gallium/state_trackers/dri/dri_drawable.h
src/gallium/state_trackers/dri/dri_screen.c
src/gallium/state_trackers/dri/dri_screen.h
src/gallium/state_trackers/egl/egl_context.c
src/gallium/state_trackers/egl/egl_surface.c
src/gallium/state_trackers/glx/xlib/Makefile
src/gallium/state_trackers/glx/xlib/SConscript
src/gallium/state_trackers/glx/xlib/fakeglx.h [deleted file]
src/gallium/state_trackers/glx/xlib/glx_api.c [moved from src/gallium/state_trackers/glx/xlib/fakeglx.c with 79% similarity]
src/gallium/state_trackers/glx/xlib/glx_getproc.c [new file with mode: 0644]
src/gallium/state_trackers/glx/xlib/glx_usefont.c [moved from src/gallium/state_trackers/glx/xlib/fakeglx_fonts.c with 96% similarity]
src/gallium/state_trackers/glx/xlib/glxapi.c [deleted file]
src/gallium/state_trackers/glx/xlib/glxapi.h [deleted file]
src/gallium/state_trackers/glx/xlib/xm_api.h
src/gallium/state_trackers/vega/asm_filters.h
src/gallium/state_trackers/vega/vg_tracker.c
src/gallium/state_trackers/vega/vg_tracker.h
src/gallium/state_trackers/xorg/xorg_dri2.c
src/gallium/state_trackers/xorg/xorg_driver.c
src/gallium/state_trackers/xorg/xorg_exa.c
src/gallium/state_trackers/xorg/xorg_exa.h
src/gallium/state_trackers/xorg/xorg_tracker.h
src/gallium/winsys/drm/Makefile.template
src/gallium/winsys/drm/intel/dri/SConscript
src/gallium/winsys/drm/intel/egl/Makefile
src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c
src/gallium/winsys/drm/intel/gem/intel_be_context.c
src/gallium/winsys/drm/intel/gem/intel_be_device.c
src/gallium/winsys/drm/intel/gem/intel_be_device.h
src/gallium/winsys/drm/intel/xorg/Makefile
src/gallium/winsys/drm/radeon/core/radeon_buffer.c
src/gallium/winsys/drm/radeon/core/radeon_buffer.h
src/gallium/winsys/drm/radeon/core/radeon_drm.c
src/gallium/winsys/drm/radeon/core/radeon_drm.h
src/gallium/winsys/drm/radeon/core/radeon_r300.c
src/gallium/winsys/drm/radeon/core/radeon_r300.h
src/gallium/winsys/egl_xlib/egl_xlib.c
src/gallium/winsys/egl_xlib/sw_winsys.c
src/gallium/winsys/xlib/xlib_brw_screen.c
src/gallium/winsys/xlib/xlib_softpipe.c
src/glut/glx/win32_winproc.c
src/glx/x11/dri2.c
src/glx/x11/dri2.h
src/glx/x11/dri2_glx.c
src/glx/x11/dri_common.c
src/glx/x11/dri_glx.c
src/glx/x11/drisw_glx.c
src/glx/x11/glx_pbuffer.c
src/glx/x11/glx_query.c
src/glx/x11/glxclient.h
src/glx/x11/glxcmds.c
src/glx/x11/glxcurrent.c
src/glx/x11/glxext.c
src/glx/x11/glxextensions.c
src/glx/x11/indirect_size.c
src/glx/x11/indirect_vertex_array.c
src/glx/x11/single2.c
src/mesa/drivers/common/meta.c [new file with mode: 0644]
src/mesa/drivers/common/meta.h [new file with mode: 0644]
src/mesa/drivers/dri/common/.gitignore [new file with mode: 0644]
src/mesa/drivers/dri/common/dri_metaops.c
src/mesa/drivers/dri/common/dri_util.c
src/mesa/drivers/dri/common/extension_helper.h
src/mesa/drivers/dri/fb/fb_egl.c
src/mesa/drivers/dri/i915/i830_context.h
src/mesa/drivers/dri/i915/i830_reg.h
src/mesa/drivers/dri/i915/i830_state.c
src/mesa/drivers/dri/i915/i830_vtbl.c
src/mesa/drivers/dri/i915/i915_context.c
src/mesa/drivers/dri/i915/i915_context.h
src/mesa/drivers/dri/i915/i915_reg.h
src/mesa/drivers/dri/i915/i915_state.c
src/mesa/drivers/dri/i915/i915_vtbl.c
src/mesa/drivers/dri/i965/Makefile
src/mesa/drivers/dri/i965/brw_clip.c
src/mesa/drivers/dri/i965/brw_clip.h
src/mesa/drivers/dri/i965/brw_clip_line.c
src/mesa/drivers/dri/i965/brw_clip_point.c
src/mesa/drivers/dri/i965/brw_clip_tri.c
src/mesa/drivers/dri/i965/brw_clip_unfilled.c
src/mesa/drivers/dri/i965/brw_clip_util.c
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_defines.h
src/mesa/drivers/dri/i965/brw_disasm.c [new file with mode: 0644]
src/mesa/drivers/dri/i965/brw_draw.c
src/mesa/drivers/dri/i965/brw_draw.h
src/mesa/drivers/dri/i965/brw_draw_upload.c
src/mesa/drivers/dri/i965/brw_eu.c
src/mesa/drivers/dri/i965/brw_eu_emit.c
src/mesa/drivers/dri/i965/brw_gs_emit.c
src/mesa/drivers/dri/i965/brw_sf_state.c
src/mesa/drivers/dri/i965/brw_state.h
src/mesa/drivers/dri/i965/brw_state_upload.c
src/mesa/drivers/dri/i965/brw_structs.h
src/mesa/drivers/dri/i965/brw_tex_layout.c
src/mesa/drivers/dri/i965/brw_vs_emit.c
src/mesa/drivers/dri/i965/brw_wm.c
src/mesa/drivers/dri/i965/brw_wm.h
src/mesa/drivers/dri/i965/brw_wm_emit.c
src/mesa/drivers/dri/i965/brw_wm_fp.c
src/mesa/drivers/dri/i965/brw_wm_glsl.c
src/mesa/drivers/dri/i965/brw_wm_iz.c
src/mesa/drivers/dri/i965/brw_wm_pass0.c
src/mesa/drivers/dri/i965/brw_wm_sampler_state.c
src/mesa/drivers/dri/intel/intel_batchbuffer.c
src/mesa/drivers/dri/intel/intel_blit.c
src/mesa/drivers/dri/intel/intel_context.c
src/mesa/drivers/dri/intel/intel_context.h
src/mesa/drivers/dri/intel/intel_extensions.c
src/mesa/drivers/dri/intel/intel_fbo.c
src/mesa/drivers/dri/intel/intel_pixel_copy.c
src/mesa/drivers/dri/intel/intel_regions.c
src/mesa/drivers/dri/intel/intel_screen.c
src/mesa/drivers/dri/intel/intel_span.c
src/mesa/drivers/dri/intel/intel_tex_subimage.c
src/mesa/drivers/dri/r200/.gitignore [deleted file]
src/mesa/drivers/dri/r200/Makefile
src/mesa/drivers/dri/r200/r200_cmdbuf.c
src/mesa/drivers/dri/r200/r200_context.c
src/mesa/drivers/dri/r200/r200_state_init.c
src/mesa/drivers/dri/r200/radeon_bo_legacy.c [new symlink]
src/mesa/drivers/dri/r200/radeon_bo_legacy.h [new symlink]
src/mesa/drivers/dri/r200/radeon_bocs_wrapper.h [new symlink]
src/mesa/drivers/dri/r200/radeon_chipset.h [new symlink]
src/mesa/drivers/dri/r200/radeon_cmdbuf.h [new symlink]
src/mesa/drivers/dri/r200/radeon_common.c [new symlink]
src/mesa/drivers/dri/r200/radeon_common.h [new symlink]
src/mesa/drivers/dri/r200/radeon_common_context.c [new symlink]
src/mesa/drivers/dri/r200/radeon_common_context.h [new symlink]
src/mesa/drivers/dri/r200/radeon_cs_legacy.c [new symlink]
src/mesa/drivers/dri/r200/radeon_cs_legacy.h [new symlink]
src/mesa/drivers/dri/r200/radeon_cs_space_drm.c [new symlink]
src/mesa/drivers/dri/r200/radeon_dma.c [new symlink]
src/mesa/drivers/dri/r200/radeon_dma.h [new symlink]
src/mesa/drivers/dri/r200/radeon_fbo.c [new symlink]
src/mesa/drivers/dri/r200/radeon_lock.c [new symlink]
src/mesa/drivers/dri/r200/radeon_lock.h [new symlink]
src/mesa/drivers/dri/r200/radeon_mipmap_tree.c [new symlink]
src/mesa/drivers/dri/r200/radeon_mipmap_tree.h [new symlink]
src/mesa/drivers/dri/r200/radeon_screen.c [new symlink]
src/mesa/drivers/dri/r200/radeon_screen.h [new symlink]
src/mesa/drivers/dri/r200/radeon_span.c [new symlink]
src/mesa/drivers/dri/r200/radeon_span.h [new symlink]
src/mesa/drivers/dri/r200/radeon_texture.c [new symlink]
src/mesa/drivers/dri/r200/radeon_texture.h [new symlink]
src/mesa/drivers/dri/r200/server/radeon.h [new symlink]
src/mesa/drivers/dri/r200/server/radeon_dri.c [new symlink]
src/mesa/drivers/dri/r200/server/radeon_dri.h [new symlink]
src/mesa/drivers/dri/r200/server/radeon_egl.c [new symlink]
src/mesa/drivers/dri/r200/server/radeon_macros.h [new symlink]
src/mesa/drivers/dri/r200/server/radeon_reg.h [new symlink]
src/mesa/drivers/dri/r300/.gitignore [deleted file]
src/mesa/drivers/dri/r300/Makefile
src/mesa/drivers/dri/r300/compiler/Makefile [new file with mode: 0644]
src/mesa/drivers/dri/r300/compiler/memory_pool.c [new file with mode: 0644]
src/mesa/drivers/dri/r300/compiler/memory_pool.h [new file with mode: 0644]
src/mesa/drivers/dri/r300/compiler/r300_fragprog.c [new file with mode: 0644]
src/mesa/drivers/dri/r300/compiler/r300_fragprog.h [new file with mode: 0644]
src/mesa/drivers/dri/r300/compiler/r300_fragprog_emit.c [moved from src/mesa/drivers/dri/r300/r300_fragprog_emit.c with 56% similarity]
src/mesa/drivers/dri/r300/compiler/r300_fragprog_swizzle.c [moved from src/mesa/drivers/dri/r300/r300_fragprog_swizzle.c with 93% similarity]
src/mesa/drivers/dri/r300/compiler/r300_fragprog_swizzle.h [moved from src/mesa/drivers/dri/r300/r300_fragprog_swizzle.h with 100% similarity]
src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c [new file with mode: 0644]
src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c [new file with mode: 0644]
src/mesa/drivers/dri/r300/compiler/r3xx_vertprog_dump.c [new file with mode: 0644]
src/mesa/drivers/dri/r300/compiler/r500_fragprog.c [moved from src/mesa/drivers/dri/r300/r500_fragprog.c with 65% similarity]
src/mesa/drivers/dri/r300/compiler/r500_fragprog.h [moved from src/mesa/drivers/dri/r300/r500_fragprog.h with 83% similarity]
src/mesa/drivers/dri/r300/compiler/r500_fragprog_emit.c [moved from src/mesa/drivers/dri/r300/r500_fragprog_emit.c with 81% similarity]
src/mesa/drivers/dri/r300/compiler/radeon_code.c [new file with mode: 0644]
src/mesa/drivers/dri/r300/compiler/radeon_code.h [new file with mode: 0644]
src/mesa/drivers/dri/r300/compiler/radeon_compiler.c [new file with mode: 0644]
src/mesa/drivers/dri/r300/compiler/radeon_compiler.h [new file with mode: 0644]
src/mesa/drivers/dri/r300/compiler/radeon_nqssadce.c [moved from src/mesa/drivers/dri/r300/radeon_nqssadce.c with 63% similarity]
src/mesa/drivers/dri/r300/compiler/radeon_nqssadce.h [moved from src/mesa/drivers/dri/r300/radeon_nqssadce.h with 93% similarity]
src/mesa/drivers/dri/r300/compiler/radeon_program.c [new file with mode: 0644]
src/mesa/drivers/dri/r300/compiler/radeon_program.h [moved from src/mesa/drivers/dri/r300/radeon_program.h with 79% similarity]
src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c [moved from src/mesa/drivers/dri/r300/radeon_program_alu.c with 50% similarity]
src/mesa/drivers/dri/r300/compiler/radeon_program_alu.h [moved from src/mesa/drivers/dri/r300/radeon_program_alu.h with 81% similarity]
src/mesa/drivers/dri/r300/compiler/radeon_program_pair.c [moved from src/mesa/drivers/dri/r300/radeon_program_pair.c with 75% similarity]
src/mesa/drivers/dri/r300/compiler/radeon_program_pair.h [moved from src/mesa/drivers/dri/r300/radeon_program_pair.h with 84% similarity]
src/mesa/drivers/dri/r300/r300_cmdbuf.c
src/mesa/drivers/dri/r300/r300_context.c
src/mesa/drivers/dri/r300/r300_context.h
src/mesa/drivers/dri/r300/r300_draw.c
src/mesa/drivers/dri/r300/r300_emit.c
src/mesa/drivers/dri/r300/r300_emit.h
src/mesa/drivers/dri/r300/r300_fragprog.c [deleted file]
src/mesa/drivers/dri/r300/r300_fragprog.h [deleted file]
src/mesa/drivers/dri/r300/r300_fragprog_common.c
src/mesa/drivers/dri/r300/r300_fragprog_common.h
src/mesa/drivers/dri/r300/r300_ioctl.c
src/mesa/drivers/dri/r300/r300_queryobj.c [new file with mode: 0644]
src/mesa/drivers/dri/r300/r300_queryobj.h [new file with mode: 0644]
src/mesa/drivers/dri/r300/r300_reg.h
src/mesa/drivers/dri/r300/r300_render.c
src/mesa/drivers/dri/r300/r300_shader.c
src/mesa/drivers/dri/r300/r300_state.c
src/mesa/drivers/dri/r300/r300_swtcl.c
src/mesa/drivers/dri/r300/r300_vertprog.c
src/mesa/drivers/dri/r300/r300_vertprog.h
src/mesa/drivers/dri/r300/radeon_bo_legacy.c [new symlink]
src/mesa/drivers/dri/r300/radeon_bo_legacy.h [new symlink]
src/mesa/drivers/dri/r300/radeon_bocs_wrapper.h [new symlink]
src/mesa/drivers/dri/r300/radeon_buffer_objects.c [new symlink]
src/mesa/drivers/dri/r300/radeon_buffer_objects.h [new symlink]
src/mesa/drivers/dri/r300/radeon_chipset.h [new symlink]
src/mesa/drivers/dri/r300/radeon_cmdbuf.h [new symlink]
src/mesa/drivers/dri/r300/radeon_common.c [new symlink]
src/mesa/drivers/dri/r300/radeon_common.h [new symlink]
src/mesa/drivers/dri/r300/radeon_common_context.c [new symlink]
src/mesa/drivers/dri/r300/radeon_common_context.h [new symlink]
src/mesa/drivers/dri/r300/radeon_cs_legacy.c [new symlink]
src/mesa/drivers/dri/r300/radeon_cs_legacy.h [new symlink]
src/mesa/drivers/dri/r300/radeon_cs_space_drm.c [new symlink]
src/mesa/drivers/dri/r300/radeon_dma.c [new symlink]
src/mesa/drivers/dri/r300/radeon_dma.h [new symlink]
src/mesa/drivers/dri/r300/radeon_fbo.c [new symlink]
src/mesa/drivers/dri/r300/radeon_lock.c [new symlink]
src/mesa/drivers/dri/r300/radeon_lock.h [new symlink]
src/mesa/drivers/dri/r300/radeon_mipmap_tree.c [new symlink]
src/mesa/drivers/dri/r300/radeon_mipmap_tree.h [new symlink]
src/mesa/drivers/dri/r300/radeon_program.c [deleted file]
src/mesa/drivers/dri/r300/radeon_screen.c [new symlink]
src/mesa/drivers/dri/r300/radeon_screen.h [new symlink]
src/mesa/drivers/dri/r300/radeon_span.c [new symlink]
src/mesa/drivers/dri/r300/radeon_span.h [new symlink]
src/mesa/drivers/dri/r300/radeon_texture.c [new symlink]
src/mesa/drivers/dri/r300/radeon_texture.h [new symlink]
src/mesa/drivers/dri/r300/server/radeon.h [new symlink]
src/mesa/drivers/dri/r300/server/radeon_dri.c [new symlink]
src/mesa/drivers/dri/r300/server/radeon_dri.h [new symlink]
src/mesa/drivers/dri/r300/server/radeon_egl.c [new symlink]
src/mesa/drivers/dri/r300/server/radeon_macros.h [new symlink]
src/mesa/drivers/dri/r300/server/radeon_reg.h [new symlink]
src/mesa/drivers/dri/r600/Makefile
src/mesa/drivers/dri/r600/r600_cmdbuf.c
src/mesa/drivers/dri/r600/r600_cmdbuf.h
src/mesa/drivers/dri/r600/r600_context.c
src/mesa/drivers/dri/r600/r600_context.h
src/mesa/drivers/dri/r600/r600_emit.c
src/mesa/drivers/dri/r600/r600_tex.c
src/mesa/drivers/dri/r600/r600_texstate.c
src/mesa/drivers/dri/r600/r700_assembler.c
src/mesa/drivers/dri/r600/r700_assembler.h
src/mesa/drivers/dri/r600/r700_chip.c
src/mesa/drivers/dri/r600/r700_chip.h
src/mesa/drivers/dri/r600/r700_clear.c
src/mesa/drivers/dri/r600/r700_fragprog.c
src/mesa/drivers/dri/r600/r700_ioctl.c
src/mesa/drivers/dri/r600/r700_oglprog.c
src/mesa/drivers/dri/r600/r700_render.c
src/mesa/drivers/dri/r600/r700_state.c
src/mesa/drivers/dri/r600/r700_state.h
src/mesa/drivers/dri/r600/r700_vertprog.c
src/mesa/drivers/dri/r600/radeon_bo_legacy.c [new symlink]
src/mesa/drivers/dri/r600/radeon_bo_legacy.h [new symlink]
src/mesa/drivers/dri/r600/radeon_bocs_wrapper.h [new symlink]
src/mesa/drivers/dri/r600/radeon_chipset.h [new symlink]
src/mesa/drivers/dri/r600/radeon_cmdbuf.h [new symlink]
src/mesa/drivers/dri/r600/radeon_common.c [new symlink]
src/mesa/drivers/dri/r600/radeon_common.h [new symlink]
src/mesa/drivers/dri/r600/radeon_common_context.c [new symlink]
src/mesa/drivers/dri/r600/radeon_common_context.h [new symlink]
src/mesa/drivers/dri/r600/radeon_context.h [deleted file]
src/mesa/drivers/dri/r600/radeon_cs_legacy.c [new symlink]
src/mesa/drivers/dri/r600/radeon_cs_legacy.h [new symlink]
src/mesa/drivers/dri/r600/radeon_cs_space_drm.c [new symlink]
src/mesa/drivers/dri/r600/radeon_dma.c [new symlink]
src/mesa/drivers/dri/r600/radeon_dma.h [new symlink]
src/mesa/drivers/dri/r600/radeon_fbo.c [new symlink]
src/mesa/drivers/dri/r600/radeon_lock.c [new symlink]
src/mesa/drivers/dri/r600/radeon_lock.h [new symlink]
src/mesa/drivers/dri/r600/radeon_mipmap_tree.c [new symlink]
src/mesa/drivers/dri/r600/radeon_mipmap_tree.h [new symlink]
src/mesa/drivers/dri/r600/radeon_screen.c [new symlink]
src/mesa/drivers/dri/r600/radeon_screen.h [new symlink]
src/mesa/drivers/dri/r600/radeon_span.c [new symlink]
src/mesa/drivers/dri/r600/radeon_span.h [new symlink]
src/mesa/drivers/dri/r600/radeon_texture.c [new symlink]
src/mesa/drivers/dri/r600/radeon_texture.h [new symlink]
src/mesa/drivers/dri/r600/server/radeon.h [new symlink]
src/mesa/drivers/dri/r600/server/radeon_dri.c [new symlink]
src/mesa/drivers/dri/r600/server/radeon_dri.h [new symlink]
src/mesa/drivers/dri/r600/server/radeon_egl.c [new symlink]
src/mesa/drivers/dri/r600/server/radeon_macros.h [new symlink]
src/mesa/drivers/dri/r600/server/radeon_reg.h [new symlink]
src/mesa/drivers/dri/radeon/radeon_bo_drm.h
src/mesa/drivers/dri/radeon/radeon_bo_legacy.c
src/mesa/drivers/dri/radeon/radeon_bo_legacy.h
src/mesa/drivers/dri/radeon/radeon_bocs_wrapper.h
src/mesa/drivers/dri/radeon/radeon_buffer_objects.c [new file with mode: 0644]
src/mesa/drivers/dri/radeon/radeon_buffer_objects.h [new file with mode: 0644]
src/mesa/drivers/dri/radeon/radeon_chipset.h
src/mesa/drivers/dri/radeon/radeon_common.c
src/mesa/drivers/dri/radeon/radeon_common_context.c
src/mesa/drivers/dri/radeon/radeon_common_context.h
src/mesa/drivers/dri/radeon/radeon_cs_space_drm.c
src/mesa/drivers/dri/radeon/radeon_dma.c
src/mesa/drivers/dri/radeon/radeon_dma.h
src/mesa/drivers/dri/radeon/radeon_fbo.c
src/mesa/drivers/dri/radeon/radeon_lock.c
src/mesa/drivers/dri/radeon/radeon_lock.h
src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
src/mesa/drivers/dri/radeon/radeon_screen.c
src/mesa/drivers/dri/radeon/radeon_screen.h
src/mesa/drivers/dri/radeon/radeon_span.c
src/mesa/drivers/dri/radeon/radeon_state_init.c
src/mesa/drivers/dri/radeon/radeon_texture.c
src/mesa/drivers/dri/swrast/swrast.c
src/mesa/drivers/windows/gdi/mesa.def
src/mesa/glapi/ARB_seamless_cube_map.xml [new file with mode: 0644]
src/mesa/glapi/EXT_framebuffer_object.xml
src/mesa/glapi/EXT_texture_array.xml [new file with mode: 0644]
src/mesa/glapi/Makefile
src/mesa/glapi/dispatch.h
src/mesa/glapi/gl_API.xml
src/mesa/glapi/gl_x86-64_asm.py
src/mesa/glapi/gl_x86_asm.py
src/mesa/glapi/glapioffsets.h
src/mesa/glapi/glapitable.h
src/mesa/glapi/glapitemp.h
src/mesa/glapi/glprocs.h
src/mesa/glapi/glthread.c
src/mesa/glapi/glthread.h
src/mesa/main/api_arrayelt.c
src/mesa/main/api_exec.c
src/mesa/main/api_validate.c
src/mesa/main/attrib.c
src/mesa/main/bufferobj.c
src/mesa/main/bufferobj.h
src/mesa/main/colortab.c
src/mesa/main/compiler.h
src/mesa/main/config.h
src/mesa/main/context.c
src/mesa/main/context.h
src/mesa/main/convolve.c
src/mesa/main/debug.c
src/mesa/main/dlist.c
src/mesa/main/drawpix.c
src/mesa/main/enable.c
src/mesa/main/enums.c
src/mesa/main/extensions.c
src/mesa/main/fbobject.c
src/mesa/main/fog.c
src/mesa/main/framebuffer.c
src/mesa/main/get.c
src/mesa/main/get_gen.py
src/mesa/main/getstring.c
src/mesa/main/histogram.c
src/mesa/main/image.c
src/mesa/main/image.h
src/mesa/main/imports.c
src/mesa/main/imports.h
src/mesa/main/light.c
src/mesa/main/mtypes.h
src/mesa/main/pixel.c
src/mesa/main/polygon.c
src/mesa/main/readpix.c
src/mesa/main/shared.c
src/mesa/main/state.c
src/mesa/main/texenv.c
src/mesa/main/texenvprogram.c
src/mesa/main/texgetimage.c
src/mesa/main/texgetimage.h
src/mesa/main/teximage.c
src/mesa/main/teximage.h
src/mesa/main/texobj.c
src/mesa/main/texobj.h
src/mesa/main/texparam.c
src/mesa/main/texstate.h
src/mesa/main/texstore.c
src/mesa/main/varray.c
src/mesa/main/varray.h
src/mesa/main/viewport.c
src/mesa/shader/arbprogparse.c
src/mesa/shader/prog_instruction.h
src/mesa/shader/prog_print.c
src/mesa/shader/prog_print.h
src/mesa/shader/programopt.c
src/mesa/shader/shader_api.c
src/mesa/shader/slang/slang_builtin.c
src/mesa/shader/slang/slang_builtin.h
src/mesa/shader/slang/slang_codegen.c
src/mesa/shader/slang/slang_link.c
src/mesa/sources.mak
src/mesa/sparc/glapi_sparc.S
src/mesa/state_tracker/st_atom_shader.c
src/mesa/state_tracker/st_cb_blit.c
src/mesa/state_tracker/st_cb_clear.c
src/mesa/state_tracker/st_cb_drawpixels.c
src/mesa/state_tracker/st_cb_fbo.c
src/mesa/state_tracker/st_cb_flush.c
src/mesa/state_tracker/st_cb_rasterpos.c
src/mesa/state_tracker/st_cb_texture.c
src/mesa/state_tracker/st_draw.c
src/mesa/state_tracker/st_draw.h
src/mesa/state_tracker/st_draw_feedback.c
src/mesa/state_tracker/st_extensions.c
src/mesa/state_tracker/st_format.c
src/mesa/state_tracker/st_mesa_to_tgsi.c
src/mesa/state_tracker/st_program.c
src/mesa/state_tracker/st_public.h
src/mesa/state_tracker/st_texture.c
src/mesa/state_tracker/st_texture.h
src/mesa/swrast/s_blit.c
src/mesa/swrast/s_fragprog.c
src/mesa/swrast/s_points.c
src/mesa/tnl/t_context.c
src/mesa/tnl/t_draw.c
src/mesa/tnl/t_vb_program.c
src/mesa/tnl/tnl.h
src/mesa/vbo/vbo.h
src/mesa/vbo/vbo_exec_api.c
src/mesa/vbo/vbo_exec_array.c
src/mesa/vbo/vbo_exec_draw.c
src/mesa/vbo/vbo_rebase.c
src/mesa/vbo/vbo_save_api.c
src/mesa/vbo/vbo_save_draw.c
src/mesa/vbo/vbo_split_copy.c
src/mesa/vbo/vbo_split_inplace.c
src/mesa/x86-64/glapi_x86-64.S
src/mesa/x86/glapi_x86.S
windows/VC8/mesa/mesa/mesa.vcproj
windows/VC8/mesa/osmesa/osmesa.vcproj

index 146c520..6eed65e 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -345,7 +345,9 @@ DRI_FILES = \
        $(DIRECTORY)/src/mesa/drivers/dri/common/xmlpool/*.[ch]         \
        $(DIRECTORY)/src/mesa/drivers/dri/common/xmlpool/*.po           \
        $(DIRECTORY)/src/mesa/drivers/dri/*/*.[chS]                     \
+       $(DIRECTORY)/src/mesa/drivers/dri/*/*/*.[chS]                   \
        $(DIRECTORY)/src/mesa/drivers/dri/*/Makefile                    \
+       $(DIRECTORY)/src/mesa/drivers/dri/*/*/Makefile                  \
        $(DIRECTORY)/src/mesa/drivers/dri/*/Doxyfile                    \
        $(DIRECTORY)/src/mesa/drivers/dri/*/server/*.[ch]
 
@@ -388,7 +390,17 @@ GLW_FILES = \
        $(DIRECTORY)/src/glw/glw.pc.in                  \
        $(DIRECTORY)/src/glw/depend
 
+GLEW_FILES = \
+       $(DIRECTORY)/include/GL/glew.h                  \
+       $(DIRECTORY)/include/GL/glxew.h                 \
+       $(DIRECTORY)/include/GL/wglew.h                 \
+       $(DIRECTORY)/src/glew/*.c                       \
+       $(DIRECTORY)/src/glew/Makefile                  \
+       $(DIRECTORY)/src/glew/SConscript                \
+       $(DIRECTORY)/src/glew/LICENSE.txt
+
 DEMO_FILES = \
+       $(GLEW_FILES)                                   \
        $(DIRECTORY)/progs/beos/*.cpp                   \
        $(DIRECTORY)/progs/beos/Makefile                \
        $(DIRECTORY)/progs/images/*.rgb                 \
@@ -415,6 +427,7 @@ DEMO_FILES = \
        $(DIRECTORY)/progs/glsl/*.c                     \
        $(DIRECTORY)/progs/glsl/*.frag                  \
        $(DIRECTORY)/progs/glsl/*.vert                  \
+       $(DIRECTORY)/progs/glsl/*.shtest                \
        $(DIRECTORY)/progs/windml/Makefile.ugl          \
        $(DIRECTORY)/progs/windml/*.c                   \
        $(DIRECTORY)/progs/windml/*.bmp                 \
index 2444945..db97087 100755 (executable)
--- a/bin/mklib
+++ b/bin/mklib
@@ -971,5 +971,6 @@ esac
 #
 if [ ${INSTALLDIR} != "." ] ; then
     echo "mklib: Installing" ${FINAL_LIBS} "in" ${INSTALLDIR}
+    test -d ${INSTALLDIR} || mkdir -p ${INSTALLDIR}
     mv ${FINAL_LIBS} ${INSTALLDIR}/
 fi
index 9b65d96..9d318b3 100644 (file)
@@ -1159,6 +1159,21 @@ AC_ARG_WITH([xorg-driver-dir],
     [XORG_DRIVER_INSTALL_DIR="${libdir}/xorg/modules/drivers"])
 AC_SUBST([XORG_DRIVER_INSTALL_DIR])
 
+AC_ARG_WITH([max-width],
+    [AS_HELP_STRING([--with-max-width=N],
+                    [Maximum framebuffer width (4096)])],
+    [DEFINES="${DEFINES} -DMAX_WIDTH=${withval}";
+     AS_IF([test "${withval}" -gt "4096"],
+           [AC_MSG_WARN([Large framebuffer: see s_tritemp.h comments.])])]
+)
+AC_ARG_WITH([max-height],
+    [AS_HELP_STRING([--with-max-height=N],
+                    [Maximum framebuffer height (4096)])],
+    [DEFINES="${DEFINES} -DMAX_HEIGHT=${withval}";
+     AS_IF([test "${withval}" -gt "4096"],
+           [AC_MSG_WARN([Large framebuffer: see s_tritemp.h comments.])])]
+)
+
 dnl
 dnl Gallium Intel configuration
 dnl
index b9ea882..bcab74c 100644 (file)
@@ -198,7 +198,7 @@ few preprocessor defines.</p>
 <ul>
 <li>If <tt>GLX_USE_TLS</tt> is defined, method #4 is used.</li>
 <li>If <tt>PTHREADS</tt> is defined, method #3 is used.</li>
-<li>If any of <tt>PTHREADS</tt>, <tt>USE_XTHREADS</tt>,
+<li>If any of <tt>PTHREADS</tt>,
 <tt>SOLARIS_THREADS</tt>, <tt>WIN32_THREADS</tt>, or <tt>BEOS_THREADS</tt>
 is defined, method #2 is used.</li>
 <li>If none of the preceeding are defined, method #1 is used.</li>
index 11b5d43..65e279a 100644 (file)
@@ -316,6 +316,19 @@ Basically, applying a translation of (0.375, 0.375, 0.0) to your coordinates
 will fix the problem.
 </p>
 
+<h2>3.6 How can I change the maximum framebuffer size in Mesa's
+<tt>swrast</tt> backend?</h2>
+<p>
+These can be overridden by using the <tt>--with-max-width</tt> and
+<tt>--with-max-height</tt> options.  The two need not be equal.
+</p><p>
+Do note that Mesa uses these values to size some internal buffers,
+so increasing these sizes will cause Mesa to require additional
+memory.  Furthermore, increasing these limits beyond <tt>4096</tt>
+may introduce rasterization artifacts; see the leading comments in
+<tt>src/mesa/swrast/s_tritemp.h</tt>.
+</p>
+
 <br>
 <br>
 
diff --git a/docs/relnotes-7.5.1.html b/docs/relnotes-7.5.1.html
new file mode 100644 (file)
index 0000000..1da086d
--- /dev/null
@@ -0,0 +1,61 @@
+<HTML>
+
+<TITLE>Mesa Release Notes</TITLE>
+
+<head><link rel="stylesheet" type="text/css" href="mesa.css"></head>
+
+<BODY>
+
+<body bgcolor="#eeeeee">
+
+<H1>Mesa 7.5.1 Release Notes / (date TBD)</H1>
+
+<p>
+Mesa 7.5.1 is a bug-fix release fixing issues found since the 7.5 release.
+</p>
+<p>
+The main new feature of Mesa 7.5.x is the
+<a href="http://wiki.freedesktop.org/wiki/Software/gallium"
+target="_parent">Gallium3D</a> infrastructure.
+</p>
+<p>
+Mesa 7.5.1 implements the OpenGL 2.1 API, but the version reported by
+glGetString(GL_VERSION) depends on the particular driver being used.
+Some drivers don't support all the features required in OpenGL 2.1.
+</p>
+<p>
+See the <a href="install.html">Compiling/Installing page</a> for prerequisites
+for DRI hardware acceleration.
+</p>
+
+
+<h2>MD5 checksums</h2>
+<pre>
+tbd
+</pre>
+
+
+<h2>New features</h2>
+<ul>
+<li>Added configure --with-max-width=W, --with-max-height=H options to specify
+    max framebuffer, viewport size.
+</ul>
+
+
+<h2>Bug fixes</h2>
+<ul>
+<li>Added missing GLEW library to MesaDemos tarballs.
+<li>Fixed swapbuffers jerkiness in Doom3/etc in Intel drivers.
+<li>Fixed front buffer rendering bug in Intel drivers.
+<li>Fixed minor GLX memory leaks.
+<li>Fixed some texture env / fragment program state bugs.
+<li>Fixed some Gallium glBlitFramebuffer() bugs
+</ul>
+
+
+<h2>Changes</h2>
+<ul>
+</ul>
+
+</body>
+</html>
index 8bcacd6..56deca6 100644 (file)
@@ -40,7 +40,15 @@ If you're especially concerned with stability you should probably look for
 
 <h2>MD5 checksums</h2>
 <pre>
-tbd
+553fd956e544727f30fbe249619b6286  MesaLib-7.5.tar.gz
+459f332551f6ebb86f384d21dd15e1f0  MesaLib-7.5.tar.bz2
+8c02c0e17a9025250d20424ae32f5163  MesaLib-7.5.zip
+a188da2886fa5496ea0c2cda602b2eeb  MesaDemos-7.5.tar.gz
+398ee8801814a00e47f6c2314e3dfddc  MesaDemos-7.5.tar.bz2
+15a0c8ae013c54335a26335e1a98d609  MesaDemos-7.5.zip
+81010147def5a644ba14f9bbb7a49a2a  MesaGLUT-7.5.tar.gz
+baa7a1e850b6e39bae58868fd0684004  MesaGLUT-7.5.tar.bz2
+265228418e4423fa328f2f5b7970cf08  MesaGLUT-7.5.zip
 </pre>
 
 
index 1e7ccf8..691c0f0 100644 (file)
@@ -46,6 +46,10 @@ This was written by Zack Rusin at Tungsten Graphics.
 <li>radeon/r200/r300 GL_EXT_framebuffer_object support when used with
     kernel memory manager
 <li>r300 driver support for GL_EXT_vertex_array_bgra, GL_EXT_texture_sRGB
+<li>i915/945 driver support for GL_ARB_point_sprite, GL_EXT_stencil_two_side
+    and GL_ATI_separate_stencil extensions
+<li>Added configure --with-max-width=W, --with-max-height=H options to specify
+    max framebuffer, viewport size.
 </ul>
 
 
index 35a4c73..ddd2e1c 100644 (file)
@@ -14,6 +14,7 @@ The release notes summarize what's new or changed in each Mesa release.
 
 <UL>
 <LI><A HREF="relnotes-7.6.html">7.6 release notes</A>
+<LI><A HREF="relnotes-7.5.1.html">7.5.1 release notes</A>
 <LI><A HREF="relnotes-7.5.html">7.5 release notes</A>
 <LI><A HREF="relnotes-7.4.4.html">7.4.4 release notes</A>
 <LI><A HREF="relnotes-7.4.3.html">7.4.3 release notes</A>
index 5429287..24e6c5d 100644 (file)
@@ -29,9 +29,9 @@ extern "C" {
 */
 
 /* Header file version number, required by OpenGL ABI for Linux */
-/* glext.h last updated $Date: 2009-05-05 15:27:42 -0700 (Tue, 05 May 2009) $ */
+/* glext.h last updated $Date: 2009-08-03 02:13:51 -0700 (Mon, 03 Aug 2009) $ */
 /* Current version at http://www.opengl.org/registry/ */
-#define GL_GLEXT_VERSION 52
+#define GL_GLEXT_VERSION 54
 
 /* Function declaration macros - to move into glplatform.h */
 
@@ -510,6 +510,8 @@ extern "C" {
 #define GL_CLIP_DISTANCE3                 0x3003
 #define GL_CLIP_DISTANCE4                 0x3004
 #define GL_CLIP_DISTANCE5                 0x3005
+#define GL_CLIP_DISTANCE6                 0x3006
+#define GL_CLIP_DISTANCE7                 0x3007
 #define GL_MAX_CLIP_DISTANCES             0x0D32
 #define GL_MAJOR_VERSION                  0x821B
 #define GL_MINOR_VERSION                  0x821C
@@ -600,6 +602,9 @@ extern "C" {
 #define GL_QUERY_NO_WAIT                  0x8E14
 #define GL_QUERY_BY_REGION_WAIT           0x8E15
 #define GL_QUERY_BY_REGION_NO_WAIT        0x8E16
+#define GL_BUFFER_ACCESS_FLAGS            0x911F
+#define GL_BUFFER_MAP_LENGTH              0x9120
+#define GL_BUFFER_MAP_OFFSET              0x9121
 /* Reuse tokens from ARB_depth_buffer_float */
 /* reuse GL_DEPTH_COMPONENT32F */
 /* reuse GL_DEPTH32F_STENCIL8 */
@@ -804,6 +809,84 @@ extern "C" {
 /* reuse GL_INVALID_INDEX */
 #endif
 
+#ifndef GL_VERSION_3_2
+#define GL_CONTEXT_CORE_PROFILE_BIT       0x00000001
+#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
+#define GL_LINES_ADJACENCY                0x000A
+#define GL_LINE_STRIP_ADJACENCY           0x000B
+#define GL_TRIANGLES_ADJACENCY            0x000C
+#define GL_TRIANGLE_STRIP_ADJACENCY       0x000D
+#define GL_PROGRAM_POINT_SIZE             0x8642
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8
+#define GL_GEOMETRY_SHADER                0x8DD9
+#define GL_GEOMETRY_VERTICES_OUT          0x8916
+#define GL_GEOMETRY_INPUT_TYPE            0x8917
+#define GL_GEOMETRY_OUTPUT_TYPE           0x8918
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES   0x8DE0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS   0x9122
+#define GL_MAX_GEOMETRY_INPUT_COMPONENTS  0x9123
+#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS  0x9125
+#define GL_CONTEXT_PROFILE_MASK           0x9126
+/* reuse GL_MAX_VARYING_COMPONENTS */
+/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */
+/* Reuse tokens from ARB_depth_clamp */
+/* reuse GL_DEPTH_CLAMP */
+/* Would reuse tokens from ARB_draw_elements_base_vertex, but it has none */
+/* Would reuse tokens from ARB_fragment_coord_conventions, but it has none */
+/* Reuse tokens from ARB_provoking_vertex */
+/* reuse GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION */
+/* reuse GL_FIRST_VERTEX_CONVENTION */
+/* reuse GL_LAST_VERTEX_CONVENTION */
+/* reuse GL_PROVOKING_VERTEX */
+/* Reuse tokens from ARB_seamless_cube_map */
+/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS */
+/* Reuse tokens from ARB_sync */
+/* reuse GL_MAX_SERVER_WAIT_TIMEOUT */
+/* reuse GL_OBJECT_TYPE */
+/* reuse GL_SYNC_CONDITION */
+/* reuse GL_SYNC_STATUS */
+/* reuse GL_SYNC_FLAGS */
+/* reuse GL_SYNC_FENCE */
+/* reuse GL_SYNC_GPU_COMMANDS_COMPLETE */
+/* reuse GL_UNSIGNALED */
+/* reuse GL_SIGNALED */
+/* reuse GL_ALREADY_SIGNALED */
+/* reuse GL_TIMEOUT_EXPIRED */
+/* reuse GL_CONDITION_SATISFIED */
+/* reuse GL_WAIT_FAILED */
+/* reuse GL_TIMEOUT_IGNORED */
+/* reuse GL_SYNC_FLUSH_COMMANDS_BIT */
+/* reuse GL_TIMEOUT_IGNORED */
+/* Reuse tokens from ARB_texture_multisample */
+/* reuse GL_SAMPLE_POSITION */
+/* reuse GL_SAMPLE_MASK */
+/* reuse GL_SAMPLE_MASK_VALUE */
+/* reuse GL_MAX_SAMPLE_MASK_WORDS */
+/* reuse GL_TEXTURE_2D_MULTISAMPLE */
+/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE */
+/* reuse GL_TEXTURE_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE */
+/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_TEXTURE_SAMPLES */
+/* reuse GL_TEXTURE_FIXED_SAMPLE_LOCATIONS */
+/* reuse GL_SAMPLER_2D_MULTISAMPLE */
+/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE */
+/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE */
+/* reuse GL_SAMPLER_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_MAX_COLOR_TEXTURE_SAMPLES */
+/* reuse GL_MAX_DEPTH_TEXTURE_SAMPLES */
+/* reuse GL_MAX_INTEGER_SAMPLES */
+/* Don't need to reuse tokens from ARB_vertex_array_bgra since they're already in 1.2 core */
+#endif
+
 #ifndef GL_ARB_multitexture
 #define GL_TEXTURE0_ARB                   0x84C0
 #define GL_TEXTURE1_ARB                   0x84C1
@@ -1530,6 +1613,100 @@ extern "C" {
 #ifndef GL_ARB_shader_texture_lod
 #endif
 
+#ifndef GL_ARB_depth_clamp
+#define GL_DEPTH_CLAMP                    0x864F
+#endif
+
+#ifndef GL_ARB_draw_elements_base_vertex
+#endif
+
+#ifndef GL_ARB_fragment_coord_conventions
+#endif
+
+#ifndef GL_ARB_provoking_vertex
+#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C
+#define GL_FIRST_VERTEX_CONVENTION        0x8E4D
+#define GL_LAST_VERTEX_CONVENTION         0x8E4E
+#define GL_PROVOKING_VERTEX               0x8E4F
+#endif
+
+#ifndef GL_ARB_seamless_cube_map
+#define GL_TEXTURE_CUBE_MAP_SEAMLESS      0x884F
+#endif
+
+#ifndef GL_ARB_sync
+#define GL_MAX_SERVER_WAIT_TIMEOUT        0x9111
+#define GL_OBJECT_TYPE                    0x9112
+#define GL_SYNC_CONDITION                 0x9113
+#define GL_SYNC_STATUS                    0x9114
+#define GL_SYNC_FLAGS                     0x9115
+#define GL_SYNC_FENCE                     0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE     0x9117
+#define GL_UNSIGNALED                     0x9118
+#define GL_SIGNALED                       0x9119
+#define GL_ALREADY_SIGNALED               0x911A
+#define GL_TIMEOUT_EXPIRED                0x911B
+#define GL_CONDITION_SATISFIED            0x911C
+#define GL_WAIT_FAILED                    0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT        0x00000001
+#define GL_TIMEOUT_IGNORED                0xFFFFFFFFFFFFFFFFull
+#endif
+
+#ifndef GL_ARB_texture_multisample
+#define GL_SAMPLE_POSITION                0x8E50
+#define GL_SAMPLE_MASK                    0x8E51
+#define GL_SAMPLE_MASK_VALUE              0x8E52
+#define GL_MAX_SAMPLE_MASK_WORDS          0x8E59
+#define GL_TEXTURE_2D_MULTISAMPLE         0x9100
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE   0x9101
+#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY   0x9102
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105
+#define GL_TEXTURE_SAMPLES                0x9106
+#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107
+#define GL_SAMPLER_2D_MULTISAMPLE         0x9108
+#define GL_INT_SAMPLER_2D_MULTISAMPLE     0x9109
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
+#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY   0x910B
+#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D
+#define GL_MAX_COLOR_TEXTURE_SAMPLES      0x910E
+#define GL_MAX_DEPTH_TEXTURE_SAMPLES      0x910F
+#define GL_MAX_INTEGER_SAMPLES            0x9110
+#endif
+
+#ifndef GL_ARB_vertex_array_bgra
+/* reuse GL_BGRA */
+#endif
+
+#ifndef GL_ARB_draw_buffers_blend
+#endif
+
+#ifndef GL_ARB_sample_shading
+#define GL_SAMPLE_SHADING                 0x8C36
+#define GL_MIN_SAMPLE_SHADING_VALUE       0x8C37
+#endif
+
+#ifndef GL_ARB_texture_cube_map_array
+#define GL_TEXTURE_CUBE_MAP_ARRAY         0x9009
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY   0x900B
+#define GL_SAMPLER_CUBE_MAP_ARRAY         0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW  0x900D
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY     0x900E
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F
+#endif
+
+#ifndef GL_ARB_texture_gather
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F
+#endif
+
+#ifndef GL_ARB_texture_query_lod
+#endif
+
 #ifndef GL_EXT_abgr
 #define GL_ABGR_EXT                       0x8000
 #endif
@@ -3996,11 +4173,11 @@ extern "C" {
 #define GL_SAMPLE_MASK_VALUE_NV           0x8E52
 #define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53
 #define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54
-#define GL_MAX_SAMPLE_MASK_WORDS_NV       0x8E59
 #define GL_TEXTURE_RENDERBUFFER_NV        0x8E55
 #define GL_SAMPLER_RENDERBUFFER_NV        0x8E56
 #define GL_INT_SAMPLER_RENDERBUFFER_NV    0x8E57
 #define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58
+#define GL_MAX_SAMPLE_MASK_WORDS_NV       0x8E59
 #endif
 
 #ifndef GL_NV_transform_feedback2
@@ -4046,6 +4223,94 @@ extern "C" {
 #define GL_PROVOKING_VERTEX_EXT           0x8E4F
 #endif
 
+#ifndef GL_EXT_texture_snorm
+#define GL_ALPHA_SNORM                    0x9010
+#define GL_LUMINANCE_SNORM                0x9011
+#define GL_LUMINANCE_ALPHA_SNORM          0x9012
+#define GL_INTENSITY_SNORM                0x9013
+#define GL_ALPHA8_SNORM                   0x9014
+#define GL_LUMINANCE8_SNORM               0x9015
+#define GL_LUMINANCE8_ALPHA8_SNORM        0x9016
+#define GL_INTENSITY8_SNORM               0x9017
+#define GL_ALPHA16_SNORM                  0x9018
+#define GL_LUMINANCE16_SNORM              0x9019
+#define GL_LUMINANCE16_ALPHA16_SNORM      0x901A
+#define GL_INTENSITY16_SNORM              0x901B
+/* reuse GL_R_SNORM */
+/* reuse GL_RG_SNORM */
+/* reuse GL_RGB_SNORM */
+/* reuse GL_RGBA_SNORM */
+/* reuse GL_R8_SNORM */
+/* reuse GL_RG8_SNORM */
+/* reuse GL_RGB8_SNORM */
+/* reuse GL_RGBA8_SNORM */
+/* reuse GL_R16_SNORM */
+/* reuse GL_RG16_SNORM */
+/* reuse GL_RGB16_SNORM */
+/* reuse GL_RGBA16_SNORM */
+/* reuse GL_SIGNED_NORMALIZED */
+#endif
+
+#ifndef GL_AMD_draw_buffers_blend
+#endif
+
+#ifndef GL_APPLE_texture_range
+#define GL_TEXTURE_RANGE_LENGTH_APPLE     0x85B7
+#define GL_TEXTURE_RANGE_POINTER_APPLE    0x85B8
+#define GL_TEXTURE_STORAGE_HINT_APPLE     0x85BC
+#define GL_STORAGE_PRIVATE_APPLE          0x85BD
+/* reuse GL_STORAGE_CACHED_APPLE */
+/* reuse GL_STORAGE_SHARED_APPLE */
+#endif
+
+#ifndef GL_APPLE_float_pixels
+#define GL_HALF_APPLE                     0x140B
+#define GL_RGBA_FLOAT32_APPLE             0x8814
+#define GL_RGB_FLOAT32_APPLE              0x8815
+#define GL_ALPHA_FLOAT32_APPLE            0x8816
+#define GL_INTENSITY_FLOAT32_APPLE        0x8817
+#define GL_LUMINANCE_FLOAT32_APPLE        0x8818
+#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE  0x8819
+#define GL_RGBA_FLOAT16_APPLE             0x881A
+#define GL_RGB_FLOAT16_APPLE              0x881B
+#define GL_ALPHA_FLOAT16_APPLE            0x881C
+#define GL_INTENSITY_FLOAT16_APPLE        0x881D
+#define GL_LUMINANCE_FLOAT16_APPLE        0x881E
+#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE  0x881F
+#define GL_COLOR_FLOAT_APPLE              0x8A0F
+#endif
+
+#ifndef GL_APPLE_vertex_program_evaluators
+#define GL_VERTEX_ATTRIB_MAP1_APPLE       0x8A00
+#define GL_VERTEX_ATTRIB_MAP2_APPLE       0x8A01
+#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE  0x8A02
+#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03
+#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04
+#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05
+#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE  0x8A06
+#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07
+#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08
+#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09
+#endif
+
+#ifndef GL_APPLE_aux_depth_stencil
+#define GL_AUX_DEPTH_STENCIL_APPLE        0x8A14
+#endif
+
+#ifndef GL_APPLE_object_purgeable
+#define GL_BUFFER_OBJECT_APPLE            0x85B3
+#define GL_RELEASED_APPLE                 0x8A19
+#define GL_VOLATILE_APPLE                 0x8A1A
+#define GL_RETAINED_APPLE                 0x8A1B
+#define GL_UNDEFINED_APPLE                0x8A1C
+#define GL_PURGEABLE_APPLE                0x8A1D
+#endif
+
+#ifndef GL_APPLE_row_bytes
+#define GL_PACK_ROW_BYTES_APPLE           0x8A15
+#define GL_UNPACK_ROW_BYTES_APPLE         0x8A16
+#endif
+
 
 /*************************************************************/
 
@@ -4125,6 +4390,12 @@ typedef int64_t GLint64EXT;
 typedef uint64_t GLuint64EXT;
 #endif
 
+#ifndef ARB_sync
+typedef int64_t GLint64;
+typedef uint64_t GLuint64;
+typedef struct __GLsync *GLsync;
+#endif
+
 #ifndef GL_VERSION_1_2
 #define GL_VERSION_1_2 1
 #ifdef GL_GLEXT_PROTOTYPES
@@ -4698,6 +4969,26 @@ GLAPI void APIENTRY glEndConditionalRender (void);
 GLAPI void APIENTRY glVertexAttribIPointer (GLuint, GLint, GLenum, GLsizei, const GLvoid *);
 GLAPI void APIENTRY glGetVertexAttribIiv (GLuint, GLenum, GLint *);
 GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint, GLenum, GLuint *);
+GLAPI void APIENTRY glVertexAttribI1i (GLuint, GLint);
+GLAPI void APIENTRY glVertexAttribI2i (GLuint, GLint, GLint);
+GLAPI void APIENTRY glVertexAttribI3i (GLuint, GLint, GLint, GLint);
+GLAPI void APIENTRY glVertexAttribI4i (GLuint, GLint, GLint, GLint, GLint);
+GLAPI void APIENTRY glVertexAttribI1ui (GLuint, GLuint);
+GLAPI void APIENTRY glVertexAttribI2ui (GLuint, GLuint, GLuint);
+GLAPI void APIENTRY glVertexAttribI3ui (GLuint, GLuint, GLuint, GLuint);
+GLAPI void APIENTRY glVertexAttribI4ui (GLuint, GLuint, GLuint, GLuint, GLuint);
+GLAPI void APIENTRY glVertexAttribI1iv (GLuint, const GLint *);
+GLAPI void APIENTRY glVertexAttribI2iv (GLuint, const GLint *);
+GLAPI void APIENTRY glVertexAttribI3iv (GLuint, const GLint *);
+GLAPI void APIENTRY glVertexAttribI4iv (GLuint, const GLint *);
+GLAPI void APIENTRY glVertexAttribI1uiv (GLuint, const GLuint *);
+GLAPI void APIENTRY glVertexAttribI2uiv (GLuint, const GLuint *);
+GLAPI void APIENTRY glVertexAttribI3uiv (GLuint, const GLuint *);
+GLAPI void APIENTRY glVertexAttribI4uiv (GLuint, const GLuint *);
+GLAPI void APIENTRY glVertexAttribI4bv (GLuint, const GLbyte *);
+GLAPI void APIENTRY glVertexAttribI4sv (GLuint, const GLshort *);
+GLAPI void APIENTRY glVertexAttribI4ubv (GLuint, const GLubyte *);
+GLAPI void APIENTRY glVertexAttribI4usv (GLuint, const GLushort *);
 GLAPI void APIENTRY glGetUniformuiv (GLuint, GLint, GLuint *);
 GLAPI void APIENTRY glBindFragDataLocation (GLuint, GLuint, const GLchar *);
 GLAPI GLint APIENTRY glGetFragDataLocation (GLuint, const GLchar *);
@@ -4737,52 +5028,6 @@ typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void);
 typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
 typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params);
 typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params);
-typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params);
-typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name);
-typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name);
-typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0);
-typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1);
-typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);
-typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
-typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value);
-typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value);
-typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value);
-typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value);
-typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params);
-typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params);
-typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params);
-typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params);
-typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value);
-typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value);
-typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value);
-typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
-typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);
-#endif
-
-#ifndef GL_VERSION_3_0_DEPRECATED
-#define GL_VERSION_3_0_DEPRECATED 1
-#ifdef GL_GLEXT_PROTOTYPES
-GLAPI void APIENTRY glVertexAttribI1i (GLuint, GLint);
-GLAPI void APIENTRY glVertexAttribI2i (GLuint, GLint, GLint);
-GLAPI void APIENTRY glVertexAttribI3i (GLuint, GLint, GLint, GLint);
-GLAPI void APIENTRY glVertexAttribI4i (GLuint, GLint, GLint, GLint, GLint);
-GLAPI void APIENTRY glVertexAttribI1ui (GLuint, GLuint);
-GLAPI void APIENTRY glVertexAttribI2ui (GLuint, GLuint, GLuint);
-GLAPI void APIENTRY glVertexAttribI3ui (GLuint, GLuint, GLuint, GLuint);
-GLAPI void APIENTRY glVertexAttribI4ui (GLuint, GLuint, GLuint, GLuint, GLuint);
-GLAPI void APIENTRY glVertexAttribI1iv (GLuint, const GLint *);
-GLAPI void APIENTRY glVertexAttribI2iv (GLuint, const GLint *);
-GLAPI void APIENTRY glVertexAttribI3iv (GLuint, const GLint *);
-GLAPI void APIENTRY glVertexAttribI4iv (GLuint, const GLint *);
-GLAPI void APIENTRY glVertexAttribI1uiv (GLuint, const GLuint *);
-GLAPI void APIENTRY glVertexAttribI2uiv (GLuint, const GLuint *);
-GLAPI void APIENTRY glVertexAttribI3uiv (GLuint, const GLuint *);
-GLAPI void APIENTRY glVertexAttribI4uiv (GLuint, const GLuint *);
-GLAPI void APIENTRY glVertexAttribI4bv (GLuint, const GLbyte *);
-GLAPI void APIENTRY glVertexAttribI4sv (GLuint, const GLshort *);
-GLAPI void APIENTRY glVertexAttribI4ubv (GLuint, const GLubyte *);
-GLAPI void APIENTRY glVertexAttribI4usv (GLuint, const GLushort *);
-#endif /* GL_GLEXT_PROTOTYPES */
 typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x);
 typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y);
 typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z);
@@ -4803,6 +5048,26 @@ typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *
 typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v);
 typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v);
 typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v);
+typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params);
+typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name);
+typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0);
+typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1);
+typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params);
+typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params);
+typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value);
+typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value);
+typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);
 #endif
 
 #ifndef GL_VERSION_3_1
@@ -4822,6 +5087,27 @@ typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalforma
 typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index);
 #endif
 
+#ifndef GL_VERSION_3_2
+#define GL_VERSION_3_2 1
+/* OpenGL 3.2 also reuses entry points from these extensions: */
+/* ARB_draw_elements_base_vertex */
+/* ARB_provoking_vertex */
+/* ARB_sync */
+/* ARB_texture_multisample */
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glGetInteger64i_v (GLenum, GLuint, GLint64 *);
+GLAPI void APIENTRY glGetBufferParameteri64v (GLenum, GLenum, GLint64 *);
+GLAPI void APIENTRY glProgramParameteri (GLuint, GLenum, GLint);
+GLAPI void APIENTRY glFramebufferTexture (GLenum, GLenum, GLuint, GLint);
+GLAPI void APIENTRY glFramebufferTextureFace (GLenum, GLenum, GLuint, GLint, GLenum);
+#endif /* GL_GLEXT_PROTOTYPES */
+typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data);
+typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params);
+typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
+#endif
+
 #ifndef GL_ARB_multitexture
 #define GL_ARB_multitexture 1
 #ifdef GL_GLEXT_PROTOTYPES
@@ -5567,6 +5853,112 @@ typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum w
 #define GL_ARB_shader_texture_lod 1
 #endif
 
+#ifndef GL_ARB_depth_clamp
+#define GL_ARB_depth_clamp 1
+#endif
+
+#ifndef GL_ARB_draw_elements_base_vertex
+#define GL_ARB_draw_elements_base_vertex 1
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum, GLsizei, GLenum, const GLvoid *, GLint);
+GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *, GLint);
+GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum, GLsizei, GLenum, const GLvoid *, GLsizei, GLint);
+GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei, const GLint *);
+#endif /* GL_GLEXT_PROTOTYPES */
+typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex);
+typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, const GLint *basevertex);
+#endif
+
+#ifndef GL_ARB_fragment_coord_conventions
+#define GL_ARB_fragment_coord_conventions 1
+#endif
+
+#ifndef GL_ARB_provoking_vertex
+#define GL_ARB_provoking_vertex 1
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glProvokingVertex (GLenum);
+#endif /* GL_GLEXT_PROTOTYPES */
+typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode);
+#endif
+
+#ifndef GL_ARB_seamless_cube_map
+#define GL_ARB_seamless_cube_map 1
+#endif
+
+#ifndef GL_ARB_sync
+#define GL_ARB_sync 1
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLsync APIENTRY glFenceSync (GLenum, GLbitfield);
+GLAPI GLboolean APIENTRY glIsSync (GLsync);
+GLAPI void APIENTRY glDeleteSync (GLsync);
+GLAPI GLenum APIENTRY glClientWaitSync (GLsync, GLbitfield, GLuint64);
+GLAPI void APIENTRY glWaitSync (GLsync, GLbitfield, GLuint64);
+GLAPI void APIENTRY glGetInteger64v (GLenum, GLint64 *);
+GLAPI void APIENTRY glGetSynciv (GLsync, GLenum, GLsizei, GLsizei *, GLint *);
+#endif /* GL_GLEXT_PROTOTYPES */
+typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags);
+typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync);
+typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync);
+typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *params);
+typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+#endif
+
+#ifndef GL_ARB_texture_multisample
+#define GL_ARB_texture_multisample 1
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTexImage2DMultisample (GLenum, GLsizei, GLint, GLsizei, GLsizei, GLboolean);
+GLAPI void APIENTRY glTexImage3DMultisample (GLenum, GLsizei, GLint, GLsizei, GLsizei, GLsizei, GLboolean);
+GLAPI void APIENTRY glGetMultisamplefv (GLenum, GLuint, GLfloat *);
+GLAPI void APIENTRY glSampleMaski (GLuint, GLbitfield);
+#endif /* GL_GLEXT_PROTOTYPES */
+typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val);
+typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask);
+#endif
+
+#ifndef GL_ARB_vertex_array_bgra
+#define GL_ARB_vertex_array_bgra 1
+#endif
+
+#ifndef GL_ARB_draw_buffers_blend
+#define GL_ARB_draw_buffers_blend 1
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBlendEquationi (GLuint, GLenum);
+GLAPI void APIENTRY glBlendEquationSeparatei (GLuint, GLenum, GLenum);
+GLAPI void APIENTRY glBlendFunci (GLuint, GLenum, GLenum);
+GLAPI void APIENTRY glBlendFuncSeparatei (GLuint, GLenum, GLenum, GLenum, GLenum);
+#endif /* GL_GLEXT_PROTOTYPES */
+typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode);
+typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+#endif
+
+#ifndef GL_ARB_sample_shading
+#define GL_ARB_sample_shading 1
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glMinSampleShading (GLclampf);
+#endif /* GL_GLEXT_PROTOTYPES */
+typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLclampf value);
+#endif
+
+#ifndef GL_ARB_texture_cube_map_array
+#define GL_ARB_texture_cube_map_array 1
+#endif
+
+#ifndef GL_ARB_texture_gather
+#define GL_ARB_texture_gather 1
+#endif
+
+#ifndef GL_ARB_texture_query_lod
+#define GL_ARB_texture_query_lod 1
+#endif
+
 #ifndef GL_EXT_abgr
 #define GL_EXT_abgr 1
 #endif
@@ -8204,7 +8596,7 @@ GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLuint, const GLint *, GLenum)
 GLAPI void APIENTRY glBindBufferRangeNV (GLenum, GLuint, GLuint, GLintptr, GLsizeiptr);
 GLAPI void APIENTRY glBindBufferOffsetNV (GLenum, GLuint, GLuint, GLintptr);
 GLAPI void APIENTRY glBindBufferBaseNV (GLenum, GLuint, GLuint);
-GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint, GLsizei, const GLint *, GLenum);
+GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint, GLsizei, const GLchar* *, GLenum);
 GLAPI void APIENTRY glActiveVaryingNV (GLuint, const GLchar *);
 GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint, const GLchar *);
 GLAPI void APIENTRY glGetActiveVaryingNV (GLuint, GLuint, GLsizei, GLsizei *, GLsizei *, GLenum *, GLchar *);
@@ -8216,7 +8608,7 @@ typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, cons
 typedef void (APIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
 typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset);
 typedef void (APIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer);
-typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode);
+typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode);
 typedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name);
 typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name);
 typedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
@@ -8781,6 +9173,78 @@ GLAPI void APIENTRY glProvokingVertexEXT (GLenum);
 typedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode);
 #endif
 
+#ifndef GL_EXT_texture_snorm
+#define GL_EXT_texture_snorm 1
+#endif
+
+#ifndef GL_AMD_draw_buffers_blend
+#define GL_AMD_draw_buffers_blend 1
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint, GLenum, GLenum);
+GLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint, GLenum, GLenum, GLenum, GLenum);
+GLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint, GLenum);
+GLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint, GLenum, GLenum);
+#endif /* GL_GLEXT_PROTOTYPES */
+typedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode);
+typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+#endif
+
+#ifndef GL_APPLE_texture_range
+#define GL_APPLE_texture_range 1
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTextureRangeAPPLE (GLenum, GLsizei, const GLvoid *);
+GLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum, GLenum, GLvoid* *);
+#endif /* GL_GLEXT_PROTOTYPES */
+typedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const GLvoid *pointer);
+typedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, GLvoid* *params);
+#endif
+
+#ifndef GL_APPLE_float_pixels
+#define GL_APPLE_float_pixels 1
+#endif
+
+#ifndef GL_APPLE_vertex_program_evaluators
+#define GL_APPLE_vertex_program_evaluators 1
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint, GLenum);
+GLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint, GLenum);
+GLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint, GLenum);
+GLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint, GLuint, GLdouble, GLdouble, GLint, GLint, const GLdouble *);
+GLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint, GLuint, GLfloat, GLfloat, GLint, GLint, const GLfloat *);
+GLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint, GLuint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *);
+GLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint, GLuint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *);
+#endif /* GL_GLEXT_PROTOTYPES */
+typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);
+typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);
+typedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname);
+typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+#endif
+
+#ifndef GL_APPLE_aux_depth_stencil
+#define GL_APPLE_aux_depth_stencil 1
+#endif
+
+#ifndef GL_APPLE_object_purgeable
+#define GL_APPLE_object_purgeable 1
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum, GLuint, GLenum);
+GLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum, GLuint, GLenum);
+GLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum, GLuint, GLenum, GLint *);
+#endif /* GL_GLEXT_PROTOTYPES */
+typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);
+typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);
+typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params);
+#endif
+
+#ifndef GL_APPLE_row_bytes
+#define GL_APPLE_row_bytes 1
+#endif
+
 
 #ifdef __cplusplus
 }
index 536fb25..eac09f9 100644 (file)
@@ -6,7 +6,7 @@ extern "C" {
 #endif
 
 /*
-** Copyright (c) 2007 The Khronos Group Inc.
+** Copyright (c) 2007-2009 The Khronos Group Inc.
 ** 
 ** Permission is hereby granted, free of charge, to any person obtaining a
 ** copy of this software and/or associated documentation files (the
@@ -28,6 +28,8 @@ extern "C" {
 ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
 */
 
+/* Function declaration macros - to move into glplatform.h */
+
 #if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
 #define WIN32_LEAN_AND_MEAN 1
 #include <windows.h>
@@ -46,9 +48,9 @@ extern "C" {
 /*************************************************************/
 
 /* Header file version number, required by OpenGL ABI for Linux */
-/* glxext.h last updated 2008/10/22 */
+/* glxext.h last updated 2009/08/03 */
 /* Current version at http://www.opengl.org/registry/ */
-#define GLX_GLXEXT_VERSION 21
+#define GLX_GLXEXT_VERSION 23
 
 #ifndef GLX_VERSION_1_3
 #define GLX_WINDOW_BIT                     0x00000001
@@ -135,6 +137,12 @@ extern "C" {
 #define GLX_CONTEXT_FLAGS_ARB              0x2094
 #endif
 
+#ifndef GLX_ARB_create_context_profile
+#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB   0x00000001
+#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
+#define GLX_CONTEXT_PROFILE_MASK_ARB       0x9126
+#endif
+
 #ifndef GLX_SGIS_multisample
 #define GLX_SAMPLE_BUFFERS_SGIS            100000
 #define GLX_SAMPLES_SGIS                   100001
@@ -518,6 +526,10 @@ extern GLXContext glXCreateContextAttribsARB (Display *, GLXFBConfig, GLXContext
 typedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display *dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);
 #endif
 
+#ifndef GLX_ARB_create_context_profile
+#define GLX_ARB_create_context_profile 1
+#endif
+
 #ifndef GLX_SGIS_multisample
 #define GLX_SGIS_multisample 1
 #endif
index 3c492dd..1f096fb 100644 (file)
@@ -48,9 +48,9 @@ extern "C" {
 /*************************************************************/
 
 /* Header file version number */
-/* wglext.h last updated 2009/03/03 */
+/* wglext.h last updated 2009/08/03 */
 /* Current version at http://www.opengl.org/registry/ */
-#define WGL_WGLEXT_VERSION 12
+#define WGL_WGLEXT_VERSION 15
 
 #ifndef WGL_ARB_buffer_region
 #define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001
@@ -176,8 +176,8 @@ extern "C" {
 #endif
 
 #ifndef WGL_ARB_create_context
-#define WGL_CONTEXT_DEBUG_BIT_ARB      0x0001
-#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
+#define WGL_CONTEXT_DEBUG_BIT_ARB      0x00000001
+#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
 #define WGL_CONTEXT_MAJOR_VERSION_ARB  0x2091
 #define WGL_CONTEXT_MINOR_VERSION_ARB  0x2092
 #define WGL_CONTEXT_LAYER_PLANE_ARB    0x2093
@@ -185,6 +185,13 @@ extern "C" {
 #define ERROR_INVALID_VERSION_ARB      0x2095
 #endif
 
+#ifndef WGL_ARB_create_context_profile
+#define WGL_CONTEXT_PROFILE_MASK_ARB   0x9126
+#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
+#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
+#define ERROR_INVALID_PROFILE_ARB      0x2096
+#endif
+
 #ifndef WGL_EXT_make_current_read
 #define ERROR_INVALID_PIXEL_TYPE_EXT   0x2043
 #endif
@@ -497,6 +504,10 @@ extern HGLRC WINAPI wglCreateContextAttribsARB (HDC, HGLRC, const int *);
 typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList);
 #endif
 
+#ifndef WGL_ARB_create_context_profile
+#define WGL_ARB_create_context_profile 1
+#endif
+
 #ifndef WGL_EXT_display_color_table
 #define WGL_EXT_display_color_table 1
 #ifdef WGL_WGLEXT_PROTOTYPES
index 1f9f290..0df5ff0 100644 (file)
@@ -43,6 +43,9 @@
 #include "GL/glut.h"
 #include "readtex.h"
 
+#ifndef GL_TEXTURE_CUBE_MAP_SEAMLESS
+#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F
+#endif
 
 static GLfloat Xrot = 0, Yrot = 0;
 static GLfloat EyeDist = 10;
@@ -53,6 +56,8 @@ static GLint FrameParity = 0;
 static GLenum FilterIndex = 0;
 static GLint ClampIndex = 0;
 static GLboolean supportFBO = GL_FALSE;
+static GLboolean supportSeamless = GL_FALSE;
+static GLboolean seamless = GL_FALSE;
 
 
 static struct {
@@ -91,7 +96,9 @@ static struct {
 
 
 
-#define eps1 0.99
+/* The effects of GL_ARB_seamless_cube_map don't show up unless eps1 is 1.0.
+ */
+#define eps1 1.0 /*0.99*/
 #define br   20.0  /* box radius */
 
 static const GLfloat tex_coords[] = {
@@ -231,6 +238,13 @@ static void draw( void )
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER,
                    FilterModes[FilterIndex].mag_mode);
 
+   if (supportSeamless) {
+      if (seamless) {
+        glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
+      } else {
+        glDisable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
+      }
+   }
    wrap = ClampModes[ClampIndex].mode;
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, wrap);
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, wrap);
@@ -321,6 +335,11 @@ static void key(unsigned char k, int x, int y)
          mode = !mode;
          set_mode(mode);
          break;
+      case 's':
+        seamless = ! seamless;
+        printf("Seamless cube map filtering is %sabled\n",
+               (seamless) ? "en" : "dis" );
+        break;
       case 'v':
          use_vertex_arrays = ! use_vertex_arrays;
          printf( "Vertex arrays are %sabled\n",
@@ -502,23 +521,26 @@ static void load_envmaps(void)
 static void init( GLboolean useImageFiles )
 {
    /* check for extensions */
-   {
-      char *exten = (char *) glGetString(GL_EXTENSIONS);
-      if (!strstr(exten, "GL_ARB_texture_cube_map")) {
-         printf("Sorry, this demo requires GL_ARB_texture_cube_map\n");
-         exit(0);
-      }
+   if (!GLEW_ARB_texture_cube_map) {
+      printf("Sorry, this demo requires GL_ARB_texture_cube_map\n");
+      exit(0);
+   }
 
-      /* Needed for glGenerateMipmapEXT / auto mipmapping
-       */
-      if (strstr(exten, "GL_EXT_framebuffer_object")) {
-         supportFBO = GL_TRUE;
-      }
-      else if (!strstr(exten, "GL_SGIS_generate_mipmap")) {
-         printf("Sorry, this demo requires GL_EXT_framebuffer_object or GL_SGIS_generate_mipmap\n");
-         exit(0);
-      }
+   /* Needed for glGenerateMipmapEXT / auto mipmapping
+    */
+   supportFBO = GLEW_EXT_framebuffer_object;
+
+   if (!supportFBO && !GLEW_SGIS_generate_mipmap) {
+      printf("Sorry, this demo requires GL_EXT_framebuffer_object or "
+            "GL_SGIS_generate_mipmap\n");
+      exit(0);
    }
+
+   /* GLEW doesn't know about this extension yet, so use the old GLUT function
+    * to check for availability.
+    */
+   supportSeamless = glutExtensionSupported("GL_ARB_seamless_cube_map");
+
    printf("GL_RENDERER: %s\n", (char *) glGetString(GL_RENDERER));
 
    if (useImageFiles) {
index d3c32d4..fd72f54 100644 (file)
@@ -17,6 +17,7 @@ PROGRAMS = \
        eglgears \
        eglscreen \
        peglgears \
+       xeglbindtex \
        xeglgears \
        xeglthreads \
        xegl_tri
@@ -84,6 +85,12 @@ peglgears.o: peglgears.c $(HEADERS)
        $(CC) -c $(CFLAGS) -I$(TOP)/include peglgears.c
 
 
+xeglbindtex: xeglbindtex.o $(TOP)/$(LIB_DIR)/libEGL.so
+       $(CC) $(CFLAGS) xeglbindtex.o -L$(TOP)/$(LIB_DIR) -lEGL -lGL $(LIBDRM_LIB) $(APP_LIB_DEPS) -o $@
+
+xeglbindtex.o: xeglbindtex.c $(HEADERS)
+       $(CC) -c $(CFLAGS) -I$(TOP)/include xeglbindtex.c
+
 xeglgears: xeglgears.o $(TOP)/$(LIB_DIR)/libEGL.so
        $(CC) $(CFLAGS) xeglgears.o -L$(TOP)/$(LIB_DIR) -lEGL -lGL $(LIBDRM_LIB) $(APP_LIB_DEPS) -o $@
 
diff --git a/progs/egl/xeglbindtex.c b/progs/egl/xeglbindtex.c
new file mode 100644 (file)
index 0000000..fdd9fe2
--- /dev/null
@@ -0,0 +1,474 @@
+/*
+ * Simple demo for eglBindTexImage.  Based on xegl_tri.c by
+ *
+ * Copyright (C) 2008  Brian Paul   All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * The spec says that eglBindTexImage supports only OpenGL ES context, but this
+ * demo uses OpenGL context.  Keep in mind that this is non-standard.
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/keysym.h>
+#include <GL/gl.h>
+#include <EGL/egl.h>
+
+static EGLDisplay dpy;
+static EGLContext ctx_win, ctx_pbuf;
+static EGLSurface surf_win, surf_pbuf;
+static GLuint tex_pbuf;
+
+static GLfloat view_rotx = 0.0, view_roty = 0.0, view_rotz = 0.0;
+static GLboolean blend = GL_TRUE;
+static GLuint color_flow;
+
+static void
+make_pbuffer(int width, int height)
+{
+   static const EGLint config_attribs[] = {
+      EGL_RED_SIZE, 8,
+      EGL_GREEN_SIZE, 8,
+      EGL_BLUE_SIZE, 8,
+      EGL_BIND_TO_TEXTURE_RGB, EGL_TRUE,
+      EGL_NONE
+   };
+   EGLint pbuf_attribs[] = {
+      EGL_WIDTH, width,
+      EGL_HEIGHT, height,
+      EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGB,
+      EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
+      EGL_NONE
+   };
+   EGLConfig config;
+   EGLint num_configs;
+
+   if (!eglChooseConfig(dpy, config_attribs, &config, 1, &num_configs)) {
+      printf("Error: couldn't get an EGL visual config for pbuffer\n");
+      exit(1);
+   }
+
+   eglBindAPI(EGL_OPENGL_API);
+   ctx_pbuf = eglCreateContext(dpy, config, EGL_NO_CONTEXT, NULL );
+   surf_pbuf = eglCreatePbufferSurface(dpy, config, pbuf_attribs);
+   if (surf_pbuf == EGL_NO_SURFACE) {
+      printf("failed to allocate pbuffer\n");
+      exit(1);
+   }
+
+   glGenTextures(1, &tex_pbuf);
+}
+
+static void
+use_pbuffer(void)
+{
+   static int initialized;
+
+   eglMakeCurrent(dpy, surf_pbuf, surf_pbuf, ctx_pbuf);
+   if (!initialized) {
+      EGLint width, height;
+      GLfloat ar;
+
+      initialized = 1;
+
+      eglQuerySurface(dpy, surf_pbuf, EGL_WIDTH, &width);
+      eglQuerySurface(dpy, surf_pbuf, EGL_WIDTH, &height);
+      ar = (GLfloat) width / (GLfloat) height;
+
+      glViewport(0, 0, (GLint) width, (GLint) height);
+
+      glMatrixMode(GL_PROJECTION);
+      glLoadIdentity();
+      glFrustum(-ar, ar, -1, 1, 1.0, 10.0);
+
+      glMatrixMode(GL_MODELVIEW);
+      glLoadIdentity();
+
+      /* y-inverted */
+      glScalef(1.0, -1.0, 1.0);
+
+      glTranslatef(0.0, 0.0, -5.0);
+
+      glClearColor(0.2, 0.2, 0.2, 0.0);
+   }
+}
+
+static void
+make_window(Display *x_dpy, const char *name,
+            int x, int y, int width, int height,
+            Window *winRet)
+{
+   static const EGLint attribs[] = {
+      EGL_RED_SIZE, 8,
+      EGL_GREEN_SIZE, 8,
+      EGL_BLUE_SIZE, 8,
+      EGL_ALPHA_SIZE, 8,
+      EGL_DEPTH_SIZE, 8,
+      EGL_NONE
+   };
+
+   int scrnum;
+   XSetWindowAttributes attr;
+   unsigned long mask;
+   Window root;
+   Window win;
+   XVisualInfo *visInfo, visTemplate;
+   int num_visuals;
+   EGLConfig config;
+   EGLint num_configs, vid;
+
+   scrnum = DefaultScreen( x_dpy );
+   root = RootWindow( x_dpy, scrnum );
+
+   if (!eglChooseConfig(dpy, attribs, &config, 1, &num_configs)) {
+      printf("Error: couldn't get an EGL visual config\n");
+      exit(1);
+   }
+
+   if (!eglGetConfigAttrib(dpy, config, EGL_NATIVE_VISUAL_ID, &vid)) {
+      printf("Error: eglGetConfigAttrib() failed\n");
+      exit(1);
+   }
+
+   /* The X window visual must match the EGL config */
+   visTemplate.visualid = vid;
+   visInfo = XGetVisualInfo(x_dpy, VisualIDMask, &visTemplate, &num_visuals);
+   if (!visInfo) {
+      printf("Error: couldn't get X visual\n");
+      exit(1);
+   }
+
+   /* window attributes */
+   attr.background_pixel = 0;
+   attr.border_pixel = 0;
+   attr.colormap = XCreateColormap( x_dpy, root, visInfo->visual, AllocNone);
+   attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
+   attr.override_redirect = 0;
+   mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect;
+
+   win = XCreateWindow( x_dpy, root, 0, 0, width, height,
+                       0, visInfo->depth, InputOutput,
+                       visInfo->visual, mask, &attr );
+
+   /* set hints and properties */
+   {
+      XSizeHints sizehints;
+      sizehints.x = x;
+      sizehints.y = y;
+      sizehints.width  = width;
+      sizehints.height = height;
+      sizehints.flags = USSize | USPosition;
+      XSetNormalHints(x_dpy, win, &sizehints);
+      XSetStandardProperties(x_dpy, win, name, name,
+                              None, (char **)NULL, 0, &sizehints);
+   }
+
+   eglBindAPI(EGL_OPENGL_API);
+   ctx_win = eglCreateContext(dpy, config, EGL_NO_CONTEXT, NULL );
+   if (!ctx_win) {
+      printf("Error: glXCreateContext failed\n");
+      exit(1);
+   }
+
+   surf_win = eglCreateWindowSurface(dpy, config, win, NULL);
+
+   XFree(visInfo);
+
+   *winRet = win;
+}
+
+static void
+use_window(void)
+{
+   static int initialized;
+
+   eglMakeCurrent(dpy, surf_win, surf_win, ctx_win);
+   if (!initialized) {
+      initialized = 1;
+      glEnable(GL_TEXTURE_2D);
+      glBindTexture(GL_TEXTURE_2D, tex_pbuf);
+      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+   }
+}
+
+static void
+draw_triangle(void)
+{
+   static const GLfloat verts[3][2] = {
+      { -3, -3 },
+      {  3, -3 },
+      {  0,  3 }
+   };
+   GLfloat colors[3][3] = {
+      { 1, 0, 0 },
+      { 0, 1, 0 },
+      { 0, 0, 1 }
+   };
+   GLint i;
+
+   /* flow the color */
+   for (i = 0; i < 3; i++) {
+      GLint first = (i + color_flow / 256) % 3;
+      GLint second = (first + 1) % 3;
+      GLint third = (second + 1) % 3;
+      GLfloat c = (color_flow % 256) / 256.0f;
+
+      c = c * c * c;
+      colors[i][first] = 1.0f - c;
+      colors[i][second] = c;
+      colors[i][third] = 0.0f;
+   }
+
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+   glVertexPointer(2, GL_FLOAT, 0, verts);
+   glColorPointer(3, GL_FLOAT, 0, colors);
+   glEnableClientState(GL_VERTEX_ARRAY);
+   glEnableClientState(GL_COLOR_ARRAY);
+
+   glDrawArrays(GL_TRIANGLES, 0, 3);
+
+   glDisableClientState(GL_VERTEX_ARRAY);
+   glDisableClientState(GL_COLOR_ARRAY);
+}
+
+static void
+draw_textured_cube(void)
+{
+   static const GLfloat verts[][2] = {
+      { -4, -4 },
+      {  4, -4 },
+      {  4,  4 },
+      { -4,  4 }
+   };
+   static const GLfloat colors[][4] = {
+      { 1, 1, 1, 0.5 },
+      { 1, 1, 1, 0.5 },
+      { 1, 1, 1, 0.5 },
+      { 1, 1, 1, 0.5 }
+   };
+   static const GLfloat texs[][2] = {
+      { 0, 0 },
+      { 1, 0 },
+      { 1, 1 },
+      { 0, 1 }
+   };
+   static const GLfloat xforms[6][4] = {
+      {   0, 0, 1, 0 },
+      {  90, 0, 1, 0 },
+      { 180, 0, 1, 0 },
+      { 270, 0, 1, 0 },
+      {  90, 1, 0, 0 },
+      { -90, 1, 0, 0 }
+   };
+   GLint i;
+
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+   if (blend) {
+      glDisable(GL_DEPTH_TEST);
+      glEnable(GL_BLEND);
+   } else {
+      glEnable(GL_DEPTH_TEST);
+      glDisable(GL_BLEND);
+   }
+
+   glVertexPointer(2, GL_FLOAT, 0, verts);
+   glColorPointer(4, GL_FLOAT, 0, colors);
+   glTexCoordPointer(2, GL_FLOAT, 0, texs);
+
+   glEnableClientState(GL_VERTEX_ARRAY);
+   glEnableClientState(GL_COLOR_ARRAY);
+   glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+
+   for (i = 0; i < 6; i++) {
+      glPushMatrix();
+      glRotatef(xforms[i][0], xforms[i][1], xforms[i][2], xforms[i][3]);
+      glTranslatef(0, 0, 4.1);
+      glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+      glPopMatrix();
+   }
+
+   glDisableClientState(GL_VERTEX_ARRAY);
+   glDisableClientState(GL_COLOR_ARRAY);
+   glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+}
+
+static void
+draw(void)
+{
+   use_pbuffer();
+   draw_triangle();
+
+   use_window();
+
+   eglBindTexImage(dpy, surf_pbuf, EGL_BACK_BUFFER);
+
+   glPushMatrix();
+   glRotatef(view_rotx, 1, 0, 0);
+   glRotatef(view_roty, 0, 1, 0);
+   glRotatef(view_rotz, 0, 0, 1);
+
+   draw_textured_cube();
+
+   glPopMatrix();
+
+   eglReleaseTexImage(dpy, surf_pbuf, EGL_BACK_BUFFER);
+}
+
+/* new window size or exposure */
+static void
+reshape(int width, int height)
+{
+   GLfloat ar = (GLfloat) width / (GLfloat) height;
+
+   use_window();
+
+   glViewport(0, 0, (GLint) width, (GLint) height);
+
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();
+   glFrustum(-ar, ar, -1, 1, 5.0, 60.0);
+
+   glMatrixMode(GL_MODELVIEW);
+   glLoadIdentity();
+   glTranslatef(0.0, 0.0, -40.0);
+}
+
+static void
+event_loop(Display *x_dpy, Window win)
+{
+   while (1) {
+      int redraw = 1;
+
+      if (XPending(x_dpy) > 0) {
+         XEvent event;
+         XNextEvent(x_dpy, &event);
+
+         switch (event.type) {
+         case Expose:
+            redraw = 1;
+            break;
+         case ConfigureNotify:
+            reshape(event.xconfigure.width, event.xconfigure.height);
+            break;
+         case KeyPress:
+            {
+               char buffer[10];
+               int r, code;
+               code = XLookupKeysym(&event.xkey, 0);
+               if (code == XK_Left) {
+                  view_roty += 5.0;
+               }
+               else if (code == XK_Right) {
+                  view_roty -= 5.0;
+               }
+               else if (code == XK_Up) {
+                  view_rotx += 5.0;
+               }
+               else if (code == XK_Down) {
+                  view_rotx -= 5.0;
+               }
+               else if (code == XK_b) {
+                  blend = !blend;
+               }
+               else {
+                  r = XLookupString(&event.xkey, buffer, sizeof(buffer),
+                        NULL, NULL);
+                  if (buffer[0] == 27) {
+                     /* escape */
+                     return;
+                  }
+               }
+            }
+            redraw = 1;
+            break;
+         default:
+            ; /*no-op*/
+         }
+      }
+
+      if (redraw) {
+         view_rotx += 1.0;
+         view_roty += 2.0;
+         view_rotz += 1.5;
+         color_flow += 20;
+         draw();
+         eglSwapBuffers(dpy, surf_win);
+      }
+   }
+}
+
+int
+main(int argc, char *argv[])
+{
+   const int winWidth = 300, winHeight = 300;
+   Display *x_dpy;
+   Window win;
+   char *dpyName = NULL;
+   EGLint egl_major, egl_minor;
+   const char *s;
+
+   x_dpy = XOpenDisplay(dpyName);
+   if (!x_dpy) {
+      printf("Error: couldn't open display %s\n",
+            dpyName ? dpyName : getenv("DISPLAY"));
+      return -1;
+   }
+
+   dpy = eglGetDisplay(x_dpy);
+   if (!dpy) {
+      printf("Error: eglGetDisplay() failed\n");
+      return -1;
+   }
+
+   if (!eglInitialize(dpy, &egl_major, &egl_minor)) {
+      printf("Error: eglInitialize() failed\n");
+      return -1;
+   }
+
+   s = eglQueryString(dpy, EGL_VERSION);
+   printf("EGL_VERSION = %s\n", s);
+
+   make_window(x_dpy, "color flow", 0, 0, winWidth, winHeight, &win);
+   make_pbuffer(winWidth, winHeight);
+
+   XMapWindow(x_dpy, win);
+
+   reshape(winWidth, winHeight);
+   event_loop(x_dpy, win);
+
+   glDeleteTextures(1, &tex_pbuf);
+
+   eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+   eglTerminate(dpy);
+
+   XDestroyWindow(x_dpy, win);
+   XCloseDisplay(x_dpy);
+
+   return 0;
+}
index 39d90c2..986775b 100644 (file)
@@ -22,6 +22,7 @@ samplers_array
 shaderutil.c
 shaderutil.h
 shadow_sampler
+shtest
 skinning
 texaaline
 texdemo1
index eedd866..0875bdd 100644 (file)
@@ -14,6 +14,11 @@ LIBS = -L$(TOP)/$(LIB_DIR) -l$(GLUT_LIB) -l$(GLEW_LIB) -l$(GLU_LIB) -l$(GL_LIB)
 
 INCLUDE_DIRS = -I$(TOP)/progs/util
 
+# using : to avoid APP_CC pointing to CC loop
+CC:=$(APP_CC)
+CFLAGS += -I$(INCDIR)
+LDLIBS=$(LIBS)
+
 DEMO_SOURCES = \
        array.c \
        bitmap.c \
@@ -33,6 +38,7 @@ DEMO_SOURCES = \
        points.c \
        samplers.c \
        shadow_sampler.c \
+       shtest.c \
        skinning.c \
        texaaline.c \
        texdemo1.c \
@@ -52,28 +58,16 @@ UTIL_SOURCES = \
        readtex.c
 
 UTIL_OBJS = $(UTIL_SOURCES:.c=.o)
-
-
+PROG_OBJS = $(DEMO_SOURCES:.c=.o)
 PROGS = $(DEMO_SOURCES:%.c=%)
 
-
-
-##### RULES #####
-
-# make .o file from .c file:
-.c.o:
-       $(APP_CC) -c -I$(INCDIR) $(CFLAGS) $< -o $@
-
-
-# make executable from .o files
-.o:
-       $(APP_CC) $(INCLUDES) $(CFLAGS) $(LDFLAGS) $< $(UTIL_OBJS) $(LIBS) -o $@
-
-
 ##### TARGETS #####
 
 default: $(PROGS)
 
+$(PROG_OBJS): $(UTIL_HEADERS)
+
+$(PROGS): $(UTIL_OBJS)
 
 clean:
        -rm -f $(PROGS)
@@ -83,7 +77,6 @@ clean:
        -rm -f readtex.*
 
 
-
 ##### Extra dependencies
 
 extfuncs.h: $(TOP)/progs/util/extfuncs.h
@@ -101,138 +94,3 @@ shaderutil.c: $(TOP)/progs/util/shaderutil.c
 shaderutil.h: $(TOP)/progs/util/shaderutil.h
        cp $< .
 
-
-
-array.o: $(UTIL_HEADERS)
-
-array: array.o  $(UTIL_OBJS)
-
-
-bitmap.o: $(UTIL_HEADERS)
-
-bitmap: bitmap.o $(UTIL_OBJS)
-
-
-brick.o: $(UTIL_HEADERS)
-
-brick: brick.o $(UTIL_OBJS)
-
-
-bump.o: $(UTIL_HEADERS)
-
-bump: bump.o $(UTIL_OBJS)
-
-
-convolutions.o: $(UTIL_HEADERS)
-
-convolutions: convolutions.o $(UTIL_OBJS)
-
-
-deriv.o: deriv.c $(UTIL_HEADERS)
-
-deriv: deriv.o $(UTIL_OBJS)
-
-
-identity.o: $(UTIL_HEADERS)
-
-identity: identity.o $(UTIL_OBJS)
-
-
-fragcoord.o: $(UTIL_HEADERS)
-
-fragcoord: fragcoord.o $(UTIL_OBJS)
-
-
-linktest.o: $(UTIL_HEADERS)
-
-linktest: linktest.o $(UTIL_OBJS)
-
-
-mandelbrot.o: $(UTIL_HEADERS)
-
-mandelbrot: mandelbrot.o $(UTIL_OBJS)
-
-
-multinoise.o: $(UTIL_HEADERS)
-
-multinoise: multinoise.o $(UTIL_OBJS)
-
-
-multitex.o: $(UTIL_HEADERS)
-
-multitex: multitex.o $(UTIL_OBJS)
-
-
-noise.o: $(UTIL_HEADERS)
-
-noise: noise.o $(UTIL_OBJS)
-
-
-noise2.o: $(UTIL_HEADERS)
-
-noise2: noise2.o $(UTIL_OBJS)
-
-
-points.o: $(UTIL_HEADERS)
-
-points: points.o $(UTIL_OBJS)
-
-
-pointcoord.o: $(UTIL_HEADERS)
-
-pointcoord: pointcoord.o $(UTIL_OBJS)
-
-
-samplers.o: $(UTIL_HEADERS)
-
-samplers: samplers.o $(UTIL_OBJS)
-
-
-samplers_array.o: $(UTIL_HEADERS)
-
-samplers_array: samplers_array.o $(UTIL_OBJS)
-
-
-shadow_sampler.o: $(UTIL_HEADERS)
-
-shadow_sampler: shadow_sampler.o $(UTIL_OBJS)
-
-
-skinning.o: $(UTIL_HEADERS)
-
-skinning: skinning.o $(UTIL_OBJS)
-
-
-texaaline.o: $(UTIL_HEADERS)
-
-texaaline: texaaline.o $(UTIL_OBJS)
-
-
-texdemo1.o: $(UTIL_HEADERS)
-
-texdemo1: texdemo1.o $(UTIL_OBJS)
-
-
-toyball.o: $(UTIL_HEADERS)
-
-toyball: toyball.o $(UTIL_OBJS)
-
-
-twoside.o: $(UTIL_HEADERS)
-
-twoside: twoside.o $(UTIL_OBJS)
-
-
-trirast.o: $(UTIL_HEADERS)
-
-trirast: trirast.o $(UTIL_OBJS)
-
-
-vert-or-frag-only.o: $(UTIL_HEADERS)
-
-vert-or-frag-only: vert-or-frag-only.o $(UTIL_OBJS)
-
-
-vert-tex.o: $(UTIL_HEADERS)
-
-vert-tex: vert-tex.o $(UTIL_OBJS)
index 1d08b23..20417aa 100644 (file)
@@ -24,12 +24,12 @@ static GLuint program;
 
 static struct uniform_info Uniforms[] = {
    /* vert */
-   { "LightPosition",     3, GL_FLOAT, { 0.1, 0.1, 9.0, 0}, -1 },
+   { "LightPosition",     1, GL_FLOAT_VEC3, { 0.1, 0.1, 9.0, 0}, -1 },
    /* frag */
-   { "BrickColor",        3, GL_FLOAT, { 0.8, 0.2, 0.2, 0 }, -1 },
-   { "MortarColor",       3, GL_FLOAT, { 0.6, 0.6, 0.6, 0 }, -1 },
-   { "BrickSize",         2, GL_FLOAT, { 1.0, 0.3, 0, 0 }, -1 },
-   { "BrickPct",          2, GL_FLOAT, { 0.9, 0.8, 0, 0 }, -1 },
+   { "BrickColor",        1, GL_FLOAT_VEC3, { 0.8, 0.2, 0.2, 0 }, -1 },
+   { "MortarColor",       1, GL_FLOAT_VEC3, { 0.6, 0.6, 0.6, 0 }, -1 },
+   { "BrickSize",         1, GL_FLOAT_VEC2, { 1.0, 0.3, 0, 0 }, -1 },
+   { "BrickPct",          1, GL_FLOAT_VEC2, { 0.9, 0.8, 0, 0 }, -1 },
    END_OF_UNIFORMS
 };
 
@@ -148,7 +148,8 @@ Init(void)
 
    glUseProgram(program);
 
-   InitUniforms(program, Uniforms);
+   SetUniformValues(program, Uniforms);
+   PrintUniforms(Uniforms);
 
    assert(glGetError() == 0);
 
@@ -183,7 +184,6 @@ int
 main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
-   glutInitWindowPosition( 0, 0);
    glutInitWindowSize(400, 400);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    win = glutCreateWindow(argv[0]);
diff --git a/progs/glsl/brick.shtest b/progs/glsl/brick.shtest
new file mode 100644 (file)
index 0000000..8a21526
--- /dev/null
@@ -0,0 +1,8 @@
+vs CH06-brick.vert
+fs CH06-brick.frag
+uniform LightPosition GL_FLOAT_VEC3 0.1 0.1 9.0
+uniform BrickColor GL_FLOAT_VEC3 0.8 0.2 0.2
+uniform MortarColor GL_FLOAT_VEC3 0.6 0.6 0.6
+uniform BrickSize  GL_FLOAT_VEC2 1.0 0.3
+uniform BrickPct GL_FLOAT_VEC2 0.9 0.8
+
index ddb986a..87669ae 100644 (file)
@@ -24,11 +24,11 @@ static GLuint program;
 
 
 static struct uniform_info Uniforms[] = {
-   { "LightPosition",    3, GL_FLOAT, { 0.57737, 0.57735, 0.57735, 0.0 }, -1 },
-   { "SurfaceColor",     3, GL_FLOAT, { 0.8, 0.8, 0.2, 0 }, -1 },
-   { "BumpDensity",      1, GL_FLOAT, { 10.0, 0, 0, 0 }, -1 },
-   { "BumpSize",         1, GL_FLOAT, { 0.125, 0, 0, 0 }, -1 },
-   { "SpecularFactor",   1, GL_FLOAT, { 0.5, 0, 0, 0 }, -1 },
+   { "LightPosition",  1, GL_FLOAT_VEC3, { 0.57737, 0.57735, 0.57735, 0.0 }, -1 },
+   { "SurfaceColor",   1, GL_FLOAT_VEC3, { 0.8, 0.8, 0.2, 0 }, -1 },
+   { "BumpDensity",    1, GL_FLOAT, { 10.0, 0, 0, 0 }, -1 },
+   { "BumpSize",       1, GL_FLOAT, { 0.125, 0, 0, 0 }, -1 },
+   { "SpecularFactor", 1, GL_FLOAT, { 0.5, 0, 0, 0 }, -1 },
    END_OF_UNIFORMS
 };
 
@@ -242,7 +242,8 @@ Init(void)
 
    CheckError(__LINE__);
 
-   InitUniforms(program, Uniforms);
+   SetUniformValues(program, Uniforms);
+   PrintUniforms(Uniforms);
 
    CheckError(__LINE__);
 
@@ -280,7 +281,6 @@ int
 main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
-   glutInitWindowPosition( 0, 0);
    glutInitWindowSize(400, 400);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    win = glutCreateWindow(argv[0]);
index 22ce7ed..c2fb76e 100644 (file)
@@ -448,7 +448,6 @@ int main(int argc, char **argv)
 {
    glutInit(&argc, argv);
 
-   glutInitWindowPosition(0, 0);
    glutInitWindowSize(400, 400);
    glutInitDisplayMode(GLUT_RGB | GLUT_ALPHA | GLUT_DOUBLE);
 
index 9cf1e40..265a515 100644 (file)
@@ -220,7 +220,6 @@ int
 main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
-   glutInitWindowPosition( 0, 0);
    glutInitWindowSize(200, 200);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    win = glutCreateWindow(argv[0]);
index 9f56a03..3dfcec8 100644 (file)
@@ -166,7 +166,6 @@ int
 main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
-   glutInitWindowPosition( 0, 0);
    glutInitWindowSize(WinWidth, WinHeight);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    win = glutCreateWindow(argv[0]);
index a772ccd..526e9b8 100644 (file)
@@ -187,7 +187,6 @@ int
 main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
-   glutInitWindowPosition( 0, 0);
    glutInitWindowSize(200, 200);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    win = glutCreateWindow(argv[0]);
index 38dffc3..b05ef37 100644 (file)
@@ -25,7 +25,7 @@ static GLuint program;
 
 static struct uniform_info Uniforms[] = {
    /* vert */
-   { "LightPosition",        3, GL_FLOAT, { 0.1, 0.1, 9.0, 0}, -1 },
+   { "LightPosition",        1, GL_FLOAT_VEC3, { 0.1, 0.1, 9.0, 0}, -1 },
    { "SpecularContribution", 1, GL_FLOAT, { 0.5, 0, 0, 0 }, -1 },
    { "DiffuseContribution",  1, GL_FLOAT, { 0.5, 0, 0, 0 }, -1 },
    { "Shininess",            1, GL_FLOAT, { 20.0, 0, 0, 0 }, -1 },
@@ -34,9 +34,9 @@ static struct uniform_info Uniforms[] = {
    { "Zoom",                 1, GL_FLOAT, { 0.125, 0, 0, 0 }, -1 },
    { "Xcenter",              1, GL_FLOAT, { -1.5, 0, 0, 0 }, -1 },
    { "Ycenter",              1, GL_FLOAT, { .005, 0, 0, 0 }, -1 },
-   { "InnerColor",           3, GL_FLOAT, { 1, 0, 0, 0 }, -1 },
-   { "OuterColor1",          3, GL_FLOAT, { 0, 1, 0, 0 }, -1 },
-   { "OuterColor2",          3, GL_FLOAT, { 0, 0, 1, 0 }, -1 },
+   { "InnerColor",           1, GL_FLOAT_VEC3, { 1, 0, 0, 0 }, -1 },
+   { "OuterColor1",          1, GL_FLOAT_VEC3, { 0, 1, 0, 0 }, -1 },
+   { "OuterColor2",          1, GL_FLOAT_VEC3, { 0, 0, 1, 0 }, -1 },
    END_OF_UNIFORMS
 };
 
@@ -159,7 +159,8 @@ Init(void)
 
    glUseProgram(program);
 
-   InitUniforms(program, Uniforms);
+   SetUniformValues(program, Uniforms);
+   PrintUniforms(Uniforms);
 
    uZoom = glGetUniformLocation(program, "Zoom");
    uXcenter = glGetUniformLocation(program, "Xcenter");
@@ -198,7 +199,6 @@ int
 main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
-   glutInitWindowPosition( 0, 0);
    glutInitWindowSize(400, 400);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    win = glutCreateWindow(argv[0]);
diff --git a/progs/glsl/mandelbrot.shtest b/progs/glsl/mandelbrot.shtest
new file mode 100644 (file)
index 0000000..4f4e5c7
--- /dev/null
@@ -0,0 +1,13 @@
+vs CH18-mandel.vert
+fs CH18-mandel.frag
+uniform LightPosition        GL_FLOAT_VEC3 0.1 0.1 9.0
+uniform SpecularContribution GL_FLOAT 0.5
+uniform DiffuseContribution  GL_FLOAT 0.5
+uniform Shininess            GL_FLOAT 20.0
+uniform Iterations           GL_FLOAT 12
+uniform Zoom                 GL_FLOAT 0.125
+uniform Xcenter              GL_FLOAT -1.5
+uniform Ycenter              GL_FLOAT .005
+uniform InnerColor           GL_FLOAT_VEC3 1 0 0
+uniform OuterColor1          GL_FLOAT_VEC3 0 1 0
+uniform OuterColor2          GL_FLOAT_VEC3 0 0 1
index 0afe230..0d4026e 100644 (file)
@@ -262,7 +262,6 @@ int
 main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
-   glutInitWindowPosition( 0, 0);
    glutInitWindowSize(400, 400);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    win = glutCreateWindow(argv[0]);
index 5e97171..6ec9c83 100644 (file)
@@ -59,8 +59,8 @@ static GLint VertCoord_attr = -1, TexCoord0_attr = -1, TexCoord1_attr = -1;
 
 /* value[0] = tex unit */
 static struct uniform_info Uniforms[] = {
-   { "tex1",  1, GL_INT, { 0, 0, 0, 0 }, -1 },
-   { "tex2",  1, GL_INT, { 1, 0, 0, 0 }, -1 },
+   { "tex1",  1, GL_SAMPLER_2D, { 0, 0, 0, 0 }, -1 },
+   { "tex2",  1, GL_SAMPLER_2D, { 1, 0, 0, 0 }, -1 },
    END_OF_UNIFORMS
 };
 
@@ -134,7 +134,7 @@ DrawPolygonArray(void)
 
    if (VertCoord_attr >= 0) {
       glVertexAttribPointer(VertCoord_attr, 2, GL_FLOAT, GL_FALSE,
-                                 0, VertCoords);
+                                 0, vertPtr);
       glEnableVertexAttribArray(VertCoord_attr);
    }
    else {
@@ -143,11 +143,11 @@ DrawPolygonArray(void)
    }
 
    glVertexAttribPointer(TexCoord0_attr, 2, GL_FLOAT, GL_FALSE,
-                              0, Tex0Coords);
+                              0, tex0Ptr);
    glEnableVertexAttribArray(TexCoord0_attr);
 
    glVertexAttribPointer(TexCoord1_attr, 2, GL_FLOAT, GL_FALSE,
-                              0, Tex1Coords);
+                              0, tex1Ptr);
    glEnableVertexAttribArray(TexCoord1_attr);
 
    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
@@ -328,7 +328,8 @@ CreateProgram(const char *vertProgFile, const char *fragProgFile,
 
    glUseProgram(program);
 
-   InitUniforms(program, uniforms);
+   SetUniformValues(program, uniforms);
+   PrintUniforms(Uniforms);
 
    VertCoord_attr = glGetAttribLocation(program, "VertCoord");
    if (VertCoord_attr > 0) {
diff --git a/progs/glsl/multitex.shtest b/progs/glsl/multitex.shtest
new file mode 100644 (file)
index 0000000..5be45f6
--- /dev/null
@@ -0,0 +1,6 @@
+vs multitex.vert
+fs multitex.frag
+texture 0 ../images/tile.rgb
+texture 1 ../images/tree2.rgba
+uniform tex1  GL_SAMPLER_2D  0
+uniform tex2  GL_SAMPLER_2D  1
index 59f594e..fdab263 100644 (file)
@@ -35,8 +35,8 @@ static const char *FragShaderText =
 
 
 static struct uniform_info Uniforms[] = {
-   { "Scale",    4, GL_FLOAT, { 0.5, 0.4, 0.0, 0}, -1 },
-   { "Bias",     4, GL_FLOAT, { 0.5, 0.3, 0.0, 0}, -1 },
+   { "Scale",    1, GL_FLOAT_VEC4, { 0.5, 0.4, 0.0, 0}, -1 },
+   { "Bias",     1, GL_FLOAT_VEC4, { 0.5, 0.3, 0.0, 0}, -1 },
    { "Slice",    1, GL_FLOAT, { 0.5, 0, 0, 0}, -1 },
    END_OF_UNIFORMS
 };
@@ -179,7 +179,8 @@ Init(void)
 
    glUseProgram(program);
 
-   InitUniforms(program, Uniforms);
+   SetUniformValues(program, Uniforms);
+   PrintUniforms(Uniforms);
 
    assert(glGetError() == 0);
 
@@ -199,7 +200,6 @@ int
 main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
-   glutInitWindowPosition( 0, 0);
    glutInitWindowSize(400, 400);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    win = glutCreateWindow(argv[0]);
index e972b62..7a28f09 100644 (file)
@@ -186,7 +186,6 @@ static void Init (void)
 int main (int argc, char *argv[])
 {
        glutInit (&argc, argv);
-       glutInitWindowPosition ( 0, 0);
        glutInitWindowSize (200, 200);
        glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
        glutCreateWindow (argv[0]);
index 27b73a0..5dced6f 100644 (file)
@@ -187,7 +187,6 @@ int
 main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
-   glutInitWindowPosition( 0, 0);
    glutInitWindowSize(WinWidth, WinHeight);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    win = glutCreateWindow(argv[0]);
index 0a4d04d..0adc9d8 100644 (file)
@@ -321,7 +321,6 @@ int
 main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
-   glutInitWindowPosition( 0, 0);
    glutInitWindowSize(400, 300);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    win = glutCreateWindow(argv[0]);
diff --git a/progs/glsl/shtest.c b/progs/glsl/shtest.c
new file mode 100644 (file)
index 0000000..2622af1
--- /dev/null
@@ -0,0 +1,629 @@
+/*
+ * Simple shader test harness.
+ * Brian Paul
+ * 13 Aug 2009
+ *
+ * Usage:
+ *   shtest --vs vertShaderFile --fs fragShaderFile
+ *
+ *   In this case the given vertex/frag shaders are read and compiled.
+ *   Random values are assigned to the uniforms.
+ *
+ * or:
+ *   shtest configFile
+ *
+ *   In this case a config file is read that specifies the file names
+ *   of the shaders plus initial values for uniforms.
+ *
+ * Example config file:
+ *
+ * vs shader.vert
+ * fs shader.frag
+ * uniform pi 3.14159
+ * uniform v1 1.0 0.5 0.2 0.3
+ *
+ */
+
+
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <GL/glew.h>
+#include <GL/glu.h>
+#include <GL/glut.h>
+#include "shaderutil.h"
+#include "readtex.h"
+
+
+typedef enum
+{
+   SPHERE,
+   CUBE,
+   NUM_SHAPES
+} shape;
+
+
+static char *FragShaderFile = NULL;
+static char *VertShaderFile = NULL;
+static char *ConfigFile = NULL;
+
+/* program/shader objects */
+static GLuint fragShader;
+static GLuint vertShader;
+static GLuint Program;
+
+
+#define MAX_UNIFORMS 100
+static struct uniform_info Uniforms[MAX_UNIFORMS];
+static GLuint NumUniforms = 0;
+
+
+#define MAX_ATTRIBS 100
+static struct attrib_info Attribs[MAX_ATTRIBS];
+static GLuint NumAttribs = 0;
+
+
+/**
+ * Config file info.
+ */
+struct config_file
+{
+   struct name_value
+   {
+      char name[100];
+      float value[4];
+      int type;
+   } uniforms[100];
+
+   int num_uniforms;
+};
+
+
+static GLint win = 0;
+static GLboolean Anim = GL_FALSE;
+static GLfloat TexRot = 0.0;
+static GLfloat xRot = 0.0f, yRot = 0.0f, zRot = 0.0f;
+static shape Object = SPHERE;
+
+
+static float
+RandomFloat(float min, float max)
+{
+   int k = rand() % 10000;
+   float x = min + (max - min) * k / 10000.0;
+   return x;
+}
+
+
+/** Set new random values for uniforms */
+static void
+RandomUniformValues(void)
+{
+   GLuint i;
+   for (i = 0; i < NumUniforms; i++) {
+      if (Uniforms[i].type == GL_FLOAT) {
+         Uniforms[i].value[0] = RandomFloat(0.0, 1.0);
+      }
+      else {
+         Uniforms[i].value[0] = RandomFloat(-1.0, 2.0);
+         Uniforms[i].value[1] = RandomFloat(-1.0, 2.0);
+         Uniforms[i].value[2] = RandomFloat(-1.0, 2.0);
+         Uniforms[i].value[3] = RandomFloat(-1.0, 2.0);
+      }
+   }
+}
+
+
+static void
+Idle(void)
+{
+   yRot += 2.0;
+   if (yRot > 360.0)
+      yRot -= 360.0;
+   glutPostRedisplay();
+}
+
+
+
+static void
+SquareVertex(GLfloat s, GLfloat t, GLfloat size)
+{
+   GLfloat x = -size + s * 2.0 * size;
+   GLfloat y = -size + t * 2.0 * size;
+   GLuint i;
+
+   glMultiTexCoord2f(GL_TEXTURE0, s, t);
+   glMultiTexCoord2f(GL_TEXTURE1, s, t);
+   glMultiTexCoord2f(GL_TEXTURE2, s, t);
+   glMultiTexCoord2f(GL_TEXTURE3, s, t);
+
+   /* assign (s,t) to the generic attributes */
+   for (i = 0; i < NumAttribs; i++) {
+      if (Attribs[i].location >= 0) {
+         glVertexAttrib2f(Attribs[i].location, s, t);
+      }
+   }
+
+   glVertex2f(x, y);
+}
+
+
+/*
+ * Draw a square, specifying normal and tangent vectors.
+ */
+static void
+Square(GLfloat size)
+{
+   GLint tangentAttrib = 1;
+   glNormal3f(0, 0, 1);
+   glVertexAttrib3f(tangentAttrib, 1, 0, 0);
+   glBegin(GL_POLYGON);
+#if 1
+   SquareVertex(0, 0, size);
+   SquareVertex(1, 0, size);
+   SquareVertex(1, 1, size);
+   SquareVertex(0, 1, size);
+#else
+   glTexCoord2f(0, 0);  glVertex2f(-size, -size);
+   glTexCoord2f(1, 0);  glVertex2f( size, -size);
+   glTexCoord2f(1, 1);  glVertex2f( size,  size);
+   glTexCoord2f(0, 1);  glVertex2f(-size,  size);
+#endif
+   glEnd();
+}
+
+
+static void
+Cube(GLfloat size)
+{
+   /* +X */
+   glPushMatrix();
+   glRotatef(90, 0, 1, 0);
+   glTranslatef(0, 0, size);
+   Square(size);
+   glPopMatrix();
+
+   /* -X */
+   glPushMatrix();
+   glRotatef(-90, 0, 1, 0);
+   glTranslatef(0, 0, size);
+   Square(size);
+   glPopMatrix();
+
+   /* +Y */
+   glPushMatrix();
+   glRotatef(90, 1, 0, 0);
+   glTranslatef(0, 0, size);
+   Square(size);
+   glPopMatrix();
+
+   /* -Y */
+   glPushMatrix();
+   glRotatef(-90, 1, 0, 0);
+   glTranslatef(0, 0, size);
+   Square(size);
+   glPopMatrix();
+
+
+   /* +Z */
+   glPushMatrix();
+   glTranslatef(0, 0, size);
+   Square(size);
+   glPopMatrix();
+
+   /* -Z */
+   glPushMatrix();
+   glRotatef(180, 0, 1, 0);
+   glTranslatef(0, 0, size);
+   Square(size);
+   glPopMatrix();
+}
+
+
+static void
+Sphere(GLfloat radius, GLint slices, GLint stacks)
+{
+   static GLUquadricObj *q = NULL;
+
+   if (!q) {
+      q = gluNewQuadric();
+      gluQuadricDrawStyle(q, GLU_FILL);
+      gluQuadricNormals(q, GLU_SMOOTH);
+      gluQuadricTexture(q, GL_TRUE);
+   }
+
+   gluSphere(q, radius, slices, stacks);
+}
+
+
+static void
+Redisplay(void)
+{
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+   
+   glPushMatrix();
+   glRotatef(xRot, 1.0f, 0.0f, 0.0f);
+   glRotatef(yRot, 0.0f, 1.0f, 0.0f);
+   glRotatef(zRot, 0.0f, 0.0f, 1.0f);
+
+   glMatrixMode(GL_TEXTURE);
+   glLoadIdentity();
+   glRotatef(TexRot, 0.0f, 1.0f, 0.0f);
+   glMatrixMode(GL_MODELVIEW);
+
+   if (Object == SPHERE) {
+      Sphere(2.0, 20, 10);
+   }
+   else if (Object == CUBE) {
+      Cube(2.0);
+   }
+
+   glPopMatrix();
+
+   glutSwapBuffers();
+}
+
+
+static void
+Reshape(int width, int height)
+{
+   glViewport(0, 0, width, height);
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();
+   glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
+   glMatrixMode(GL_MODELVIEW);
+   glLoadIdentity();
+   glTranslatef(0.0f, 0.0f, -15.0f);
+}
+
+
+static void
+CleanUp(void)
+{
+   glDeleteShader(fragShader);
+   glDeleteShader(vertShader);
+   glDeleteProgram(Program);
+   glutDestroyWindow(win);
+}
+
+
+static void
+Key(unsigned char key, int x, int y)
+{
+   const GLfloat step = 2.0;
+  (void) x;
+  (void) y;
+
+   switch(key) {
+   case 'a':
+      Anim = !Anim;
+      if (Anim)
+         glutIdleFunc(Idle);
+      else
+         glutIdleFunc(NULL);
+      break;
+   case 'z':
+      zRot += step;
+      break;
+   case 'Z':
+      zRot -= step;
+      break;
+   case 'o':
+      Object = (Object + 1) % NUM_SHAPES;
+      break;
+   case 'r':
+      RandomUniformValues();
+      SetUniformValues(Program, Uniforms);
+      PrintUniforms(Uniforms);
+      break;
+   case 27:
+      CleanUp();
+      exit(0);
+      break;
+   }
+   glutPostRedisplay();
+}
+
+
+static void
+SpecialKey(int key, int x, int y)
+{
+   const GLfloat step = 2.0;
+
+  (void) x;
+  (void) y;
+
+   switch(key) {
+   case GLUT_KEY_UP:
+      xRot += step;
+      break;
+   case GLUT_KEY_DOWN:
+      xRot -= step;
+      break;
+   case GLUT_KEY_LEFT:
+      yRot -= step;
+      break;
+   case GLUT_KEY_RIGHT:
+      yRot += step;
+      break;
+   }
+   glutPostRedisplay();
+}
+
+
+static void
+InitUniforms(const struct config_file *conf,
+             struct uniform_info uniforms[])
+{
+   int i;
+
+   for (i = 0; i < conf->num_uniforms; i++) {
+      int j;
+      for (j = 0; uniforms[j].name; j++) {
+         if (strcmp(uniforms[j].name, conf->uniforms[i].name) == 0) {
+            uniforms[j].type = conf->uniforms[i].type;
+            uniforms[j].value[0] = conf->uniforms[i].value[0];
+            uniforms[j].value[1] = conf->uniforms[i].value[1];
+            uniforms[j].value[2] = conf->uniforms[i].value[2];
+            uniforms[j].value[3] = conf->uniforms[i].value[3];
+         }
+      }
+   }
+}
+
+
+static void
+LoadTexture(GLint unit, const char *texFileName)
+{
+   GLint imgWidth, imgHeight;
+   GLenum imgFormat;
+   GLubyte *image = NULL;
+   GLuint tex;
+   GLenum filter = GL_LINEAR;
+
+   image = LoadRGBImage(texFileName, &imgWidth, &imgHeight, &imgFormat);
+   if (!image) {
+      printf("Couldn't read %s\n", texFileName);
+      exit(1);
+   }
+
+   printf("Load Texture: unit %d: %s %d x %d\n",
+          unit, texFileName, imgWidth, imgHeight);
+
+   glActiveTexture(GL_TEXTURE0 + unit);
+   glGenTextures(1, &tex);
+   glBindTexture(GL_TEXTURE_2D, tex);
+
+   gluBuild2DMipmaps(GL_TEXTURE_2D, 4, imgWidth, imgHeight,
+                     imgFormat, GL_UNSIGNED_BYTE, image);
+   free(image);
+      
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
+}
+
+
+static GLenum
+TypeFromName(const char *n)
+{
+   static const struct {
+      const char *name;
+      GLenum type;
+   } types[] = {
+      { "GL_FLOAT", GL_FLOAT },
+      { "GL_FLOAT_VEC2", GL_FLOAT_VEC2 },
+      { "GL_FLOAT_VEC3", GL_FLOAT_VEC3 },
+      { "GL_FLOAT_VEC4", GL_FLOAT_VEC4 },
+      { "GL_INT", GL_INT },
+      { "GL_INT_VEC2", GL_INT_VEC2 },
+      { "GL_INT_VEC3", GL_INT_VEC3 },
+      { "GL_INT_VEC4", GL_INT_VEC4 },
+      { "GL_SAMPLER_2D", GL_SAMPLER_2D },
+      { NULL, 0 }
+   };
+   GLuint i;
+
+   for (i = 0; types[i].name; i++) {
+      if (strcmp(types[i].name, n) == 0)
+         return types[i].type;
+   }
+   abort();
+   return GL_NONE;
+}
+
+
+
+/**
+ * Read a config file.
+ */
+static void
+ReadConfigFile(const char *filename, struct config_file *conf)
+{
+   char line[1000];
+   FILE *f;
+
+   f = fopen(filename, "r");
+   if (!f) {
+      fprintf(stderr, "Unable to open config file %s\n", filename);
+      exit(1);
+   }
+
+   conf->num_uniforms = 0;
+
+   /* ugly but functional parser */
+   while (!feof(f)) {
+      fgets(line, sizeof(line), f);
+      if (!feof(f) && line[0]) {
+         if (strncmp(line, "vs ", 3) == 0) {
+            VertShaderFile = strdup(line + 3);
+            VertShaderFile[strlen(VertShaderFile) - 1] = 0;
+         }
+         else if (strncmp(line, "fs ", 3) == 0) {
+            FragShaderFile = strdup(line + 3);
+            FragShaderFile[strlen(FragShaderFile) - 1] = 0;
+         }
+         else if (strncmp(line, "texture ", 8) == 0) {
+            char texFileName[100];
+            int unit, k;
+            k = sscanf(line + 8, "%d %s", &unit, texFileName);
+            assert(k == 2);
+            LoadTexture(unit, texFileName);
+         }
+         else if (strncmp(line, "uniform ", 8) == 0) {
+            char name[1000], typeName[100];
+            int k;
+            float v1 = 0.0F, v2 = 0.0F, v3 = 0.0F, v4 = 0.0F;
+            GLenum type;
+
+            k = sscanf(line + 8, "%s %s %f %f %f %f", name, typeName,
+                       &v1, &v2, &v3, &v4);
+
+            type = TypeFromName(typeName);
+
+            strcpy(conf->uniforms[conf->num_uniforms].name, name);
+            conf->uniforms[conf->num_uniforms].value[0] = v1;
+            conf->uniforms[conf->num_uniforms].value[1] = v2;
+            conf->uniforms[conf->num_uniforms].value[2] = v3;
+            conf->uniforms[conf->num_uniforms].value[3] = v4;
+            conf->uniforms[conf->num_uniforms].type = type;
+            conf->num_uniforms++;
+         }
+         else {
+            if (strlen(line) > 1) {
+               fprintf(stderr, "syntax error in: %s\n", line);
+               break;
+            }
+         }
+      }
+   }
+
+   fclose(f);
+}
+
+
+static void
+Init(void)
+{
+   struct config_file config;
+   memset(&config, 0, sizeof(config));
+
+   if (ConfigFile)
+      ReadConfigFile(ConfigFile, &config);
+
+   if (!VertShaderFile) {
+      fprintf(stderr, "Error: no vertex shader\n");
+      exit(1);
+   }
+
+   if (!FragShaderFile) {
+      fprintf(stderr, "Error: no fragment shader\n");
+      exit(1);
+   }
+
+   if (!ShadersSupported())
+      exit(1);
+
+   vertShader = CompileShaderFile(GL_VERTEX_SHADER, VertShaderFile);
+   fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragShaderFile);
+   Program = LinkShaders(vertShader, fragShader);
+
+   glUseProgram(Program);
+
+   NumUniforms = GetUniforms(Program, Uniforms);
+   if (config.num_uniforms) {
+      InitUniforms(&config, Uniforms);
+   }
+   else {
+      RandomUniformValues();
+   }
+   SetUniformValues(Program, Uniforms);
+   PrintUniforms(Uniforms);
+
+   NumAttribs = GetAttribs(Program, Attribs);
+   PrintAttribs(Attribs);
+
+   //assert(glGetError() == 0);
+
+   glClearColor(0.4f, 0.4f, 0.8f, 0.0f);
+
+   glEnable(GL_DEPTH_TEST);
+
+   glColor3f(1, 0, 0);
+}
+
+
+static void
+Keys(void)
+{
+   printf("Keyboard:\n");
+   printf("       a  Animation toggle\n");
+   printf("       r  Randomize uniform values\n");
+   printf("       o  Change object\n");
+   printf("  arrows  Rotate object\n");
+   printf("     ESC  Exit\n");
+}
+
+
+static void
+Usage(void)
+{
+   printf("Usage:\n");
+   printf("   shtest config.shtest\n");
+   printf("       Run w/ given config file.\n");
+   printf("   shtest --vs vertShader --fs fragShader\n");
+   printf("       Load/compile given shaders.\n");
+}
+
+
+static void
+ParseOptions(int argc, char *argv[])
+{
+   int i;
+
+   if (argc == 1) {
+      Usage();
+      exit(1);
+   }
+
+   for (i = 1; i < argc; i++) {
+      if (strcmp(argv[i], "--fs") == 0) {
+         FragShaderFile = argv[i+1];
+         i++;
+      }
+      else if (strcmp(argv[i], "--vs") == 0) {
+         VertShaderFile = argv[i+1];
+         i++;
+      }
+      else {
+         /* assume the arg is a config file */
+         ConfigFile = argv[i];
+         break;
+      }
+   }
+}
+
+
+int
+main(int argc, char *argv[])
+{
+   glutInit(&argc, argv);
+   glutInitWindowSize(400, 400);
+   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
+   win = glutCreateWindow(argv[0]);
+   glewInit();
+   glutReshapeFunc(Reshape);
+   glutKeyboardFunc(Key);
+   glutSpecialFunc(SpecialKey);
+   glutDisplayFunc(Redisplay);
+   ParseOptions(argc, argv);
+   Init();
+   Keys();
+   glutMainLoop();
+   return 0;
+}
+
index 1f566c8..2481c0f 100644 (file)
@@ -351,7 +351,6 @@ int
 main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
-   glutInitWindowPosition( 0, 0);
    glutInitWindowSize(WinWidth, WinHeight);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    win = glutCreateWindow(argv[0]);
index d55f9e7..5b1913a 100644 (file)
@@ -53,14 +53,14 @@ static int win = 0;
 
 
 static struct uniform_info ReflectUniforms[] = {
-   { "cubeTex",  1, GL_INT, { 0, 0, 0, 0 }, -1 },
-   { "lightPos", 3, GL_FLOAT, { 10, 10, 20, 0 }, -1 },
+   { "cubeTex",  1, GL_SAMPLER_CUBE, { 0, 0, 0, 0 }, -1 },
+   { "lightPos", 1, GL_FLOAT_VEC3, { 10, 10, 20, 0 }, -1 },
    END_OF_UNIFORMS
 };
 
 static struct uniform_info SimpleUniforms[] = {
-   { "tex2d",    1, GL_INT,   { 1, 0, 0, 0 }, -1 },
-   { "lightPos", 3, GL_FLOAT, { 10, 10, 20, 0 }, -1 },
+   { "tex2d",    1, GL_SAMPLER_2D, { 1, 0, 0, 0 }, -1 },
+   { "lightPos", 1, GL_FLOAT_VEC3, { 10, 10, 20, 0 }, -1 },
    END_OF_UNIFORMS
 };
 
@@ -382,7 +382,8 @@ CreateProgram(const char *vertProgFile, const char *fragProgFile,
 
    glUseProgram(program);
 
-   InitUniforms(program, uniforms);
+   SetUniformValues(program, uniforms);
+   PrintUniforms(uniforms);
 
    return program;
 }
index 7fe27ae..c502f24 100644 (file)
@@ -24,18 +24,18 @@ static GLuint program;
 
 
 static struct uniform_info Uniforms[] = {
-   { "LightDir",       4, GL_FLOAT, { 0.57737, 0.57735, 0.57735, 0.0 }, -1 },
-   { "HVector",        4, GL_FLOAT, { 0.32506, 0.32506, 0.88808, 0.0 }, -1 },
-   { "BallCenter",     4, GL_FLOAT, { 0.0, 0.0, 0.0, 1.0 }, -1 },
-   { "SpecularColor",  4, GL_FLOAT, { 0.4, 0.4, 0.4, 60.0 }, -1 },
-   { "Red",         4, GL_FLOAT, { 0.6, 0.0, 0.0, 1.0 }, -1 },
-   { "Blue",        4, GL_FLOAT, { 0.0, 0.3, 0.6, 1.0 }, -1 },
-   { "Yellow",      4, GL_FLOAT, { 0.6, 0.5, 0.0, 1.0 }, -1 },
-   { "HalfSpace0",  4, GL_FLOAT, { 1.0, 0.0, 0.0, 0.2 }, -1 },
-   { "HalfSpace1",  4, GL_FLOAT, { 0.309016994, 0.951056516, 0.0, 0.2 }, -1 },
-   { "HalfSpace2",  4, GL_FLOAT, { -0.809016994, 0.587785252, 0.0, 0.2 }, -1 },
-   { "HalfSpace3",  4, GL_FLOAT, { -0.809016994, -0.587785252, 0.0, 0.2 }, -1 },
-   { "HalfSpace4",  4, GL_FLOAT, { 0.309116994, -0.951056516, 0.0, 0.2 }, -1 },
+   { "LightDir",    1, GL_FLOAT_VEC4, { 0.57737, 0.57735, 0.57735, 0.0 }, -1 },
+   { "HVector",     1, GL_FLOAT_VEC4, { 0.32506, 0.32506, 0.88808, 0.0 }, -1 },
+   { "BallCenter",  1, GL_FLOAT_VEC4, { 0.0, 0.0, 0.0, 1.0 }, -1 },
+   { "SpecularColor", 1, GL_FLOAT_VEC4, { 0.4, 0.4, 0.4, 60.0 }, -1 },
+   { "Red",         1, GL_FLOAT_VEC4, { 0.6, 0.0, 0.0, 1.0 }, -1 },
+   { "Blue",        1, GL_FLOAT_VEC4, { 0.0, 0.3, 0.6, 1.0 }, -1 },
+   { "Yellow",      1, GL_FLOAT_VEC4, { 0.6, 0.5, 0.0, 1.0 }, -1 },
+   { "HalfSpace0",  1, GL_FLOAT_VEC4, { 1.0, 0.0, 0.0, 0.2 }, -1 },
+   { "HalfSpace1",  1, GL_FLOAT_VEC4, { 0.309016994, 0.951056516, 0.0, 0.2 }, -1 },
+   { "HalfSpace2",  1, GL_FLOAT_VEC4, { -0.809016994, 0.587785252, 0.0, 0.2 }, -1 },
+   { "HalfSpace3",  1, GL_FLOAT_VEC4, { -0.809016994, -0.587785252, 0.0, 0.2 }, -1 },
+   { "HalfSpace4",  1, GL_FLOAT_VEC4, { 0.309116994, -0.951056516, 0.0, 0.2 }, -1 },
    { "InOrOutInit", 1, GL_FLOAT, { -3.0, 0, 0, 0 }, -1 },
    { "StripeWidth", 1, GL_FLOAT, {  0.3, 0, 0, 0 }, -1 },
    { "FWidth",      1, GL_FLOAT, { 0.005, 0, 0, 0 }, -1 },
@@ -173,7 +173,8 @@ Init(void)
 
    glUseProgram(program);
 
-   InitUniforms(program, Uniforms);
+   SetUniformValues(program, Uniforms);
+   PrintUniforms(Uniforms);
 
    assert(glGetError() == 0);
 
@@ -204,7 +205,6 @@ int
 main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
-   glutInitWindowPosition( 0, 0);
    glutInitWindowSize(400, 400);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    win = glutCreateWindow(argv[0]);
diff --git a/progs/glsl/toyball.shtest b/progs/glsl/toyball.shtest
new file mode 100644 (file)
index 0000000..887663a
--- /dev/null
@@ -0,0 +1,17 @@
+vs CH11-toyball.vert
+fs CH11-toyball.frag
+uniform LightDir      GL_FLOAT_VEC4 0.57737 0.57735 0.57735 0.0
+uniform HVector       GL_FLOAT_VEC4 0.32506 0.32506 0.88808 0.0
+uniform BallCenter    GL_FLOAT_VEC4 0.0 0.0 0.0 1.0
+uniform SpecularColor GL_FLOAT_VEC4 0.4 0.4 0.4 60.0
+uniform Red           GL_FLOAT_VEC4 0.6 0.0 0.0 1.0
+uniform Blue          GL_FLOAT_VEC4 0.0 0.3 0.6 1.0
+uniform Yellow        GL_FLOAT_VEC4 0.6 0.5 0.0 1.0
+uniform HalfSpace0    GL_FLOAT_VEC4 1.0 0.0 0.0 0.2
+uniform HalfSpace1    GL_FLOAT_VEC4 .309016994 0.951056516 0.0 0.2
+uniform HalfSpace2    GL_FLOAT_VEC4 -0.809016994 0.587785252 0.0 0.2
+uniform HalfSpace3    GL_FLOAT_VEC4 -0.809016994 -0.587785252 0.0 0.2
+uniform HalfSpace4    GL_FLOAT_VEC4 .309116994 -0.951056516 0.0 0.2
+uniform InOrOutInit   GL_FLOAT -3.0
+uniform StripeWidth   GL_FLOAT 0.3
+uniform FWidth        GL_FLOAT .005
index f7546f2..53bd91e 100644 (file)
@@ -239,7 +239,6 @@ int
 main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
-   glutInitWindowPosition( 0, 0);
    glutInitWindowSize(WinWidth, WinHeight);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    win = glutCreateWindow(argv[0]);
index b6c1b47..a57484f 100644 (file)
@@ -285,7 +285,6 @@ int
 main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
-   glutInitWindowPosition( 0, 0);
    glutInitWindowSize(WinWidth, WinHeight);
    glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
    win = glutCreateWindow(argv[0]);
index 81fcab8..148991c 100644 (file)
@@ -173,7 +173,6 @@ int
 main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
-   glutInitWindowPosition( 0, 0);
    glutInitWindowSize(400, 200);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    Win = glutCreateWindow(argv[0]);
index e791a57..4c8bfa5 100644 (file)
@@ -43,7 +43,7 @@ static GLfloat xRot = -70.0f, yRot = 0.0f, zRot = 0.0f;
 
 /* value[0] = tex unit */
 static struct uniform_info Uniforms[] = {
-   { "tex1",  1, GL_INT, { 0, 0, 0, 0 }, -1 },
+   { "tex1",  1, GL_SAMPLER_2D, { 0, 0, 0, 0 }, -1 },
    END_OF_UNIFORMS
 };
 
index b17fa90..bb6a1d2 100644 (file)
@@ -72,6 +72,7 @@ progs = [
     'fogcoord',
     'fptest1',
     'fptexture',
+    'getteximage',
     'glutfx',
     'interleave',
     'invert',
index ad14cac..39302ce 100644 (file)
@@ -33,7 +33,7 @@ static const char *VertShaderText =
    "} \n";
 
 static struct uniform_info Uniforms[] = {
-   { "tex1",  1, GL_INT, { 0, 0, 0, 0 }, -1 },
+   { "tex1",  1, GL_SAMPLER_2D, { 0, 0, 0, 0 }, -1 },
    END_OF_UNIFORMS
 };
 
@@ -189,7 +189,7 @@ CreateProgram(void)
 
    glUseProgram_func(program);
 
-   InitUniforms(program, Uniforms);
+   SetUniformValues(program, Uniforms);
 
    return program;
 }
index ca66025..a09ea58 100644 (file)
@@ -39,13 +39,2600 @@ typedef void (*generic_func)();
 
 #define EQUAL(X, Y)  (fabs((X) - (Y)) < 0.001)
 
-/**
+/* This macro simplifies the task of querying an extension function
+ * pointer and checking to see whether it resolved.
+ */
+#define DECLARE_GLFUNC_PTR(name,type) \
+   type name = (type) glXGetProcAddressARB((const GLubyte *) "gl" #name)
+
+/********************************************************************
+ * Generic helper functions used by the test functions.
+ */
+
+static void CheckGLError(int line, const char *file, const char *function)
+{
+    int errorCode;
+    glFinish();
+    errorCode  = glGetError();
+    if (errorCode == GL_NO_ERROR) return;
+    while (errorCode != GL_NO_ERROR) {
+       fprintf(stderr, "OpenGL error 0x%x (%s) at line %d of file %s in function %s()\n",
+           errorCode,
+           errorCode == GL_INVALID_VALUE? "GL_INVALID_VALUE":
+           errorCode == GL_INVALID_ENUM? "GL_INVALID_ENUM":
+           errorCode == GL_INVALID_OPERATION? "GL_INVALID_OPERATION":
+           errorCode == GL_STACK_OVERFLOW? "GL_STACK_OVERFLOW":
+           errorCode == GL_STACK_UNDERFLOW? "GL_STACK_UNDERFLOW":
+           errorCode == GL_OUT_OF_MEMORY? "GL_OUT_OF_MEMORY":
+           "unknown",
+           line, file, function);
+       errorCode = glGetError();
+    }
+    fflush(stderr);
+}
+
+static GLboolean 
+compare_bytes(const char *errorLabel, GLuint expectedSize, 
+   const GLubyte *expectedData, GLuint actualSize, const GLubyte *actualData)
+{
+   int i;
+
+   if (expectedSize == actualSize &&
+      memcmp(expectedData, actualData, actualSize) == 0) {
+      /* All is well */
+      return GL_TRUE;
+   }
+
+   /* Trouble; we don't match.  Print out why. */
+   fprintf(stderr, "%s: actual data is not as expected\n", errorLabel);
+   for (i = 0; i <= 1; i++) {
+      const GLubyte *ptr;
+      int size;
+      char *label;
+      int j;
+
+      switch(i) {
+         case 0:
+            label = "expected";
+            size = expectedSize;
+            ptr = expectedData;
+            break;
+         case 1:
+            label = "  actual";
+            size = actualSize;
+            ptr = actualData;
+            break;
+      }
+      
+      fprintf(stderr, "    %s: size %d: {", label, size);
+      for (j = 0; j < size; j++) {
+         fprintf(stderr, "%s0x%02x", j > 0 ? ", " : "", ptr[j]);
+      }
+      fprintf(stderr, "}\n");
+   }
+
+   /* We fail if the data is unexpected. */
+   return GL_FALSE;
+}
+
+
+static GLboolean 
+compare_ints(const char *errorLabel, GLuint expectedSize, 
+   const GLint *expectedData, GLuint actualSize, const GLint *actualData)
+{
+   int i;
+
+   if (expectedSize == actualSize &&
+      memcmp(expectedData, actualData, actualSize*sizeof(*expectedData)) == 0) {
+      /* All is well */
+      return GL_TRUE;
+   }
+
+   /* Trouble; we don't match.  Print out why. */
+   fprintf(stderr, "%s: actual data is not as expected\n", errorLabel);
+   for (i = 0; i <= 1; i++) {
+      const GLint *ptr;
+      int size;
+      char *label;
+      int j;
+
+      switch(i) {
+         case 0:
+            label = "expected";
+            size = expectedSize;
+            ptr = expectedData;
+            break;
+         case 1:
+            label = "  actual";
+            size = actualSize;
+            ptr = actualData;
+            break;
+      }
+      
+      fprintf(stderr, "    %s: size %d: {", label, size);
+      for (j = 0; j < size; j++) {
+         fprintf(stderr, "%s%d", j > 0 ? ", " : "", ptr[j]);
+      }
+      fprintf(stderr, "}\n");
+   }
+
+   /* We fail if the data is unexpected. */
+   return GL_FALSE;
+}
+
+#define MAX_CONVERTED_VALUES 4
+static GLboolean 
+compare_shorts_to_ints(const char *errorLabel, GLuint expectedSize, 
+   const GLshort *expectedData, GLuint actualSize, const GLint *actualData)
+{
+   int i;
+   GLint convertedValues[MAX_CONVERTED_VALUES];
+
+   if (expectedSize > MAX_CONVERTED_VALUES) {
+      fprintf(stderr, "%s: too much data [need %d values, have %d values]\n",
+         errorLabel, expectedSize, MAX_CONVERTED_VALUES);
+      return GL_FALSE;
+   }
+
+   for (i = 0; i < expectedSize; i++) {
+      convertedValues[i] = (GLint) expectedData[i];
+   }
+
+   return compare_ints(errorLabel, expectedSize, convertedValues, 
+      actualSize, actualData);
+}
+
+static GLboolean 
+compare_floats(const char *errorLabel, GLuint expectedSize, 
+   const GLfloat *expectedData, GLuint actualSize, const GLfloat *actualData)
+{
+   int i;
+
+   if (expectedSize == actualSize &&
+      memcmp(expectedData, actualData, actualSize*sizeof(*expectedData)) == 0) {
+      /* All is well */
+      return GL_TRUE;
+   }
+
+   /* Trouble; we don't match.  Print out why. */
+   fprintf(stderr, "%s: actual data is not as expected\n", errorLabel);
+   for (i = 0; i <= 1; i++) {
+      const GLfloat *ptr;
+      int size;
+      char *label;
+      int j;
+
+      switch(i) {
+         case 0:
+            label = "expected";
+            size = expectedSize;
+            ptr = expectedData;
+            break;
+         case 1:
+            label = "  actual";
+            size = actualSize;
+            ptr = actualData;
+            break;
+      }
+      
+      fprintf(stderr, "    %s: size %d: {", label, size);
+      for (j = 0; j < size; j++) {
+         fprintf(stderr, "%s%f", j > 0 ? ", " : "", ptr[j]);
+      }
+      fprintf(stderr, "}\n");
+   }
+
+   /* We fail if the data is unexpected. */
+   return GL_FALSE;
+}
+
+static GLboolean 
+compare_doubles(const char *errorLabel, GLuint expectedSize, 
+   const GLdouble *expectedData, GLuint actualSize, const GLdouble *actualData)
+{
+   int i;
+
+   if (expectedSize == actualSize || 
+      memcmp(expectedData, actualData, actualSize*sizeof(*expectedData)) == 0) {
+      /* All is well */
+      return GL_TRUE;
+   }
+
+   /* Trouble; we don't match.  Print out why. */
+   fprintf(stderr, "%s: actual data is not as expected\n", errorLabel);
+   for (i = 0; i <= 1; i++) {
+      const GLdouble *ptr;
+      int size;
+      char *label;
+      int j;
+
+      switch(i) {
+         case 0:
+            label = "expected";
+            size = expectedSize;
+            ptr = expectedData;
+            break;
+         case 1:
+            label = "  actual";
+            size = actualSize;
+            ptr = actualData;
+            break;
+      }
+      
+      fprintf(stderr, "    %s: size %d: {", label, size);
+      for (j = 0; j < size; j++) {
+         fprintf(stderr, "%s%f", j > 0 ? ", " : "", ptr[j]);
+      }
+      fprintf(stderr, "}\n");
+   }
+
+   /* We fail if the data is unexpected. */
+   return GL_FALSE;
+}
+
+/********************************************************************
+ * Functions to assist with GL_ARB_texture_compressiong testing
+ */
+
+static GLboolean
+check_texture_format_supported(GLenum format)
+{
+   GLint numFormats;
+   GLint *formats;
+   register int i;
+
+   glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB, &numFormats);
+   formats = malloc(numFormats * sizeof(GLint));
+   if (formats == NULL) {
+      fprintf(stderr, "check_texture_format_supported: could not allocate memory for %d GLints\n", 
+         numFormats);
+      return GL_FALSE;
+   }
+   
+   memset(formats, 0, numFormats * sizeof(GLint));
+   glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS_ARB, formats);
+
+   for (i = 0; i < numFormats; i++) {
+      if (formats[i] == format) {
+         free(formats);
+         return GL_TRUE;
+      }
+   }
+
+   /* We didn't find the format we were looking for.  Give an error. */
+#define FORMAT_NAME(x) (\
+   x == GL_COMPRESSED_RGB_FXT1_3DFX ? "GL_COMPRESSED_RGB_FXT1_3DFX" : \
+   x == GL_COMPRESSED_RGBA_FXT1_3DFX ? "GL_COMPRESSED_RGBA_FXT1_3DFX" : \
+   x == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ? "GL_COMPRESSED_RGB_S3TC_DXT1_EXT" : \
+   x == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ? "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT" : \
+   x == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT ? "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT" : \
+   x == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT ? "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT" : \
+   x == GL_RGB_S3TC ? "GL_RGB_S3TC" : \
+   x == GL_RGB4_S3TC ? "GL_RGB4_S3TC" : \
+   x == GL_RGBA_S3TC ? "GL_RGBA_S3TC" : \
+   x == GL_RGBA4_S3TC ? "GL_RGBA4_S3TC" : \
+   "unknown")
+   fprintf(stderr, "check_texture_format_supported: unsupported format 0x%04x [%s]\n",
+      format, FORMAT_NAME(format));
+   fprintf(stderr, "supported formats:");
+   for (i = 0; i < numFormats; i++) {
+      fprintf(stderr, " 0x%04x [%s]", formats[i], FORMAT_NAME(formats[i]));
+   }
+   fprintf(stderr, "\n");
+   return GL_FALSE;
+}
+
+/* This helper function compresses an RGBA texture and compares it
+ * against the expected compressed data.  It returns GL_TRUE if all
+ * went as expected, or GL_FALSE in the case of error.
+ */
+static GLboolean
+check_texture_compression(const char *message, GLenum dimension,
+   GLint width, GLint height, GLint depth, const GLubyte *texture, 
+   int expectedCompressedSize, const GLubyte *expectedCompressedData)
+{
+   /* These are the data we query about the texture. */
+   GLint isCompressed;
+   GLenum compressedFormat;
+   GLint compressedSize;
+   GLubyte *compressedData;
+
+   /* We need this function pointer to operate. */
+   DECLARE_GLFUNC_PTR(GetCompressedTexImageARB, PFNGLGETCOMPRESSEDTEXIMAGEARBPROC);
+   if (GetCompressedTexImageARB == NULL) {
+      fprintf(stderr, 
+         "%s: could not query GetCompressedTexImageARB function pointer\n",
+         message);
+      return GL_FALSE;
+   }
+
+   /* Verify that we actually have the GL_COMPRESSED_RGBA_S3TC_DXT3_EXT format available. */
+   if (!check_texture_format_supported(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT)) {
+      return GL_FALSE;
+   }
+
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+   /* Set up the base image, requesting that the GL library compress it. */
+   switch(dimension) {
+      case GL_TEXTURE_1D:
+         glTexImage1D(GL_TEXTURE_1D, 0, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 
+            width, 0, 
+            GL_RGBA, GL_UNSIGNED_BYTE, texture);
+         break;
+      case GL_TEXTURE_2D:
+         glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 
+            width, height, 0, 
+            GL_RGBA, GL_UNSIGNED_BYTE, texture);
+         break;
+      case GL_TEXTURE_3D:
+         glTexImage3D(GL_TEXTURE_3D, 0, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 
+            width, height, depth, 0, 
+            GL_RGBA, GL_UNSIGNED_BYTE, texture);
+         break;
+      default:
+         fprintf(stderr, "%s: unknown dimension 0x%04x.\n", message, dimension);
+         return GL_FALSE;
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Make sure the texture is compressed, and pull it out if it is. */
+   glGetTexLevelParameteriv(dimension, 0, GL_TEXTURE_COMPRESSED_ARB, 
+      &isCompressed);
+   if (!isCompressed) {
+      fprintf(stderr, "%s: could not compress GL_COMPRESSED_RGBA_S3TC_DXT3_EXT texture\n",
+         message);
+      return GL_FALSE;
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+   glGetTexLevelParameteriv(dimension, 0, GL_TEXTURE_INTERNAL_FORMAT, 
+      (GLint *)&compressedFormat);
+   if (compressedFormat != GL_COMPRESSED_RGBA_S3TC_DXT3_EXT) {
+      fprintf(stderr, "%s: got internal format 0x%04x, expected GL_COMPRESSED_RGBA_S3TC_DXT3_EXT [0x%04x]\n",
+         __FUNCTION__, compressedFormat, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT);
+      return GL_FALSE;
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+   glGetTexLevelParameteriv(dimension, 0, GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB, &compressedSize);
+   compressedData = malloc(compressedSize);
+   if (compressedData == NULL) {
+      fprintf(stderr, "%s: could not malloc %d bytes for compressed texture\n",
+         message, compressedSize);
+      return GL_FALSE;
+   }
+   memset(compressedData, 0, compressedSize);
+   (*GetCompressedTexImageARB)(dimension, 0, compressedData);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Compare it to the expected compressed data. The compare_bytes()
+    * call will print out diagnostics in the case of failure.
+    */
+   if (!compare_bytes(message, 
+      expectedCompressedSize, expectedCompressedData,
+      compressedSize, compressedData)) {
+
+      free(compressedData);
+      return GL_FALSE;
+   }
+
+   /* All done.  Free our allocated data and return success. */
+   free(compressedData);
+   return GL_TRUE;
+}
+
+/* We'll use one function to exercise 1D, 2D, and 3D textures. */
+
+/* The test function for compressed 3D texture images requires several
+ * different function pointers that have to be queried.  This function
+ * gets all the function pointers it needs itself, and so is suitable for 
+ * use to test any and all of the incorporated functions.
+ */
+
+static GLboolean
+exercise_CompressedTextures(GLenum dimension)
+{
+   /* Set up a basic (uncompressed) texture.  We're doing a blue/yellow
+    * checkerboard.  The 8x4/32-pixel board is well-suited to S3TC
+    * compression, which works on 4x4 blocks of pixels.
+    */
+#define B 0,0,255,255
+#define Y 255,255,0,255
+#define TEXTURE_WIDTH 16 
+#define TEXTURE_HEIGHT 4
+#define TEXTURE_DEPTH 1
+   static GLubyte texture[TEXTURE_WIDTH*TEXTURE_HEIGHT*TEXTURE_DEPTH*4] = {
+      B, B, Y, Y, B, B, Y, Y, B, B, Y, Y, B, B, Y, Y,
+      B, B, Y, Y, B, B, Y, Y, B, B, Y, Y, B, B, Y, Y,
+      Y, Y, B, B, Y, Y, B, B, Y, Y, B, B, Y, Y, B, B, 
+      Y, Y, B, B, Y, Y, B, B, Y, Y, B, B, Y, Y, B, B, 
+   };
+#undef B
+#undef Y
+   GLubyte uncompressedTexture[TEXTURE_WIDTH*TEXTURE_HEIGHT*TEXTURE_DEPTH*4];
+
+   /* We'll use this as a texture subimage. */
+#define R 255,0,0,255
+#define G 0,255,0,255
+#define SUBTEXTURE_WIDTH 4
+#define SUBTEXTURE_HEIGHT 4
+#define SUBTEXTURE_DEPTH 1
+   static GLubyte subtexture[SUBTEXTURE_WIDTH*SUBTEXTURE_HEIGHT*SUBTEXTURE_DEPTH*4] = {
+      G, G, R, R,
+      G, G, R, R,
+      R, R, G, G,
+      R, R, G, G,
+   };
+#undef R
+#undef G
+
+   /* These are the expected compressed textures.  (In the case of
+    * a failed comparison, the test program will print out the
+    * actual compressed data in a format that can be directly used
+    * here, if desired.)  The brave of heart can calculate the compression 
+    * themselves based on the formulae described at:
+    *   http://en.wikipedia.org/wiki/S3_Texture_Compression
+    * In a nutshell, each group of 16 bytes encodes a 4x4 texture block.
+    * The first eight bytes of each group are 4-bit alpha values
+    * for each of the 16 pixels in the texture block.
+    * The next four bytes in each group are LSB-first RGB565 colors; the
+    * first two bytes are identified as the color C0, and the next two
+    * are the color C1.  (Two more colors C2 and C3 will be calculated 
+    * from these, but do not appear in the compression data.)  The
+    * last 4 bytes of the group are sixteen 2-bit indices that, for
+    * each of the 16 pixels in the texture block, select one of the
+    * colors C0, C1, C2, or C3.
+    *
+    * For example, our blue/yellow checkerboard is made up of
+    * four identical 4x4 blocks.  Each of those blocks will
+    * be encoded as: eight bytes of 0xff (16 alpha values, each 0xf),
+    * C0 as the RGB565 color yellow (0xffe0), encoded LSB-first;
+    * C1 as the RGB565 color blue (0x001f), encoded LSB-first;
+    * and 4 bytes of 16 2-bit color indices reflecting the
+    * choice of color for each of the 16 pixels:
+    *     00, 00, 01, 01, = 0x05
+    *     00, 00, 01, 01, = 0x05
+    *     01, 01, 00, 00, = 0x50
+    *     01, 01, 00, 00, = 0x50
+    */
+   static GLubyte compressedTexture[] = {
+      0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+      0xe0, 0xff, 0x1f, 0x00, 0x05, 0x05, 0x50, 0x50,
+      0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+      0xe0, 0xff, 0x1f, 0x00, 0x05, 0x05, 0x50, 0x50,
+      0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+      0xe0, 0xff, 0x1f, 0x00, 0x05, 0x05, 0x50, 0x50,
+      0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+      0xe0, 0xff, 0x1f, 0x00, 0x05, 0x05, 0x50, 0x50
+   };
+
+   /* The similar calculations for the 4x4 subtexture are left
+    * as an exercise for the reader.
+    */
+   static GLubyte compressedSubTexture[] = {
+      0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+      0x00, 0xf8, 0xe0, 0x07, 0x05, 0x05, 0x50, 0x50,
+   };
+
+   /* The combined texture replaces the initial blue/yellow
+    * block with the green/red block.  (I'd wanted to do
+    * the more interesting exercise of putting the
+    * green/red block in the middle of the blue/yellow
+    * texture, which is a non-trivial replacement, but
+    * the attempt produces GL_INVALID_OPERATION, showing
+    * that you can only replace whole blocks of 
+    * subimages with S3TC.)  The combined texture looks
+    * like:
+    *      G G R R  B B Y Y  B B Y Y  B B Y Y
+    *      G G R R  B B Y Y  B B Y Y  B B Y Y
+    *      R R G G  Y Y B B  Y Y B B  Y Y B B 
+    *      R R G G  Y Y B B  Y Y B B  Y Y B B 
+    * which encodes just like the green/red block followed
+    * by 3 copies of the yellow/blue block.
+    */
+   static GLubyte compressedCombinedTexture[] = {
+      0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+      0x00, 0xf8, 0xe0, 0x07, 0x05, 0x05, 0x50, 0x50,
+      0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+      0xe0, 0xff, 0x1f, 0x00, 0x05, 0x05, 0x50, 0x50,
+      0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+      0xe0, 0xff, 0x1f, 0x00, 0x05, 0x05, 0x50, 0x50,
+      0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+      0xe0, 0xff, 0x1f, 0x00, 0x05, 0x05, 0x50, 0x50
+   };
+
+   /* These are the data we query about the texture. */
+   GLint queryIsCompressed;
+   GLenum queryCompressedFormat;
+   GLint queryCompressedSize;
+   GLubyte queryCompressedData[sizeof(compressedTexture)];
+
+   /* Query the function pointers we need.  We actually won't need most
+    * of these (the "dimension" parameter dictates whether we're testing
+    * 1D, 2D, or 3D textures), but we'll have them all ready just in case.
+    */
+   DECLARE_GLFUNC_PTR(GetCompressedTexImageARB, PFNGLGETCOMPRESSEDTEXIMAGEARBPROC);
+   DECLARE_GLFUNC_PTR(CompressedTexImage3DARB, PFNGLCOMPRESSEDTEXIMAGE3DARBPROC);
+   DECLARE_GLFUNC_PTR(CompressedTexSubImage3DARB, PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC);
+   DECLARE_GLFUNC_PTR(CompressedTexImage2DARB, PFNGLCOMPRESSEDTEXIMAGE2DARBPROC);
+   DECLARE_GLFUNC_PTR(CompressedTexSubImage2DARB, PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC);
+   DECLARE_GLFUNC_PTR(CompressedTexImage1DARB, PFNGLCOMPRESSEDTEXIMAGE1DARBPROC);
+   DECLARE_GLFUNC_PTR(CompressedTexSubImage1DARB, PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC);
+
+   /* If the necessary functions are missing, we can't continue */
+   if (GetCompressedTexImageARB == NULL) {
+      fprintf(stderr, "%s: GetCompressedTexImageARB function is missing\n",
+         __FUNCTION__);
+      return GL_FALSE;
+   }
+   switch (dimension) {
+      case GL_TEXTURE_1D:
+         if (CompressedTexImage1DARB == NULL || CompressedTexSubImage1DARB == NULL) {
+            fprintf(stderr, "%s: 1D compressed texture functions are missing\n",
+               __FUNCTION__);
+            return GL_FALSE;
+         };
+         break;
+      case GL_TEXTURE_2D:
+         if (CompressedTexImage2DARB == NULL || CompressedTexSubImage2DARB == NULL) {
+            fprintf(stderr, "%s: 2D compressed texture functions are missing\n",
+               __FUNCTION__);
+            return GL_FALSE;
+         };
+         break;
+      case GL_TEXTURE_3D:
+         if (CompressedTexImage3DARB == NULL || CompressedTexSubImage3DARB == NULL) {
+            fprintf(stderr, "%s: 3D compressed texture functions are missing\n",
+               __FUNCTION__);
+            return GL_FALSE;
+         };
+         break;
+      default:
+         fprintf(stderr, "%s: unknown texture dimension 0x%04x passed.\n",
+            __FUNCTION__, dimension);
+         return GL_FALSE;
+   }
+   
+   /* Check the compression of our base texture image. */
+   if (!check_texture_compression("texture compression", dimension,
+         TEXTURE_WIDTH, TEXTURE_HEIGHT, TEXTURE_DEPTH, texture,
+         sizeof(compressedTexture), compressedTexture)) {
+
+      /* Something's wrong with texture compression.  The function
+       * above will have printed an appropriate error.
+       */
+      return GL_FALSE;
+   }
+
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Do the same for our texture subimage */
+   if (!check_texture_compression("subtexture compression", dimension,
+         SUBTEXTURE_WIDTH, SUBTEXTURE_HEIGHT, SUBTEXTURE_DEPTH, subtexture,
+         sizeof(compressedSubTexture), compressedSubTexture)) {
+
+      /* Something's wrong with texture compression.  The function
+       * above will have printed an appropriate error.
+       */
+      return GL_FALSE;
+   }
+
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Send the base compressed texture down to the hardware. */
+   switch(dimension) {
+      case GL_TEXTURE_3D:
+         (*CompressedTexImage3DARB)(GL_TEXTURE_3D, 0, 
+            GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 
+            TEXTURE_WIDTH, TEXTURE_HEIGHT, TEXTURE_DEPTH, 0, 
+            sizeof(compressedTexture), compressedTexture);
+         break;
+
+      case GL_TEXTURE_2D:
+         (*CompressedTexImage2DARB)(GL_TEXTURE_2D, 0, 
+            GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 
+            TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, 
+            sizeof(compressedTexture), compressedTexture);
+         break;
+
+      case GL_TEXTURE_1D:
+         (*CompressedTexImage1DARB)(GL_TEXTURE_1D, 0, 
+            GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 
+            TEXTURE_WIDTH, 0, 
+            sizeof(compressedTexture), compressedTexture);
+         break;
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* For grins, query it to make sure it is as expected. */
+   glGetTexLevelParameteriv(dimension, 0, GL_TEXTURE_COMPRESSED_ARB, 
+      &queryIsCompressed);
+   if (!queryIsCompressed) {
+      fprintf(stderr, "%s: compressed texture did not come back as compressed\n",
+         __FUNCTION__);
+      return GL_FALSE;
+   }
+   glGetTexLevelParameteriv(dimension, 0, GL_TEXTURE_INTERNAL_FORMAT, 
+      (GLint *)&queryCompressedFormat);
+   if (queryCompressedFormat != GL_COMPRESSED_RGBA_S3TC_DXT3_EXT) {
+      fprintf(stderr, "%s: got internal format 0x%04x, expected GL_COMPRESSED_RGBA_S3TC_DXT3_EXT [0x%04x]\n",
+         __FUNCTION__, queryCompressedFormat, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT);
+      return GL_FALSE;
+   }
+   glGetTexLevelParameteriv(dimension, 0, GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB, 
+      &queryCompressedSize);
+   if (queryCompressedSize != sizeof(compressedTexture)) {
+      fprintf(stderr, "%s: compressed 3D texture changed size: expected %d, actual %d\n",
+         __FUNCTION__, sizeof(compressedTexture), queryCompressedSize);
+      return GL_FALSE;
+   }
+   (*GetCompressedTexImageARB)(dimension, 0, queryCompressedData);
+   if (!compare_bytes(
+      "exercise_CompressedTextures:doublechecking compressed texture",
+      sizeof(compressedTexture), compressedTexture,
+      queryCompressedSize, queryCompressedData)) {
+      return GL_FALSE;
+   }
+
+   /* Now apply the texture subimage.  The current implementation of
+    * S3TC requires that subimages be only applied to whole blocks.
+    */
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+   switch(dimension) {
+      case GL_TEXTURE_3D:
+         (*CompressedTexSubImage3DARB)(GL_TEXTURE_3D, 0, 
+            0, 0, 0, /* offsets */
+            SUBTEXTURE_WIDTH, SUBTEXTURE_HEIGHT, SUBTEXTURE_DEPTH,
+            GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 
+            sizeof(compressedSubTexture), compressedSubTexture);
+         break;
+      case GL_TEXTURE_2D:
+         (*CompressedTexSubImage2DARB)(GL_TEXTURE_2D, 0, 
+            0, 0, /* offsets */
+            SUBTEXTURE_WIDTH, SUBTEXTURE_HEIGHT,
+            GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 
+            sizeof(compressedSubTexture), compressedSubTexture);
+         break;
+      case GL_TEXTURE_1D:
+         (*CompressedTexSubImage2DARB)(GL_TEXTURE_2D, 0, 
+            0, 0, /* offsets */
+            SUBTEXTURE_WIDTH, SUBTEXTURE_HEIGHT,
+            GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 
+            sizeof(compressedSubTexture), compressedSubTexture);
+         break;
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query the compressed texture back now, and see that it
+    * is as expected.
+    */
+   (*GetCompressedTexImageARB)(dimension, 0, queryCompressedData);
+   if (!compare_bytes("exercise_CompressedTextures:combined texture",
+      sizeof(compressedCombinedTexture), compressedCombinedTexture,
+      queryCompressedSize, queryCompressedData)) {
+      return GL_FALSE;
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Just for the exercise, uncompress the texture and pull it out. 
+    * We don't check it because the compression is lossy, so it won't
+    * compare exactly to the source texture; we just 
+    * want to exercise the code paths that convert it.
+    */
+   glGetTexImage(dimension, 0, GL_RGBA, GL_UNSIGNED_BYTE, uncompressedTexture);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* If we survived this far, we pass. */
+   return GL_TRUE;
+}
+
+/**************************************************************************
+ * Functions to assist with GL_EXT_framebuffer_object and
+ * GL_EXT_framebuffer_blit testing.
+ */
+
+#define FB_STATUS_NAME(x) (\
+   x == GL_FRAMEBUFFER_COMPLETE_EXT ? "GL_FRAMEBUFFER_COMPLETE_EXT" : \
+   x == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT ? "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT" : \
+   x == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT ? "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT" : \
+   x == GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT ? "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT" : \
+   x == GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT ? "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT" : \
+   x == GL_FRAMEBUFFER_UNSUPPORTED_EXT ? "GL_FRAMEBUFFER_UNSUPPORTED_EXT" : \
+   x == GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT ? "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT" : \
+   x == GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT ? "GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT" : \
+   x == GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT ? "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT" : \
+   "unknown")
+
+static GLboolean
+exercise_framebuffer(void)
+{
+   GLuint framebufferID = 0;
+   GLuint renderbufferID = 0;
+   
+   /* Dimensions of the framebuffer and renderbuffers are arbitrary.
+    * Since they won't be shown on-screen, we can use whatever we want.
+    */
+   const GLint Width = 100;
+   const GLint Height = 100;
+
+   /* Every function we use will be referenced through function pointers.
+    * This will allow this test program to run on OpenGL implementations
+    * that *don't* implement these extensions (though the implementation
+    * used to compile them must have up-to-date header files).
+    */
+   DECLARE_GLFUNC_PTR(GenFramebuffersEXT, PFNGLGENFRAMEBUFFERSEXTPROC);
+   DECLARE_GLFUNC_PTR(IsFramebufferEXT, PFNGLISFRAMEBUFFEREXTPROC);
+   DECLARE_GLFUNC_PTR(DeleteFramebuffersEXT, PFNGLDELETEFRAMEBUFFERSEXTPROC);
+   DECLARE_GLFUNC_PTR(BindFramebufferEXT, PFNGLBINDFRAMEBUFFEREXTPROC);
+   DECLARE_GLFUNC_PTR(GenRenderbuffersEXT, PFNGLGENRENDERBUFFERSEXTPROC);
+   DECLARE_GLFUNC_PTR(IsRenderbufferEXT, PFNGLISRENDERBUFFEREXTPROC);
+   DECLARE_GLFUNC_PTR(DeleteRenderbuffersEXT, PFNGLDELETERENDERBUFFERSEXTPROC);
+   DECLARE_GLFUNC_PTR(BindRenderbufferEXT, PFNGLBINDRENDERBUFFEREXTPROC);
+   DECLARE_GLFUNC_PTR(FramebufferRenderbufferEXT, PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC);
+   DECLARE_GLFUNC_PTR(RenderbufferStorageEXT, PFNGLRENDERBUFFERSTORAGEEXTPROC);
+   DECLARE_GLFUNC_PTR(CheckFramebufferStatusEXT, PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC);
+
+   /* The BlitFramebuffer function comes from a different extension.
+    * It's possible for an implementation to implement all the above,
+    * but not BlitFramebuffer; so it's okay if this one comes back
+    * NULL, as we can still test the rest.
+    */
+   DECLARE_GLFUNC_PTR(BlitFramebufferEXT, PFNGLBLITFRAMEBUFFEREXTPROC);
+
+   /* We cannot test unless we have all the function pointers. */
+   if (
+      GenFramebuffersEXT == NULL ||
+      IsFramebufferEXT == NULL || 
+      DeleteFramebuffersEXT == NULL ||
+      BindFramebufferEXT == NULL ||
+      GenRenderbuffersEXT == NULL ||
+      IsRenderbufferEXT == NULL ||
+      DeleteRenderbuffersEXT == NULL ||
+      BindRenderbufferEXT == NULL ||
+      FramebufferRenderbufferEXT == NULL ||
+      RenderbufferStorageEXT == NULL ||
+      CheckFramebufferStatusEXT == NULL
+   ) {
+      fprintf(stderr, "%s: could not locate all framebuffer functions\n",
+         __FUNCTION__);
+      return GL_FALSE;
+   }
+
+   /* Generate a framebuffer for us to play with. */
+   (*GenFramebuffersEXT)(1, &framebufferID);
+   if (framebufferID == 0) {
+      fprintf(stderr, "%s: failed to generate a frame buffer ID.\n",
+         __FUNCTION__);
+      return GL_FALSE;
+   }
+   /* The generated name is not a framebuffer object until bound. */
+   (*BindFramebufferEXT)(GL_FRAMEBUFFER_EXT, framebufferID);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+   if (!(*IsFramebufferEXT)(framebufferID)) {
+      fprintf(stderr, "%s: generated a frame buffer ID 0x%x that wasn't a framebuffer\n",
+         __FUNCTION__, framebufferID);
+      (*BindFramebufferEXT)(GL_FRAMEBUFFER_EXT, 0);
+      (*DeleteFramebuffersEXT)(1, &framebufferID);
+      return GL_FALSE;
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+   {
+      GLint queriedFramebufferID;
+      glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &queriedFramebufferID);
+      if (queriedFramebufferID != framebufferID) {
+         fprintf(stderr, "%s: bound frame buffer 0x%x, but queried 0x%x\n",
+            __FUNCTION__, framebufferID, queriedFramebufferID);
+         (*BindFramebufferEXT)(GL_FRAMEBUFFER_EXT, 0);
+         (*DeleteFramebuffersEXT)(1, &framebufferID);
+         return GL_FALSE;
+      }
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Create a color buffer to attach to the frame buffer object, so
+    * we can actually operate on it.  We go through the same basic checks
+    * with the renderbuffer that we do with the framebuffer.
+    */
+   (*GenRenderbuffersEXT)(1, &renderbufferID);
+   if (renderbufferID == 0) {
+      fprintf(stderr, "%s: could not generate a renderbuffer ID\n",
+         __FUNCTION__);
+      (*BindFramebufferEXT)(GL_FRAMEBUFFER_EXT, 0);
+      (*DeleteFramebuffersEXT)(1, &framebufferID);
+      return GL_FALSE;
+   }
+   (*BindRenderbufferEXT)(GL_RENDERBUFFER_EXT, renderbufferID);
+   if (!(*IsRenderbufferEXT)(renderbufferID)) {
+      fprintf(stderr, "%s: generated renderbuffer 0x%x is not a renderbuffer\n",
+         __FUNCTION__, renderbufferID);
+      (*BindRenderbufferEXT)(GL_RENDERBUFFER_EXT, 0);
+      (*DeleteRenderbuffersEXT)(1, &renderbufferID);
+      (*BindFramebufferEXT)(GL_FRAMEBUFFER_EXT, 0);
+      (*DeleteFramebuffersEXT)(1, &framebufferID);
+      return GL_FALSE;
+   }
+   {
+      GLint queriedRenderbufferID = 0;
+      glGetIntegerv(GL_RENDERBUFFER_BINDING_EXT, &queriedRenderbufferID);
+      if (renderbufferID != queriedRenderbufferID) {
+         fprintf(stderr, "%s: bound renderbuffer 0x%x, but got 0x%x\n",
+            __FUNCTION__, renderbufferID, queriedRenderbufferID);
+         (*BindRenderbufferEXT)(GL_RENDERBUFFER_EXT, 0);
+         (*DeleteRenderbuffersEXT)(1, &renderbufferID);
+         (*BindFramebufferEXT)(GL_FRAMEBUFFER_EXT, 0);
+         (*DeleteFramebuffersEXT)(1, &framebufferID);
+         return GL_FALSE;
+      }
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Add the renderbuffer as a color attachment to the current
+    * framebuffer (which is our generated framebuffer).
+    */
+   (*FramebufferRenderbufferEXT)(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT,
+      GL_RENDERBUFFER_EXT, renderbufferID);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* The renderbuffer will need some dimensions and storage space. */
+   (*RenderbufferStorageEXT)(GL_RENDERBUFFER_EXT, GL_RGB, Width, Height);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* That should be everything we need.  If we set up to draw and to
+    * read from our color attachment, we should be "framebuffer complete",
+    * meaning the framebuffer is ready to go.
+    */
+   glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT);
+   glReadBuffer(GL_COLOR_ATTACHMENT1_EXT);
+   {
+      GLenum status = (*CheckFramebufferStatusEXT)(GL_FRAMEBUFFER_EXT);
+      if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
+         fprintf(stderr, "%s: framebuffer not complete; status = %s [0x%x]\n",
+            __FUNCTION__, FB_STATUS_NAME(status), status);
+         glReadBuffer(0);
+         glDrawBuffer(0);
+         (*BindRenderbufferEXT)(GL_RENDERBUFFER_EXT, 0);
+         (*DeleteRenderbuffersEXT)(1, &renderbufferID);
+         (*BindFramebufferEXT)(GL_FRAMEBUFFER_EXT, 0);
+         (*DeleteFramebuffersEXT)(1, &framebufferID);
+         return GL_FALSE;
+      }
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Define the contents of the frame buffer */
+   glClearColor(0.5, 0.5, 0.5, 0.0);
+   glClear(GL_COLOR_BUFFER_BIT);
+
+   /* If the GL_EXT_framebuffer_blit is supported, attempt a framebuffer
+    * blit from (5,5)-(10,10) to (90,90)-(95,95).  This is *not* an
+    * error if framebuffer_blit is *not* supported (as we can still
+    * effectively test the other functions).
+    */
+   if (BlitFramebufferEXT != NULL) {
+      (*BlitFramebufferEXT)(5, 5, 10, 10, 90, 90, 95, 95,
+         GL_COLOR_BUFFER_BIT, GL_NEAREST);
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* We could now test to see whether the framebuffer had the desired
+    * contents.  As this is just a touch test, we'll leave that for now.
+    * Clean up and go home.
+    */
+   glReadBuffer(0);
+   glDrawBuffer(0);
+   (*BindRenderbufferEXT)(GL_RENDERBUFFER_EXT, 0);
+   (*DeleteRenderbuffersEXT)(1, &renderbufferID);
+   (*BindFramebufferEXT)(GL_FRAMEBUFFER_EXT, 0);
+   (*DeleteFramebuffersEXT)(1, &framebufferID);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   return GL_TRUE;
+}
+
+/**************************************************************************
+ * Functions to assist with GL_ARB_shader_objects testing.
+ */
+
+static void
+print_info_log(const char *message, GLhandleARB object)
+{
+   DECLARE_GLFUNC_PTR(GetObjectParameterivARB, PFNGLGETOBJECTPARAMETERIVARBPROC);
+   DECLARE_GLFUNC_PTR(GetInfoLogARB, PFNGLGETINFOLOGARBPROC);
+   int logLength, queryLength;
+   char *log;
+
+   if (GetObjectParameterivARB == NULL) {
+      fprintf(stderr, "%s: could not get GetObjectParameterivARB address\n",
+         message);
+      return;
+   }
+   if (GetInfoLogARB == NULL) {
+      fprintf(stderr, "%s: could not get GetInfoLogARB address\n",
+         message);
+      return;
+   }
+
+   (*GetObjectParameterivARB)(object, GL_OBJECT_INFO_LOG_LENGTH_ARB, 
+      &logLength);
+   if (logLength == 0) {
+      fprintf(stderr, "%s: info log length is 0\n", message);
+      return;
+   }
+   log = malloc(logLength);
+   if (log == NULL) {
+      fprintf(stderr, "%s: could not malloc %d bytes for info log\n",
+         message, logLength);
+   }
+   else {
+      (*GetInfoLogARB)(object, logLength, &queryLength, log);
+      fprintf(stderr, "%s: info log says '%s'\n",
+         message, log);
+   }
+   free(log);
+}
+
+static GLboolean
+exercise_uniform_start(const char *fragmentShaderText, const char *uniformName,
+   GLhandleARB *returnProgram, GLint *returnUniformLocation)
+{
+   DECLARE_GLFUNC_PTR(CreateShaderObjectARB, PFNGLCREATESHADEROBJECTARBPROC);
+   DECLARE_GLFUNC_PTR(ShaderSourceARB, PFNGLSHADERSOURCEARBPROC);
+   DECLARE_GLFUNC_PTR(CompileShaderARB, PFNGLCOMPILESHADERARBPROC);
+   DECLARE_GLFUNC_PTR(CreateProgramObjectARB, PFNGLCREATEPROGRAMOBJECTARBPROC);
+   DECLARE_GLFUNC_PTR(AttachObjectARB, PFNGLATTACHOBJECTARBPROC);
+   DECLARE_GLFUNC_PTR(LinkProgramARB, PFNGLLINKPROGRAMARBPROC);
+   DECLARE_GLFUNC_PTR(UseProgramObjectARB, PFNGLUSEPROGRAMOBJECTARBPROC);
+   DECLARE_GLFUNC_PTR(ValidateProgramARB, PFNGLVALIDATEPROGRAMARBPROC);
+   DECLARE_GLFUNC_PTR(GetUniformLocationARB, PFNGLGETUNIFORMLOCATIONARBPROC);
+   DECLARE_GLFUNC_PTR(DeleteObjectARB, PFNGLDELETEOBJECTARBPROC);
+   DECLARE_GLFUNC_PTR(GetObjectParameterivARB, PFNGLGETOBJECTPARAMETERIVARBPROC);
+   GLhandleARB fs, program;
+   GLint uniformLocation;
+   GLint shaderCompiled, programValidated;
+
+   if (CreateShaderObjectARB == NULL ||
+       ShaderSourceARB == NULL ||
+       CompileShaderARB == NULL ||
+       CreateProgramObjectARB == NULL ||
+       AttachObjectARB == NULL ||
+       LinkProgramARB == NULL ||
+       UseProgramObjectARB == NULL ||
+       ValidateProgramARB == NULL ||
+       GetUniformLocationARB == NULL ||
+       DeleteObjectARB == NULL ||
+       GetObjectParameterivARB == NULL ||
+       0) {
+      return GL_FALSE;
+   }
+
+   /* Create the trivial fragment shader and program.  For safety
+    * we'll check to make sure they compile and link correctly.
+    */
+   fs = (*CreateShaderObjectARB)(GL_FRAGMENT_SHADER_ARB);
+   (*ShaderSourceARB)(fs, 1, &fragmentShaderText, NULL);
+   (*CompileShaderARB)(fs);
+   (*GetObjectParameterivARB)(fs, GL_OBJECT_COMPILE_STATUS_ARB,
+      &shaderCompiled);
+   if (!shaderCompiled) {
+      print_info_log("shader did not compile", fs);
+      (*DeleteObjectARB)(fs);
+      CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+      return GL_FALSE;
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   program = (*CreateProgramObjectARB)();
+   (*AttachObjectARB)(program, fs);
+   (*LinkProgramARB)(program);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Make sure we're going to run successfully */
+   (*ValidateProgramARB)(program);
+   (*GetObjectParameterivARB)(program, GL_OBJECT_VALIDATE_STATUS_ARB, 
+      &programValidated);
+   if (!programValidated) {; 
+      print_info_log("program did not validate", program);
+      (*DeleteObjectARB)(program);
+      (*DeleteObjectARB)(fs);
+      CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+      return GL_FALSE;
+   }
+
+   /* Put the program in place.  We're not allowed to assign to uniform
+    * variables used by the program until the program is put into use.
+    */
+   (*UseProgramObjectARB)(program);
+
+   /* Once the shader is in place, we're free to delete it; this
+    * won't affect the copy that's part of the program.
+    */
+   (*DeleteObjectARB)(fs);
+
+   /* Find the location index of the uniform variable we declared;
+    * the caller will ned that to set the value.
+    */
+   uniformLocation = (*GetUniformLocationARB)(program, uniformName);
+   if (uniformLocation == -1) {
+      fprintf(stderr, "%s: could not determine uniform location\n",
+         __FUNCTION__);
+      (*DeleteObjectARB)(program);
+      CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+      return GL_FALSE;
+   }
+
+   /* All done with what we're supposed to do - return the program
+    * handle and the uniform location to the caller.
+    */
+   *returnProgram = program;
+   *returnUniformLocation = uniformLocation;
+   return GL_TRUE;
+}
+
+static void
+exercise_uniform_end(GLhandleARB program)
+{
+   DECLARE_GLFUNC_PTR(UseProgramObjectARB, PFNGLUSEPROGRAMOBJECTARBPROC);
+   DECLARE_GLFUNC_PTR(DeleteObjectARB, PFNGLDELETEOBJECTARBPROC);
+   if (UseProgramObjectARB == NULL || DeleteObjectARB == NULL) {
+      return;
+   }
+
+   /* Turn off our program by setting the special value 0, and
+    * then delete the program object.
+    */
+   (*UseProgramObjectARB)(0);
+   (*DeleteObjectARB)(program);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+}
+
+/**************************************************************************
+ * Exercises for fences
+ */
+static GLboolean
+exercise_fences(void)
+{
+   DECLARE_GLFUNC_PTR(DeleteFencesNV, PFNGLDELETEFENCESNVPROC);
+   DECLARE_GLFUNC_PTR(FinishFenceNV, PFNGLFINISHFENCENVPROC);
+   DECLARE_GLFUNC_PTR(GenFencesNV, PFNGLGENFENCESNVPROC);
+   DECLARE_GLFUNC_PTR(GetFenceivNV, PFNGLGETFENCEIVNVPROC);
+   DECLARE_GLFUNC_PTR(IsFenceNV, PFNGLISFENCENVPROC);
+   DECLARE_GLFUNC_PTR(SetFenceNV, PFNGLSETFENCENVPROC);
+   DECLARE_GLFUNC_PTR(TestFenceNV, PFNGLTESTFENCENVPROC);
+   GLuint fence;
+   GLint fenceStatus, fenceCondition;
+   int count;
+
+   /* Make sure we have all the function pointers we need. */
+   if (GenFencesNV == NULL ||
+      SetFenceNV == NULL ||
+      IsFenceNV == NULL ||
+      GetFenceivNV == NULL ||
+      TestFenceNV == NULL ||
+      FinishFenceNV == NULL ||
+      DeleteFencesNV == NULL) {
+      fprintf(stderr, "%s: don't have all the fence functions\n",
+         __FUNCTION__);
+      return GL_FALSE;
+   }
+
+   /* Create and set a simple fence. */
+   (*GenFencesNV)(1, &fence);
+   (*SetFenceNV)(fence, GL_ALL_COMPLETED_NV);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Make sure it reads as a fence. */
+   if (!(*IsFenceNV)(fence)) {
+      fprintf(stderr, "%s: set fence is not a fence\n", __FUNCTION__);
+      (*DeleteFencesNV)(1, &fence);
+      return GL_FALSE;
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Try to read back its current status and condition. */
+   (*GetFenceivNV)(fence, GL_FENCE_CONDITION_NV, &fenceCondition);
+   if (fenceCondition != GL_ALL_COMPLETED_NV) {
+      fprintf(stderr, "%s: expected fence condition 0x%x, got 0x%x\n",
+         __FUNCTION__, GL_ALL_COMPLETED_NV, fenceCondition);
+      (*DeleteFencesNV)(1, &fence);
+      return GL_FALSE;
+   }
+   (*GetFenceivNV)(fence, GL_FENCE_STATUS_NV, &fenceStatus);
+   if (fenceStatus != GL_TRUE && fenceStatus != GL_FALSE) {
+      fprintf(stderr,"%s: fence status should be GL_TRUE or GL_FALSE, got 0x%x\n",
+         __FUNCTION__, fenceStatus);
+      (*DeleteFencesNV)(1, &fence);
+      return GL_FALSE;
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Set the fence again, query its status, and wait for it to finish
+    * two different ways: once by looping on TestFence(), and a 
+    * second time by a simple call to FinishFence();
+    */
+   (*SetFenceNV)(fence, GL_ALL_COMPLETED_NV);
+   glFlush();
+   count = 1;
+   while (!(*TestFenceNV)(fence)) {
+      count++;
+      if (count == 0) {
+         break;
+      }
+   }
+   if (count == 0) {
+      fprintf(stderr, "%s: fence never returned true\n", __FUNCTION__);
+      (*DeleteFencesNV)(1, &fence);
+      return GL_FALSE;
+   }
+   (*SetFenceNV)(fence, GL_ALL_COMPLETED_NV);
+   (*FinishFenceNV)(fence);
+   if ((*TestFenceNV)(fence) != GL_TRUE) {
+      fprintf(stderr, "%s: finished fence does not have status GL_TRUE\n",
+         __FUNCTION__);
+      (*DeleteFencesNV)(1, &fence);
+      return GL_FALSE;
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* All done.  Delete the fence and return. */
+   (*DeleteFencesNV)(1, &fence);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+   return GL_TRUE;
+}
+
+/**************************************************************************
+ * Exercises for buffer objects
+ */
+enum Map_Buffer_Usage{ Use_Map_Buffer, Use_Map_Buffer_Range};
+static GLboolean
+exercise_buffer_objects(enum Map_Buffer_Usage usage)
+{
+#define BUFFER_DATA_SIZE 1024
+   GLuint bufferID;
+   GLint bufferMapped;
+   static GLubyte data[BUFFER_DATA_SIZE] = {0};
+   float *dataPtr;
+
+   /* Get the function pointers we need.  These are from
+    * GL_ARB_vertex_buffer_object and are required in all
+    * cases.
+    */
+   DECLARE_GLFUNC_PTR(GenBuffersARB, PFNGLGENBUFFERSARBPROC);
+   DECLARE_GLFUNC_PTR(BindBufferARB, PFNGLBINDBUFFERARBPROC);
+   DECLARE_GLFUNC_PTR(BufferDataARB, PFNGLBUFFERDATAARBPROC);
+   DECLARE_GLFUNC_PTR(MapBufferARB, PFNGLMAPBUFFERARBPROC);
+   DECLARE_GLFUNC_PTR(UnmapBufferARB, PFNGLUNMAPBUFFERARBPROC);
+   DECLARE_GLFUNC_PTR(DeleteBuffersARB, PFNGLDELETEBUFFERSARBPROC);
+   DECLARE_GLFUNC_PTR(GetBufferParameterivARB, PFNGLGETBUFFERPARAMETERIVARBPROC);
+
+   /* These are from GL_ARB_map_buffer_range, and are optional
+    * unless we're given Use_Map_Buffer_Range.  Note that they do *not*
+    * have the standard "ARB" suffixes; this is because the extension
+    * was introduced *after* a superset was standardized in OpenGL 3.0.
+    * (The extension really only exists to allow the functionality on
+    * devices that cannot implement a full OpenGL 3.0 driver.)
+    */
+   DECLARE_GLFUNC_PTR(FlushMappedBufferRange, PFNGLFLUSHMAPPEDBUFFERRANGEPROC);
+   DECLARE_GLFUNC_PTR(MapBufferRange, PFNGLMAPBUFFERRANGEPROC);
+   
+   /* This is from APPLE_flush_buffer_range, and is optional even if
+    * we're given Use_Map_Buffer_Range.  Test it before using it.
+    */
+   DECLARE_GLFUNC_PTR(BufferParameteriAPPLE, PFNGLBUFFERPARAMETERIAPPLEPROC);
+
+   /* Make sure we have all the function pointers we need. */
+   if (GenBuffersARB == NULL ||
+      BindBufferARB == NULL ||
+      BufferDataARB == NULL ||
+      MapBufferARB == NULL ||
+      UnmapBufferARB == NULL ||
+      DeleteBuffersARB == NULL ||
+      GetBufferParameterivARB == NULL) {
+      fprintf(stderr, "%s: missing basic MapBuffer functions\n", __FUNCTION__);
+      return GL_FALSE;
+   }
+   if (usage == Use_Map_Buffer_Range) {
+      if (FlushMappedBufferRange == NULL || MapBufferRange == NULL) {
+         fprintf(stderr, "%s: missing MapBufferRange functions\n", __FUNCTION__);
+         return GL_FALSE;
+      }
+   }
+
+   /* Create and define a buffer */
+   (*GenBuffersARB)(1, &bufferID);
+   (*BindBufferARB)(GL_ARRAY_BUFFER_ARB, bufferID);
+   (*BufferDataARB)(GL_ARRAY_BUFFER_ARB, BUFFER_DATA_SIZE, data, 
+      GL_DYNAMIC_DRAW_ARB);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* If we're using MapBufferRange, and if the BufferParameteriAPPLE
+    * function is present, use it before mapping.  This particular
+    * use is a no-op, intended just to exercise the entry point.
+    */
+   if (usage == Use_Map_Buffer_Range && BufferParameteriAPPLE != NULL) {
+      (*BufferParameteriAPPLE)(GL_ARRAY_BUFFER_ARB, 
+         GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE);
+   }
+
+   /* Map it, and make sure it's mapped. */
+   switch(usage) {
+      case Use_Map_Buffer:
+         dataPtr = (float *) (*MapBufferARB)(
+            GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
+         break;
+      case Use_Map_Buffer_Range:
+         dataPtr = (float *)(*MapBufferRange)(GL_ARRAY_BUFFER_ARB,
+            4, 16, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
+         break;
+   }
+   if (dataPtr == NULL) {
+      fprintf(stderr, "%s: %s returned NULL\n", __FUNCTION__,
+         usage == Use_Map_Buffer ? "MapBuffer" : "MapBufferRange");
+      (*BindBufferARB)(GL_ARRAY_BUFFER_ARB, 0);
+      (*DeleteBuffersARB)(1, &bufferID);
+      return GL_FALSE;
+   }
+   (*GetBufferParameterivARB)(GL_ARRAY_BUFFER_ARB, GL_BUFFER_MAPPED_ARB, 
+      &bufferMapped);
+   if (!bufferMapped) {
+      fprintf(stderr, "%s: buffer should be mapped but isn't\n", __FUNCTION__);
+      (*BindBufferARB)(GL_ARRAY_BUFFER_ARB, 0);
+      (*DeleteBuffersARB)(1, &bufferID);
+      return GL_FALSE;
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Write something to it, just to make sure we don't segfault. */
+   *dataPtr = 1.5;
+
+   /* Unmap to show we're finished with the buffer.  Note that if we're
+    * using MapBufferRange, we first have to flush the range we modified.
+    */
+   if (usage == Use_Map_Buffer_Range) {
+      (*FlushMappedBufferRange)(GL_ARRAY_BUFFER_ARB, 4, 16);
+   }
+   if (!(*UnmapBufferARB)(GL_ARRAY_BUFFER_ARB)) {
+      fprintf(stderr, "%s: UnmapBuffer failed\n", __FUNCTION__);
+      (*BindBufferARB)(GL_ARRAY_BUFFER_ARB, 0);
+      (*DeleteBuffersARB)(1, &bufferID);
+      return GL_FALSE;
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* All done. */
+   (*BindBufferARB)(GL_ARRAY_BUFFER_ARB, 0);
+   (*DeleteBuffersARB)(1, &bufferID);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+   return GL_TRUE;
+
+#undef BUFFER_DATA_SIZE
+}
+
+/**************************************************************************
+ * Exercises for occlusion query
+ */
+static GLboolean
+exercise_occlusion_query(void)
+{
+   GLuint queryObject;
+   GLint queryReady;
+   GLuint querySampleCount;
+   GLint queryCurrent;
+   GLint queryCounterBits;
+
+   /* Get the function pointers we need.  These are from
+    * GL_ARB_vertex_buffer_object and are required in all
+    * cases.
+    */
+   DECLARE_GLFUNC_PTR(GenQueriesARB, PFNGLGENQUERIESARBPROC);
+   DECLARE_GLFUNC_PTR(BeginQueryARB, PFNGLBEGINQUERYARBPROC);
+   DECLARE_GLFUNC_PTR(GetQueryivARB, PFNGLGETQUERYIVARBPROC);
+   DECLARE_GLFUNC_PTR(EndQueryARB, PFNGLENDQUERYARBPROC);
+   DECLARE_GLFUNC_PTR(IsQueryARB, PFNGLISQUERYARBPROC);
+   DECLARE_GLFUNC_PTR(GetQueryObjectivARB, PFNGLGETQUERYOBJECTIVARBPROC);
+   DECLARE_GLFUNC_PTR(GetQueryObjectuivARB, PFNGLGETQUERYOBJECTUIVARBPROC);
+   DECLARE_GLFUNC_PTR(DeleteQueriesARB, PFNGLDELETEQUERIESARBPROC);
+
+   /* Make sure we have all the function pointers we need. */
+   if (GenQueriesARB == NULL ||
+      BeginQueryARB == NULL ||
+      GetQueryivARB == NULL ||
+      EndQueryARB == NULL ||
+      IsQueryARB == NULL ||
+      GetQueryObjectivARB == NULL ||
+      GetQueryObjectuivARB == NULL ||
+      DeleteQueriesARB == NULL) {
+      fprintf(stderr, "%s: don't have all the Query functions\n", __FUNCTION__);
+      return GL_FALSE;
+   }
+
+   /* Create a query object, and start a query. */
+   (*GenQueriesARB)(1, &queryObject);
+   (*BeginQueryARB)(GL_SAMPLES_PASSED_ARB, queryObject);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* While we're in the query, check the functions that are supposed
+    * to return which query we're in and how many bits of resolution
+    * we get.
+    */
+   (*GetQueryivARB)(GL_SAMPLES_PASSED_ARB, GL_CURRENT_QUERY_ARB, &queryCurrent);
+   if (queryCurrent != queryObject) {
+      fprintf(stderr, "%s: current query 0x%x != set query 0x%x\n",
+         __FUNCTION__, queryCurrent, queryObject);
+      (*EndQueryARB)(GL_SAMPLES_PASSED_ARB);
+      (*DeleteQueriesARB)(1, &queryObject);
+      return GL_FALSE;
+   }
+   (*GetQueryivARB)(GL_SAMPLES_PASSED_ARB, GL_QUERY_COUNTER_BITS_ARB, 
+      &queryCounterBits);
+   if (queryCounterBits < 1) {
+      fprintf(stderr, "%s: query counter bits is too small (%d)\n",
+         __FUNCTION__, queryCounterBits);
+      (*EndQueryARB)(GL_SAMPLES_PASSED_ARB);
+      (*DeleteQueriesARB)(1, &queryObject);
+      return GL_FALSE;
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Finish up the query.  Since we didn't draw anything, the result
+    * should be 0 passed samples.
+    */
+   (*EndQueryARB)(GL_SAMPLES_PASSED_ARB);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Routine existence test */
+   if (!(*IsQueryARB)(queryObject)) {
+      fprintf(stderr, "%s: query object 0x%x fails existence test\n",
+         __FUNCTION__, queryObject);
+      (*DeleteQueriesARB)(1, &queryObject);
+      return GL_FALSE;
+   }
+
+   /* Loop until the query is ready, then get back the result.  We use
+    * the signed query for the boolean value of whether the result is
+    * available, but the unsigned query to actually pull the result;
+    * this is just to test both entrypoints, but in a real query you may
+    * need the extra bit of resolution.
+    */
+   queryReady = GL_FALSE;
+   do {
+      (*GetQueryObjectivARB)(queryObject, GL_QUERY_RESULT_AVAILABLE_ARB, 
+         &queryReady);
+   } while (!queryReady);
+   (*GetQueryObjectuivARB)(queryObject, GL_QUERY_RESULT_ARB, &querySampleCount);
+   (*DeleteQueriesARB)(1, &queryObject);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* If sample count isn't 0, something's funny. */
+   if (querySampleCount > 0) {
+      fprintf(stderr, "%s: expected query result of 0, got %ud\n",
+         __FUNCTION__, querySampleCount);
+      return GL_FALSE;
+   }
+
+   /* Here, all is well. */
+   return GL_TRUE;
+}
+
+/**************************************************************************
  * The following functions are used to check that the named OpenGL function
  * actually does what it's supposed to do.
- * The naming of these functions is signficant.  The getprocaddress.py script
+ * The naming of these functions is significant.  The getprocaddress.py script
  * scans this file and extracts these function names.
  */
 
+static GLboolean
+test_WeightPointerARB(generic_func func)
+{
+   /* Assume we have at least 2 vertex units (or this extension makes
+    * no sense), and establish a set of 2-element vector weights.
+    * We use floats that can be represented exactly in binary
+    * floating point formats so we can compare correctly later.
+    * We also make sure the 0th entry matches the default weights,
+    * so we can restore the default easily.
+    */
+#define USE_VERTEX_UNITS 2
+#define USE_WEIGHT_INDEX 3
+   static GLfloat weights[] = {
+      1.0,   0.0,
+      0.875, 0.125,
+      0.75,  0.25,
+      0.625, 0.375,
+      0.5,   0.5,
+      0.375, 0.625,
+      0.25,  0.75,
+      0.125, 0.875, 
+      0.0,   1.0,
+   };
+   GLint numVertexUnits;
+   GLfloat *currentWeights;
+   int i;
+   int errorCount = 0;
+
+   PFNGLWEIGHTPOINTERARBPROC WeightPointerARB = (PFNGLWEIGHTPOINTERARBPROC) func;
+
+   /* Make sure we have at least two vertex units */
+   glGetIntegerv(GL_MAX_VERTEX_UNITS_ARB, &numVertexUnits);
+   if (numVertexUnits < USE_VERTEX_UNITS) {
+      fprintf(stderr, "%s: need %d vertex units, got %d\n", 
+         __FUNCTION__, USE_VERTEX_UNITS, numVertexUnits);
+      return GL_FALSE;
+   }
+   
+   /* Make sure we allocate enough room to query all the current weights */
+   currentWeights = (GLfloat *)malloc(numVertexUnits * sizeof(GLfloat));
+   if (currentWeights == NULL) {
+      fprintf(stderr, "%s: couldn't allocate room for %d floats\n",
+         __FUNCTION__, numVertexUnits);
+      return GL_FALSE;
+   }
+
+   /* Set up the pointer, enable the state, and try to send down a
+    * weight vector (we'll arbitrarily send index 2).
+    */
+   (*WeightPointerARB)(USE_VERTEX_UNITS, GL_FLOAT, 0, weights);
+   glEnableClientState(GL_WEIGHT_ARRAY_ARB);
+   glArrayElement(USE_WEIGHT_INDEX);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Verify that it changed the current state. */
+   glGetFloatv(GL_CURRENT_WEIGHT_ARB, currentWeights);
+   for (i = 0; i < numVertexUnits; i++) {
+      if (i < USE_VERTEX_UNITS) {
+         /* This is one of the units we explicitly set. */
+         if (currentWeights[i] != weights[USE_VERTEX_UNITS*USE_WEIGHT_INDEX + i]) {
+            fprintf(stderr, "%s: current weight at index %d is %f, should be %f\n",
+               __FUNCTION__, i, currentWeights[i], 
+               weights[USE_VERTEX_UNITS*USE_WEIGHT_INDEX + i]);
+            errorCount++;
+         }
+      }
+      else {
+         /* All other weights should be 0. */
+         if (currentWeights[i] != 0.0) {
+            fprintf(stderr, "%s: current weight at index %d is %f, should be %f\n",
+               __FUNCTION__, i, 0.0,
+               weights[USE_VERTEX_UNITS*USE_WEIGHT_INDEX + i]);
+            errorCount++;
+         }
+      }
+   }
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Restore the old state.  We know the default set of weights is in
+    * index 0.
+    */
+   glArrayElement(0);
+   glDisableClientState(GL_WEIGHT_ARRAY_ARB);
+   (*WeightPointerARB)(0, GL_FLOAT, 0, NULL);
+   free(currentWeights);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* We're fine if we didn't get any mismatches. */
+   if (errorCount == 0) {
+      return GL_TRUE;
+   }
+   else {
+      return GL_FALSE;
+   }
+}
+
+/* Wrappers on the exercise_occlusion_query function */
+static GLboolean
+test_GenQueriesARB(generic_func func)
+{
+   (void) func;
+   return exercise_occlusion_query();
+}
+static GLboolean
+test_BeginQueryARB(generic_func func)
+{
+   (void) func;
+   return exercise_occlusion_query();
+}
+static GLboolean
+test_GetQueryivARB(generic_func func)
+{
+   (void) func;
+   return exercise_occlusion_query();
+}
+static GLboolean
+test_EndQueryARB(generic_func func)
+{
+   (void) func;
+   return exercise_occlusion_query();
+}
+static GLboolean
+test_IsQueryARB(generic_func func)
+{
+   (void) func;
+   return exercise_occlusion_query();
+}
+static GLboolean
+test_GetQueryObjectivARB(generic_func func)
+{
+   (void) func;
+   return exercise_occlusion_query();
+}
+static GLboolean
+test_GetQueryObjectuivARB(generic_func func)
+{
+   (void) func;
+   return exercise_occlusion_query();
+}
+static GLboolean
+test_DeleteQueriesARB(generic_func func)
+{
+   (void) func;
+   return exercise_occlusion_query();
+}
+
+/* Wrappers on the exercise_buffer_objects() function */
+static GLboolean
+test_GenBuffersARB(generic_func func)
+{
+   (void) func;
+   return exercise_buffer_objects(Use_Map_Buffer);
+}
+static GLboolean
+test_BindBufferARB(generic_func func)
+{
+   (void) func;
+   return exercise_buffer_objects(Use_Map_Buffer);
+}
+static GLboolean
+test_BufferDataARB(generic_func func)
+{
+   (void) func;
+   return exercise_buffer_objects(Use_Map_Buffer);
+}
+static GLboolean
+test_MapBufferARB(generic_func func)
+{
+   (void) func;
+   return exercise_buffer_objects(Use_Map_Buffer);
+}
+static GLboolean
+test_UnmapBufferARB(generic_func func)
+{
+   (void) func;
+   return exercise_buffer_objects(Use_Map_Buffer);
+}
+static GLboolean
+test_DeleteBuffersARB(generic_func func)
+{
+   (void) func;
+   return exercise_buffer_objects(Use_Map_Buffer);
+}
+static GLboolean
+test_GetBufferParameterivARB(generic_func func)
+{
+   (void) func;
+   return exercise_buffer_objects(Use_Map_Buffer);
+}
+static GLboolean
+test_FlushMappedBufferRange(generic_func func)
+{
+   (void) func;
+   return exercise_buffer_objects(Use_Map_Buffer_Range);
+}
+static GLboolean
+test_MapBufferRange(generic_func func)
+{
+   (void) func;
+   return exercise_buffer_objects(Use_Map_Buffer_Range);
+}
+static GLboolean
+test_BufferParameteriAPPLE(generic_func func)
+{
+   (void) func;
+   return exercise_buffer_objects(Use_Map_Buffer_Range);
+}
+
+/* Wrappers on the exercise_framebuffer() function */
+static GLboolean
+test_BindFramebufferEXT(generic_func func)
+{
+   (void) func;
+   return exercise_framebuffer();
+}
+static GLboolean
+test_BindRenderbufferEXT(generic_func func)
+{
+   (void) func;
+   return exercise_framebuffer();
+}
+static GLboolean
+test_CheckFramebufferStatusEXT(generic_func func)
+{
+   (void) func;
+   return exercise_framebuffer();
+}
+static GLboolean
+test_DeleteFramebuffersEXT(generic_func func)
+{
+   (void) func;
+   return exercise_framebuffer();
+}
+static GLboolean
+test_DeleteRenderbuffersEXT(generic_func func)
+{
+   (void) func;
+   return exercise_framebuffer();
+}
+static GLboolean
+test_FramebufferRenderbufferEXT(generic_func func)
+{
+   (void) func;
+   return exercise_framebuffer();
+}
+static GLboolean
+test_GenFramebuffersEXT(generic_func func)
+{
+   (void) func;
+   return exercise_framebuffer();
+}
+static GLboolean
+test_GenRenderbuffersEXT(generic_func func)
+{
+   (void) func;
+   return exercise_framebuffer();
+}
+static GLboolean
+test_IsFramebufferEXT(generic_func func)
+{
+   (void) func;
+   return exercise_framebuffer();
+}
+static GLboolean
+test_IsRenderbufferEXT(generic_func func)
+{
+   (void) func;
+   return exercise_framebuffer();
+}
+static GLboolean
+test_RenderbufferStorageEXT(generic_func func)
+{
+   (void) func;
+   return exercise_framebuffer();
+}
+static GLboolean
+test_BlitFramebufferEXT(generic_func func)
+{
+   (void) func;
+   return exercise_framebuffer();
+}
+
+/* These are wrappers on the exercise_CompressedTextures function. 
+ * Unfortunately, we cannot test the 1D counterparts, because the
+ * texture compressions available all support 2D and higher only.
+ */
+static GLboolean
+test_CompressedTexImage2DARB(generic_func func)
+{
+   (void) func;
+   return exercise_CompressedTextures(GL_TEXTURE_2D);
+}
+static GLboolean
+test_CompressedTexSubImage2DARB(generic_func func)
+{
+   (void) func;
+   return exercise_CompressedTextures(GL_TEXTURE_2D);
+}
+static GLboolean
+test_CompressedTexImage3DARB(generic_func func)
+{
+   (void) func;
+   return exercise_CompressedTextures(GL_TEXTURE_3D);
+}
+static GLboolean
+test_CompressedTexSubImage3DARB(generic_func func)
+{
+   (void) func;
+   return exercise_CompressedTextures(GL_TEXTURE_3D);
+}
+static GLboolean
+test_GetCompressedTexImageARB(generic_func func)
+{
+   (void) func;
+   return exercise_CompressedTextures(GL_TEXTURE_3D);
+}
+
+/* Wrappers on exercise_fences(). */
+static GLboolean
+test_DeleteFencesNV(generic_func func)
+{
+   (void) func;
+   return exercise_fences();
+}
+static GLboolean
+test_GenFencesNV(generic_func func)
+{
+   (void) func;
+   return exercise_fences();
+}
+static GLboolean
+test_SetFenceNV(generic_func func)
+{
+   (void) func;
+   return exercise_fences();
+}
+static GLboolean
+test_TestFenceNV(generic_func func)
+{
+   (void) func;
+   return exercise_fences();
+}
+static GLboolean
+test_FinishFenceNV(generic_func func)
+{
+   (void) func;
+   return exercise_fences();
+}
+static GLboolean
+test_GetFenceivNV(generic_func func)
+{
+   (void) func;
+   return exercise_fences();
+}
+static GLboolean
+test_IsFenceNV(generic_func func)
+{
+   (void) func;
+   return exercise_fences();
+}
+
+/* A bunch of glUniform*() tests */
+static GLboolean
+test_Uniform1iv(generic_func func)
+{
+   PFNGLUNIFORM1IVARBPROC Uniform1ivARB = (PFNGLUNIFORM1IVARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformivARB, PFNGLGETUNIFORMIVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform int uniformColor;" 
+      "void main() {gl_FragColor.r = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLint uniform[1] = {1};
+   GLint queriedUniform[1];
+
+   if (GetUniformivARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is an integer
+    * so we must set it using integer versions
+    * of the Uniform* functions.  The "1" means we're setting
+    * one vector's worth of information.
+    */
+   (*Uniform1ivARB)(uniformLocation, 1, uniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformivARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_ints(__FUNCTION__, 1, uniform, 1, queriedUniform);
+}
+
+static GLboolean
+test_Uniform1i(generic_func func)
+{
+   PFNGLUNIFORM1IARBPROC Uniform1iARB = (PFNGLUNIFORM1IARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformivARB, PFNGLGETUNIFORMIVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform int uniformColor;"
+      "void main() {gl_FragColor.r = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLint uniform[1] = {1};
+   GLint queriedUniform[4];
+
+   if (GetUniformivARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is an integer
+    * so we must set it using integer versions
+    * of the Uniform* functions.
+    */
+   (*Uniform1iARB)(uniformLocation, uniform[0]);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformivARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_ints(__FUNCTION__, 1, uniform, 1, queriedUniform);
+}
+
+static GLboolean
+test_Uniform1fv(generic_func func)
+{
+   PFNGLUNIFORM1FVARBPROC Uniform1fvARB = (PFNGLUNIFORM1FVARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformfvARB, PFNGLGETUNIFORMFVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform float uniformColor;"
+      "void main() {gl_FragColor.r = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLfloat uniform[1] = {1.1};
+   GLfloat queriedUniform[1];
+
+   if (GetUniformfvARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is a float
+    * so we must set it using float versions
+    * of the Uniform* functions.  The "1" means we're setting
+    * one vector's worth of information.
+    */
+   (*Uniform1fvARB)(uniformLocation, 1, uniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformfvARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_floats(__FUNCTION__, 1, uniform, 1, queriedUniform);
+}
+
+static GLboolean
+test_Uniform1f(generic_func func)
+{
+   PFNGLUNIFORM1FARBPROC Uniform1fARB = (PFNGLUNIFORM1FARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformfvARB, PFNGLGETUNIFORMFVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform float uniformColor;"
+      "void main() {gl_FragColor.r = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLfloat uniform[1] = {1.1};
+   GLfloat queriedUniform[1];
+
+   if (GetUniformfvARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is a float
+    * so we must set it using float versions
+    * of the Uniform* functions.
+    */
+   (*Uniform1fARB)(uniformLocation, uniform[0]);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformfvARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_floats(__FUNCTION__, 1, uniform, 1, queriedUniform);
+}
+
+static GLboolean
+test_Uniform2iv(generic_func func)
+{
+   PFNGLUNIFORM2IVARBPROC Uniform2ivARB = (PFNGLUNIFORM2IVARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformivARB, PFNGLGETUNIFORMIVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform ivec2 uniformColor;" 
+      "void main() {gl_FragColor.rg = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLint uniform[2] = {1,2};
+   GLint queriedUniform[2];
+
+   if (GetUniformivARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is an integer
+    * vector 2 (ivec2), so we must set it using integer versions
+    * of the Uniform* functions.  The "1" means we're setting
+    * one vector's worth of information.
+    */
+   (*Uniform2ivARB)(uniformLocation, 1, uniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformivARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_ints(__FUNCTION__, 2, uniform, 2, queriedUniform);
+}
+
+static GLboolean
+test_Uniform2i(generic_func func)
+{
+   PFNGLUNIFORM2IARBPROC Uniform2iARB = (PFNGLUNIFORM2IARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformivARB, PFNGLGETUNIFORMIVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform ivec2 uniformColor;"
+      "void main() {gl_FragColor.rg = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLint uniform[2] = {1,2};
+   GLint queriedUniform[4];
+
+   if (GetUniformivARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is an integer
+    * vector 2 (ivec2), so we must set it using integer versions
+    * of the Uniform* functions.
+    */
+   (*Uniform2iARB)(uniformLocation, uniform[0], uniform[1]);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformivARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_ints(__FUNCTION__, 2, uniform, 2, queriedUniform);
+}
+
+static GLboolean
+test_Uniform2fv(generic_func func)
+{
+   PFNGLUNIFORM2FVARBPROC Uniform2fvARB = (PFNGLUNIFORM2FVARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformfvARB, PFNGLGETUNIFORMFVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform vec2 uniformColor;"
+      "void main() {gl_FragColor.rg = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLfloat uniform[2] = {1.1,2.2};
+   GLfloat queriedUniform[2];
+
+   if (GetUniformfvARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is a float
+    * vector 2 (vec2), so we must set it using float versions
+    * of the Uniform* functions.  The "1" means we're setting
+    * one vector's worth of information.
+    */
+   (*Uniform2fvARB)(uniformLocation, 1, uniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformfvARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_floats(__FUNCTION__, 2, uniform, 2, queriedUniform);
+}
+
+static GLboolean
+test_Uniform2f(generic_func func)
+{
+   PFNGLUNIFORM2FARBPROC Uniform2fARB = (PFNGLUNIFORM2FARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformfvARB, PFNGLGETUNIFORMFVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform vec2 uniformColor;"
+      "void main() {gl_FragColor.rg = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLfloat uniform[2] = {1.1,2.2};
+   GLfloat queriedUniform[2];
+
+   if (GetUniformfvARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is a float
+    * vector 2 (vec2), so we must set it using float versions
+    * of the Uniform* functions.
+    */
+   (*Uniform2fARB)(uniformLocation, uniform[0], uniform[1]);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformfvARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_floats(__FUNCTION__, 2, uniform, 2, queriedUniform);
+}
+
+static GLboolean
+test_Uniform3iv(generic_func func)
+{
+   PFNGLUNIFORM3IVARBPROC Uniform3ivARB = (PFNGLUNIFORM3IVARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformivARB, PFNGLGETUNIFORMIVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform ivec3 uniformColor;" 
+      "void main() {gl_FragColor.rgb = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLint uniform[3] = {1,2,3};
+   GLint queriedUniform[3];
+
+   if (GetUniformivARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is an integer
+    * vector 3 (ivec3), so we must set it using integer versions
+    * of the Uniform* functions.  The "1" means we're setting
+    * one vector's worth of information.
+    */
+   (*Uniform3ivARB)(uniformLocation, 1, uniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformivARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_ints(__FUNCTION__, 3, uniform, 3, queriedUniform);
+}
+
+static GLboolean
+test_Uniform3i(generic_func func)
+{
+   PFNGLUNIFORM3IARBPROC Uniform3iARB = (PFNGLUNIFORM3IARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformivARB, PFNGLGETUNIFORMIVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform ivec3 uniformColor;"
+      "void main() {gl_FragColor.rgb = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLint uniform[3] = {1,2,3};
+   GLint queriedUniform[4];
+
+   if (GetUniformivARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is an integer
+    * vector 3 (ivec3), so we must set it using integer versions
+    * of the Uniform* functions.
+    */
+   (*Uniform3iARB)(uniformLocation, uniform[0], uniform[1], uniform[2]);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformivARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_ints(__FUNCTION__, 3, uniform, 3, queriedUniform);
+}
+
+static GLboolean
+test_Uniform3fv(generic_func func)
+{
+   PFNGLUNIFORM3FVARBPROC Uniform3fvARB = (PFNGLUNIFORM3FVARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformfvARB, PFNGLGETUNIFORMFVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform vec3 uniformColor;"
+      "void main() {gl_FragColor.rgb = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLfloat uniform[3] = {1.1,2.2,3.3};
+   GLfloat queriedUniform[3];
+
+   if (GetUniformfvARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is a float
+    * vector 3 (vec3), so we must set it using float versions
+    * of the Uniform* functions.  The "1" means we're setting
+    * one vector's worth of information.
+    */
+   (*Uniform3fvARB)(uniformLocation, 1, uniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformfvARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_floats(__FUNCTION__, 3, uniform, 3, queriedUniform);
+}
+
+static GLboolean
+test_Uniform3f(generic_func func)
+{
+   PFNGLUNIFORM3FARBPROC Uniform3fARB = (PFNGLUNIFORM3FARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformfvARB, PFNGLGETUNIFORMFVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform vec3 uniformColor;"
+      "void main() {gl_FragColor.rgb = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLfloat uniform[3] = {1.1,2.2,3.3};
+   GLfloat queriedUniform[3];
+
+   if (GetUniformfvARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is a float
+    * vector 3 (vec3), so we must set it using float versions
+    * of the Uniform* functions.
+    */
+   (*Uniform3fARB)(uniformLocation, uniform[0], uniform[1], uniform[2]);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformfvARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_floats(__FUNCTION__, 3, uniform, 3, queriedUniform);
+}
+
+static GLboolean
+test_Uniform4iv(generic_func func)
+{
+   PFNGLUNIFORM4IVARBPROC Uniform4ivARB = (PFNGLUNIFORM4IVARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformivARB, PFNGLGETUNIFORMIVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform ivec4 uniformColor; void main() {gl_FragColor = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLint uniform[4] = {1,2,3,4};
+   GLint queriedUniform[4];
+
+   if (GetUniformivARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is an integer
+    * vector (ivec4), so we must set it using integer versions
+    * of the Uniform* functions.  The "1" means we're setting
+    * one vector's worth of information.
+    */
+   (*Uniform4ivARB)(uniformLocation, 1, uniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformivARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_ints(__FUNCTION__, 4, uniform, 4, queriedUniform);
+}
+
+static GLboolean
+test_Uniform4i(generic_func func)
+{
+   PFNGLUNIFORM4IARBPROC Uniform4iARB = (PFNGLUNIFORM4IARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformivARB, PFNGLGETUNIFORMIVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform ivec4 uniformColor; void main() {gl_FragColor = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLint uniform[4] = {1,2,3,4};
+   GLint queriedUniform[4];
+
+   if (GetUniformivARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is an integer
+    * vector (ivec4), so we must set it using integer versions
+    * of the Uniform* functions.
+    */
+   (*Uniform4iARB)(uniformLocation, uniform[0], uniform[1], uniform[2],
+      uniform[3]);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformivARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_ints(__FUNCTION__, 4, uniform, 4, queriedUniform);
+}
+
+static GLboolean
+test_Uniform4fv(generic_func func)
+{
+   PFNGLUNIFORM4FVARBPROC Uniform4fvARB = (PFNGLUNIFORM4FVARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformfvARB, PFNGLGETUNIFORMFVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform vec4 uniformColor; void main() {gl_FragColor = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLfloat uniform[4] = {1.1,2.2,3.3,4.4};
+   GLfloat queriedUniform[4];
+
+   if (GetUniformfvARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is a float
+    * vector (vec4), so we must set it using float versions
+    * of the Uniform* functions.  The "1" means we're setting
+    * one vector's worth of information.
+    */
+   (*Uniform4fvARB)(uniformLocation, 1, uniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformfvARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_floats(__FUNCTION__, 4, uniform, 4, queriedUniform);
+}
+
+static GLboolean
+test_Uniform4f(generic_func func)
+{
+   PFNGLUNIFORM4FARBPROC Uniform4fARB = (PFNGLUNIFORM4FARBPROC) func;
+   DECLARE_GLFUNC_PTR(GetUniformfvARB, PFNGLGETUNIFORMFVARBPROC);
+
+   /* This is a trivial fragment shader that sets the color of the
+    * fragment to the uniform value passed in.
+    */
+   static const char *fragmentShaderText = 
+      "uniform vec4 uniformColor; void main() {gl_FragColor = uniformColor;}";
+   static const char *uniformName = "uniformColor";
+
+   GLhandleARB program;
+   GLint uniformLocation;
+   const GLfloat uniform[4] = {1.1,2.2,3.3,4.4};
+   GLfloat queriedUniform[4];
+
+   if (GetUniformfvARB == NULL) {
+      return GL_FALSE;
+   }
+
+   /* Call a helper function to compile up the shader and give
+    * us back the validated program and uniform location.
+    * If it fails, something's wrong and we can't continue.
+    */
+   if (!exercise_uniform_start(fragmentShaderText, uniformName, 
+      &program, &uniformLocation)) {
+      return GL_FALSE;
+   }
+
+   /* Set the value of the program uniform.  Note that you must
+    * use a compatible type.  Our uniform above is an integer
+    * vector (ivec4), so we must set it using integer versions
+    * of the Uniform* functions.
+    */
+   (*Uniform4fARB)(uniformLocation, uniform[0], uniform[1], uniform[2],
+      uniform[3]);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Query it back */
+   (*GetUniformfvARB)(program, uniformLocation, queriedUniform);
+   CheckGLError(__LINE__, __FILE__, __FUNCTION__);
+
+   /* Clean up before we check to see whether it came back unscathed */
+   exercise_uniform_end(program);
+
+   /* Now check to see whether the uniform came back as expected.  This
+    * will return GL_TRUE if all is well, or GL_FALSE if the comparison failed.
+    */
+   return compare_floats(__FUNCTION__, 4, uniform, 4, queriedUniform);
+}
 
 static GLboolean
 test_ActiveTextureARB(generic_func func)
@@ -92,17 +2679,51 @@ test_ActiveStencilFaceEXT(generic_func func)
 static GLboolean
 test_VertexAttrib1fvARB(generic_func func)
 {
-   PFNGLVERTEXATTRIB1FVARBPROC vertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) func;
-   PFNGLGETVERTEXATTRIBFVARBPROC getVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvARB");
+   PFNGLVERTEXATTRIB1FVARBPROC vertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) func;
+   PFNGLGETVERTEXATTRIBFVARBPROC getVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvARB");
+
+   const GLfloat v[1] = {25.0};
+   const GLfloat def[1] = {0};
+   GLfloat res[4];
+   GLboolean pass;
+   (*vertexAttrib1fvARB)(6, v);
+   (*getVertexAttribfvARB)(6, GL_CURRENT_VERTEX_ATTRIB_ARB, res);
+   pass = (res[0] == 25.0 && res[1] == 0.0 && res[2] == 0.0 && res[3] == 1.0);
+   (*vertexAttrib1fvARB)(6, def);
+   return pass;
+}
+
+static GLboolean
+test_VertexAttrib1dvARB(generic_func func)
+{
+   PFNGLVERTEXATTRIB1DVARBPROC vertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) func;
+   PFNGLGETVERTEXATTRIBDVARBPROC getVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribdvARB");
+
+   const GLdouble v[1] = {25.0};
+   const GLdouble def[1] = {0};
+   GLdouble res[4];
+   GLboolean pass;
+   (*vertexAttrib1dvARB)(6, v);
+   (*getVertexAttribdvARB)(6, GL_CURRENT_VERTEX_ATTRIB_ARB, res);
+   pass = (res[0] == 25.0 && res[1] == 0.0 && res[2] == 0.0 && res[3] == 1.0);
+   (*vertexAttrib1dvARB)(6, def);
+   return pass;
+}
+
+static GLboolean
+test_VertexAttrib1svARB(generic_func func)
+{
+   PFNGLVERTEXATTRIB1SVARBPROC vertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) func;
+   PFNGLGETVERTEXATTRIBIVARBPROC getVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribivARB");
 
-   const GLfloat v[1] = {25.0};
-   const GLfloat def[1] = {0};
-   GLfloat res[4];
+   const GLshort v[1] = {25.0};
+   const GLshort def[1] = {0};
+   GLint res[4];
    GLboolean pass;
-   (*vertexAttrib1fvARB)(6, v);
-   (*getVertexAttribfvARB)(6, GL_CURRENT_VERTEX_ATTRIB_ARB, res);
-   pass = (res[0] == 25.0 && res[1] == 0.0 && res[2] == 0.0 && res[3] == 1.0);
-   (*vertexAttrib1fvARB)(6, def);
+   (*vertexAttrib1svARB)(6, v);
+   (*getVertexAttribivARB)(6, GL_CURRENT_VERTEX_ATTRIB_ARB, res);
+   pass = (res[0] == 25 && res[1] == 0 && res[2] == 0 && res[3] == 1);
+   (*vertexAttrib1svARB)(6, def);
    return pass;
 }
 
@@ -177,7 +2798,6 @@ test_VertexAttrib4NsvARB(generic_func func)
    return pass;
 }
 
-
 static GLboolean
 test_VertexAttrib4NusvARB(generic_func func)
 {
@@ -195,42 +2815,110 @@ test_VertexAttrib4NusvARB(generic_func func)
    return pass;
 }
 
+static GLboolean
+test_VertexAttrib1sNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB1SNVPROC vertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC) func;
+   PFNGLGETVERTEXATTRIBIVNVPROC getVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribivNV");
+
+   const GLshort v[4] = {2, 0, 0, 1};
+   const GLshort def[4] = {0, 0, 0, 1};
+   GLint res[4];
+   (*vertexAttrib1sNV)(6, v[0]);
+   (*getVertexAttribivNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib1sNV)(6, def[0]);
+   return compare_shorts_to_ints(__FUNCTION__, 4, v, 4, res);
+}
 
 static GLboolean
-test_VertexAttrib4ubNV(generic_func func)
+test_VertexAttrib1fNV(generic_func func)
 {
-   PFNGLVERTEXATTRIB4UBNVPROC vertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC) func;
+   PFNGLVERTEXATTRIB1FNVPROC vertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC) func;
    PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
 
-   const GLubyte v[4] = {255, 0, 255, 0};
-   const GLubyte def[4] = {0, 0, 0, 255};
+   const GLfloat v[4] = {2.5, 0.0, 0.0, 1.0};
+   const GLfloat def[4] = {0, 0, 0, 1};
    GLfloat res[4];
-   GLboolean pass;
-   (*vertexAttrib4ubNV)(6, v[0], v[1], v[2], v[3]);
+   (*vertexAttrib1fNV)(6, v[0]);
    (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
-   pass = (res[0] == 1.0 && res[1] == 0.0 && res[2] == 1.0 && res[3] == 0.0);
-   (*vertexAttrib4ubNV)(6, def[0], def[1], def[2], def[3]);
-   return pass;
+   (*vertexAttrib1fNV)(6, def[0]);
+   return compare_floats(__FUNCTION__, 4, v, 4, res);
 }
 
+static GLboolean
+test_VertexAttrib1dNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB1DNVPROC vertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC) func;
+   PFNGLGETVERTEXATTRIBDVNVPROC getVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribdvNV");
+
+   const GLdouble v[4] = {2.5, 0.0, 0.0, 1.0};
+   const GLdouble def[4] = {0, 0, 0, 1};
+   GLdouble res[4];
+   (*vertexAttrib1dNV)(6, v[0]);
+   (*getVertexAttribdvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib1dNV)(6, def[0]);
+   return compare_doubles(__FUNCTION__, 4, v, 4, res);
+}
 
 static GLboolean
 test_VertexAttrib2sNV(generic_func func)
 {
    PFNGLVERTEXATTRIB2SNVPROC vertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC) func;
+   PFNGLGETVERTEXATTRIBIVNVPROC getVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribivNV");
+
+   const GLshort v[4] = {2, 4, 0, 1};
+   const GLshort def[4] = {0, 0, 0, 1};
+   GLint res[4];
+   (*vertexAttrib2sNV)(6, v[0], v[1]);
+   (*getVertexAttribivNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib2sNV)(6, def[0], def[1]);
+   return compare_shorts_to_ints(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib2fNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB2FNVPROC vertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC) func;
    PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
 
-   const GLshort v[2] = {2, -4,};
-   const GLshort def[2] = {0, 0};
+   const GLfloat v[4] = {2.5, 4.25, 0.0, 1.0};
+   const GLfloat def[4] = {0, 0, 0, 1};
    GLfloat res[4];
-   GLboolean pass;
-   (*vertexAttrib2sNV)(6, v[0], v[1]);
+   (*vertexAttrib2fNV)(6, v[0], v[1]);
    (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
-   pass = (EQUAL(res[0], 2) && EQUAL(res[1], -4) && EQUAL(res[2], 0) && res[3] == 1.0);
-   (*vertexAttrib2sNV)(6, def[0], def[1]);
-   return pass;
+   (*vertexAttrib2fNV)(6, def[0], def[1]);
+   return compare_floats(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib2dNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB2DNVPROC vertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC) func;
+   PFNGLGETVERTEXATTRIBDVNVPROC getVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribdvNV");
+
+   const GLdouble v[4] = {2.5, 4.25, 0.0, 1.0};
+   const GLdouble def[4] = {0, 0, 0, 1};
+   GLdouble res[4];
+   (*vertexAttrib2dNV)(6, v[0], v[1]);
+   (*getVertexAttribdvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib2dNV)(6, def[0], def[1]);
+   return compare_doubles(__FUNCTION__, 4, v, 4, res);
 }
 
+static GLboolean
+test_VertexAttrib3sNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB3SNVPROC vertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC) func;
+   PFNGLGETVERTEXATTRIBIVNVPROC getVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribivNV");
+
+   const GLshort v[4] = {2, 4, 7, 1};
+   const GLshort def[4] = {0, 0, 0, 1};
+   GLint res[4];
+   (*vertexAttrib3sNV)(6, v[0], v[1], v[2]);
+   (*getVertexAttribivNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib3sNV)(6, def[0], def[1], def[2]);
+   return compare_shorts_to_ints(__FUNCTION__, 4, v, 4, res);
+}
 
 static GLboolean
 test_VertexAttrib3fNV(generic_func func)
@@ -238,35 +2926,467 @@ test_VertexAttrib3fNV(generic_func func)
    PFNGLVERTEXATTRIB3FNVPROC vertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC) func;
    PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
 
-   const GLfloat v[3] = {0.2, 0.4, 0.8};
-   const GLfloat def[3] = {0, 0, 0};
+   const GLfloat v[4] = {2.5, 4.25, 7.125, 1.0};
+   const GLfloat def[4] = {0, 0, 0, 1};
    GLfloat res[4];
-   GLboolean pass;
    (*vertexAttrib3fNV)(6, v[0], v[1], v[2]);
    (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
-   pass = (EQUAL(res[0], 0.2) && EQUAL(res[1], 0.4) && EQUAL(res[2], 0.8) && res[3] == 1.0);
    (*vertexAttrib3fNV)(6, def[0], def[1], def[2]);
-   return pass;
+   return compare_floats(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib3dNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB3DNVPROC vertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC) func;
+   PFNGLGETVERTEXATTRIBDVNVPROC getVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribdvNV");
+
+   const GLdouble v[4] = {2.5, 4.25, 7.125, 1.0};
+   const GLdouble def[4] = {0, 0, 0, 1};
+   GLdouble res[4];
+   (*vertexAttrib3dNV)(6, v[0], v[1], v[2]);
+   (*getVertexAttribdvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib3dNV)(6, def[0], def[1], def[2]);
+   return compare_doubles(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib4sNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB4SNVPROC vertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC) func;
+   PFNGLGETVERTEXATTRIBIVNVPROC getVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribivNV");
+
+   const GLshort v[4] = {2, 4, 7, 5};
+   const GLshort def[4] = {0, 0, 0, 1};
+   GLint res[4];
+   (*vertexAttrib4sNV)(6, v[0], v[1], v[2], v[3]);
+   (*getVertexAttribivNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib4sNV)(6, def[0], def[1], def[2], def[3]);
+   return compare_shorts_to_ints(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib4fNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB4FNVPROC vertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC) func;
+   PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
+
+   const GLfloat v[4] = {2.5, 4.25, 7.125, 5.0625};
+   const GLfloat def[4] = {0, 0, 0, 1};
+   GLfloat res[4];
+   (*vertexAttrib4fNV)(6, v[0], v[1], v[2], v[3]);
+   (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib4fNV)(6, def[0], def[1], def[2], def[3]);
+   return compare_floats(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib4dNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB4DNVPROC vertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC) func;
+   PFNGLGETVERTEXATTRIBDVNVPROC getVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribdvNV");
+
+   const GLdouble v[4] = {2.5, 4.25, 7.125, 5.0625};
+   const GLdouble def[4] = {0, 0, 0, 1};
+   GLdouble res[4];
+   (*vertexAttrib4dNV)(6, v[0], v[1], v[2], v[3]);
+   (*getVertexAttribdvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib4dNV)(6, def[0], def[1], def[2], def[3]);
+   return compare_doubles(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib4ubNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB4UBNVPROC vertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC) func;
+   PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
+
+   const GLubyte v[4] = {255, 0, 255, 0};
+   const GLubyte def[4] = {0, 0, 0, 255};
+   GLfloat res[4];
+   /* There's no byte-value query; so we use the float-value query.
+    * Bytes are interpreted as steps between 0 and 1, so the
+    * expected float values will be 0.0 for byte value 0 and 1.0 for
+    * byte value 255.
+    */
+   GLfloat expectedResults[4] = {1.0, 0.0, 1.0, 0.0};
+   (*vertexAttrib4ubNV)(6, v[0], v[1], v[2], v[3]);
+   (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib4ubNV)(6, def[0], def[1], def[2], def[3]);
+   return compare_floats(__FUNCTION__, 4, expectedResults, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib1fvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB1FVNVPROC vertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC) func;
+   PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
+
+   const GLfloat v[4] = {2.5, 0.0, 0.0, 1.0};
+   const GLfloat def[4] = {0, 0, 0, 1};
+   GLfloat res[4];
+   (*vertexAttrib1fvNV)(6, v);
+   (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib1fvNV)(6, def);
+   return compare_floats(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib1dvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB1DVNVPROC vertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC) func;
+   PFNGLGETVERTEXATTRIBDVNVPROC getVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribdvNV");
+
+   const GLdouble v[4] = {2.5, 0.0, 0.0, 1.0};
+   const GLdouble def[4] = {0, 0, 0, 1};
+   GLdouble res[4];
+   (*vertexAttrib1dvNV)(6, v);
+   (*getVertexAttribdvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib1dvNV)(6, def);
+   return compare_doubles(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib2svNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB2SVNVPROC vertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC) func;
+   PFNGLGETVERTEXATTRIBIVNVPROC getVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribivNV");
+
+   const GLshort v[4] = {2, 4, 0, 1};
+   const GLshort def[4] = {0, 0, 0, 1};
+   GLint res[4];
+   (*vertexAttrib2svNV)(6, v);
+   (*getVertexAttribivNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib2svNV)(6, def);
+   return compare_shorts_to_ints(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib2fvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB2FVNVPROC vertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC) func;
+   PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
+
+   const GLfloat v[4] = {2.5, 4.25, 0.0, 1.0};
+   const GLfloat def[4] = {0, 0, 0, 1};
+   GLfloat res[4];
+   (*vertexAttrib2fvNV)(6, v);
+   (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib2fvNV)(6, def);
+   return compare_floats(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib2dvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB2DVNVPROC vertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC) func;
+   PFNGLGETVERTEXATTRIBDVNVPROC getVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribdvNV");
+
+   const GLdouble v[4] = {2.5, 4.25, 0.0, 1.0};
+   const GLdouble def[4] = {0, 0, 0, 1};
+   GLdouble res[4];
+   (*vertexAttrib2dvNV)(6, v);
+   (*getVertexAttribdvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib2dvNV)(6, def);
+   return compare_doubles(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib3svNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB3SVNVPROC vertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC) func;
+   PFNGLGETVERTEXATTRIBIVNVPROC getVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribivNV");
+
+   const GLshort v[4] = {2, 4, 7, 1};
+   const GLshort def[4] = {0, 0, 0, 1};
+   GLint res[4];
+   (*vertexAttrib3svNV)(6, v);
+   (*getVertexAttribivNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib3svNV)(6, def);
+   return compare_shorts_to_ints(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib3fvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB3FVNVPROC vertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC) func;
+   PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
+
+   const GLfloat v[4] = {2.5, 4.25, 7.125, 1.0};
+   const GLfloat def[4] = {0, 0, 0, 1};
+   GLfloat res[4];
+   (*vertexAttrib3fvNV)(6, v);
+   (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib3fvNV)(6, def);
+   return compare_floats(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib3dvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB3DVNVPROC vertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC) func;
+   PFNGLGETVERTEXATTRIBDVNVPROC getVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribdvNV");
+
+   const GLdouble v[4] = {2.5, 4.25, 7.125, 1.0};
+   const GLdouble def[4] = {0, 0, 0, 1};
+   GLdouble res[4];
+   (*vertexAttrib3dvNV)(6, v);
+   (*getVertexAttribdvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib3dvNV)(6, def);
+   return compare_doubles(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib4svNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB4SVNVPROC vertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC) func;
+   PFNGLGETVERTEXATTRIBIVNVPROC getVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribivNV");
+
+   const GLshort v[4] = {2, 4, 7, 5};
+   const GLshort def[4] = {0, 0, 0, 1};
+   GLint res[4];
+   (*vertexAttrib4svNV)(6, v);
+   (*getVertexAttribivNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib4svNV)(6, def);
+   return compare_shorts_to_ints(__FUNCTION__, 4, v, 4, res);
 }
 
+static GLboolean
+test_VertexAttrib4fvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB4FVNVPROC vertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC) func;
+   PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
+
+   const GLfloat v[4] = {2.5, 4.25, 7.125, 5.0625};
+   const GLfloat def[4] = {0, 0, 0, 1};
+   GLfloat res[4];
+   (*vertexAttrib4fvNV)(6, v);
+   (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib4fvNV)(6, def);
+   return compare_floats(__FUNCTION__, 4, v, 4, res);
+}
 
 static GLboolean
 test_VertexAttrib4dvNV(generic_func func)
 {
    PFNGLVERTEXATTRIB4DVNVPROC vertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC) func;
+   PFNGLGETVERTEXATTRIBDVNVPROC getVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribdvNV");
+
+   const GLdouble v[4] = {2.5, 4.25, 7.125, 5.0625};
+   const GLdouble def[4] = {0, 0, 0, 1};
+   GLdouble res[4];
+   (*vertexAttrib4dvNV)(6, v);
+   (*getVertexAttribdvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib4dvNV)(6, def);
+   return compare_doubles(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttrib4ubvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB4UBVNVPROC vertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC) func;
+   PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
+
+   const GLubyte v[4] = {255, 0, 255, 0};
+   const GLubyte def[4] = {0, 0, 0, 255};
+   GLfloat res[4];
+   /* There's no byte-value query; so we use the float-value query.
+    * Bytes are interpreted as steps between 0 and 1, so the
+    * expected float values will be 0.0 for byte value 0 and 1.0 for
+    * byte value 255.
+    */
+   GLfloat expectedResults[4] = {1.0, 0.0, 1.0, 0.0};
+   (*vertexAttrib4ubvNV)(6, v);
+   (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttrib4ubvNV)(6, def);
+   return compare_floats(__FUNCTION__, 4, expectedResults, 4, res);
+}
+
+static GLboolean
+test_VertexAttribs1fvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIBS1FVNVPROC vertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC) func;
    PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
 
-   const GLdouble v[4] = {0.2, 0.4, 0.8, 1.2};
+   const GLfloat v[4] = {2.5, 0.0, 0.0, 1.0};
+   const GLfloat def[4] = {0, 0, 0, 1};
+   GLfloat res[4];
+   (*vertexAttribs1fvNV)(6, 1, v);
+   (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttribs1fvNV)(6, 1, def);
+   return compare_floats(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttribs1dvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIBS1DVNVPROC vertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC) func;
+   PFNGLGETVERTEXATTRIBDVNVPROC getVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribdvNV");
+
+   const GLdouble v[4] = {2.5, 0.0, 0.0, 1.0};
    const GLdouble def[4] = {0, 0, 0, 1};
+   GLdouble res[4];
+   (*vertexAttribs1dvNV)(6, 1, v);
+   (*getVertexAttribdvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttribs1dvNV)(6, 1, def);
+   return compare_doubles(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttribs2svNV(generic_func func)
+{
+   PFNGLVERTEXATTRIBS2SVNVPROC vertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC) func;
+   PFNGLGETVERTEXATTRIBIVNVPROC getVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribivNV");
+
+   const GLshort v[4] = {2, 4, 0, 1};
+   const GLshort def[4] = {0, 0, 0, 1};
+   GLint res[4];
+   (*vertexAttribs2svNV)(6, 1, v);
+   (*getVertexAttribivNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttribs2svNV)(6, 1, def);
+   return compare_shorts_to_ints(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttribs2fvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIBS2FVNVPROC vertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC) func;
+   PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
+
+   const GLfloat v[4] = {2.5, 4.25, 0.0, 1.0};
+   const GLfloat def[4] = {0, 0, 0, 1};
    GLfloat res[4];
-   GLboolean pass;
-   (*vertexAttrib4dvNV)(6, v);
+   (*vertexAttribs2fvNV)(6, 1, v);
    (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
-   pass = (EQUAL(res[0], 0.2) && EQUAL(res[1], 0.4) && EQUAL(res[2], 0.8) && EQUAL(res[3], 1.2));
-   (*vertexAttrib4dvNV)(6, def);
-   return pass;
+   (*vertexAttribs2fvNV)(6, 1, def);
+   return compare_floats(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttribs2dvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIBS2DVNVPROC vertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC) func;
+   PFNGLGETVERTEXATTRIBDVNVPROC getVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribdvNV");
+
+   const GLdouble v[4] = {2.5, 4.25, 0.0, 1.0};
+   const GLdouble def[4] = {0, 0, 0, 1};
+   GLdouble res[4];
+   (*vertexAttribs2dvNV)(6, 1, v);
+   (*getVertexAttribdvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttribs2dvNV)(6, 1, def);
+   return compare_doubles(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttribs3svNV(generic_func func)
+{
+   PFNGLVERTEXATTRIBS3SVNVPROC vertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC) func;
+   PFNGLGETVERTEXATTRIBIVNVPROC getVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribivNV");
+
+   const GLshort v[4] = {2, 4, 7, 1};
+   const GLshort def[4] = {0, 0, 0, 1};
+   GLint res[4];
+   (*vertexAttribs3svNV)(6, 1, v);
+   (*getVertexAttribivNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttribs3svNV)(6, 1, def);
+   return compare_shorts_to_ints(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttribs3fvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIBS3FVNVPROC vertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC) func;
+   PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
+
+   const GLfloat v[4] = {2.5, 4.25, 7.125, 1.0};
+   const GLfloat def[4] = {0, 0, 0, 1};
+   GLfloat res[4];
+   (*vertexAttribs3fvNV)(6, 1, v);
+   (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttribs3fvNV)(6, 1, def);
+   return compare_floats(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttribs3dvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIBS3DVNVPROC vertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC) func;
+   PFNGLGETVERTEXATTRIBDVNVPROC getVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribdvNV");
+
+   const GLdouble v[4] = {2.5, 4.25, 7.125, 1.0};
+   const GLdouble def[4] = {0, 0, 0, 1};
+   GLdouble res[4];
+   (*vertexAttribs3dvNV)(6, 1, v);
+   (*getVertexAttribdvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttribs3dvNV)(6, 1, def);
+   return compare_doubles(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttribs4svNV(generic_func func)
+{
+   PFNGLVERTEXATTRIBS4SVNVPROC vertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC) func;
+   PFNGLGETVERTEXATTRIBIVNVPROC getVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribivNV");
+
+   const GLshort v[4] = {2, 4, 7, 5};
+   const GLshort def[4] = {0, 0, 0, 1};
+   GLint res[4];
+   (*vertexAttribs4svNV)(6, 1, v);
+   (*getVertexAttribivNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttribs4svNV)(6, 1, def);
+   return compare_shorts_to_ints(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttribs4fvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIBS4FVNVPROC vertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC) func;
+   PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
+
+   const GLfloat v[4] = {2.5, 4.25, 7.125, 5.0625};
+   const GLfloat def[4] = {0, 0, 0, 1};
+   GLfloat res[4];
+   (*vertexAttribs4fvNV)(6, 1, v);
+   (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttribs4fvNV)(6, 1, def);
+   return compare_floats(__FUNCTION__, 4, v, 4, res);
+}
+
+static GLboolean
+test_VertexAttribs4dvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIBS4DVNVPROC vertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC) func;
+   PFNGLGETVERTEXATTRIBDVNVPROC getVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribdvNV");
+
+   const GLdouble v[4] = {2.5, 4.25, 7.125, 5.0625};
+   const GLdouble def[4] = {0, 0, 0, 1};
+   GLdouble res[4];
+   (*vertexAttribs4dvNV)(6, 1, v);
+   (*getVertexAttribdvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttribs4dvNV)(6, 1, def);
+   return compare_doubles(__FUNCTION__, 4, v, 4, res);
 }
 
+static GLboolean
+test_VertexAttribs4ubvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIBS4UBVNVPROC vertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC) func;
+   PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
+
+   const GLubyte v[4] = {255, 0, 255, 0};
+   const GLubyte def[4] = {0, 0, 0, 255};
+   GLfloat res[4];
+   /* There's no byte-value query; so we use the float-value query.
+    * Bytes are interpreted as steps between 0 and 1, so the
+    * expected float values will be 0.0 for byte value 0 and 1.0 for
+    * byte value 255.
+    */
+   GLfloat expectedResults[4] = {1.0, 0.0, 1.0, 0.0};
+   (*vertexAttribs4ubvNV)(6, 1, v);
+   (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   (*vertexAttribs4ubvNV)(6, 1, def);
+   return compare_floats(__FUNCTION__, 4, expectedResults, 4, res);
+}
 
 static GLboolean
 test_StencilFuncSeparateATI(generic_func func)
@@ -387,17 +3507,32 @@ extension_supported(const char *haystack, const char *needle)
 }
 
 
-static void
+/* Run all the known extension function tests, if the extension is supported.
+ * Return a count of how many failed.
+ */
+static int
 check_functions( const char *extensions )
 {
    struct name_test_pair *entry;
-   int failures = 0, passes = 0;
-   int totalFail = 0, totalPass = 0;
+   int failures = 0, passes = 0, untested = 0;
+   int totalFail = 0, totalPass = 0, totalUntested = 0, totalUnsupported = 0;
    int doTests;
-
+   const char *version = (const char *) glGetString(GL_VERSION);
+
+   /* The functions list will have "real" entries (consisting of
+    * a GL function name and a pointer to an exercise function for
+    * that GL function), and "group" entries (indicated as
+    * such by having a "-" as the first character of the name).
+    * "Group" names always start with the "-" character, and can
+    * be numeric (e.g. "-1.0", "-2.1"), indicating that a particular
+    * OpenGL version is required for the following functions; or can be
+    * an extension name (e.g. "-GL_ARB_multitexture") that means
+    * that the named extension is required for the following functions.
+    */
    for (entry = functions; entry->name; entry++) {
+      /* Check if this is a group indicator */
       if (entry->name[0] == '-') {
-         const char *version = (const char *) glGetString(GL_VERSION);
+         /* A group indicator; check if it's an OpenGL version group */
          if (entry->name[1] == '1') {
             /* check GL version 1.x */
             if (version[0] == '1' &&
@@ -419,14 +3554,27 @@ check_functions( const char *extensions )
             /* check if the named extension is available */
             doTests = extension_supported(extensions, entry->name+1);
          }
+
+         /* doTests is now set if we're starting an OpenGL version
+          * group, and the running OpenGL version is at least the
+          * version required; or if we're starting an OpenGL extension
+          * group, and the extension is supported.
+          */
          if (doTests)
             printf("Testing %s functions\n", entry->name + 1);
-         totalFail += failures;
-         totalPass += passes;
+
+         /* Each time we hit a title function, reset the function
+          * counts.
+          */
          failures = 0;
          passes = 0;
+         untested = 0;
       }
       else if (doTests) {
+         /* Here, we know we're trying to exercise a function for
+          * a supported extension.  See whether we have a test for
+          * it, and try to run it.
+          */
          generic_func funcPtr = (generic_func) glXGetProcAddressARB((const GLubyte *) entry->name);
          if (funcPtr) {
             if (entry->test) {
@@ -436,21 +3584,36 @@ check_functions( const char *extensions )
                if (b) {
                   printf(" Pass\n");
                   passes++;
+                  totalPass++;
                }
                else {
                   printf(" FAIL!!!\n");
                   failures++;
+                  totalFail++;
                }
             }
             else {
-               passes++;
+               untested++;
+               totalUntested++;
             }
          }
          else {
             printf("   glXGetProcAddress(%s) failed!\n", entry->name);
             failures++;
+            totalFail++;
          }
       }
+      else {
+         /* Here, we have a function that belongs to a group that
+          * is known to be unsupported.
+          */
+         totalUnsupported++;
+      }
+
+      /* Make sure a poor test case doesn't leave any lingering
+       * OpenGL errors.
+       */
+      CheckGLError(__LINE__, __FILE__, __FUNCTION__);
 
       if (doTests && (!(entry+1)->name || (entry+1)->name[0] == '-')) {
          if (failures > 0) {
@@ -459,18 +3622,29 @@ check_functions( const char *extensions )
          if (passes > 0) {
             printf("   %d passed.\n", passes);
          }
+         if (untested > 0) {
+            printf("   %d untested.\n", untested);
+         }
       }
    }
-   totalFail += failures;
-   totalPass += passes;
 
    printf("-----------------------------\n");
-   printf("Total: %d pass  %d fail\n", totalPass, totalFail);
+   printf("Total: %d pass  %d fail  %d untested  %d unsupported  %d total\n", 
+      totalPass, totalFail, totalUntested, totalUnsupported,
+      totalPass + totalFail + totalUntested + totalUnsupported);
+
+   return totalFail;
 }
 
 
+/* Return an error code */
+#define ERROR_NONE 0
+#define ERROR_NO_VISUAL 1
+#define ERROR_NO_CONTEXT 2
+#define ERROR_NO_MAKECURRENT 3
+#define ERROR_FAILED 4
 
-static void
+static int
 print_screen_info(Display *dpy, int scrnum, Bool allowDirect)
 {
    Window win;
@@ -496,6 +3670,7 @@ print_screen_info(Display *dpy, int scrnum, Bool allowDirect)
    GLXContext ctx;
    XVisualInfo *visinfo;
    int width = 100, height = 100;
+   int failures;
 
    root = RootWindow(dpy, scrnum);
 
@@ -504,7 +3679,7 @@ print_screen_info(Display *dpy, int scrnum, Bool allowDirect)
       visinfo = glXChooseVisual(dpy, scrnum, attribDouble);
       if (!visinfo) {
          fprintf(stderr, "Error: couldn't find RGB GLX visual\n");
-         return;
+         return ERROR_NO_VISUAL;
       }
    }
 
@@ -521,26 +3696,29 @@ print_screen_info(Display *dpy, int scrnum, Bool allowDirect)
    if (!ctx) {
       fprintf(stderr, "Error: glXCreateContext failed\n");
       XDestroyWindow(dpy, win);
-      return;
+      return ERROR_NO_CONTEXT;
    }
 
-   if (glXMakeCurrent(dpy, win, ctx)) {
-      check_functions( (const char *) glGetString(GL_EXTENSIONS) );
-   }
-   else {
+   if (!glXMakeCurrent(dpy, win, ctx)) {
       fprintf(stderr, "Error: glXMakeCurrent failed\n");
+      glXDestroyContext(dpy, ctx);
+      XDestroyWindow(dpy, win);
+      return ERROR_NO_MAKECURRENT;
    }
 
+   failures = check_functions( (const char *) glGetString(GL_EXTENSIONS) );
    glXDestroyContext(dpy, ctx);
    XDestroyWindow(dpy, win);
-}
 
+   return (failures == 0 ? ERROR_NONE : ERROR_FAILED);
+}
 
 int
 main(int argc, char *argv[])
 {
    char *displayName = NULL;
    Display *dpy;
+   int returnCode;
 
    dpy = XOpenDisplay(displayName);
    if (!dpy) {
@@ -548,9 +3726,9 @@ main(int argc, char *argv[])
       return -1;
    }
 
-   print_screen_info(dpy, 0, GL_TRUE);
+   returnCode = print_screen_info(dpy, 0, GL_TRUE);
 
    XCloseDisplay(dpy);
 
-   return 0;
+   return returnCode;
 }
index 8adfc51..699195b 100644 (file)
@@ -52,7 +52,7 @@ static struct name_test_pair functions[] = {"""
                prev_category = None
                
 
-               for f in api.functionIterateByOffset():
+               for f in api.functionIterateByCategory():
                        [category, num] = api.get_category_for_name( f.name )
                        if category != prev_category:
                                print '   { "-%s", NULL},' % category
index e4818a8..71f29b4 100644 (file)
@@ -15,7 +15,7 @@ static int Win;
 
 
 static void
-TestGetTexImage(void)
+TestGetTexImage(GLboolean npot)
 {
    GLuint iter;
    GLubyte *data = (GLubyte *) malloc(1024 * 1024 * 4);
@@ -27,8 +27,8 @@ TestGetTexImage(void)
 
    for (iter = 0; iter < 8; iter++) {
       GLint p = (iter % 8) + 3;
-      GLint w = (1 << p);
-      GLint h = (1 << p);
+      GLint w = npot ? (p * 20) : (1 << p);
+      GLint h = npot ? (p * 10) : (1 << p);
       GLuint i;
       GLint level = 0;
 
@@ -83,63 +83,94 @@ ColorsEqual(const GLubyte ref[4], const GLubyte act[4])
 
 
 static void
-TestGetTexImageRTT(void)
+TestGetTexImageRTT(GLboolean npot)
 {
    GLuint iter;
-   GLuint fb, tex;
-   GLint w = 512;
-   GLint h = 256;
-   GLint level = 0;
-   
-   glGenTextures(1, &tex);
-   glGenFramebuffersEXT(1, &fb);
-
-   glBindTexture(GL_TEXTURE_2D, tex);
-   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0,
-                GL_RGBA, GL_UNSIGNED_BYTE, NULL);
-
-   glBindFramebuffer(GL_FRAMEBUFFER_EXT, fb);
-   glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
-                             GL_TEXTURE_2D, tex, level);
 
    printf("Render to texture + glGetTexImage:\n");
-   printf("  Testing %d x %d tex image\n", w, h);
+
    for (iter = 0; iter < 8; iter++) {
-      GLubyte color[4];
-      GLubyte *data2 = (GLubyte *) malloc(w * h * 4);
-      GLuint i;
 
-      /* random clear color */
-      for (i = 0; i < 4; i++) {
-         color[i] = rand() % 256;
+      GLuint fb, tex;
+      GLint w, h;
+      GLint level = 0;
+
+      if (npot) {
+         w = 200 + iter * 40;
+         h = 200 + iter * 12;
+      }
+      else {
+         w = 4 << iter;
+         h = 4 << iter;
       }
 
-      glClearColor(color[0] / 255.0,
-                   color[1] / 255.0,
-                   color[2] / 255.0,
-                   color[3] / 255.0);
+      glGenTextures(1, &tex);
+      glGenFramebuffersEXT(1, &fb);
 
-      glClear(GL_COLOR_BUFFER_BIT);
+      glBindTexture(GL_TEXTURE_2D, tex);
+      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0,
+                   GL_RGBA, GL_UNSIGNED_BYTE, NULL);
 
-      /* get */
-      glGetTexImage(GL_TEXTURE_2D, level, GL_RGBA, GL_UNSIGNED_BYTE, data2);
+      glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);
+      glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
+                                GL_TEXTURE_2D, tex, level);
 
-      /* compare */
-      for (i = 0; i < w * h; i += 4) {
-         if (!ColorsEqual(color, data2 + i * 4)) {
-            printf("Render to texture failure!\n");
-            abort();
+      glViewport(0, 0, w, h);
+
+      printf("  Testing %d x %d tex image\n", w, h);
+      {
+         static const GLubyte blue[4] = {0, 0, 255, 255};
+         GLubyte color[4];
+         GLubyte *data2 = (GLubyte *) malloc(w * h * 4);
+         GLuint i;
+
+         /* random clear color */
+         for (i = 0; i < 4; i++) {
+            color[i] = rand() % 256;
+         }
+
+         glClearColor(color[0] / 255.0,
+                      color[1] / 255.0,
+                      color[2] / 255.0,
+                      color[3] / 255.0);
+
+         glClear(GL_COLOR_BUFFER_BIT);
+
+         /* draw polygon over top half, in blue */
+         glColor4ubv(blue);
+         glRectf(0, 0.5, 1.0, 1.0);
+
+         /* get */
+         glGetTexImage(GL_TEXTURE_2D, level, GL_RGBA, GL_UNSIGNED_BYTE, data2);
+
+         /* compare */
+         for (i = 0; i < w * h; i += 4) {
+            if (i < w * h / 2) {
+               /* lower half */
+               if (!ColorsEqual(color, data2 + i * 4)) {
+                  printf("Render to texture failure (expected clear color)!\n");
+                  abort();
+               }
+            }
+            else {
+               /* upper half */
+               if (!ColorsEqual(blue, data2 + i * 4)) {
+                  printf("Render to texture failure (expected blue)!\n");
+                  abort();
+               }
+            }
          }
+
+         free(data2);
       }
 
-      free(data2);
-   }
+      glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+      glDeleteFramebuffersEXT(1, &fb);
+      glDeleteTextures(1, &tex);
 
-   glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
-   glDeleteFramebuffersEXT(1, &fb);
-   glDeleteTextures(1, &tex);
+   }
 
    printf("Passed\n");
 }
@@ -152,11 +183,16 @@ Draw(void)
 {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
-   TestGetTexImage();
+   TestGetTexImage(GL_FALSE);
+   if (glutExtensionSupported("GL_ARB_texture_non_power_of_two"))
+      TestGetTexImage(GL_TRUE);
 
    if (glutExtensionSupported("GL_EXT_framebuffer_object") ||
-       glutExtensionSupported("GL_ARB_framebuffer_object"))
-      TestGetTexImageRTT();
+       glutExtensionSupported("GL_ARB_framebuffer_object")) {
+      TestGetTexImageRTT(GL_FALSE);
+      if (glutExtensionSupported("GL_ARB_texture_non_power_of_two"))
+         TestGetTexImageRTT(GL_TRUE);
+   }
 
    glutDestroyWindow(Win);
    exit(0);
@@ -171,10 +207,10 @@ Reshape(int width, int height)
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
-   glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
+   glOrtho(0, 1, 0, 1, -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
-   glTranslatef(0.0, 0.0, -15.0);
+   glTranslatef(0.0, 0.0, 0.0);
 }
 
 
index 79a5f95..50106bf 100644 (file)
@@ -6,6 +6,7 @@
 #include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <GL/glew.h>
 #include <GL/glut.h>
 
@@ -31,6 +32,8 @@ CheckError(int line)
 static void
 LoadCompressedImage(void)
 {
+   unsigned char ImgDataTemp[ImgSize / 4];
+   unsigned i;
    const GLenum filter = GL_LINEAR;
    glTexImage2D(Target, 0, CompFormat, ImgWidth, ImgHeight, 0,
                 GL_RGB, GL_UNSIGNED_BYTE, NULL);
@@ -40,11 +43,24 @@ LoadCompressedImage(void)
                                 0, 0, /* pos */
                                 ImgWidth, ImgHeight / 2,
                                 CompFormat, ImgSize / 2, ImgData + ImgSize / 2);
-   /* top half */
+
+   /* top left */
+   for (i = 0; i < ImgHeight / 8; i++) {
+      memcpy(&ImgDataTemp[i * ImgWidth], &ImgData[i * 2 * ImgWidth], ImgWidth);
+   }
    glCompressedTexSubImage2DARB(Target, 0,
                                 0, ImgHeight / 2, /* pos */
-                                ImgWidth, ImgHeight / 2,
-                                CompFormat, ImgSize / 2, ImgData);
+                                ImgWidth / 2, ImgHeight / 2,
+                                CompFormat, ImgSize / 4, ImgDataTemp);
+
+   /* top right */
+   for (i = 0; i < ImgHeight / 8; i++) {
+      memcpy(&ImgDataTemp[i * ImgWidth], &ImgData[i * 2 * ImgWidth + ImgWidth], ImgWidth);
+   }
+   glCompressedTexSubImage2DARB(Target, 0,
+                                ImgWidth / 2, ImgHeight / 2, /* pos */
+                                ImgWidth / 2, ImgHeight / 2,
+                                CompFormat, ImgSize / 4, ImgDataTemp);
 
    glTexParameteri(Target, GL_TEXTURE_MIN_FILTER, filter);
    glTexParameteri(Target, GL_TEXTURE_MAG_FILTER, filter);
index 12f045b..92c8a2f 100644 (file)
@@ -258,8 +258,26 @@ static void Init( void )
    }
 
    glBindTexture(GL_TEXTURE_2D, BORDER_TEXTURE);
+#ifdef TEST_PBO_DLIST
+   /* test fetching teximage from PBO in display list */
+   {
+      GLuint b = 42, l = 10;
+
+      glBindBufferARB(GL_PIXEL_UNPACK_BUFFER, b);
+      glBufferDataARB(GL_PIXEL_UNPACK_BUFFER, sizeof(BorderImage),
+                      BorderImage, GL_STREAM_DRAW);
+
+      glNewList(l, GL_COMPILE);
+      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SIZE+2, SIZE+2, 1,
+                GL_RGBA, GL_UNSIGNED_BYTE, (void *) 0/* BorderImage*/);
+      glEndList();
+      glCallList(l);
+      glBindBufferARB(GL_PIXEL_UNPACK_BUFFER, 0);
+   }
+#else
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SIZE+2, SIZE+2, 1,
                 GL_RGBA, GL_UNSIGNED_BYTE, (void *) BorderImage);
+#endif
 
    for (i = 0; i < SIZE; i++) {
       for (j = 0; j < SIZE; j++) {
index dce733a..4d6e405 100644 (file)
@@ -5,10 +5,17 @@ clear-random
 clear-repeat
 clear-scissor
 clear-undefined
+createwin
+dlist-begin-call-end
 dlist-dangling
 dlist-degenerate
 dlist-edgeflag
 dlist-edgeflag-dangling
+dlist-flat-tri
+dlist-mat-tri
+dlist-recursive-call
+dlist-tri-flat-tri
+dlist-tri-mat-tri
 draw2arrays
 drawarrays
 drawelements
@@ -31,6 +38,7 @@ lineloop
 lineloop-clip
 lineloop-elts
 linestrip
+linestrip-clip
 linestrip-flat-stipple
 linestrip-stipple
 linestrip-stipple-wide
@@ -71,8 +79,10 @@ quadstrip-cont
 quadstrip-flat
 readtex.c
 readtex.h
+readpixels
 tri
 tri-alpha
+tri-alpha-tex
 tri-array-interleaved
 tri-blend
 tri-blend-color
@@ -80,6 +90,7 @@ tri-blend-max
 tri-blend-min
 tri-blend-revsub
 tri-blend-sub
+tri-clear
 tri-clip
 tri-cull
 tri-cull-both
@@ -94,6 +105,7 @@ tri-fog
 tri-fp
 tri-fp-const-imm
 tri-lit
+tri-lit-material
 tri-logicop-none
 tri-logicop-xor
 tri-mask-tri
@@ -102,6 +114,7 @@ tri-orig
 tri-query
 tri-repeat
 tri-scissor-tri
+tri-square
 tri-stencil
 tri-stipple
 tri-tex
@@ -111,6 +124,7 @@ tri-unfilled
 tri-unfilled-clip
 tri-unfilled-edgeflag
 tri-unfilled-fog
+tri-unfilled-point
 tri-unfilled-smooth
 tri-unfilled-tri
 tri-unfilled-tri-lit
@@ -119,6 +133,7 @@ tri-unfilled-userclip-stip
 tri-userclip
 tri-viewport
 tri-z
+tri-z-9
 tri-z-eq
 trifan
 trifan-flat
index 3bd8faf..7072861 100644 (file)
@@ -18,6 +18,7 @@ SOURCES = \
        clear-repeat.c \
        clear-random.c \
        clear.c \
+       createwin.c \
        dlist-dangling.c \
        dlist-flat-tri.c \
        dlist-mat-tri.c \
@@ -48,6 +49,7 @@ SOURCES = \
        lineloop-clip.c \
        lineloop-elts.c \
        lineloop.c \
+       linestrip-clip.c \
        linestrip-flat-stipple.c \
        linestrip-stipple-wide.c \
        linestrip-stipple.c \
@@ -87,7 +89,9 @@ SOURCES = \
        quadstrip-cont.c \
        quadstrip-flat.c \
        quadstrip.c \
+       readpixels.c \
        tri-alpha.c \
+       tri-alpha-tex.c \
        tri-array-interleaved.c \
        tri-blend-color.c \
        tri-blend-max.c \
@@ -95,6 +99,7 @@ SOURCES = \
        tri-blend-revsub.c \
        tri-blend-sub.c \
        tri-blend.c \
+       tri-clear.c \
        tri-clip.c \
        tri-cull-both.c \
        tri-cull.c \
@@ -117,6 +122,7 @@ SOURCES = \
        tri-query.c \
        tri-repeat.c \
        tri-scissor-tri.c \
+       tri-square.c \
        tri-stencil.c \
        tri-stipple.c \
        tri-multitex-vbo.c \
@@ -126,6 +132,7 @@ SOURCES = \
        tri-unfilled-fog.c \
        tri-unfilled-edgeflag.c \
        tri-unfilled-clip.c \
+       tri-unfilled-point.c \
        tri-unfilled-smooth.c \
        tri-unfilled-tri.c \
        tri-unfilled-tri-lit.c \
@@ -134,6 +141,7 @@ SOURCES = \
        tri-unfilled.c \
        tri-userclip.c \
        tri-viewport.c \
+       tri-z-9.c \
        tri-z-eq.c \
        tri-z.c \
        tri.c \
index 13b68d9..489e71c 100644 (file)
@@ -9,21 +9,12 @@
 #include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <GL/glew.h>
 #include <GL/glut.h>
 #include "shaderutil.h"
 
 
-static void
-Init(void)
-{
-   static GLboolean firstCall = GL_TRUE;
-   if (firstCall) {
-      firstCall = GL_FALSE;
-   }
-}
-
-
 GLboolean
 ShadersSupported(void)
 {
@@ -47,8 +38,6 @@ CompileShaderText(GLenum shaderType, const char *text)
    GLuint shader;
    GLint stat;
 
-   Init();
-
    shader = glCreateShader(shaderType);
    glShaderSource(shader, 1, (const GLchar **) &text, NULL);
    glCompileShader(shader);
@@ -79,9 +68,6 @@ CompileShaderFile(GLenum shaderType, const char *filename)
    GLuint shader;
    FILE *f;
 
-   Init();
-
-
    f = fopen(filename, "r");
    if (!f) {
       fprintf(stderr, "Unable to open shader file %s\n", filename);
@@ -136,7 +122,7 @@ LinkShaders(GLuint vertShader, GLuint fragShader)
 
 
 void
-InitUniforms(GLuint program, struct uniform_info uniforms[])
+SetUniformValues(GLuint program, struct uniform_info uniforms[])
 {
    GLuint i;
 
@@ -144,28 +130,133 @@ InitUniforms(GLuint program, struct uniform_info uniforms[])
       uniforms[i].location
          = glGetUniformLocation(program, uniforms[i].name);
 
-      printf("Uniform %s location: %d\n", uniforms[i].name,
-             uniforms[i].location);
-
-      switch (uniforms[i].size) {
-      case 1:
-         if (uniforms[i].type == GL_INT)
-            glUniform1i(uniforms[i].location,
-                             (GLint) uniforms[i].value[0]);
-         else
-            glUniform1fv(uniforms[i].location, 1, uniforms[i].value);
+      switch (uniforms[i].type) {
+      case GL_INT:
+      case GL_SAMPLER_1D:
+      case GL_SAMPLER_2D:
+      case GL_SAMPLER_3D:
+      case GL_SAMPLER_CUBE:
+      case GL_SAMPLER_2D_RECT_ARB:
+         glUniform1i(uniforms[i].location,
+                     (GLint) uniforms[i].value[0]);
+         break;
+      case GL_FLOAT:
+         glUniform1fv(uniforms[i].location, 1, uniforms[i].value);
          break;
-      case 2:
+      case GL_FLOAT_VEC2:
          glUniform2fv(uniforms[i].location, 1, uniforms[i].value);
          break;
-      case 3:
+      case GL_FLOAT_VEC3:
          glUniform3fv(uniforms[i].location, 1, uniforms[i].value);
          break;
-      case 4:
+      case GL_FLOAT_VEC4:
          glUniform4fv(uniforms[i].location, 1, uniforms[i].value);
          break;
       default:
-         abort();
+         if (strncmp(uniforms[i].name, "gl_", 3) == 0) {
+            /* built-in uniform: ignore */
+         }
+         else {
+            fprintf(stderr,
+                    "Unexpected uniform data type in SetUniformValues\n");
+            abort();
+         }
       }
    }
 }
+
+
+/** Get list of uniforms used in the program */
+GLuint
+GetUniforms(GLuint program, struct uniform_info uniforms[])
+{
+   GLint n, max, i;
+
+   glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &n);
+   glGetProgramiv(program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &max);
+
+   for (i = 0; i < n; i++) {
+      GLint size, len;
+      GLenum type;
+      char name[100];
+
+      glGetActiveUniform(program, i, 100, &len, &size, &type, name);
+
+      uniforms[i].name = strdup(name);
+      uniforms[i].size = size;
+      uniforms[i].type = type;
+      uniforms[i].location = glGetUniformLocation(program, name);
+   }
+
+   uniforms[i].name = NULL; /* end of list */
+
+   return n;
+}
+
+
+void
+PrintUniforms(const struct uniform_info uniforms[])
+{
+   GLint i;
+
+   printf("Uniforms:\n");
+
+   for (i = 0; uniforms[i].name; i++) {
+      printf("  %d: %s size=%d type=0x%x loc=%d value=%g, %g, %g, %g\n",
+             i,
+             uniforms[i].name,
+             uniforms[i].size,
+             uniforms[i].type,
+             uniforms[i].location,
+             uniforms[i].value[0],
+             uniforms[i].value[1],
+             uniforms[i].value[2],
+             uniforms[i].value[3]);
+   }
+}
+
+
+/** Get list of attribs used in the program */
+GLuint
+GetAttribs(GLuint program, struct attrib_info attribs[])
+{
+   GLint n, max, i;
+
+   glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &n);
+   glGetProgramiv(program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max);
+
+   for (i = 0; i < n; i++) {
+      GLint size, len;
+      GLenum type;
+      char name[100];
+
+      glGetActiveAttrib(program, i, 100, &len, &size, &type, name);
+
+      attribs[i].name = strdup(name);
+      attribs[i].size = size;
+      attribs[i].type = type;
+      attribs[i].location = glGetAttribLocation(program, name);
+   }
+
+   attribs[i].name = NULL; /* end of list */
+
+   return n;
+}
+
+
+void
+PrintAttribs(const struct attrib_info attribs[])
+{
+   GLint i;
+
+   printf("Attribs:\n");
+
+   for (i = 0; attribs[i].name; i++) {
+      printf("  %d: %s size=%d type=0x%x loc=%d\n",
+             i,
+             attribs[i].name,
+             attribs[i].size,
+             attribs[i].type,
+             attribs[i].location);
+   }
+}
index cfb8c1f..0a6be02 100644 (file)
@@ -6,8 +6,8 @@
 struct uniform_info
 {
    const char *name;
-   GLuint size;
-   GLenum type;  /**< GL_FLOAT or GL_INT */
+   GLuint size;  /**< number of value[] elements: 1, 2, 3 or 4 */
+   GLenum type;  /**< GL_FLOAT, GL_FLOAT_VEC4, GL_INT, etc */
    GLfloat value[4];
    GLint location;  /**< filled in by InitUniforms() */
 };
@@ -15,6 +15,15 @@ struct uniform_info
 #define END_OF_UNIFORMS   { NULL, 0, GL_NONE, { 0, 0, 0, 0 }, -1 }
 
 
+struct attrib_info
+{
+   const char *name;
+   GLuint size;  /**< number of value[] elements: 1, 2, 3 or 4 */
+   GLenum type;  /**< GL_FLOAT, GL_FLOAT_VEC4, GL_INT, etc */
+   GLint location;
+};
+
+
 extern GLboolean
 ShadersSupported(void);
 
@@ -28,7 +37,18 @@ extern GLuint
 LinkShaders(GLuint vertShader, GLuint fragShader);
 
 extern void
-InitUniforms(GLuint program, struct uniform_info uniforms[]);
+SetUniformValues(GLuint program, struct uniform_info uniforms[]);
+
+extern GLuint
+GetUniforms(GLuint program, struct uniform_info uniforms[]);
+
+extern void
+PrintUniforms(const struct uniform_info uniforms[]);
 
+extern GLuint
+GetAttribs(GLuint program, struct attrib_info attribs[]);
+
+extern void
+PrintAttribs(const struct attrib_info attribs[]);
 
 #endif /* SHADER_UTIL_H */
index aea87b7..83aebf6 100644 (file)
@@ -1,5 +1,5 @@
 !!ARBvp1.0
-PARAM arr[5]  = { {.0,.1,.2,.3}, {.4,.5,.6,.7}, {.8,.9,.10,.1}, {.12,.3,.4,.14}, {.5,.8,.1,.9},  {.2,0,.4,.1}, {.6,.1,.8,.9}};
+PARAM arr[7]  = { {.0,.1,.2,.3}, {.4,.5,.6,.7}, {.8,.9,.10,.1}, {.12,.3,.4,.14}, {.5,.8,.1,.9},  {.2,0,.4,.1}, {.6,.1,.8,.9}};
 ADDRESS addr;
 ARL addr.x, {3}.x;
 MOV result.color, arr[addr.x];
index 7bdbb8e..c2afe3c 100644 (file)
@@ -1,5 +1,5 @@
 !!ARBvp1.0
-PARAM arr[5]  = { {.0,.1,.2,.3}, {.4,.5,.6,.7}, {.8,.9,.10,.1}, {.12,.3,.4,.14}, {.5,.8,.1,.9},  {.2,0,.4,.1}, {.6,.1,.8,.9}};
+PARAM arr[7]  = { {.0,.1,.2,.3}, {.4,.5,.6,.7}, {.8,.9,.10,.1}, {.12,.3,.4,.14}, {.5,.8,.1,.9},  {.2,0,.4,.1}, {.6,.1,.8,.9}};
 ADDRESS addr;
 ARL addr.x, {3}.x;  # not actually used
 MOV result.color, arr[3];
index 6581df8..53e1c54 100644 (file)
@@ -26,6 +26,7 @@ PROGS = \
        glxsnoop \
        glxswapcontrol \
        manywin \
+       multictx \
        offset \
        overlay \
        pbinfo \
index 481749b..9f83679 100644 (file)
@@ -378,6 +378,9 @@ make_window( Display *dpy, const char *name,
    scrnum = DefaultScreen( dpy );
    root = RootWindow( dpy, scrnum );
 
+   if (visinfo)
+          XFree(visinfo);
+
    visinfo = glXChooseVisual( dpy, scrnum, attribs );
    if (!visinfo) {
       printf("Error: couldn't get an RGB, Double-buffered visual\n");
index bc84ee3..088f25a 100644 (file)
  * This is a port of the infamous "gears" demo to straight GLX (i.e. no GLUT)
  * Port by Brian Paul  23 March 2001
  *
- * Command line options:
- *    -info      print GL implementation information
- *    -stereo    use stereo enabled GLX visual
- *
+ * See usage() below for command line options.
  */
 
 
@@ -45,10 +42,6 @@ typedef int (*PFNGLXGETSWAPINTERVALMESAPROC)(void);
 #endif
 
 
-static int is_glx_extension_supported(Display *dpy, const char *query);
-
-static void query_vsync(Display *dpy);
-
 #define BENCHMARK
 
 #ifdef BENCHMARK
@@ -572,7 +565,7 @@ make_window( Display *dpy, const char *name,
 /**
  * Determine whether or not a GLX extension is supported.
  */
-int
+static int
 is_glx_extension_supported(Display *dpy, const char *query)
 {
    const int scrnum = DefaultScreen(dpy);
@@ -592,7 +585,7 @@ is_glx_extension_supported(Display *dpy, const char *query)
 /**
  * Attempt to determine whether or not the display is synched to vblank.
  */
-void
+static void
 query_vsync(Display *dpy)
 {
    int interval = 0;
index df9f7ad..cd60d46 100644 (file)
@@ -587,6 +587,9 @@ event_loop(Display *dpy, Window win)
       angle += 2.0;
 
       draw();
+
+      glXSwapBuffers(dpy, win);
+
       if ( get_frame_usage != NULL ) {
         GLfloat   temp;
         
@@ -594,8 +597,6 @@ event_loop(Display *dpy, Window win)
         frame_usage += temp;
       }
 
-      glXSwapBuffers(dpy, win);
-
       /* calc framerate */
       {
          static int t0 = -1;
diff --git a/progs/xdemos/multictx.c b/progs/xdemos/multictx.c
new file mode 100644 (file)
index 0000000..75255b2
--- /dev/null
@@ -0,0 +1,585 @@
+/*
+ * Copyright (C) 2009  VMware, Inc.   All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Test rendering with two contexts into one window.
+ * Setup different rendering state for each context to check that
+ * context switching is handled properly.
+ *
+ * Brian Paul
+ * 6 Aug 2009
+ */
+
+
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <X11/Xlib.h>
+#include <X11/keysym.h>
+#include <GL/gl.h>
+#include <GL/glx.h>
+
+
+
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+
+/** Event handler results: */
+#define NOP 0
+#define EXIT 1
+#define DRAW 2
+
+static GLfloat view_rotx = 0.0, view_roty = 210.0, view_rotz = 0.0;
+static GLint gear1, gear2;
+static GLfloat angle = 0.0;
+
+static GLboolean animate = GL_TRUE;    /* Animation */
+
+
+static double
+current_time(void)
+{
+   struct timeval tv;
+#ifdef __VMS
+   (void) gettimeofday(&tv, NULL );
+#else
+   struct timezone tz;
+   (void) gettimeofday(&tv, &tz);
+#endif
+   return (double) tv.tv_sec + tv.tv_usec / 1000000.0;
+}
+
+
+/*
+ *
+ *  Draw a gear wheel.  You'll probably want to call this function when
+ *  building a display list since we do a lot of trig here.
+ * 
+ *  Input:  inner_radius - radius of hole at center
+ *          outer_radius - radius at center of teeth
+ *          width - width of gear
+ *          teeth - number of teeth
+ *          tooth_depth - depth of tooth
+ */
+static void
+gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
+     GLint teeth, GLfloat tooth_depth)
+{
+   GLint i;
+   GLfloat r0, r1, r2;
+   GLfloat angle, da;
+   GLfloat u, v, len;
+
+   r0 = inner_radius;
+   r1 = outer_radius - tooth_depth / 2.0;
+   r2 = outer_radius + tooth_depth / 2.0;
+
+   da = 2.0 * M_PI / teeth / 4.0;
+
+   glShadeModel(GL_FLAT);
+
+   glNormal3f(0.0, 0.0, 1.0);
+
+   /* draw front face */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i <= teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+      if (i < teeth) {
+        glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                   width * 0.5);
+      }
+   }
+   glEnd();
+
+   /* draw front sides of teeth */
+   glBegin(GL_QUADS);
+   da = 2.0 * M_PI / teeth / 4.0;
+   for (i = 0; i < teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                width * 0.5);
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                width * 0.5);
+   }
+   glEnd();
+
+   glNormal3f(0.0, 0.0, -1.0);
+
+   /* draw back face */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i <= teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+      if (i < teeth) {
+        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                   -width * 0.5);
+        glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+      }
+   }
+   glEnd();
+
+   /* draw back sides of teeth */
+   glBegin(GL_QUADS);
+   da = 2.0 * M_PI / teeth / 4.0;
+   for (i = 0; i < teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                -width * 0.5);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                -width * 0.5);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+   }
+   glEnd();
+
+   /* draw outward faces of teeth */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i < teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+      glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+      u = r2 * cos(angle + da) - r1 * cos(angle);
+      v = r2 * sin(angle + da) - r1 * sin(angle);
+      len = sqrt(u * u + v * v);
+      u /= len;
+      v /= len;
+      glNormal3f(v, -u, 0.0);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+      glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+      glNormal3f(cos(angle), sin(angle), 0.0);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                width * 0.5);
+      glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da),
+                -width * 0.5);
+      u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
+      v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
+      glNormal3f(v, -u, 0.0);
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                width * 0.5);
+      glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da),
+                -width * 0.5);
+      glNormal3f(cos(angle), sin(angle), 0.0);
+   }
+
+   glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
+   glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);
+
+   glEnd();
+
+   glShadeModel(GL_SMOOTH);
+
+   /* draw inside radius cylinder */
+   glBegin(GL_QUAD_STRIP);
+   for (i = 0; i <= teeth; i++) {
+      angle = i * 2.0 * M_PI / teeth;
+      glNormal3f(-cos(angle), -sin(angle), 0.0);
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+      glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+   }
+   glEnd();
+}
+
+
+static void
+draw(int ctx)
+{
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+   glPushMatrix();
+   glRotatef(view_rotx, 1.0, 0.0, 0.0);
+   glRotatef(view_roty + angle, 0.0, 1.0, 0.0);
+   glRotatef(view_rotz, 0.0, 0.0, 1.0);
+
+   if (ctx == 0) {
+      glDisable(GL_CULL_FACE);
+      glPushMatrix();
+      glRotatef(angle, 0.0, 0.0, 1.0);
+      glCallList(gear1);
+      glPopMatrix();
+      /* This should not effect the other context's rendering */
+      glEnable(GL_CULL_FACE);
+      glCullFace(GL_FRONT_AND_BACK);
+   }
+   else {
+      glPushMatrix();
+      glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);
+      glCallList(gear2);
+      glPopMatrix();
+   }
+
+   glPopMatrix();
+
+   /* this flush is important since we'll be switching contexts next */
+   glFlush();
+}
+
+
+
+static void
+draw_frame(Display *dpy, Window win, GLXContext ctx1, GLXContext ctx2)
+{
+   static double tRot0 = -1.0;
+   double dt, t = current_time();
+
+   if (tRot0 < 0.0)
+      tRot0 = t;
+   dt = t - tRot0;
+   tRot0 = t;
+
+   if (animate) {
+      /* advance rotation for next frame */
+      angle += 70.0 * dt;  /* 70 degrees per second */
+      if (angle > 3600.0)
+         angle -= 3600.0;
+   }
+
+   glXMakeCurrent(dpy, (GLXDrawable) win, ctx1);
+   draw(0);
+
+   glXMakeCurrent(dpy, (GLXDrawable) win, ctx2);
+   draw(1);
+
+   glXSwapBuffers(dpy, win);
+}
+
+
+/* new window size or exposure */
+static void
+reshape(Display *dpy, Window win,
+        GLXContext ctx1, GLXContext ctx2, int width, int height)
+{
+   int i;
+
+   width /= 2;
+
+   /* loop: left half of window, right half of window */
+   for (i = 0; i < 2; i++) {
+      if (i == 0)
+         glXMakeCurrent(dpy, win, ctx1);
+      else
+         glXMakeCurrent(dpy, win, ctx2);
+
+      glViewport(width * i, 0, width, height);
+      glScissor(width * i, 0, width, height);
+
+      {
+         GLfloat h = (GLfloat) height / (GLfloat) width;
+
+         glMatrixMode(GL_PROJECTION);
+         glLoadIdentity();
+         glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
+      }
+
+      glMatrixMode(GL_MODELVIEW);
+      glLoadIdentity();
+      glTranslatef(0.0, 0.0, -30.0);
+   }
+}
+   
+
+
+static void
+init(Display *dpy, Window win, GLXContext ctx1, GLXContext ctx2)
+{
+   static GLfloat pos[4] = { 5.0, 5.0, 10.0, 0.0 };
+   static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 };
+   static GLfloat green[4] = { 0.0, 0.8, 0.2, 0.5 };
+   /*static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 };*/
+
+   /* first ctx */
+   {
+      static GLuint stipple[32] = {
+         0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff,
+         0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff,
+
+         0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00,
+         0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00,
+
+         0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff,
+         0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff,
+
+         0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00,
+         0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00
+      };
+
+      glXMakeCurrent(dpy, win, ctx1);
+
+      glLightfv(GL_LIGHT0, GL_POSITION, pos);
+      glEnable(GL_LIGHTING);
+      glEnable(GL_LIGHT0);
+      glEnable(GL_DEPTH_TEST);
+
+      gear1 = glGenLists(1);
+      glNewList(gear1, GL_COMPILE);
+      glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
+      gear(1.0, 4.0, 1.0, 20, 0.7);
+      glEndList();
+
+      glEnable(GL_NORMALIZE);
+      glEnable(GL_SCISSOR_TEST);
+      glClearColor(0.4, 0.4, 0.4, 1.0);
+
+      glPolygonStipple((GLubyte *) stipple);
+      glEnable(GL_POLYGON_STIPPLE);
+   }
+
+   /* second ctx */
+   {
+      glXMakeCurrent(dpy, win, ctx2);
+
+      glLightfv(GL_LIGHT0, GL_POSITION, pos);
+      glEnable(GL_LIGHTING);
+      glEnable(GL_LIGHT0);
+      glEnable(GL_DEPTH_TEST);
+
+      gear2 = glGenLists(1);
+      glNewList(gear2, GL_COMPILE);
+      glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
+      gear(1.5, 3.0, 1.5, 16, 0.7);
+      glEndList();
+
+      glEnable(GL_NORMALIZE);
+      glEnable(GL_SCISSOR_TEST);
+      glClearColor(0.6, 0.6, 0.6, 1.0);
+
+      glEnable(GL_BLEND);
+      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+   }
+}
+
+
+/**
+ * Create an RGB, double-buffered window.
+ * Return the window and two context handles.
+ */
+static void
+make_window_and_contexts( Display *dpy, const char *name,
+                          int x, int y, int width, int height,
+                          Window *winRet,
+                          GLXContext *ctxRet1,
+                          GLXContext *ctxRet2)
+{
+   int attribs[] = { GLX_RGBA,
+                     GLX_RED_SIZE, 1,
+                     GLX_GREEN_SIZE, 1,
+                     GLX_BLUE_SIZE, 1,
+                     GLX_DOUBLEBUFFER,
+                     GLX_DEPTH_SIZE, 1,
+                     None };
+   int scrnum;
+   XSetWindowAttributes attr;
+   unsigned long mask;
+   Window root;
+   Window win;
+   XVisualInfo *visinfo;
+
+   scrnum = DefaultScreen( dpy );
+   root = RootWindow( dpy, scrnum );
+
+   visinfo = glXChooseVisual( dpy, scrnum, attribs );
+   if (!visinfo) {
+      printf("Error: couldn't get an RGB, Double-buffered visual\n");
+      exit(1);
+   }
+
+   /* window attributes */
+   attr.background_pixel = 0;
+   attr.border_pixel = 0;
+   attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone);
+   attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
+   mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
+
+   win = XCreateWindow( dpy, root, x, y, width, height,
+                       0, visinfo->depth, InputOutput,
+                       visinfo->visual, mask, &attr );
+
+   /* set hints and properties */
+   {
+      XSizeHints sizehints;
+      sizehints.x = x;
+      sizehints.y = y;
+      sizehints.width  = width;
+      sizehints.height = height;
+      sizehints.flags = USSize | USPosition;
+      XSetNormalHints(dpy, win, &sizehints);
+      XSetStandardProperties(dpy, win, name, name,
+                              None, (char **)NULL, 0, &sizehints);
+   }
+
+   *winRet = win;
+   *ctxRet1 = glXCreateContext( dpy, visinfo, NULL, True );
+   *ctxRet2 = glXCreateContext( dpy, visinfo, NULL, True );
+
+   if (!*ctxRet1 || !*ctxRet2) {
+      printf("Error: glXCreateContext failed\n");
+      exit(1);
+   }
+
+   XFree(visinfo);
+}
+
+
+/**
+ * Handle one X event.
+ * \return NOP, EXIT or DRAW
+ */
+static int
+handle_event(Display *dpy, Window win, GLXContext ctx1, GLXContext ctx2,
+             XEvent *event)
+{
+   (void) dpy;
+   (void) win;
+
+   switch (event->type) {
+   case Expose:
+      return DRAW;
+   case ConfigureNotify:
+      reshape(dpy, win, ctx1, ctx2,
+              event->xconfigure.width, event->xconfigure.height);
+      break;
+   case KeyPress:
+      {
+         char buffer[10];
+         int r, code;
+         code = XLookupKeysym(&event->xkey, 0);
+         if (code == XK_Left) {
+            view_roty += 5.0;
+         }
+         else if (code == XK_Right) {
+            view_roty -= 5.0;
+         }
+         else if (code == XK_Up) {
+            view_rotx += 5.0;
+         }
+         else if (code == XK_Down) {
+            view_rotx -= 5.0;
+         }
+         else {
+            r = XLookupString(&event->xkey, buffer, sizeof(buffer),
+                              NULL, NULL);
+            if (buffer[0] == 27) {
+               /* escape */
+               return EXIT;
+            }
+            else if (buffer[0] == 'a' || buffer[0] == 'A') {
+               animate = !animate;
+            }
+         }
+         return DRAW;
+      }
+   }
+   return NOP;
+}
+
+
+static void
+event_loop(Display *dpy, Window win, GLXContext ctx1, GLXContext ctx2)
+{
+   while (1) {
+      int op;
+      while (!animate || XPending(dpy) > 0) {
+         XEvent event;
+         XNextEvent(dpy, &event);
+         op = handle_event(dpy, win, ctx1, ctx2, &event);
+         if (op == EXIT)
+            return;
+         else if (op == DRAW)
+            break;
+      }
+
+      draw_frame(dpy, win, ctx1, ctx2);
+   }
+}
+
+
+int
+main(int argc, char *argv[])
+{
+   unsigned int winWidth = 800, winHeight = 400;
+   int x = 0, y = 0;
+   Display *dpy;
+   Window win;
+   GLXContext ctx1, ctx2;
+   char *dpyName = NULL;
+   GLboolean printInfo = GL_FALSE;
+   int i;
+
+   for (i = 1; i < argc; i++) {
+      if (strcmp(argv[i], "-display") == 0) {
+         dpyName = argv[i+1];
+         i++;
+      }
+      else {
+         return 1;
+      }
+   }
+
+   dpy = XOpenDisplay(dpyName);
+   if (!dpy) {
+      printf("Error: couldn't open display %s\n",
+            dpyName ? dpyName : getenv("DISPLAY"));
+      return -1;
+   }
+
+   make_window_and_contexts(dpy, "multictx", x, y, winWidth, winHeight,
+                            &win, &ctx1, &ctx2);
+   XMapWindow(dpy, win);
+
+   if (printInfo) {
+      printf("GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
+      printf("GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
+      printf("GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
+      printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
+   }
+
+   init(dpy, win, ctx1, ctx2);
+
+   /* Set initial projection/viewing transformation.
+    * We can't be sure we'll get a ConfigureNotify event when the window
+    * first appears.
+    */
+   reshape(dpy, win, ctx1, ctx2, winWidth, winHeight);
+
+   event_loop(dpy, win, ctx1, ctx2);
+
+   glDeleteLists(gear1, 1);
+   glDeleteLists(gear2, 1);
+   glXDestroyContext(dpy, ctx1);
+   glXDestroyContext(dpy, ctx2);
+   XDestroyWindow(dpy, win);
+   XCloseDisplay(dpy);
+
+   return 0;
+}
index e9e799d..bf6172b 100644 (file)
@@ -462,6 +462,8 @@ def generate(env):
         shlinkflags += [
             '-Wl,-Bsymbolic',
         ]
+        # Handle circular dependencies in the libraries
+        env['_LIBFLAGS'] = '-Wl,--start-group ' + env['_LIBFLAGS'] + ' -Wl,--end-group'
     if platform == 'windows' and msvc:
         # See also:
         # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx
index 26694c9..444dfb3 100644 (file)
@@ -4,7 +4,7 @@ TOP = ../../../..
 include $(TOP)/configs/current
 
 
-INCLUDE_DIRS = -I$(TOP)/include -I$(TOP)/src/egl/main
+INCLUDE_DIRS = -I$(TOP)/include -I$(TOP)/src/egl/main $(X11_INCLUDES)
 
 
 SOURCES = demo.c
index f316974..e8c0c1d 100644 (file)
@@ -236,7 +236,7 @@ demoDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
 {
    DemoSurface *fs = LookupDemoSurface(surface);
    _eglUnlinkSurface(&fs->Base);
-   if (!fs->Base.IsBound)
+   if (!_eglIsSurfaceBound(&fs->Base))
       free(fs);
    return EGL_TRUE;
 }
@@ -247,7 +247,7 @@ demoDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext context)
 {
    DemoContext *fc = LookupDemoContext(context);
    _eglUnlinkContext(&fc->Base);
-   if (!fc->Base.IsBound)
+   if (!_eglIsContextBound(&fc->Base))
       free(fc);
    return EGL_TRUE;
 }
index 567edfa..7339c97 100644 (file)
@@ -55,6 +55,7 @@ install:
 clean:
        -rm -f *.o
        -rm -f *.so
+       -rm -f depend depend.bak
 
 depend: $(SOURCES) $(HEADERS)
        @ echo "running $(MKDEP)"
index 3f9617a..9e400be 100644 (file)
@@ -296,7 +296,7 @@ _eglDRIDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
 
    fs->drawable.destroyDrawable(disp, fs->drawable.private);
 
-   if (!fs->Base.IsBound)
+   if (!_eglIsSurfaceBound(&fs->Base))
       free(fs);
    return EGL_TRUE;
 }
@@ -312,7 +312,7 @@ _eglDRIDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext context)
 
    fc->driContext.destroyContext(disp, 0, fc->driContext.private);
 
-   if (!fc->Base.IsBound)
+   if (!_eglIsContextBound(&fc->Base))
       free(fc);
    return EGL_TRUE;
 }
index 207b1ea..5ed4b68 100644 (file)
@@ -739,7 +739,7 @@ GLX_eglDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
    return EGL_TRUE;
    if (surf) {
       _eglUnlinkSurface(surf);
-      if (!surf->IsBound)
+      if (!_eglIsSurfaceBound(surf))
          free(surf);
 
       return EGL_TRUE;
index e040efd..d8d29fc 100644 (file)
@@ -958,7 +958,7 @@ xdri_eglDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
    struct xdri_egl_surface *xdri_surf = lookup_surface(surface);
    if (xdri_surf) {
       _eglUnlinkSurface(&xdri_surf->Base);
-      if (!xdri_surf->Base.IsBound) {
+      if (!_eglIsSurfaceBound(&xdri_surf->Base)) {
          /*
          st_unreference_framebuffer(surf->Framebuffer);
          */
index e1ff879..ab61d68 100644 (file)
@@ -4,7 +4,7 @@ TOP = ../../..
 include $(TOP)/configs/current
 
 
-INCLUDE_DIRS = -I$(TOP)/include -I$(TOP)/src/mesa/glapi
+INCLUDE_DIRS = -I$(TOP)/include -I$(TOP)/src/mesa/glapi $(X11_INCLUDES)
 
 HEADERS = \
        eglcompiler.h \
@@ -20,6 +20,7 @@ HEADERS = \
        eglhash.h \
        eglmisc.h \
        eglmode.h \
+       eglmutex.h \
        eglscreen.h \
        eglstring.h \
        eglsurface.h \
@@ -74,6 +75,7 @@ install: default
 clean:
        -rm -f *.o *.so*
        -rm -f core.*
+       -rm -f depend depend.bak
 
 
 depend: $(SOURCES) $(HEADERS)
index f0a6f7f..fde6b73 100644 (file)
@@ -50,7 +50,6 @@ EGLDisplay EGLAPIENTRY
 eglGetDisplay(NativeDisplayType nativeDisplay)
 {
    _EGLDisplay *dpy;
-   _eglInitGlobals();
    dpy = _eglFindDisplay(nativeDisplay);
    if (!dpy) {
       dpy = _eglNewDisplay(nativeDisplay);
index 0b19afe..6b639b7 100644 (file)
@@ -3,6 +3,39 @@
 
 
 /**
+ * Get standard integer types
+ */
+#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)
+#  include <stdint.h>
+#elif defined(_MSC_VER)
+   typedef __int8             int8_t;
+   typedef unsigned __int8    uint8_t;
+   typedef __int16            int16_t;
+   typedef unsigned __int16   uint16_t;
+#  ifndef __eglplatform_h_
+     typedef __int32            int32_t;
+#  endif
+   typedef unsigned __int32   uint32_t;
+   typedef __int64            int64_t;
+   typedef unsigned __int64   uint64_t;
+
+#  if defined(_WIN64)
+     typedef __int64            intptr_t;
+     typedef unsigned __int64   uintptr_t;
+#  else
+     typedef __int32            intptr_t;
+     typedef unsigned __int32   uintptr_t;
+#  endif
+
+#  define INT64_C(__val) __val##i64
+#  define UINT64_C(__val) __val##ui64
+#else
+/* hope the best instead of adding a bunch of ifdef's */
+#  include <stdint.h>
+#endif
+
+
+/**
  * Function inlining
  */
 #if defined(__GNUC__)
index f2f3258..bbc585b 100644 (file)
@@ -34,7 +34,7 @@ void
 _eglInitConfig(_EGLConfig *config, EGLint id)
 {
    memset(config, 0, sizeof(*config));
-   config->Handle = (EGLConfig) id;
+   config->Handle = (EGLConfig) _eglUIntToPointer((unsigned int) id);
    _eglSetConfigAttrib(config, EGL_CONFIG_ID,               id);
    _eglSetConfigAttrib(config, EGL_BIND_TO_TEXTURE_RGB,     EGL_DONT_CARE);
    _eglSetConfigAttrib(config, EGL_BIND_TO_TEXTURE_RGBA,    EGL_DONT_CARE);
index 138dc72..c9d00e7 100644 (file)
@@ -156,6 +156,7 @@ _eglFillInConfigs(_EGLConfig * configs,
             {0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000},  /* 8_8_8_8_REV */
          };
 
+#if 0
    static const uint32_t masks_table_bgr[8][4] = {
             {0x00000000, 0x00000000, 0x00000000, 0x00000000},
             {0x00000000, 0x00000000, 0x00000000, 0x00000000},
@@ -177,6 +178,7 @@ _eglFillInConfigs(_EGLConfig * configs,
             {0x00000000, 0x00000000, 0x00000000, 0x00000000},
             {0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000},  /* 8_8_8_8_REV */
          };
+#endif
 
    static const uint8_t bytes_per_pixel[8] = {
             0, 0, 0, 2, 2, 4, 0, 4
index 9ab4286..88de60d 100644 (file)
@@ -96,7 +96,7 @@ _eglDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext ctx)
    _EGLContext *context = _eglLookupContext(ctx);
    if (context) {
       _eglUnlinkContext(context);
-      if (!context->IsBound)
+      if (!_eglIsContextBound(context))
          free(context);
       return EGL_TRUE;
    }
@@ -146,10 +146,11 @@ _eglQueryContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext ctx,
  * Then, the driver will do its device-dependent Make-Current stuff.
  */
 EGLBoolean
-_eglMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface d,
+_eglMakeCurrent(_EGLDriver *drv, EGLDisplay display, EGLSurface d,
                 EGLSurface r, EGLContext context)
 {
    _EGLThreadInfo *t = _eglGetCurrentThread();
+   _EGLDisplay *dpy = _eglLookupDisplay(display);
    _EGLContext *ctx = _eglLookupContext(context);
    _EGLSurface *draw = _eglLookupSurface(d);
    _EGLSurface *read = _eglLookupSurface(r);
@@ -160,21 +161,23 @@ _eglMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface d,
 
    if (_eglIsCurrentThreadDummy())
       return _eglError(EGL_BAD_ALLOC, "eglMakeCurrent");
+   if (dpy == NULL)
+      return _eglError(EGL_BAD_DISPLAY, "eglMakeCurrent");
 
-   /* error checking */
    if (ctx) {
+      /* error checking */
+      if (ctx->Binding && ctx->Binding != t)
+         return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
       if (draw == NULL || read == NULL) {
-         _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
-         return EGL_FALSE;
-      }
-      if (draw->Config != ctx->Config) {
-         _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
-         return EGL_FALSE;
-      }
-      if (read->Config != ctx->Config) {
-         _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
-         return EGL_FALSE;
+         EGLint err = (d == EGL_NO_SURFACE || r == EGL_NO_SURFACE)
+                      ? EGL_BAD_MATCH : EGL_BAD_SURFACE;
+         return _eglError(err, "eglMakeCurrent");
       }
+      if (draw->Config != ctx->Config || read->Config != ctx->Config)
+         return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
+      if ((draw->Binding && draw->Binding->Binding != t) ||
+          (read->Binding && read->Binding->Binding != t))
+         return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
 
 #ifdef EGL_VERSION_1_4
       /* OpenGL and OpenGL ES are conflicting */
@@ -194,6 +197,10 @@ _eglMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface d,
       apiIndex = _eglConvertApiToIndex(ctx->ClientAPI);
    }
    else {
+      if (context != EGL_NO_CONTEXT)
+         return _eglError(EGL_BAD_CONTEXT, "eglMakeCurrent");
+      if (draw != NULL || read != NULL)
+         return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
       apiIndex = t->CurrentAPIIndex;
    }
 
@@ -201,60 +208,47 @@ _eglMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface d,
    if (oldContext) {
       oldDrawSurface = oldContext->DrawSurface;
       oldReadSurface = oldContext->ReadSurface;
-   }
+      assert(oldDrawSurface);
+      assert(oldReadSurface);
 
-   /*
-    * check if the old context or surfaces need to be deleted
-    */
-   if (oldDrawSurface != NULL) {
-      oldDrawSurface->IsBound = EGL_FALSE;
+      /* break old bindings */
+      t->CurrentContexts[apiIndex] = NULL;
+      oldContext->Binding = NULL;
+      oldContext->DrawSurface = NULL;
+      oldContext->ReadSurface = NULL;
+      oldDrawSurface->Binding = NULL;
+      oldReadSurface->Binding = NULL;
+
+      /*
+       * check if the old context or surfaces need to be deleted
+       * FIXME They are linked so that they can be unlinked.  This is ugly.
+       */
       if (!_eglIsSurfaceLinked(oldDrawSurface)) {
-         /* make sure we don't try to rebind a deleted surface */
-         if (draw == oldDrawSurface || draw == oldReadSurface) {
-            draw = NULL;
-         }
-         /* really delete surface now */
-         drv->API.DestroySurface(drv, dpy, oldDrawSurface->Handle);
+         assert(draw != oldDrawSurface && read != oldDrawSurface);
+         drv->API.DestroySurface(drv, display,
+                                 _eglLinkSurface(oldDrawSurface, dpy));
       }
-   }
-   if (oldReadSurface != NULL && oldReadSurface != oldDrawSurface) {
-      oldReadSurface->IsBound = EGL_FALSE;
-      if (!_eglIsSurfaceLinked(oldReadSurface)) {
-         /* make sure we don't try to rebind a deleted surface */
-         if (read == oldDrawSurface || read == oldReadSurface) {
-            read = NULL;
-         }
-         /* really delete surface now */
-         drv->API.DestroySurface(drv, dpy, oldReadSurface->Handle);
+      if (oldReadSurface != oldDrawSurface &&
+          !_eglIsSurfaceLinked(oldReadSurface)) {
+         assert(draw != oldReadSurface && read != oldReadSurface);
+         drv->API.DestroySurface(drv, display,
+                                 _eglLinkSurface(oldReadSurface, dpy));
       }
-   }
-   if (oldContext != NULL) {
-      oldContext->IsBound = EGL_FALSE;
       if (!_eglIsContextLinked(oldContext)) {
-         /* make sure we don't try to rebind a deleted context */
-         if (ctx == oldContext) {
-            ctx = NULL;
-         }
-         /* really delete context now */
-         drv->API.DestroyContext(drv, dpy, _eglGetContextHandle(oldContext));
+         assert(ctx != oldContext);
+         drv->API.DestroyContext(drv, display,
+                                 _eglLinkContext(oldContext, dpy));
       }
    }
 
+   /* build new bindings */
    if (ctx) {
-      /* check read/draw again, in case we deleted them above */
-      if (draw == NULL || read == NULL) {
-         _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
-         return EGL_FALSE;
-      }
+      t->CurrentContexts[apiIndex] = ctx;
+      ctx->Binding = t;
       ctx->DrawSurface = draw;
       ctx->ReadSurface = read;
-      ctx->IsBound = EGL_TRUE;
-      draw->IsBound = EGL_TRUE;
-      read->IsBound = EGL_TRUE;
-      t->CurrentContexts[apiIndex] = ctx;
-   }
-   else {
-      t->CurrentContexts[apiIndex] = NULL;
+      draw->Binding = ctx;
+      read->Binding = ctx;
    }
 
    return EGL_TRUE;
index 2fb28d3..4276c09 100644 (file)
@@ -15,12 +15,12 @@ struct _egl_context
    _EGLDisplay *Display;
    _EGLContext *Next;
 
-   _EGLConfig *Config;
-
+   /* The bound status of the context */
+   _EGLThreadInfo *Binding;
    _EGLSurface *DrawSurface;
    _EGLSurface *ReadSurface;
 
-   EGLBoolean IsBound;
+   _EGLConfig *Config;
 
    EGLint ClientAPI; /**< EGL_OPENGL_ES_API, EGL_OPENGL_API, EGL_OPENVG_API */
    EGLint ClientVersion; /**< 1 = OpenGLES 1.x, 2 = OpenGLES 2.x */
@@ -51,4 +51,15 @@ _eglMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw, EGLSurface rea
 extern EGLBoolean
 _eglCopyContextMESA(_EGLDriver *drv, EGLDisplay dpy, EGLContext source, EGLContext dest, EGLint mask);
 
+
+/**
+ * Return true if the context is bound to a thread.
+ */
+static INLINE EGLBoolean
+_eglIsContextBound(_EGLContext *ctx)
+{
+   return (ctx->Binding != NULL);
+}
+
+
 #endif /* EGLCONTEXT_INCLUDED */
index 96152db..4431f96 100644 (file)
 #include "eglcurrent.h"
 #include "eglcontext.h"
 #include "egllog.h"
+#include "eglmutex.h"
+#include "eglglobals.h"
 
 
+/* This should be kept in sync with _eglInitThreadInfo() */
+#define _EGL_THREAD_INFO_INITIALIZER \
+   { EGL_SUCCESS, { NULL }, 1 }
+
 /* a fallback thread info to guarantee that every thread always has one */
-static _EGLThreadInfo dummy_thread;
+static _EGLThreadInfo dummy_thread = _EGL_THREAD_INFO_INITIALIZER;
 
 
 #ifdef GLX_USE_TLS
 static __thread const _EGLThreadInfo *_egl_TSD;
    __attribute__ ((tls_model("initial-exec")));
 
-static INLINE EGLBoolean _eglInitTSD(void) { return EGL_TRUE; }
-static INLINE void _eglFiniTSD(void) { }
-static INLINE void _eglSetTSD(const _EGLThreadInfo *t) { _egl_TSD = t; }
+static INLINE void _eglSetTSD(const _EGLThreadInfo *t)
+{
+   _egl_TSD = t;
+}
 
 static INLINE _EGLThreadInfo *_eglGetTSD(void)
 {
    return (_EGLThreadInfo *) _egl_TSD;
 }
 
+static INLINE void _eglFiniTSD(void)
+{
+}
+
+static INLINE EGLBoolean _eglInitTSD(void (*dtor)(_EGLThreadInfo *))
+{
+   /* TODO destroy TSD */
+   (void) dtor;
+   (void) _eglFiniTSD;
+   return EGL_TRUE;
+}
+
 #elif PTHREADS
 #include <pthread.h>
 
+static _EGL_DECLARE_MUTEX(_egl_TSDMutex);
+static EGLBoolean _egl_TSDInitialized;
 static pthread_key_t _egl_TSD;
+static void (*_egl_FreeTSD)(_EGLThreadInfo *);
 
-static INLINE EGLBoolean _eglInitTSD(void)
+static INLINE void _eglSetTSD(const _EGLThreadInfo *t)
 {
-   return (pthread_key_create(&_egl_TSD, NULL) == 0);
+   pthread_setspecific(_egl_TSD, (const void *) t);
 }
 
-static INLINE void _eglFiniTSD(void)
+static INLINE _EGLThreadInfo *_eglGetTSD(void)
 {
-   pthread_key_delete(_egl_TSD);
+   return (_EGLThreadInfo *) pthread_getspecific(_egl_TSD);
 }
 
-static INLINE void _eglSetTSD(const _EGLThreadInfo *t)
+static INLINE void _eglFiniTSD(void)
 {
-   pthread_setspecific(_egl_TSD, (const void *) t);
+   _eglLockMutex(&_egl_TSDMutex);
+   if (_egl_TSDInitialized) {
+      _EGLThreadInfo *t = _eglGetTSD();
+
+      _egl_TSDInitialized = EGL_FALSE;
+      if (t && _egl_FreeTSD)
+         _egl_FreeTSD((void *) t);
+      pthread_key_delete(_egl_TSD);
+   }
+   _eglUnlockMutex(&_egl_TSDMutex);
 }
 
-static INLINE _EGLThreadInfo *_eglGetTSD(void)
+static INLINE EGLBoolean _eglInitTSD(void (*dtor)(_EGLThreadInfo *))
 {
-   return (_EGLThreadInfo *) pthread_getspecific(_egl_TSD);
+   if (!_egl_TSDInitialized) {
+      _eglLockMutex(&_egl_TSDMutex);
+
+      /* check again after acquiring lock */
+      if (!_egl_TSDInitialized) {
+         if (pthread_key_create(&_egl_TSD, (void (*)(void *)) dtor) != 0) {
+            _eglUnlockMutex(&_egl_TSDMutex);
+            return EGL_FALSE;
+         }
+         _egl_FreeTSD = dtor;
+         _eglAddAtExitCall(_eglFiniTSD);
+         _egl_TSDInitialized = EGL_TRUE;
+      }
+
+      _eglUnlockMutex(&_egl_TSDMutex);
+   }
+
+   return EGL_TRUE;
 }
 
 #else /* PTHREADS */
 static const _EGLThreadInfo *_egl_TSD;
+static void (*_egl_FreeTSD)(_EGLThreadInfo *);
 
-static INLINE EGLBoolean _eglInitTSD(void) { return EGL_TRUE; }
-static INLINE void _eglFiniTSD(void) { }
-static INLINE void _eglSetTSD(const _EGLThreadInfo *t) { _egl_TSD = t; }
+static INLINE void _eglSetTSD(const _EGLThreadInfo *t)
+{
+   _egl_TSD = t;
+}
 
 static INLINE _EGLThreadInfo *_eglGetTSD(void)
 {
    return (_EGLThreadInfo *) _egl_TSD;
 }
+
+static INLINE void _eglFiniTSD(void)
+{
+   if (_egl_FreeTSD && _egl_TSD)
+      _egl_FreeTSD((_EGLThreadInfo *) _egl_TSD);
+}
+
+static INLINE EGLBoolean _eglInitTSD(void (*dtor)(_EGLThreadInfo *))
+{
+   if (!_egl_FreeTSD && dtor) {
+      _egl_FreeTSD = dtor;
+      _eglAddAtExitCall(_eglFiniTSD);
+   }
+   return EGL_TRUE;
+}
+
 #endif /* !PTHREADS */
 
 
@@ -98,24 +164,17 @@ _eglDestroyThreadInfo(_EGLThreadInfo *t)
 
 
 /**
- * Initialize "current thread" management.
+ * Make sure TSD is initialized and return current value.
  */
-EGLBoolean
-_eglInitCurrent(void)
+static INLINE _EGLThreadInfo *
+_eglCheckedGetTSD(void)
 {
-   _eglInitThreadInfo(&dummy_thread);
-   return _eglInitTSD();
-}
-
+   if (_eglInitTSD(&_eglDestroyThreadInfo) != EGL_TRUE) {
+      _eglLog(_EGL_FATAL, "failed to initialize \"current\" system");
+      return NULL;
+   }
 
-/**
- * Finish "current thread" management.
- */
-void
-_eglFiniCurrent(void)
-{
-   /* TODO trace and release all threads... */
-   _eglFiniTSD();
+   return _eglGetTSD();
 }
 
 
@@ -129,7 +188,7 @@ _eglFiniCurrent(void)
 _EGLThreadInfo *
 _eglGetCurrentThread(void)
 {
-   _EGLThreadInfo *t = _eglGetTSD();
+   _EGLThreadInfo *t = _eglCheckedGetTSD();
    if (!t) {
       t = _eglCreateThreadInfo();
       _eglSetTSD(t);
@@ -145,7 +204,7 @@ _eglGetCurrentThread(void)
 void
 _eglDestroyCurrentThread(void)
 {
-   _EGLThreadInfo *t = _eglGetTSD();
+   _EGLThreadInfo *t = _eglCheckedGetTSD();
    if (t) {
       _eglDestroyThreadInfo(t);
       _eglSetTSD(NULL);
@@ -162,7 +221,7 @@ _eglDestroyCurrentThread(void)
 EGLBoolean
 _eglIsCurrentThreadDummy(void)
 {
-   _EGLThreadInfo *t = _eglGetTSD();
+   _EGLThreadInfo *t = _eglCheckedGetTSD();
    return (!t || t == &dummy_thread);
 }
 
index f9fdf7b..8eb2410 100644 (file)
@@ -20,14 +20,6 @@ struct _egl_thread_info
 };
 
 
-extern EGLBoolean
-_eglInitCurrent(void);
-
-
-extern void
-_eglFiniCurrent(void);
-
-
 /**
  * Return true if a client API enum can be converted to an index.
  */
index 89de609..feae1d6 100644 (file)
@@ -1,4 +1,3 @@
-
 /**
  * Functions related to EGLDisplay.
  */
 #include "eglglobals.h"
 #include "eglhash.h"
 #include "eglstring.h"
+#include "eglmutex.h"
+#include "egllog.h"
+
+
+static _EGL_DECLARE_MUTEX(_eglDisplayInitMutex);
+static _EGLHashtable *_eglDisplayHash;
+/* TODO surface hash table should be per-display */
+static _EGLHashtable *_eglSurfaceHash;
+
+
+/**
+ * Finish display management.
+ */
+static void
+_eglFiniDisplay(void)
+{
+   _eglLockMutex(&_eglDisplayInitMutex);
+   if (_eglDisplayHash) {
+      EGLuint key = _eglHashFirstEntry(_eglDisplayHash);
+
+      while (key) {
+         _EGLDisplay *dpy = (_EGLDisplay *)
+            _eglHashLookup(_eglDisplayHash, key);
+         assert(dpy);
+
+         if (dpy->ContextList || dpy->SurfaceList)
+            _eglLog(_EGL_DEBUG, "Display %u is destroyed with resources", key);
+
+         _eglCleanupDisplay(dpy);
+         free(dpy);
+
+         key = _eglHashNextEntry(_eglDisplayHash, key);
+      }
+
+      _eglDeleteHashTable(_eglDisplayHash);
+      _eglDisplayHash = NULL;
+      _eglDeleteHashTable(_eglSurfaceHash);
+      _eglSurfaceHash = NULL;
+   }
+   _eglUnlockMutex(&_eglDisplayInitMutex);
+}
+
+
+/* This can be avoided if hash table can be statically initialized */
+static INLINE void
+_eglInitDisplay(void)
+{
+   if (!_eglDisplayHash) {
+      _eglLockMutex(&_eglDisplayInitMutex);
+
+      /* check again after acquiring lock */
+      if (!_eglDisplayHash) {
+         _eglDisplayHash = _eglNewHashTable();
+         _eglSurfaceHash = _eglNewHashTable();
+
+         _eglAddAtExitCall(_eglFiniDisplay);
+      }
+
+      _eglUnlockMutex(&_eglDisplayInitMutex);
+   }
+}
 
 
 /**
@@ -31,6 +91,9 @@ _eglNewDisplay(NativeDisplayType nativeDisplay)
       dpy->Xdpy = (Display *) nativeDisplay;
 #endif
 
+      _eglInitDisplay();
+      dpy->SurfaceHash = _eglSurfaceHash;
+
       dpy->DriverName = _eglChooseDriver(dpy);
       if (!dpy->DriverName) {
          free(dpy);
@@ -49,11 +112,14 @@ EGLDisplay
 _eglLinkDisplay(_EGLDisplay *dpy)
 {
    EGLuint key;
-   key = _eglHashGenKey(_eglGlobal.Displays);
+
+   _eglInitDisplay();
+
+   key = _eglHashGenKey(_eglDisplayHash);
    assert(key);
    /* "link" the display to the hash table */
-   _eglHashInsert(_eglGlobal.Displays, key, dpy);
-   dpy->Handle = (EGLDisplay) key;
+   _eglHashInsert(_eglDisplayHash, key, dpy);
+   dpy->Handle = (EGLDisplay) _eglUIntToPointer(key);
 
    return dpy->Handle;
 }
@@ -66,7 +132,11 @@ _eglLinkDisplay(_EGLDisplay *dpy)
 void
 _eglUnlinkDisplay(_EGLDisplay *dpy)
 {
-   _eglHashRemove(_eglGlobal.Displays, (EGLuint) dpy->Handle);
+   EGLuint key = _eglPointerToUInt((void *) dpy->Handle);
+
+   _eglInitDisplay();
+
+   _eglHashRemove(_eglDisplayHash, key);
    dpy->Handle = EGL_NO_DISPLAY;
 }
 
@@ -83,7 +153,7 @@ _eglGetDisplayHandle(_EGLDisplay *display)
       return EGL_NO_DISPLAY;
 }
 
+
 /**
  * Lookup a handle to find the linked display.
  * Return NULL if the handle has no corresponding linked display.
@@ -91,8 +161,11 @@ _eglGetDisplayHandle(_EGLDisplay *display)
 _EGLDisplay *
 _eglLookupDisplay(EGLDisplay dpy)
 {
-   EGLuint key = (EGLuint) dpy;
-   return (_EGLDisplay *) _eglHashLookup(_eglGlobal.Displays, key);
+   EGLuint key = _eglPointerToUInt((void *) dpy);
+
+   _eglInitDisplay();
+
+   return (_EGLDisplay *) _eglHashLookup(_eglDisplayHash, key);
 }
 
 
@@ -103,17 +176,20 @@ _eglLookupDisplay(EGLDisplay dpy)
 _EGLDisplay *
 _eglFindDisplay(NativeDisplayType nativeDisplay)
 {
-   EGLuint key = _eglHashFirstEntry(_eglGlobal.Displays);
+   EGLuint key;
+
+   _eglInitDisplay();
 
    /* Walk the hash table.  Should switch to list if it is a problem. */
+   key = _eglHashFirstEntry(_eglDisplayHash);
    while (key) {
       _EGLDisplay *dpy = (_EGLDisplay *)
-            _eglHashLookup(_eglGlobal.Displays, key);
+            _eglHashLookup(_eglDisplayHash, key);
       assert(dpy);
 
       if (dpy->NativeDisplay == nativeDisplay)
          return dpy;
-      key = _eglHashNextEntry(_eglGlobal.Displays, key);
+      key = _eglHashNextEntry(_eglDisplayHash, key);
    }
 
    return NULL;
@@ -224,7 +300,7 @@ _eglUnlinkContext(_EGLContext *ctx)
 EGLContext
 _eglGetContextHandle(_EGLContext *ctx)
 {
-   return (EGLContext) (ctx && ctx->Display) ? ctx : EGL_NO_CONTEXT;
+   return (EGLContext) ((ctx && ctx->Display) ? ctx : EGL_NO_CONTEXT);
 }
 
 
@@ -253,11 +329,11 @@ _eglLinkSurface(_EGLSurface *surf, _EGLDisplay *dpy)
    surf->Next = dpy->SurfaceList;
    dpy->SurfaceList = surf;
 
-   key = _eglHashGenKey(_eglGlobal.Surfaces);
+   key = _eglHashGenKey(dpy->SurfaceHash);
    assert(key);
-   _eglHashInsert(_eglGlobal.Surfaces, key, surf);
+   _eglHashInsert(dpy->SurfaceHash, key, surf);
 
-   surf->Handle = (EGLSurface) key;
+   surf->Handle = (EGLSurface) _eglUIntToPointer(key);
    return surf->Handle;
 }
 
@@ -270,8 +346,9 @@ void
 _eglUnlinkSurface(_EGLSurface *surf)
 {
    _EGLSurface *prev;
+   EGLuint key = _eglPointerToUInt((void *) surf->Handle);
 
-   _eglHashRemove(_eglGlobal.Surfaces, (EGLuint) surf->Handle);
+   _eglHashRemove(surf->Display->SurfaceHash, key);
    surf->Handle = EGL_NO_SURFACE;
 
    prev = surf->Display->SurfaceList;
@@ -314,7 +391,6 @@ _eglGetSurfaceHandle(_EGLSurface *surface)
 _EGLSurface *
 _eglLookupSurface(EGLSurface surf)
 {
-   _EGLSurface *c = (_EGLSurface *) _eglHashLookup(_eglGlobal.Surfaces,
-                                                   (EGLuint) surf);
-   return c;
+   EGLuint key = _eglPointerToUInt((void *) surf);
+   return (_EGLSurface *) _eglHashLookup(_eglSurfaceHash, key);
 }
index 372ed3c..70c59ef 100644 (file)
@@ -6,6 +6,7 @@
 #endif
 
 #include "egltypedefs.h"
+#include "eglhash.h"
 
 
 struct _egl_display 
@@ -26,6 +27,10 @@ struct _egl_display
    /* lists of linked contexts and surface */
    _EGLContext *ContextList;
    _EGLSurface *SurfaceList;
+
+   /* hash table to map surfaces to handles */
+   _EGLHashtable *SurfaceHash;
+
 #ifdef _EGL_PLATFORM_X
    Display *Xdpy;
 #endif
@@ -125,4 +130,25 @@ _eglIsSurfaceLinked(_EGLSurface *surf)
 }
 
 
+/**
+ * Cast an unsigned int to a pointer.
+ */
+static INLINE void *
+_eglUIntToPointer(unsigned int v)
+{
+   return (void *) ((uintptr_t) v);
+}
+
+
+/**
+ * Cast a pointer to an unsigned int.  The pointer must be one that is
+ * returned by _eglUIntToPointer.
+ */
+static INLINE unsigned int
+_eglPointerToUInt(const void *p)
+{
+   return (unsigned int) ((uintptr_t) p);
+}
+
+
 #endif /* EGLDISPLAY_INCLUDED */
index 55de394..e93b48e 100644 (file)
@@ -1,41 +1,53 @@
 #include <stdlib.h>
+#include <assert.h>
 #include "eglglobals.h"
+#include "egldisplay.h"
 #include "egllog.h"
+#include "eglmutex.h"
 
-struct _egl_global _eglGlobal = 
-{
-   EGL_FALSE
-};
 
-/**
- * Init the fields in the _eglGlobal struct
- * May be safely called more than once.
- */
-void
-_eglInitGlobals(void)
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+
+
+static _EGL_DECLARE_MUTEX(_eglGlobalMutex);
+struct _egl_global _eglGlobal =
 {
-   if (!_eglGlobal.Initialized) {
-      _eglGlobal.Displays = _eglNewHashTable();
-      _eglGlobal.Surfaces = _eglNewHashTable();
-      _eglGlobal.FreeScreenHandle = 1;
-      _eglGlobal.Initialized = EGL_TRUE;
+   &_eglGlobalMutex,       /* Mutex */
+   1,                      /* FreeScreenHandle */
+   0x0,                    /* ClientAPIsMask */
+   { 0x0 },                /* ClientAPIs */
+   0,                      /* NumDrivers */
+   { NULL },               /* Drivers */
+   0,                      /* NumAtExitCalls */
+   { NULL },               /* AtExitCalls */
+};
 
-      _eglGlobal.ClientAPIsMask = 0x0;
 
-      if (!_eglInitCurrent())
-         _eglLog(_EGL_FATAL, "failed to initialize \"current\" system");
-   }
+static void
+_eglAtExit(void)
+{
+   EGLint i;
+   for (i = _eglGlobal.NumAtExitCalls - 1; i >= 0; i--)
+      _eglGlobal.AtExitCalls[i]();
 }
 
 
-/**
- * Should call this via an atexit handler.
- */
 void
-_eglDestroyGlobals(void)
+_eglAddAtExitCall(void (*func)(void))
 {
-   _eglFiniCurrent();
-   /* XXX TODO walk over table entries, deleting each */
-   _eglDeleteHashTable(_eglGlobal.Displays);
-   _eglDeleteHashTable(_eglGlobal.Surfaces);
+   if (func) {
+      static EGLBoolean registered = EGL_FALSE;
+
+      _eglLockMutex(_eglGlobal.Mutex);
+
+      if (!registered) {
+         atexit(_eglAtExit);
+         registered = EGL_TRUE;
+      }
+
+      assert(_eglGlobal.NumAtExitCalls < ARRAY_SIZE(_eglGlobal.AtExitCalls));
+      _eglGlobal.AtExitCalls[_eglGlobal.NumAtExitCalls++] = func;
+
+      _eglUnlockMutex(_eglGlobal.Mutex);
+   }
 }
index a9443cf..1e2c674 100644 (file)
@@ -4,6 +4,7 @@
 #include "egltypedefs.h"
 #include "eglhash.h"
 #include "eglcurrent.h"
+#include "eglmutex.h"
 
 
 /**
  */
 struct _egl_global
 {
-   EGLBoolean Initialized;
-
-   /* these are private to egldisplay.c */
-   _EGLHashtable *Displays;
-   _EGLHashtable *Surfaces;
-
+   _EGLMutex *Mutex;
    EGLScreenMESA FreeScreenHandle;
 
    /* bitmaks of supported APIs (supported by _some_ driver) */
@@ -26,6 +22,9 @@ struct _egl_global
 
    EGLint NumDrivers;
    _EGLDriver *Drivers[10];
+
+   EGLint NumAtExitCalls;
+   void (*AtExitCalls[10])(void);
 };
 
 
@@ -33,11 +32,7 @@ extern struct _egl_global _eglGlobal;
 
 
 extern void
-_eglInitGlobals(void);
-
-
-extern void
-_eglDestroyGlobals(void);
+_eglAddAtExitCall(void (*func)(void));
 
 
 #endif /* EGLGLOBALS_INCLUDED */
diff --git a/src/egl/main/eglmutex.h b/src/egl/main/eglmutex.h
new file mode 100644 (file)
index 0000000..29faba0
--- /dev/null
@@ -0,0 +1,52 @@
+#ifndef EGLMUTEX_INCLUDED
+#define EGLMUTEX_INCLUDED
+
+#include "eglcompiler.h"
+
+#ifdef PTHREADS
+#include <pthread.h>
+
+typedef pthread_mutex_t _EGLMutex;
+
+static INLINE void _eglInitMutex(_EGLMutex *m)
+{
+   pthread_mutex_init(m, NULL);
+}
+
+static INLINE void
+_eglDestroyMutex(_EGLMutex *m)
+{
+   pthread_mutex_destroy(m);
+}
+
+static INLINE void
+_eglLockMutex(_EGLMutex *m)
+{
+   pthread_mutex_lock(m);
+}
+
+static INLINE void
+_eglUnlockMutex(_EGLMutex *m)
+{
+   pthread_mutex_unlock(m);
+}
+
+#define _EGL_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
+#define _EGL_DECLARE_MUTEX(m) \
+   _EGLMutex m = _EGL_MUTEX_INITIALIZER
+
+#else
+
+typedef int _EGLMutex;
+static INLINE void _eglInitMutex(_EGLMutex *m) { (void) m; }
+static INLINE void _eglDestroyMutex(_EGLMutex *m) { (void) m; }
+static INLINE void _eglLockMutex(_EGLMutex *m) { (void) m; }
+static INLINE void _eglUnlockMutex(_EGLMutex *m) { (void) m; }
+
+#define _EGL_MUTEX_INITIALIZER 0
+#define _EGL_DECLARE_MUTEX(m) \
+   _EGLMutex m = _EGL_MUTEX_INITIALIZER
+
+#endif
+
+#endif /* EGLMUTEX_INCLUDED */
index 9821e63..3947051 100644 (file)
@@ -26,7 +26,8 @@ _eglInitSurface(_EGLDriver *drv, _EGLSurface *surf, EGLint type,
 {
    const char *func;
    EGLint width = 0, height = 0, largest = 0;
-   EGLint texFormat = 0, texTarget = 0, mipmapTex = 0;
+   EGLint texFormat = EGL_NO_TEXTURE, texTarget = EGL_NO_TEXTURE;
+   EGLint mipmapTex = EGL_FALSE;
    EGLint renderBuffer = EGL_BACK_BUFFER;
 #ifdef EGL_VERSION_1_2
    EGLint colorspace = EGL_COLORSPACE_sRGB;
@@ -413,7 +414,7 @@ _eglDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
    _EGLSurface *surf = _eglLookupSurface(surface);
    if (surf) {
       _eglUnlinkSurface(surf);
-      if (!surf->IsBound)
+      if (!_eglIsSurfaceBound(surf))
          free(surf);
       return EGL_TRUE;
    }
index f9413eb..8864176 100644 (file)
@@ -15,12 +15,12 @@ struct _egl_surface
    _EGLSurface *Next;
    EGLSurface Handle;
 
-   _EGLConfig *Config;
-
-   /* May need reference counting here */
-   EGLBoolean IsBound;
+   /* The bound status of the surface */
+   _EGLContext *Binding;
    EGLBoolean BoundToTexture;
 
+   _EGLConfig *Config;
+
    EGLint Type; /* one of EGL_WINDOW_BIT, EGL_PIXMAP_BIT or EGL_PBUFFER_BIT */
    EGLint Width, Height;
    EGLint TextureFormat, TextureTarget;
@@ -100,5 +100,16 @@ _eglCreatePbufferFromClientBuffer(_EGLDriver *drv, EGLDisplay dpy,
 #endif /* EGL_VERSION_1_2 */
 
 
+/**
+ * Return true if the surface is bound to a thread.
+ * A surface bound to a texutre is not considered bound by
+ * this function.
+ */
+static INLINE EGLBoolean
+_eglIsSurfaceBound(_EGLSurface *surf)
+{
+   return (surf->Binding != NULL);
+}
+
 
 #endif /* EGLSURFACE_INCLUDED */
index 98487d4..2e3da43 100644 (file)
@@ -31,8 +31,8 @@ INCLUDES = \
 
 default: depend lib$(LIBNAME).a
 
-lib$(LIBNAME).a: $(OBJECTS) Makefile $(TOP)/src/gallium/Makefile.template
-       $(MKLIB) -o $(LIBNAME) -static $(OBJECTS)
+lib$(LIBNAME).a: $(OBJECTS) $(EXTRA_OBJECTS) Makefile $(TOP)/src/gallium/Makefile.template
+       $(MKLIB) -o $(LIBNAME) -static $(OBJECTS) $(EXTRA_OBJECTS)
 
 depend: $(C_SOURCES) $(CPP_SOURCES) $(ASM_SOURCES) $(SYMLINKS)
        rm -f depend
index 2e3f5b2..1c6d657 100644 (file)
@@ -158,6 +158,60 @@ static void do_triangle( struct draw_context *draw,
 
 
 
+#define QUAD(i0,i1,i2,i3)                       \
+   do_triangle( draw,                           \
+                ( DRAW_PIPE_RESET_STIPPLE |     \
+                  DRAW_PIPE_EDGE_FLAG_0 |       \
+                  DRAW_PIPE_EDGE_FLAG_2 ),      \
+                verts + stride * elts[i0],      \
+                verts + stride * elts[i1],      \
+                verts + stride * elts[i3]);     \
+   do_triangle( draw,                           \
+                ( DRAW_PIPE_EDGE_FLAG_0 |       \
+                  DRAW_PIPE_EDGE_FLAG_1 ),      \
+                verts + stride * elts[i1],      \
+                verts + stride * elts[i2],      \
+                verts + stride * elts[i3])
+
+#define TRIANGLE(flags,i0,i1,i2)                                        \
+   do_triangle( draw,                                                   \
+                elts[i0],  /* flags */                          \
+                verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK),     \
+                verts + stride * elts[i1],                              \
+                verts + stride * elts[i2])
+
+#define LINE(flags,i0,i1)                                       \
+   do_line( draw,                                               \
+            elts[i0],                                   \
+            verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK), \
+            verts + stride * elts[i1])
+
+#define POINT(i0)                               \
+   do_point( draw,                              \
+             verts + stride * elts[i0] )
+
+#define FUNC pipe_run
+#define ARGS                                    \
+    struct draw_context *draw,                  \
+    unsigned prim,                              \
+    struct vertex_header *vertices,             \
+    unsigned stride,                            \
+    const ushort *elts
+
+#define LOCAL_VARS                                           \
+   char *verts = (char *)vertices;                           \
+   boolean flatfirst = (draw->rasterizer->flatshade &&       \
+                        draw->rasterizer->flatshade_first);  \
+   unsigned i;                                               \
+   ushort flags
+
+#define FLUSH
+
+#include "draw_pt_decompose.h"
+#undef ARGS
+#undef LOCAL_VARS
+
+
 
 /* Code to run the pipeline on a fairly arbitary collection of vertices.
  *
@@ -178,34 +232,12 @@ void draw_pipeline_run( struct draw_context *draw,
                         unsigned count )
 {
    char *verts = (char *)vertices;
-   unsigned i;
 
    draw->pipeline.verts = verts;
    draw->pipeline.vertex_stride = stride;
    draw->pipeline.vertex_count = vertex_count;
    
-   switch (prim) {
-   case PIPE_PRIM_POINTS:
-      for (i = 0; i < count; i++) 
-         do_point( draw, 
-                   verts + stride * elts[i] );
-      break;
-   case PIPE_PRIM_LINES:
-      for (i = 0; i+1 < count; i += 2) 
-         do_line( draw, 
-                  elts[i+0],  /* flags */
-                  verts + stride * (elts[i+0] & ~DRAW_PIPE_FLAG_MASK),
-                  verts + stride * elts[i+1]);
-      break;
-   case PIPE_PRIM_TRIANGLES:
-      for (i = 0; i+2 < count; i += 3)
-         do_triangle( draw, 
-                      elts[i+0],  /* flags */
-                      verts + stride * (elts[i+0] & ~DRAW_PIPE_FLAG_MASK),
-                      verts + stride * elts[i+1],
-                      verts + stride * elts[i+2]);
-      break;
-   }
+   pipe_run(draw, prim, vertices, stride, elts, count);
    
    draw->pipeline.verts = NULL;
    draw->pipeline.vertex_count = 0;
index 30a6d29..283502c 100644 (file)
@@ -256,7 +256,10 @@ pstip_transform_inst(struct tgsi_transform_context *ctx,
          uint size = 4;
          immed = tgsi_default_full_immediate();
          immed.Immediate.NrTokens = 1 + size; /* one for the token itself */
-         immed.u.Pointer = (void *) value;
+         immed.u[0].Float = value[0];
+         immed.u[1].Float = value[1];
+         immed.u[2].Float = value[2];
+         immed.u[3].Float = value[3];
          ctx->emit_immediate(ctx, &immed);
       }
 
index 014d8c7..7d76a7d 100644 (file)
 /* Authors:  Keith Whitwell <keith@tungstengraphics.com>
  */
 
+/**
+ * Notes on wide points and sprite mode:
+ *
+ * In wide point/sprite mode we effectively need to convert each incoming
+ * vertex into four outgoing vertices specifying the corners of a quad.
+ * Since we don't (yet) have geometry shaders, we have to handle this here
+ * in the draw module.
+ *
+ * For sprites, it also means that this is where we have to handle texcoords
+ * for the vertices of the quad.  OpenGL's GL_COORD_REPLACE state specifies
+ * if/how enabled texcoords are automatically generated for sprites.  We pass
+ * that info through gallium in the pipe_rasterizer_state::sprite_coord_mode
+ * array.
+ *
+ * Additionally, GLSL's gl_PointCoord fragment attribute has to be handled
+ * here as well.  This is basically an additional texture/generic attribute
+ * that varies .x from 0 to 1 horizontally across the point and varies .y
+ * vertically from 0 to 1 down the sprite.
+ *
+ * With geometry shaders, the state tracker could create a GS to do
+ * most/all of this.
+ */
+
+
 #include "util/u_math.h"
 #include "util/u_memory.h"
 #include "pipe/p_defines.h"
@@ -52,7 +76,7 @@ struct widepoint_stage {
 
    int psize_slot;
 
-   int point_coord_fs_input;  /**< input for pointcoord (and fog) */
+   int point_coord_fs_input;  /**< input for pointcoord */
 };
 
 
@@ -64,8 +88,6 @@ widepoint_stage( struct draw_stage *stage )
 }
 
 
-
-
 /**
  * Set the vertex texcoords for sprite mode.
  * Coords may be left untouched or set to a right-side-up or upside-down
@@ -89,10 +111,12 @@ static void set_texcoords(const struct widepoint_stage *wide,
    }
 
    if (wide->point_coord_fs_input >= 0) {
-      /* put gl_PointCoord into extra vertex output's zw components */
-      uint k = wide->stage.draw->extra_vp_outputs.slot;
-      v->data[k][2] = tc[0];
-      v->data[k][3] = tc[1];
+      /* put gl_PointCoord into the extra vertex slot */
+      uint slot = wide->stage.draw->extra_vp_outputs.slot;
+      v->data[slot][0] = tc[0];
+      v->data[slot][1] = tc[1];
+      v->data[slot][2] = 0.0F;
+      v->data[slot][3] = 1.0F;
    }
 }
 
@@ -182,10 +206,10 @@ static void widepoint_point( struct draw_stage *stage,
 
 
 static int
-find_fog_input_attrib(struct draw_context *draw)
+find_pntc_input_attrib(struct draw_context *draw)
 {
-   /* Scan the fragment program's input decls to find the fogcoord
-    * attribute.  The z/w components will store the point coord.
+   /* Scan the fragment program's input decls to find the pointcoord
+    * attribute.  The xy components will store the point coord.
     */
    return 0; /* XXX fix this */
 }
@@ -229,8 +253,8 @@ static void widepoint_first_point( struct draw_stage *stage,
       }
       wide->num_texcoords = j;
 
-      /* find fragment shader PointCoord/Fog input */
-      wide->point_coord_fs_input = find_fog_input_attrib(draw);
+      /* find fragment shader PointCoord input */
+      wide->point_coord_fs_input = find_pntc_input_attrib(draw);
 
       /* setup extra vp output (point coord implemented as a texcoord) */
       draw->extra_vp_outputs.semantic_name = TGSI_SEMANTIC_GENERIC;
index 9e37a26..62e04a6 100644 (file)
@@ -1758,24 +1758,24 @@ emit_instruction( struct aos_compilation *cp,
    case TGSI_OPCODE_SUB:
       return emit_SUB(cp, inst);
  
-   case TGSI_OPCODE_LERP:
+   case TGSI_OPCODE_LRP:
 //      return emit_LERP(cp, inst);
       return FALSE;
 
-   case TGSI_OPCODE_FRAC:
+   case TGSI_OPCODE_FRC:
       return emit_FRC(cp, inst);
 
    case TGSI_OPCODE_CLAMP:
 //      return emit_CLAMP(cp, inst);
       return FALSE;
 
-   case TGSI_OPCODE_FLOOR:
+   case TGSI_OPCODE_FLR:
       return emit_FLR(cp, inst);
 
    case TGSI_OPCODE_ROUND:
       return emit_RND(cp, inst);
 
-   case TGSI_OPCODE_EXPBASE2:
+   case TGSI_OPCODE_EX2:
 #if FAST_MATH
       return emit_EXPBASE2(cp, inst);
 #elif 0
@@ -1787,13 +1787,13 @@ emit_instruction( struct aos_compilation *cp,
       return FALSE;
 #endif
 
-   case TGSI_OPCODE_LOGBASE2:
+   case TGSI_OPCODE_LG2:
       return emit_LG2(cp, inst);
 
-   case TGSI_OPCODE_POWER:
+   case TGSI_OPCODE_POW:
       return emit_POW(cp, inst);
 
-   case TGSI_OPCODE_CROSSPRODUCT:
+   case TGSI_OPCODE_XPD:
       return emit_XPD(cp, inst);
 
    case TGSI_OPCODE_ABS:
@@ -1891,8 +1891,9 @@ static boolean note_immediate( struct aos_compilation *cp,
    unsigned pos = cp->num_immediates++;
    unsigned j;
 
+   assert( imm->Immediate.NrTokens <= 4 + 1 );
    for (j = 0; j < imm->Immediate.NrTokens - 1; j++) {
-      cp->vaos->machine->immediate[pos][j] = imm->u.ImmediateFloat32[j].Float;
+      cp->vaos->machine->immediate[pos][j] = imm->u[j].Float;
    }
 
    return TRUE;
index 727977b..b3535c0 100644 (file)
@@ -119,7 +119,7 @@ draw_create_vs_llvm(struct draw_context *draw,
    vs->base.create_varient = draw_vs_varient_generic;
    vs->base.run_linear = vs_llvm_run_linear;
    vs->base.delete = vs_llvm_delete;
-   vs->machine = &draw->vs.machine;
+   vs->machine = draw->vs.machine;
 
    {
       struct gallivm_ir *ir = gallivm_ir_new(GALLIVM_VS);
index 2d2af30..721b7d2 100644 (file)
@@ -128,7 +128,7 @@ void InstructionsSoa::createFunctionMap()
    m_functionsMap[TGSI_OPCODE_DP4]   = "dp4";
    m_functionsMap[TGSI_OPCODE_MIN]   = "min";
    m_functionsMap[TGSI_OPCODE_MAX]   = "max";
-   m_functionsMap[TGSI_OPCODE_POWER] = "pow";
+   m_functionsMap[TGSI_OPCODE_POW]   = "pow";
    m_functionsMap[TGSI_OPCODE_LIT]   = "lit";
    m_functionsMap[TGSI_OPCODE_RSQ]   = "rsq";
    m_functionsMap[TGSI_OPCODE_SLT]   = "slt";
@@ -311,7 +311,7 @@ std::vector<llvm::Value*> InstructionsSoa::mul(const std::vector<llvm::Value*> i
 std::vector<llvm::Value*> InstructionsSoa::pow(const std::vector<llvm::Value*> in1,
                                                const std::vector<llvm::Value*> in2)
 {
-   llvm::Function *func = function(TGSI_OPCODE_POWER);
+   llvm::Function *func = function(TGSI_OPCODE_POW);
    return callBuiltin(func, in1, in2);
 }
 
index 5b08200..bf84401 100644 (file)
@@ -160,10 +160,11 @@ translate_immediate(Storage *storage,
 {
    float vec[4];
    int i;
+   assert( imm->Immediate.NrTokens <= 4 + 1 );
    for (i = 0; i < imm->Immediate.NrTokens - 1; ++i) {
       switch (imm->Immediate.DataType) {
       case TGSI_IMM_FLOAT32:
-         vec[i] = imm->u.ImmediateFloat32[i].Float;
+         vec[i] = imm->u[i].Float;
          break;
       default:
          assert(0);
@@ -179,10 +180,11 @@ translate_immediateir(StorageSoa *storage,
 {
    float vec[4];
    int i;
+   assert( imm->Immediate.NrTokens <= 4 + 1 );
    for (i = 0; i < imm->Immediate.NrTokens - 1; ++i) {
       switch (imm->Immediate.DataType) {
       case TGSI_IMM_FLOAT32:
-         vec[i] = imm->u.ImmediateFloat32[i].Float;
+         vec[i] = imm->u[i].Float;
          break;
       default:
          assert(0);
@@ -336,7 +338,7 @@ translate_instruction(llvm::Module *module,
       out = instr->sub(inputs[0], inputs[1]);
    }
       break;
-   case TGSI_OPCODE_LERP: {
+   case TGSI_OPCODE_LRP: {
       out = instr->lerp(inputs[0], inputs[1], inputs[2]);
    }
       break;
@@ -348,17 +350,11 @@ translate_instruction(llvm::Module *module,
       out = instr->cnd0(inputs[0], inputs[1], inputs[2]);
    }
       break;
-   case TGSI_OPCODE_DOT2ADD: {
+   case TGSI_OPCODE_DP2A: {
       out = instr->dot2add(inputs[0], inputs[1], inputs[2]);
    }
       break;
-   case TGSI_OPCODE_INDEX:
-      break;
-   case TGSI_OPCODE_NEGATE: {
-      out = instr->neg(inputs[0]);
-   }
-      break;
-   case TGSI_OPCODE_FRAC: {
+   case TGSI_OPCODE_FRC: {
       out = instr->frc(inputs[0]);
    }
       break;
@@ -366,30 +362,28 @@ translate_instruction(llvm::Module *module,
       out = instr->clamp(inputs[0]);
    }
       break;
-   case TGSI_OPCODE_FLOOR: {
+   case TGSI_OPCODE_FLR: {
       out = instr->floor(inputs[0]);
    }
       break;
    case TGSI_OPCODE_ROUND:
       break;
-   case TGSI_OPCODE_EXPBASE2: {
+   case TGSI_OPCODE_EX2: {
       out = instr->ex2(inputs[0]);
    }
       break;
-   case TGSI_OPCODE_LOGBASE2: {
+   case TGSI_OPCODE_LG2: {
       out = instr->lg2(inputs[0]);
    }
       break;
-   case TGSI_OPCODE_POWER: {
+   case TGSI_OPCODE_POW: {
       out = instr->pow(inputs[0], inputs[1]);
    }
       break;
-   case TGSI_OPCODE_CROSSPRODUCT: {
+   case TGSI_OPCODE_XPD: {
       out = instr->cross(inputs[0], inputs[1]);
    }
       break;
-   case TGSI_OPCODE_MULTIPLYMATRIX:
-      break;
    case TGSI_OPCODE_ABS: {
       out = instr->abs(inputs[0]);
    }
@@ -522,7 +516,7 @@ translate_instruction(llvm::Module *module,
       return;  //just update the state
    }
       break;
-   case TGSI_OPCODE_LOOP:
+   case TGSI_OPCODE_BGNFOR:
       break;
    case TGSI_OPCODE_REP:
       break;
@@ -538,7 +532,7 @@ translate_instruction(llvm::Module *module,
       return; //just update the state
    }
       break;
-   case TGSI_OPCODE_ENDLOOP:
+   case TGSI_OPCODE_ENDFOR:
       break;
    case TGSI_OPCODE_ENDREP:
       break;
@@ -580,7 +574,7 @@ translate_instruction(llvm::Module *module,
       break;
    case TGSI_OPCODE_ENDPRIM:
       break;
-   case TGSI_OPCODE_BGNLOOP2: {
+   case TGSI_OPCODE_BGNLOOP: {
       instr->beginLoop();
       storage->setCurrentBlock(instr->currentBlock());
       return;
@@ -593,7 +587,7 @@ translate_instruction(llvm::Module *module,
       return;
    }
       break;
-   case TGSI_OPCODE_ENDLOOP2: {
+   case TGSI_OPCODE_ENDLOOP: {
       instr->endLoop();
       storage->setCurrentBlock(instr->currentBlock());
       return;
@@ -617,14 +611,6 @@ translate_instruction(llvm::Module *module,
       break;
    case TGSI_OPCODE_NOP:
       break;
-   case TGSI_OPCODE_M4X3:
-      break;
-   case TGSI_OPCODE_M3X4:
-      break;
-   case TGSI_OPCODE_M3X3:
-      break;
-   case TGSI_OPCODE_M3X2:
-      break;
    case TGSI_OPCODE_CALLNZ:
       break;
    case TGSI_OPCODE_IFC:
@@ -778,44 +764,38 @@ translate_instructionir(llvm::Module *module,
       out = instr->sub(inputs[0], inputs[1]);
    }
       break;
-   case TGSI_OPCODE_LERP: {
+   case TGSI_OPCODE_LRP: {
    }
       break;
    case TGSI_OPCODE_CND:
       break;
    case TGSI_OPCODE_CND0:
       break;
-   case TGSI_OPCODE_DOT2ADD:
+   case TGSI_OPCODE_DP2A:
       break;
-   case TGSI_OPCODE_INDEX:
-      break;
-   case TGSI_OPCODE_NEGATE:
-      break;
-   case TGSI_OPCODE_FRAC: {
+   case TGSI_OPCODE_FRC: {
    }
       break;
    case TGSI_OPCODE_CLAMP:
       break;
-   case TGSI_OPCODE_FLOOR: {
+   case TGSI_OPCODE_FLR: {
    }
       break;
    case TGSI_OPCODE_ROUND:
       break;
-   case TGSI_OPCODE_EXPBASE2: {
+   case TGSI_OPCODE_EX2: {
    }
       break;
-   case TGSI_OPCODE_LOGBASE2: {
+   case TGSI_OPCODE_LG2: {
    }
       break;
-   case TGSI_OPCODE_POWER: {
+   case TGSI_OPCODE_POW: {
       out = instr->pow(inputs[0], inputs[1]);
    }
       break;
-   case TGSI_OPCODE_CROSSPRODUCT: {
+   case TGSI_OPCODE_XPD: {
    }
       break;
-   case TGSI_OPCODE_MULTIPLYMATRIX:
-      break;
    case TGSI_OPCODE_ABS: {
       out = instr->abs(inputs[0]);
    }
@@ -910,7 +890,7 @@ translate_instructionir(llvm::Module *module,
    case TGSI_OPCODE_IF: {
    }
       break;
-   case TGSI_OPCODE_LOOP:
+   case TGSI_OPCODE_BGNFOR:
       break;
    case TGSI_OPCODE_REP:
       break;
@@ -920,7 +900,7 @@ translate_instructionir(llvm::Module *module,
    case TGSI_OPCODE_ENDIF: {
    }
       break;
-   case TGSI_OPCODE_ENDLOOP:
+   case TGSI_OPCODE_ENDFOR:
       break;
    case TGSI_OPCODE_ENDREP:
       break;
@@ -961,13 +941,13 @@ translate_instructionir(llvm::Module *module,
       break;
    case TGSI_OPCODE_ENDPRIM:
       break;
-   case TGSI_OPCODE_BGNLOOP2: {
+   case TGSI_OPCODE_BGNLOOP: {
    }
       break;
    case TGSI_OPCODE_BGNSUB: {
    }
       break;
-   case TGSI_OPCODE_ENDLOOP2: {
+   case TGSI_OPCODE_ENDLOOP: {
    }
       break;
    case TGSI_OPCODE_ENDSUB: {
@@ -983,14 +963,6 @@ translate_instructionir(llvm::Module *module,
       break;
    case TGSI_OPCODE_NOP:
       break;
-   case TGSI_OPCODE_M4X3:
-      break;
-   case TGSI_OPCODE_M3X4:
-      break;
-   case TGSI_OPCODE_M3X3:
-      break;
-   case TGSI_OPCODE_M3X2:
-      break;
    case TGSI_OPCODE_NRM4:
       break;
    case TGSI_OPCODE_CALLNZ:
index b4900e8..5f0a580 100644 (file)
@@ -16,6 +16,7 @@ C_SOURCES = \
        tgsi_sse2.c \
        tgsi_text.c \
        tgsi_transform.c \
+       tgsi_ureg.c \
        tgsi_util.c
 
 include ../../Makefile.template
index 8200cce..b6bc292 100644 (file)
@@ -16,6 +16,7 @@ tgsi = env.ConvenienceLibrary(
                'tgsi_sse2.c',
                'tgsi_text.c',
                'tgsi_transform.c',
+               'tgsi_ureg.c',
                'tgsi_util.c',
        ])
 
index a3f4947..802ec37 100644 (file)
@@ -665,9 +665,18 @@ TGSI Instruction Specification
   TBD
 
 
-1.9.8  LOOP - Loop
+1.9.8  BGNFOR - Begin a For-Loop
 
-  TBD
+  dst.x = floor(src.x)
+  dst.y = floor(src.y)
+  dst.z = floor(src.z)
+
+  if (dst.y <= 0)
+    pc = [matching ENDFOR] + 1
+  endif
+
+  Note: The destination must be a loop register.
+        The source must be a constant register.
 
 
 1.9.9  REP - Repeat
@@ -685,9 +694,16 @@ TGSI Instruction Specification
   TBD
 
 
-1.9.12  ENDLOOP - End Loop
+1.9.12  ENDFOR - End a For-Loop
 
-  TBD
+  dst.x = dst.x + dst.z
+  dst.y = dst.y - 1.0
+
+  if (dst.y > 0)
+    pc = [matching BGNFOR instruction] + 1
+  endif
+
+  Note: The destination must be a loop register.
 
 
 1.9.13  ENDREP - End Repeat
@@ -840,7 +856,7 @@ TGSI Instruction Specification
 ----------
 
 
-1.13.1  BGNLOOP2 - Begin Loop
+1.13.1  BGNLOOP - Begin a Loop
 
   TBD
 
@@ -850,7 +866,7 @@ TGSI Instruction Specification
   TBD
 
 
-1.13.3  ENDLOOP2 - End Loop
+1.13.3  ENDLOOP - End a Loop
 
   TBD
 
index d272533..010d501 100644 (file)
@@ -335,7 +335,10 @@ tgsi_default_full_immediate( void )
    struct tgsi_full_immediate fullimm;
 
    fullimm.Immediate = tgsi_default_immediate();
-   fullimm.u.Pointer = (void *) 0;
+   fullimm.u[0].Float = 0.0f;
+   fullimm.u[1].Float = 0.0f;
+   fullimm.u[2].Float = 0.0f;
+   fullimm.u[3].Float = 0.0f;
 
    return fullimm;
 }
@@ -352,19 +355,19 @@ immediate_grow(
    header_bodysize_grow( header );
 }
 
-struct tgsi_immediate_float32
+union tgsi_immediate_data
 tgsi_build_immediate_float32(
    float value,
    struct tgsi_immediate *immediate,
    struct tgsi_header *header )
 {
-   struct tgsi_immediate_float32 immediate_float32;
+   union tgsi_immediate_data immediate_data;
 
-   immediate_float32.Float = value;
+   immediate_data.Float = value;
 
    immediate_grow( immediate, header );
 
-   return immediate_float32;
+   return immediate_data;
 }
 
 unsigned
@@ -384,16 +387,18 @@ tgsi_build_full_immediate(
 
    *immediate = tgsi_build_immediate( header );
 
+   assert( full_imm->Immediate.NrTokens <= 4 + 1 );
+
    for( i = 0; i < full_imm->Immediate.NrTokens - 1; i++ ) {
-      struct tgsi_immediate_float32 *if32;
+      union tgsi_immediate_data *data;
 
       if( maxsize <= size )
          return  0;
-      if32 = (struct tgsi_immediate_float32 *) &tokens[size];
+      data = (union tgsi_immediate_data *) &tokens[size];
       size++;
 
-      *if32 = tgsi_build_immediate_float32(
-         full_imm->u.ImmediateFloat32[i].Float,
+      *data = tgsi_build_immediate_float32(
+         full_imm->u[i].Float,
          immediate,
          header );
    }
index 9a3a077..17d977b 100644 (file)
@@ -119,7 +119,7 @@ tgsi_build_immediate(
 struct tgsi_full_immediate
 tgsi_default_full_immediate( void );
 
-struct tgsi_immediate_float32
+union tgsi_immediate_data
 tgsi_build_immediate_float32(
    float value,
    struct tgsi_immediate *immediate,
index a6994ec..f36b111 100644 (file)
@@ -82,7 +82,7 @@ static const char *processor_type_names[] =
    "GEOM"
 };
 
-static const char *file_names[] =
+static const char *file_names[TGSI_FILE_COUNT] =
 {
    "NULL",
    "CONST",
@@ -91,7 +91,8 @@ static const char *file_names[] =
    "TEMP",
    "SAMP",
    "ADDR",
-   "IMM"
+   "IMM",
+   "LOOP"
 };
 
 static const char *interpolate_names[] =
@@ -295,10 +296,12 @@ iter_immediate(
    ENM( imm->Immediate.DataType, immediate_type_names );
 
    TXT( " { " );
+
+   assert( imm->Immediate.NrTokens <= 4 + 1 );
    for (i = 0; i < imm->Immediate.NrTokens - 1; i++) {
       switch (imm->Immediate.DataType) {
       case TGSI_IMM_FLOAT32:
-         FLT( imm->u.ImmediateFloat32[i].Float );
+         FLT( imm->u[i].Float );
          break;
       default:
          assert( 0 );
@@ -470,8 +473,8 @@ iter_instruction(
    switch (inst->Instruction.Opcode) {
    case TGSI_OPCODE_IF:
    case TGSI_OPCODE_ELSE:
-   case TGSI_OPCODE_BGNLOOP2:
-   case TGSI_OPCODE_ENDLOOP2:
+   case TGSI_OPCODE_BGNLOOP:
+   case TGSI_OPCODE_ENDLOOP:
    case TGSI_OPCODE_CAL:
       TXT( " :" );
       UID( inst->InstructionExtLabel.Label );
index 3dc61c4..4a9c02b 100644 (file)
@@ -69,7 +69,7 @@ static const char *TGSI_TOKEN_TYPES[] =
    "TOKEN_TYPE_INSTRUCTION"
 };
 
-static const char *TGSI_FILES[] =
+static const char *TGSI_FILES[TGSI_FILE_COUNT] =
 {
    "FILE_NULL",
    "FILE_CONSTANT",
@@ -78,7 +78,8 @@ static const char *TGSI_FILES[] =
    "FILE_TEMPORARY",
    "FILE_SAMPLER",
    "FILE_ADDRESS",
-   "FILE_IMMEDIATE"
+   "FILE_IMMEDIATE",
+   "FILE_LOOP"
 };
 
 static const char *TGSI_INTERPOLATES[] =
@@ -283,12 +284,13 @@ dump_immediate_verbose(
       UIX( imm->Immediate.Padding );
    }
 
+   assert( imm->Immediate.NrTokens <= 4 + 1 );
    for( i = 0; i < imm->Immediate.NrTokens - 1; i++ ) {
       EOL();
       switch( imm->Immediate.DataType ) {
       case TGSI_IMM_FLOAT32:
          TXT( "\nFloat: " );
-         FLT( imm->u.ImmediateFloat32[i].Float );
+         FLT( imm->u[i].Float );
          break;
 
       default:
index fe571a8..951ecfd 100644 (file)
@@ -301,14 +301,14 @@ tgsi_exec_machine_bind_shader(
       case TGSI_TOKEN_TYPE_IMMEDIATE:
          {
             uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1;
-            assert( size % 4 == 0 );
-            assert( mach->ImmLimit + size / 4 <= TGSI_EXEC_NUM_IMMEDIATES );
+            assert( size <= 4 );
+            assert( mach->ImmLimit + 1 <= TGSI_EXEC_NUM_IMMEDIATES );
 
             for( i = 0; i < size; i++ ) {
-               mach->Imms[mach->ImmLimit + i / 4][i % 4] = 
-                 parse.FullToken.FullImmediate.u.ImmediateFloat32[i].Float;
+               mach->Imms[mach->ImmLimit][i] = 
+                 parse.FullToken.FullImmediate.u[i].Float;
             }
-            mach->ImmLimit += size / 4;
+            mach->ImmLimit += 1;
          }
          break;
 
@@ -375,15 +375,9 @@ tgsi_exec_machine_create( void )
    if (!mach)
       goto fail;
 
-   mach->Addrs = &mach->Temps[TGSI_EXEC_TEMP_ADDR];
+   memset(mach, 0, sizeof(*mach));
 
-   mach->Samplers = NULL;
-   mach->Consts = NULL;
-   mach->Tokens = NULL;
-   mach->Primitives = NULL;
-   mach->InterpCoefs = NULL;
-   mach->Instructions = NULL;
-   mach->Declarations = NULL;
+   mach->Addrs = &mach->Temps[TGSI_EXEC_TEMP_ADDR];
 
    /* Setup constants. */
    for( i = 0; i < 4; i++ ) {
@@ -2020,8 +2014,7 @@ exec_instruction(
 
    switch (inst->Instruction.Opcode) {
    case TGSI_OPCODE_ARL:
-   case TGSI_OPCODE_FLOOR:
-   /* TGSI_OPCODE_FLR */
+   case TGSI_OPCODE_FLR:
       FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
          FETCH( &r[0], 0, chan_index );
          micro_flr( &r[0], &r[0] );
@@ -2290,8 +2283,7 @@ exec_instruction(
       }
       break;
 
-   case TGSI_OPCODE_LERP:
-   /* TGSI_OPCODE_LRP */
+   case TGSI_OPCODE_LRP:
       FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
          FETCH(&r[0], 0, chan_index);
          FETCH(&r[1], 1, chan_index);
@@ -2325,8 +2317,7 @@ exec_instruction(
       }
       break;
 
-   case TGSI_OPCODE_DOT2ADD:
-   /* TGSI_OPCODE_DP2A */
+   case TGSI_OPCODE_DP2A:
       FETCH( &r[0], 0, CHAN_X );
       FETCH( &r[1], 1, CHAN_X );
       micro_mul( &r[0], &r[0], &r[1] );
@@ -2344,18 +2335,7 @@ exec_instruction(
       }
       break;
 
-   case TGSI_OPCODE_INDEX:
-      /* XXX: considered for removal */
-      assert (0);
-      break;
-
-   case TGSI_OPCODE_NEGATE:
-      /* XXX: considered for removal */
-      assert (0);
-      break;
-
-   case TGSI_OPCODE_FRAC:
-   /* TGSI_OPCODE_FRC */
+   case TGSI_OPCODE_FRC:
       FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
          FETCH( &r[0], 0, chan_index );
          micro_frc( &r[0], &r[0] );
@@ -2383,8 +2363,7 @@ exec_instruction(
       }
       break;
 
-   case TGSI_OPCODE_EXPBASE2:
-   /* TGSI_OPCODE_EX2 */
+   case TGSI_OPCODE_EX2:
       FETCH(&r[0], 0, CHAN_X);
 
 #if FAST_MATH
@@ -2398,8 +2377,7 @@ exec_instruction(
       }
       break;
 
-   case TGSI_OPCODE_LOGBASE2:
-   /* TGSI_OPCODE_LG2 */
+   case TGSI_OPCODE_LG2:
       FETCH( &r[0], 0, CHAN_X );
       micro_lg2( &r[0], &r[0] );
       FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
@@ -2407,8 +2385,7 @@ exec_instruction(
       }
       break;
 
-   case TGSI_OPCODE_POWER:
-   /* TGSI_OPCODE_POW */
+   case TGSI_OPCODE_POW:
       FETCH(&r[0], 0, CHAN_X);
       FETCH(&r[1], 1, CHAN_X);
 
@@ -2419,8 +2396,7 @@ exec_instruction(
       }
       break;
 
-   case TGSI_OPCODE_CROSSPRODUCT:
-   /* TGSI_OPCODE_XPD */
+   case TGSI_OPCODE_XPD:
       FETCH(&r[0], 0, CHAN_Y);
       FETCH(&r[1], 1, CHAN_Z);
 
@@ -2462,11 +2438,6 @@ exec_instruction(
       }
       break;
 
-    case TGSI_OPCODE_MULTIPLYMATRIX:
-       /* XXX: considered for removal */
-       assert (0);
-       break;
-
     case TGSI_OPCODE_ABS:
        FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
           FETCH(&r[0], 0, chan_index);
@@ -3110,9 +3081,9 @@ exec_instruction(
       mach->Primitives[mach->Temps[TEMP_PRIMITIVE_I].xyzw[TEMP_PRIMITIVE_C].u[0]] = 0;
       break;
 
-   case TGSI_OPCODE_LOOP:
+   case TGSI_OPCODE_BGNFOR:
       /* fall-through (for now) */
-   case TGSI_OPCODE_BGNLOOP2:
+   case TGSI_OPCODE_BGNLOOP:
       /* push LoopMask and ContMasks */
       assert(mach->LoopStackTop < TGSI_EXEC_MAX_LOOP_NESTING);
       mach->LoopStack[mach->LoopStackTop++] = mach->LoopMask;
@@ -3120,9 +3091,9 @@ exec_instruction(
       mach->ContStack[mach->ContStackTop++] = mach->ContMask;
       break;
 
-   case TGSI_OPCODE_ENDLOOP:
+   case TGSI_OPCODE_ENDFOR:
       /* fall-through (for now at least) */
-   case TGSI_OPCODE_ENDLOOP2:
+   case TGSI_OPCODE_ENDLOOP:
       /* Restore ContMask, but don't pop */
       assert(mach->ContStackTop > 0);
       mach->ContMask = mach->ContStack[mach->ContStackTop - 1];
index 37f2b66..ccf4b20 100644 (file)
  **************************************************************************/
 
 #include "util/u_debug.h"
+#include "util/u_memory.h"
 #include "tgsi_info.h"
 
 static const struct tgsi_opcode_info opcode_info[TGSI_OPCODE_LAST] =
 {
-   { 1, 1, 0, 0, "ARL", NULL, NULL },
-   { 1, 1, 0, 0, "MOV", NULL, NULL },
-   { 1, 1, 0, 0, "LIT", NULL, NULL },
-   { 1, 1, 0, 0, "RCP", "RECIP", NULL },
-   { 1, 1, 0, 0, "RSQ", "RECIPSQRT", NULL },
-   { 1, 1, 0, 0, "EXP", "EXPP", NULL },
-   { 1, 1, 0, 0, "LOG", NULL, NULL },
-   { 1, 2, 0, 0, "MUL", NULL, NULL },
-   { 1, 2, 0, 0, "ADD", NULL, NULL },
-   { 1, 2, 0, 0, "DP3", "DOT3", NULL },
-   { 1, 2, 0, 0, "DP4", "DOT4", NULL },
-   { 1, 2, 0, 0, "DST", NULL, NULL },
-   { 1, 2, 0, 0, "MIN", NULL, NULL },
-   { 1, 2, 0, 0, "MAX", NULL, NULL },
-   { 1, 2, 0, 0, "SLT", "SETLT", NULL },
-   { 1, 2, 0, 0, "SGE", "SETGE", NULL },
-   { 1, 3, 0, 0, "MAD", "MADD", NULL },
-   { 1, 2, 0, 0, "SUB", NULL, NULL },
-   { 1, 3, 0, 0, "LRP", "LERP", NULL },
-   { 1, 3, 0, 0, "CND", NULL, NULL },
-   { 1, 3, 0, 0, "CND0", NULL, NULL },
-   { 1, 3, 0, 0, "DP2A", "DP2ADD", "DOT2ADD" },
-   { 1, 2, 0, 0, "INDEX", NULL, NULL },
-   { 1, 1, 0, 0, "NEGATE", NULL, NULL },
-   { 1, 1, 0, 0, "FRC", "FRAC", NULL },
-   { 1, 3, 0, 0, "CLAMP", NULL, NULL },
-   { 1, 1, 0, 0, "FLR", "FLOOR", NULL },
-   { 1, 1, 0, 0, "ROUND", NULL, NULL },
-   { 1, 1, 0, 0, "EX2", "EXPBASE2", NULL },
-   { 1, 1, 0, 0, "LG2", "LOGBASE2", "LOGP" },
-   { 1, 2, 0, 0, "POW", "POWER", NULL },
-   { 1, 2, 0, 0, "XPD", "CRS", "CROSSPRODUCT" },
-   { 1, 2, 0, 0, "M4X4", "MULTIPLYMATRIX", NULL },
-   { 1, 1, 0, 0, "ABS", NULL, NULL },
-   { 1, 1, 0, 0, "RCC", NULL, NULL },
-   { 1, 2, 0, 0, "DPH", NULL, NULL },
-   { 1, 1, 0, 0, "COS", NULL, NULL },
-   { 1, 1, 0, 0, "DDX", "DSX", NULL },
-   { 1, 1, 0, 0, "DDY", "DSY", NULL },
-   { 0, 0, 0, 0, "KILP", NULL, NULL },
-   { 1, 1, 0, 0, "PK2H", NULL, NULL },
-   { 1, 1, 0, 0, "PK2US", NULL, NULL },
-   { 1, 1, 0, 0, "PK4B", NULL, NULL },
-   { 1, 1, 0, 0, "PK4UB", NULL, NULL },
-   { 1, 2, 0, 0, "RFL", NULL, NULL },
-   { 1, 2, 0, 0, "SEQ", NULL, NULL },
-   { 1, 2, 0, 0, "SFL", NULL, NULL },
-   { 1, 2, 0, 0, "SGT", NULL, NULL },
-   { 1, 1, 0, 0, "SIN", NULL, NULL },
-   { 1, 2, 0, 0, "SLE", NULL, NULL },
-   { 1, 2, 0, 0, "SNE", NULL, NULL },
-   { 1, 2, 0, 0, "STR", NULL, NULL },
-   { 1, 2, 1, 0, "TEX", "TEXLD", NULL },
-   { 1, 4, 1, 0, "TXD", "TEXLDD", NULL },
-   { 1, 2, 1, 0, "TXP", NULL, NULL },
-   { 1, 1, 0, 0, "UP2H", NULL, NULL },
-   { 1, 1, 0, 0, "UP2US", NULL, NULL },
-   { 1, 1, 0, 0, "UP4B", NULL, NULL },
-   { 1, 1, 0, 0, "UP4UB", NULL, NULL },
-   { 1, 3, 0, 0, "X2D", NULL, NULL },
-   { 1, 1, 0, 0, "ARA", NULL, NULL },
-   { 1, 1, 0, 0, "ARR", "MOVA", NULL },
-   { 0, 1, 0, 0, "BRA", NULL, NULL },
-   { 0, 0, 0, 1, "CAL", "CALL", NULL },
-   { 0, 0, 0, 0, "RET", NULL, NULL },
-   { 1, 1, 0, 0, "SGN", "SSG", NULL },
-   { 1, 3, 0, 0, "CMP", NULL, NULL },
-   { 1, 1, 0, 0, "SCS", "SINCOS", NULL },
-   { 1, 2, 1, 0, "TXB", "TEXLDB", NULL },
-   { 1, 1, 0, 0, "NRM", NULL, NULL },
-   { 1, 2, 0, 0, "DIV", NULL, NULL },
-   { 1, 2, 0, 0, "DP2", NULL, NULL },
-   { 1, 2, 1, 0, "TXL", NULL, NULL },
-   { 0, 0, 0, 0, "BRK", "BREAK", NULL },
-   { 0, 1, 0, 1, "IF", NULL, NULL },
-   { 0, 0, 0, 0, "LOOP", NULL, NULL },
-   { 0, 1, 0, 0, "REP", NULL, NULL },
-   { 0, 0, 0, 1, "ELSE", NULL, NULL },
-   { 0, 0, 0, 0, "ENDIF", NULL, NULL },
-   { 0, 0, 0, 0, "ENDLOOP", NULL, NULL },
-   { 0, 0, 0, 0, "ENDREP", NULL, NULL },
-   { 0, 1, 0, 0, "PUSHA", NULL, NULL },
-   { 1, 0, 0, 0, "POPA", NULL, NULL },
-   { 1, 1, 0, 0, "CEIL", NULL, NULL },
-   { 1, 1, 0, 0, "I2F", NULL, NULL },
-   { 1, 1, 0, 0, "NOT", NULL, NULL },
-   { 1, 1, 0, 0, "INT", "TRUNC", NULL },
-   { 1, 2, 0, 0, "SHL", NULL, NULL },
-   { 1, 2, 0, 0, "SHR", NULL, NULL },
-   { 1, 2, 0, 0, "AND", NULL, NULL },
-   { 1, 2, 0, 0, "OR", NULL, NULL },
-   { 1, 2, 0, 0, "MOD", NULL, NULL },
-   { 1, 2, 0, 0, "XOR", NULL, NULL },
-   { 1, 3, 0, 0, "SAD", NULL, NULL },
-   { 1, 2, 1, 0, "TXF", NULL, NULL },
-   { 1, 2, 1, 0, "TXQ", NULL, NULL },
-   { 0, 0, 0, 0, "CONT", NULL, NULL },
-   { 0, 0, 0, 0, "EMIT", NULL, NULL },
-   { 0, 0, 0, 0, "ENDPRIM", NULL, NULL },
-   { 0, 0, 0, 1, "BGNLOOP2", NULL, NULL },
-   { 0, 0, 0, 0, "BGNSUB", NULL, NULL },
-   { 0, 0, 0, 1, "ENDLOOP2", NULL, NULL },
-   { 0, 0, 0, 0, "ENDSUB", NULL, NULL },
-   { 1, 1, 0, 0, "NOISE1", NULL, NULL },
-   { 1, 1, 0, 0, "NOISE2", NULL, NULL },
-   { 1, 1, 0, 0, "NOISE3", NULL, NULL },
-   { 1, 1, 0, 0, "NOISE4", NULL, NULL },
-   { 0, 0, 0, 0, "NOP", NULL, NULL },
-   { 1, 2, 0, 0, "M4X3", NULL, NULL },
-   { 1, 2, 0, 0, "M3X4", NULL, NULL },
-   { 1, 2, 0, 0, "M3X3", NULL, NULL },
-   { 1, 2, 0, 0, "M3X2", NULL, NULL },
-   { 1, 1, 0, 0, "NRM4", NULL, NULL },
-   { 0, 1, 0, 0, "CALLNZ", NULL, NULL },
-   { 0, 1, 0, 0, "IFC", NULL, NULL },
-   { 0, 1, 0, 0, "BREAKC", NULL, NULL },
-   { 0, 1, 0, 0, "KIL", "TEXKILL", NULL },
-   { 0, 0, 0, 0, "END", NULL, NULL },
-   { 1, 1, 0, 0, "SWZ", NULL, NULL }
+   { 1, 1, 0, 0, "ARL", TGSI_OPCODE_ARL },
+   { 1, 1, 0, 0, "MOV", TGSI_OPCODE_MOV },
+   { 1, 1, 0, 0, "LIT", TGSI_OPCODE_LIT },
+   { 1, 1, 0, 0, "RCP", TGSI_OPCODE_RCP },
+   { 1, 1, 0, 0, "RSQ", TGSI_OPCODE_RSQ },
+   { 1, 1, 0, 0, "EXP", TGSI_OPCODE_EXP },
+   { 1, 1, 0, 0, "LOG", TGSI_OPCODE_LOG },
+   { 1, 2, 0, 0, "MUL", TGSI_OPCODE_MUL },
+   { 1, 2, 0, 0, "ADD", TGSI_OPCODE_ADD },
+   { 1, 2, 0, 0, "DP3", TGSI_OPCODE_DP3 },
+   { 1, 2, 0, 0, "DP4", TGSI_OPCODE_DP4 },
+   { 1, 2, 0, 0, "DST", TGSI_OPCODE_DST },
+   { 1, 2, 0, 0, "MIN", TGSI_OPCODE_MIN },
+   { 1, 2, 0, 0, "MAX", TGSI_OPCODE_MAX },
+   { 1, 2, 0, 0, "SLT", TGSI_OPCODE_SLT },
+   { 1, 2, 0, 0, "SGE", TGSI_OPCODE_SGE },
+   { 1, 3, 0, 0, "MAD", TGSI_OPCODE_MAD },
+   { 1, 2, 0, 0, "SUB", TGSI_OPCODE_SUB },
+   { 1, 3, 0, 0, "LRP", TGSI_OPCODE_LRP },
+   { 1, 3, 0, 0, "CND", TGSI_OPCODE_CND },
+   { 1, 3, 0, 0, "CND0", TGSI_OPCODE_CND0 },
+   { 1, 3, 0, 0, "DP2A", TGSI_OPCODE_DP2A },
+   { 0, 0, 0, 0, "", 22 },      /* removed */
+   { 0, 0, 0, 0, "", 23 },      /* removed */
+   { 1, 1, 0, 0, "FRC", TGSI_OPCODE_FRC },
+   { 1, 3, 0, 0, "CLAMP", TGSI_OPCODE_CLAMP },
+   { 1, 1, 0, 0, "FLR", TGSI_OPCODE_FLR },
+   { 1, 1, 0, 0, "ROUND", TGSI_OPCODE_ROUND },
+   { 1, 1, 0, 0, "EX2", TGSI_OPCODE_EX2 },
+   { 1, 1, 0, 0, "LG2", TGSI_OPCODE_LG2 },
+   { 1, 2, 0, 0, "POW", TGSI_OPCODE_POW },
+   { 1, 2, 0, 0, "XPD", TGSI_OPCODE_XPD },
+   { 0, 0, 0, 0, "", 32 },      /* removed */
+   { 1, 1, 0, 0, "ABS", TGSI_OPCODE_ABS },
+   { 1, 1, 0, 0, "RCC", TGSI_OPCODE_RCC },
+   { 1, 2, 0, 0, "DPH", TGSI_OPCODE_DPH },
+   { 1, 1, 0, 0, "COS", TGSI_OPCODE_COS },
+   { 1, 1, 0, 0, "DDX", TGSI_OPCODE_DDX },
+   { 1, 1, 0, 0, "DDY", TGSI_OPCODE_DDY },
+   { 0, 0, 0, 0, "KILP", TGSI_OPCODE_KILP },
+   { 1, 1, 0, 0, "PK2H", TGSI_OPCODE_PK2H },
+   { 1, 1, 0, 0, "PK2US", TGSI_OPCODE_PK2US },
+   { 1, 1, 0, 0, "PK4B", TGSI_OPCODE_PK4B },
+   { 1, 1, 0, 0, "PK4UB", TGSI_OPCODE_PK4UB },
+   { 1, 2, 0, 0, "RFL", TGSI_OPCODE_RFL },
+   { 1, 2, 0, 0, "SEQ", TGSI_OPCODE_SEQ },
+   { 1, 2, 0, 0, "SFL", TGSI_OPCODE_SFL },
+   { 1, 2, 0, 0, "SGT", TGSI_OPCODE_SGT },
+   { 1, 1, 0, 0, "SIN", TGSI_OPCODE_SIN },
+   { 1, 2, 0, 0, "SLE", TGSI_OPCODE_SLE },
+   { 1, 2, 0, 0, "SNE", TGSI_OPCODE_SNE },
+   { 1, 2, 0, 0, "STR", TGSI_OPCODE_STR },
+   { 1, 2, 1, 0, "TEX", TGSI_OPCODE_TEX },
+   { 1, 4, 1, 0, "TXD", TGSI_OPCODE_TXD },
+   { 1, 2, 1, 0, "TXP", TGSI_OPCODE_TXP },
+   { 1, 1, 0, 0, "UP2H", TGSI_OPCODE_UP2H },
+   { 1, 1, 0, 0, "UP2US", TGSI_OPCODE_UP2US },
+   { 1, 1, 0, 0, "UP4B", TGSI_OPCODE_UP4B },
+   { 1, 1, 0, 0, "UP4UB", TGSI_OPCODE_UP4UB },
+   { 1, 3, 0, 0, "X2D", TGSI_OPCODE_X2D },
+   { 1, 1, 0, 0, "ARA", TGSI_OPCODE_ARA },
+   { 1, 1, 0, 0, "ARR", TGSI_OPCODE_ARR },
+   { 0, 1, 0, 0, "BRA", TGSI_OPCODE_BRA },
+   { 0, 0, 0, 1, "CAL", TGSI_OPCODE_CAL },
+   { 0, 0, 0, 0, "RET", TGSI_OPCODE_RET },
+   { 1, 1, 0, 0, "SSG", TGSI_OPCODE_SSG },
+   { 1, 3, 0, 0, "CMP", TGSI_OPCODE_CMP },
+   { 1, 1, 0, 0, "SCS", TGSI_OPCODE_SCS },
+   { 1, 2, 1, 0, "TXB", TGSI_OPCODE_TXB },
+   { 1, 1, 0, 0, "NRM", TGSI_OPCODE_NRM },
+   { 1, 2, 0, 0, "DIV", TGSI_OPCODE_DIV },
+   { 1, 2, 0, 0, "DP2", TGSI_OPCODE_DP2 },
+   { 1, 2, 1, 0, "TXL", TGSI_OPCODE_TXL },
+   { 0, 0, 0, 0, "BRK", TGSI_OPCODE_BRK },
+   { 0, 1, 0, 1, "IF", TGSI_OPCODE_IF },
+   { 1, 1, 0, 0, "BGNFOR", TGSI_OPCODE_BGNFOR },
+   { 0, 1, 0, 0, "REP", TGSI_OPCODE_REP },
+   { 0, 0, 0, 1, "ELSE", TGSI_OPCODE_ELSE },
+   { 0, 0, 0, 0, "ENDIF", TGSI_OPCODE_ENDIF },
+   { 1, 0, 0, 0, "ENDFOR", TGSI_OPCODE_ENDFOR },
+   { 0, 0, 0, 0, "ENDREP", TGSI_OPCODE_ENDREP },
+   { 0, 1, 0, 0, "PUSHA", TGSI_OPCODE_PUSHA },
+   { 1, 0, 0, 0, "POPA", TGSI_OPCODE_POPA },
+   { 1, 1, 0, 0, "CEIL", TGSI_OPCODE_CEIL },
+   { 1, 1, 0, 0, "I2F", TGSI_OPCODE_I2F },
+   { 1, 1, 0, 0, "NOT", TGSI_OPCODE_NOT },
+   { 1, 1, 0, 0, "TRUNC", TGSI_OPCODE_TRUNC },
+   { 1, 2, 0, 0, "SHL", TGSI_OPCODE_SHL },
+   { 1, 2, 0, 0, "SHR", TGSI_OPCODE_SHR },
+   { 1, 2, 0, 0, "AND", TGSI_OPCODE_AND },
+   { 1, 2, 0, 0, "OR", TGSI_OPCODE_OR },
+   { 1, 2, 0, 0, "MOD", TGSI_OPCODE_MOD },
+   { 1, 2, 0, 0, "XOR", TGSI_OPCODE_XOR },
+   { 1, 3, 0, 0, "SAD", TGSI_OPCODE_SAD },
+   { 1, 2, 1, 0, "TXF", TGSI_OPCODE_TXF },
+   { 1, 2, 1, 0, "TXQ", TGSI_OPCODE_TXQ },
+   { 0, 0, 0, 0, "CONT", TGSI_OPCODE_CONT },
+   { 0, 0, 0, 0, "EMIT", TGSI_OPCODE_EMIT },
+   { 0, 0, 0, 0, "ENDPRIM", TGSI_OPCODE_ENDPRIM },
+   { 0, 0, 0, 1, "BGNLOOP", TGSI_OPCODE_BGNLOOP },
+   { 0, 0, 0, 0, "BGNSUB", TGSI_OPCODE_BGNSUB },
+   { 0, 0, 0, 1, "ENDLOOP", TGSI_OPCODE_ENDLOOP },
+   { 0, 0, 0, 0, "ENDSUB", TGSI_OPCODE_ENDSUB },
+   { 1, 1, 0, 0, "NOISE1", TGSI_OPCODE_NOISE1 },
+   { 1, 1, 0, 0, "NOISE2", TGSI_OPCODE_NOISE2 },
+   { 1, 1, 0, 0, "NOISE3", TGSI_OPCODE_NOISE3 },
+   { 1, 1, 0, 0, "NOISE4", TGSI_OPCODE_NOISE4 },
+   { 0, 0, 0, 0, "NOP", TGSI_OPCODE_NOP },
+   { 0, 0, 0, 0, "", 108 },     /* removed */
+   { 0, 0, 0, 0, "", 109 },     /* removed */
+   { 0, 0, 0, 0, "", 110 },     /* removed */
+   { 0, 0, 0, 0, "", 111 },     /* removed */
+   { 1, 1, 0, 0, "NRM4", TGSI_OPCODE_NRM4 },
+   { 0, 1, 0, 0, "CALLNZ", TGSI_OPCODE_CALLNZ },
+   { 0, 1, 0, 0, "IFC", TGSI_OPCODE_IFC },
+   { 0, 1, 0, 0, "BREAKC", TGSI_OPCODE_BREAKC },
+   { 0, 1, 0, 0, "KIL", TGSI_OPCODE_KIL },
+   { 0, 0, 0, 0, "END", TGSI_OPCODE_END },
+   { 1, 1, 0, 0, "SWZ", TGSI_OPCODE_SWZ }
 };
 
 const struct tgsi_opcode_info *
 tgsi_get_opcode_info( uint opcode )
 {
+   static boolean firsttime = 1;
+
+   if (firsttime) {
+      unsigned i;
+      firsttime = 0;
+      for (i = 0; i < Elements(opcode_info); i++)
+         assert(opcode_info[i].opcode == i);
+   }
+   
    if (opcode < TGSI_OPCODE_LAST)
       return &opcode_info[opcode];
+
    assert( 0 );
    return NULL;
 }
+
+
+const char *
+tgsi_get_opcode_name( uint opcode )
+{
+   const struct tgsi_opcode_info *info = tgsi_get_opcode_info(opcode);
+   return info->mnemonic;
+}
+
index 077e25a..b2375c6 100644 (file)
@@ -41,13 +41,16 @@ struct tgsi_opcode_info
    boolean is_tex;
    boolean is_branch;
    const char *mnemonic;
-   const char *alt_mnemonic1;
-   const char *alt_mnemonic2;
+   uint opcode;
 };
 
 const struct tgsi_opcode_info *
 tgsi_get_opcode_info( uint opcode );
 
+const char *
+tgsi_get_opcode_name( uint opcode );
+
+
 #if defined __cplusplus
 }
 #endif
diff --git a/src/gallium/auxiliary/tgsi/tgsi_opcode_tmp.h b/src/gallium/auxiliary/tgsi/tgsi_opcode_tmp.h
new file mode 100644 (file)
index 0000000..ed594a3
--- /dev/null
@@ -0,0 +1,173 @@
+/**************************************************************************
+ * 
+ * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+#ifndef OP12_TEX
+#define OP12_TEX(a) OP12(a)
+#endif
+
+#ifndef OP14_TEX
+#define OP14_TEX(a) OP14(a)
+#endif
+
+#ifndef OP00_LBL
+#define OP00_LBL(a) OP00(a)
+#endif
+
+#ifndef OP01_LBL
+#define OP01_LBL(a) OP01(a)
+#endif
+
+OP11(ARL)
+OP11(MOV)
+OP11(LIT)
+OP11(RCP)
+OP11(RSQ)
+OP11(EXP)
+OP11(LOG)
+OP12(MUL)
+OP12(ADD)
+OP12(DP3)
+OP12(DP4)
+OP12(DST)
+OP12(MIN)
+OP12(MAX)
+OP12(SLT)
+OP12(SGE)
+OP13(MAD)
+OP12(SUB)
+OP13(LRP)
+OP13(CND)
+OP13(CND0)
+OP13(DP2A)
+OP11(FRC)
+OP13(CLAMP)
+OP11(FLR)
+OP11(ROUND)
+OP11(EX2)
+OP11(LG2)
+OP12(POW)
+OP12(XPD)
+OP11(ABS)
+OP11(RCC)
+OP12(DPH)
+OP11(COS)
+OP11(DDX)
+OP11(DDY)
+OP00(KILP)
+OP11(PK2H)
+OP11(PK2US)
+OP11(PK4B)
+OP11(PK4UB)
+OP12(RFL)
+OP12(SEQ)
+OP12(SFL)
+OP12(SGT)
+OP11(SIN)
+OP12(SLE)
+OP12(SNE)
+OP12(STR)
+OP12_TEX(TEX)
+OP14_TEX(TXD)
+OP12_TEX(TXP)
+OP11(UP2H)
+OP11(UP2US)
+OP11(UP4B)
+OP11(UP4UB)
+OP13(X2D)
+OP11(ARA)
+OP11(ARR)
+OP01(BRA)
+OP00_LBL(CAL)
+OP00(RET)
+OP11(SSG)
+OP13(CMP)
+OP11(SCS)
+OP12_TEX(TXB)
+OP11(NRM)
+OP12(DIV)
+OP12(DP2)
+OP12_TEX(TXL)
+OP00(BRK)
+OP01_LBL(IF)
+OP11(BGNFOR)
+OP01(REP)
+OP00_LBL(ELSE)
+OP00(ENDIF)
+OP10(ENDFOR)
+OP00(ENDREP)
+OP01(PUSHA)
+OP10(POPA)
+OP11(CEIL)
+OP11(I2F)
+OP11(NOT)
+OP11(TRUNC)
+OP12(SHL)
+OP12(SHR)
+OP12(AND)
+OP12(OR)
+OP12(MOD)
+OP12(XOR)
+OP13(SAD)
+OP12_TEX(TXF)
+OP12_TEX(TXQ)
+OP00(CONT)
+OP00(EMIT)
+OP00(ENDPRIM)
+OP00_LBL(BGNLOOP)
+OP00(BGNSUB)
+OP00_LBL(ENDLOOP)
+OP00(ENDSUB)
+OP11(NOISE1)
+OP11(NOISE2)
+OP11(NOISE3)
+OP11(NOISE4)
+OP00(NOP)
+OP11(NRM4)
+OP01(CALLNZ)
+OP01(IFC)
+OP01(BREAKC)
+OP01(KIL)
+OP00(END)
+OP11(SWZ)
+
+
+#undef OP00
+#undef OP01
+#undef OP10
+#undef OP11
+#undef OP12
+#undef OP13
+
+#ifdef OP14
+#undef OP14
+#endif
+
+#undef OP00_LBL
+#undef OP01_LBL
+
+#undef OP12_TEX
+#undef OP14_TEX
+
index 7f2cfb7..4870f82 100644 (file)
@@ -42,9 +42,6 @@ void
 tgsi_full_token_free(
    union tgsi_full_token *full_token )
 {
-   if( full_token->Token.Type == TGSI_TOKEN_TYPE_IMMEDIATE ) {
-      FREE( (void *) full_token->FullImmediate.u.Pointer );
-   }
 }
 
 unsigned
@@ -156,14 +153,8 @@ tgsi_parse_token(
       case TGSI_IMM_FLOAT32:
          {
             uint imm_count = imm->Immediate.NrTokens - 1;
-            struct tgsi_immediate_float32 *data;
-
-            data = (struct tgsi_immediate_float32 *) MALLOC(sizeof(struct tgsi_immediate_float32) * imm_count);
-            if (data) {
-               for (i = 0; i < imm_count; i++) {
-                  next_token(ctx, &data[i]);
-               }
-               imm->u.ImmediateFloat32 = data;
+            for (i = 0; i < imm_count; i++) {
+               next_token(ctx, &imm->u[i]);
             }
          }
          break;
index a289e26..1035bda 100644 (file)
@@ -73,11 +73,7 @@ struct tgsi_full_declaration
 struct tgsi_full_immediate
 {
    struct tgsi_immediate   Immediate;
-   union
-   {
-      const void                          *Pointer;
-      const struct tgsi_immediate_float32 *ImmediateFloat32;
-   } u;
+   union tgsi_immediate_data u[4];
 };
 
 #define TGSI_FULL_MAX_DST_REGISTERS 2
index 0c64ae5..2d6ad12 100644 (file)
@@ -38,6 +38,7 @@
 #include "util/u_math.h"
 #include "util/u_memory.h"
 #include "util/u_sse.h"
+#include "tgsi/tgsi_info.h"
 #include "tgsi/tgsi_parse.h"
 #include "tgsi/tgsi_util.h"
 #include "tgsi_dump.h"
@@ -619,17 +620,17 @@ emit_unaryop(struct gen_context *gen, struct tgsi_full_instruction *inst)
             ppc_vandc(gen->f, v1, v0, bit31_vec); /* v1 = v0 & ~bit31 */
          }
          break;
-      case TGSI_OPCODE_FLOOR:
+      case TGSI_OPCODE_FLR:
          ppc_vrfim(gen->f, v1, v0);         /* v1 = floor(v0) */
          break;
-      case TGSI_OPCODE_FRAC:
+      case TGSI_OPCODE_FRC:
          ppc_vrfim(gen->f, v1, v0);      /* tmp = floor(v0) */
          ppc_vsubfp(gen->f, v1, v0, v1); /* v1 = v0 - v1 */
          break;
-      case TGSI_OPCODE_EXPBASE2:
+      case TGSI_OPCODE_EX2:
          ppc_vexptefp(gen->f, v1, v0);     /* v1 = 2^v0 */
          break;
-      case TGSI_OPCODE_LOGBASE2:
+      case TGSI_OPCODE_LG2:
          /* XXX this may be broken! */
          ppc_vlogefp(gen->f, v1, v0);      /* v1 = log2(v0) */
          break;
@@ -1111,10 +1112,10 @@ emit_instruction(struct gen_context *gen,
    case TGSI_OPCODE_MOV:
    case TGSI_OPCODE_SWZ:
    case TGSI_OPCODE_ABS:
-   case TGSI_OPCODE_FLOOR:
-   case TGSI_OPCODE_FRAC:
-   case TGSI_OPCODE_EXPBASE2:
-   case TGSI_OPCODE_LOGBASE2:
+   case TGSI_OPCODE_FLR:
+   case TGSI_OPCODE_FRC:
+   case TGSI_OPCODE_EX2:
+   case TGSI_OPCODE_LG2:
       emit_unaryop(gen, inst);
       break;
    case TGSI_OPCODE_RSQ:
@@ -1317,8 +1318,10 @@ tgsi_emit_ppc(const struct tgsi_token *tokens,
          ok = emit_instruction(&gen, &parse.FullToken.FullInstruction);
 
         if (!ok) {
-           debug_printf("failed to translate tgsi opcode %d to PPC (%s)\n", 
-                        parse.FullToken.FullInstruction.Instruction.Opcode,
+            uint opcode = parse.FullToken.FullInstruction.Instruction.Opcode;
+           debug_printf("failed to translate tgsi opcode %d (%s) to PPC (%s)\n", 
+                        opcode,
+                         tgsi_get_opcode_name(opcode),
                          parse.FullHeader.Processor.Processor == TGSI_PROCESSOR_VERTEX ?
                          "vertex shader" : "fragment shader");
         }
@@ -1333,7 +1336,7 @@ tgsi_emit_ppc(const struct tgsi_token *tokens,
             assert(num_immediates < TGSI_EXEC_NUM_IMMEDIATES);
             for (i = 0; i < size; i++) {
                immediates[num_immediates][i] =
-                 parse.FullToken.FullImmediate.u.ImmediateFloat32[i].Float;
+                 parse.FullToken.FullImmediate.u[i].Float;
             }
             num_immediates++;
          }
index 6f1f5c2..4fe8553 100644 (file)
@@ -131,7 +131,7 @@ is_register_used(
    return (ctx->regs_used[file][index / BITS_IN_REG_FLAG] & (1 << (index % BITS_IN_REG_FLAG))) ? TRUE : FALSE;
 }
 
-static const char *file_names[] =
+static const char *file_names[TGSI_FILE_COUNT] =
 {
    "NULL",
    "CONST",
@@ -140,7 +140,8 @@ static const char *file_names[] =
    "TEMP",
    "SAMP",
    "ADDR",
-   "IMM"
+   "IMM",
+   "LOOP"
 };
 
 static boolean
@@ -234,9 +235,29 @@ iter_instruction(
             index,
             "indirect",
             FALSE );
-         if (file != TGSI_FILE_ADDRESS || index != 0)
-            report_warning( ctx, "Indirect register not ADDR[0]" );
+         if (!(file == TGSI_FILE_ADDRESS || file == TGSI_FILE_LOOP) || index != 0) {
+            report_warning(ctx, "Indirect register neither ADDR[0] nor LOOP[0]");
+         }
+      }
+   }
+
+   switch (inst->Instruction.Opcode) {
+   case TGSI_OPCODE_BGNFOR:
+   case TGSI_OPCODE_ENDFOR:
+      if (inst->FullDstRegisters[0].DstRegister.File != TGSI_FILE_LOOP ||
+          inst->FullDstRegisters[0].DstRegister.Index != 0) {
+         report_error(ctx, "Destination register must be LOOP[0]");
+      }
+      break;
+   }
+
+   switch (inst->Instruction.Opcode) {
+   case TGSI_OPCODE_BGNFOR:
+      if (inst->FullSrcRegisters[0].SrcRegister.File != TGSI_FILE_CONSTANT &&
+          inst->FullSrcRegisters[0].SrcRegister.File != TGSI_FILE_IMMEDIATE) {
+         report_error(ctx, "Source register file must be either CONST or IMM");
       }
+      break;
    }
 
    ctx->num_instructions++;
index 4c3343d..cfec5cf 100644 (file)
@@ -36,6 +36,7 @@
 #if defined(PIPE_ARCH_SSE)
 #include "util/u_sse.h"
 #endif
+#include "tgsi/tgsi_info.h"
 #include "tgsi/tgsi_parse.h"
 #include "tgsi/tgsi_util.h"
 #include "tgsi_exec.h"
@@ -1467,15 +1468,15 @@ emit_tex( struct x86_function *func,
 
    switch (inst->InstructionExtTexture.Texture) {
    case TGSI_TEXTURE_1D:
-   case TGSI_TEXTURE_SHADOW1D:
       count = 1;
       break;
    case TGSI_TEXTURE_2D:
    case TGSI_TEXTURE_RECT:
-   case TGSI_TEXTURE_SHADOW2D:
-   case TGSI_TEXTURE_SHADOWRECT:
       count = 2;
       break;
+   case TGSI_TEXTURE_SHADOW1D:
+   case TGSI_TEXTURE_SHADOW2D:
+   case TGSI_TEXTURE_SHADOWRECT:
    case TGSI_TEXTURE_3D:
    case TGSI_TEXTURE_CUBE:
       count = 3;
@@ -2064,8 +2065,7 @@ emit_instruction(
       }
       break;
 
-   case TGSI_OPCODE_LERP:
-   /* TGSI_OPCODE_LRP */
+   case TGSI_OPCODE_LRP:
       FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {
          FETCH( func, *inst, 0, 0, chan_index );
          FETCH( func, *inst, 1, 1, chan_index );
@@ -2085,8 +2085,7 @@ emit_instruction(
       return 0;
       break;
 
-   case TGSI_OPCODE_DOT2ADD:
-   /* TGSI_OPCODE_DP2A */
+   case TGSI_OPCODE_DP2A:
       FETCH( func, *inst, 0, 0, CHAN_X );  /* xmm0 = src[0].x */
       FETCH( func, *inst, 1, 1, CHAN_X );  /* xmm1 = src[1].x */
       emit_mul( func, 0, 1 );              /* xmm0 = xmm0 * xmm1 */
@@ -2101,16 +2100,7 @@ emit_instruction(
       }
       break;
 
-   case TGSI_OPCODE_INDEX:
-      return 0;
-      break;
-
-   case TGSI_OPCODE_NEGATE:
-      return 0;
-      break;
-
-   case TGSI_OPCODE_FRAC:
-   /* TGSI_OPCODE_FRC */
+   case TGSI_OPCODE_FRC:
       FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {
          FETCH( func, *inst, 0, 0, chan_index );
          emit_frc( func, 0, 0 );
@@ -2122,8 +2112,7 @@ emit_instruction(
       return 0;
       break;
 
-   case TGSI_OPCODE_FLOOR:
-   /* TGSI_OPCODE_FLR */
+   case TGSI_OPCODE_FLR:
       FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {
          FETCH( func, *inst, 0, 0, chan_index );
          emit_flr( func, 0, 0 );
@@ -2139,8 +2128,7 @@ emit_instruction(
       }
       break;
 
-   case TGSI_OPCODE_EXPBASE2:
-   /* TGSI_OPCODE_EX2 */
+   case TGSI_OPCODE_EX2:
       FETCH( func, *inst, 0, 0, CHAN_X );
       emit_ex2( func, 0, 0 );
       FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {
@@ -2148,8 +2136,7 @@ emit_instruction(
       }
       break;
 
-   case TGSI_OPCODE_LOGBASE2:
-   /* TGSI_OPCODE_LG2 */
+   case TGSI_OPCODE_LG2:
       FETCH( func, *inst, 0, 0, CHAN_X );
       emit_lg2( func, 0, 0 );
       FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {
@@ -2157,8 +2144,7 @@ emit_instruction(
       }
       break;
 
-   case TGSI_OPCODE_POWER:
-   /* TGSI_OPCODE_POW */
+   case TGSI_OPCODE_POW:
       FETCH( func, *inst, 0, 0, CHAN_X );
       FETCH( func, *inst, 1, 1, CHAN_X );
       emit_pow( func, 0, 0, 0, 1 );
@@ -2167,8 +2153,7 @@ emit_instruction(
       }
       break;
 
-   case TGSI_OPCODE_CROSSPRODUCT:
-   /* TGSI_OPCODE_XPD */
+   case TGSI_OPCODE_XPD:
       if( IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) ||
           IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y ) ) {
          FETCH( func, *inst, 1, 1, CHAN_Z );
@@ -2214,10 +2199,6 @@ emit_instruction(
       }
       break;
 
-   case TGSI_OPCODE_MULTIPLYMATRIX:
-      return 0;
-      break;
-
    case TGSI_OPCODE_ABS:
       FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {
          FETCH( func, *inst, 0, 0, chan_index );
@@ -2551,7 +2532,7 @@ emit_instruction(
       return 0;
       break;
 
-   case TGSI_OPCODE_LOOP:
+   case TGSI_OPCODE_BGNFOR:
       return 0;
       break;
 
@@ -2567,7 +2548,7 @@ emit_instruction(
       return 0;
       break;
 
-   case TGSI_OPCODE_ENDLOOP:
+   case TGSI_OPCODE_ENDFOR:
       return 0;
       break;
 
@@ -2937,8 +2918,10 @@ tgsi_emit_sse2(
             &parse.FullToken.FullInstruction );
 
         if (!ok) {
-           debug_printf("failed to translate tgsi opcode %d to SSE (%s)\n", 
-                        parse.FullToken.FullInstruction.Instruction.Opcode,
+            uint opcode = parse.FullToken.FullInstruction.Instruction.Opcode;
+           debug_printf("failed to translate tgsi opcode %d (%s) to SSE (%s)\n", 
+                        opcode,
+                         tgsi_get_opcode_name(opcode),
                          parse.FullHeader.Processor.Processor == TGSI_PROCESSOR_VERTEX ?
                          "vertex shader" : "fragment shader");
         }
@@ -2953,7 +2936,7 @@ tgsi_emit_sse2(
             assert(num_immediates < TGSI_EXEC_NUM_IMMEDIATES);
             for( i = 0; i < size; i++ ) {
                immediates[num_immediates][i] =
-                 parse.FullToken.FullImmediate.u.ImmediateFloat32[i].Float;
+                 parse.FullToken.FullImmediate.u[i].Float;
             }
 #if 0
             debug_printf("SSE FS immediate[%d] = %f %f %f %f\n",
index a76bbc9..d438450 100644 (file)
@@ -231,7 +231,8 @@ static const char *file_names[TGSI_FILE_COUNT] =
    "TEMP",
    "SAMP",
    "ADDR",
-   "IMM"
+   "IMM",
+   "LOOP"
 };
 
 static boolean
@@ -789,16 +790,6 @@ match_inst_mnemonic(const char **pcur,
    if (str_match_no_case(pcur, info->mnemonic)) {
       return TRUE;
    }
-   if (info->alt_mnemonic1) {
-      if (str_match_no_case(pcur, info->alt_mnemonic1)) {
-         return TRUE;
-      }
-      if (info->alt_mnemonic2) {
-         if (str_match_no_case(pcur, info->alt_mnemonic2)) {
-            return TRUE;
-         }
-      }
-   }
    return FALSE;
 }
 
@@ -1091,7 +1082,10 @@ static boolean parse_immediate( struct translate_ctx *ctx )
    imm = tgsi_default_full_immediate();
    imm.Immediate.NrTokens += 4;
    imm.Immediate.DataType = TGSI_IMM_FLOAT32;
-   imm.u.Pointer = values;
+   imm.u[0].Float = values[0];
+   imm.u[1].Float = values[1];
+   imm.u[2].Float = values[2];
+   imm.u[3].Float = values[3];
 
    advance = tgsi_build_full_immediate(
       &imm,
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
new file mode 100644 (file)
index 0000000..ba84a82
--- /dev/null
@@ -0,0 +1,797 @@
+/**************************************************************************
+ * 
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL VMWARE, INC AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+
+
+#include "pipe/p_context.h"
+#include "pipe/p_state.h"
+#include "tgsi/tgsi_ureg.h"
+#include "tgsi/tgsi_dump.h"
+#include "util/u_memory.h"
+
+union tgsi_any_token {
+   struct tgsi_version version;
+   struct tgsi_header header;
+   struct tgsi_processor processor;
+   struct tgsi_token token;
+   struct tgsi_declaration decl;
+   struct tgsi_declaration_range decl_range;
+   struct tgsi_declaration_semantic decl_semantic;
+   struct tgsi_immediate imm;
+   union  tgsi_immediate_data imm_data;
+   struct tgsi_instruction insn;
+   struct tgsi_instruction_ext_nv insn_ext_nv;
+   struct tgsi_instruction_ext_label insn_ext_label;
+   struct tgsi_instruction_ext_texture insn_ext_texture;
+   struct tgsi_instruction_ext_predicate insn_ext_predicate;
+   struct tgsi_src_register src;
+   struct tgsi_src_register_ext_swz src_ext_swz;
+   struct tgsi_src_register_ext_mod src_ext_mod;
+   struct tgsi_dimension dim;
+   struct tgsi_dst_register dst;
+   struct tgsi_dst_register_ext_concode dst_ext_code;
+   struct tgsi_dst_register_ext_modulate dst_ext_mod;
+   struct tgsi_dst_register_ext_predicate dst_ext_pred;
+   unsigned value;
+};
+
+
+struct ureg_tokens {
+   union tgsi_any_token *tokens;
+   unsigned size;
+   unsigned order;
+   unsigned count;
+};
+
+#define UREG_MAX_INPUT PIPE_MAX_ATTRIBS
+#define UREG_MAX_OUTPUT PIPE_MAX_ATTRIBS
+#define UREG_MAX_IMMEDIATE 32
+#define UREG_MAX_TEMP 256
+
+#define DOMAIN_DECL 0
+#define DOMAIN_INSN 1
+
+struct ureg_program
+{
+   unsigned processor;
+   struct pipe_context *pipe;
+
+   struct {
+      unsigned semantic_name;
+      unsigned semantic_index;
+      unsigned interp;
+   } input[UREG_MAX_INPUT];
+   unsigned nr_inputs;
+
+   struct {
+      unsigned semantic_name;
+      unsigned semantic_index;
+   } output[UREG_MAX_OUTPUT];
+   unsigned nr_outputs;
+
+   struct {
+      float v[4];
+      unsigned nr;
+   } immediate[UREG_MAX_IMMEDIATE];
+   unsigned nr_immediates;
+
+   unsigned temps_active[UREG_MAX_TEMP / 32];
+   unsigned nr_temps;
+
+   unsigned nr_constants;
+   unsigned nr_samplers;
+
+   struct ureg_tokens domain[2];
+};
+
+static union tgsi_any_token error_tokens[32];
+
+static void tokens_error( struct ureg_tokens *tokens )
+{
+   tokens->tokens = error_tokens;
+   tokens->size = Elements(error_tokens);
+   tokens->count = 0;
+}
+
+
+static void tokens_expand( struct ureg_tokens *tokens,
+                           unsigned count )
+{
+   unsigned old_size = tokens->size * sizeof(unsigned);
+
+   if (tokens->tokens == error_tokens)
+      goto fail;
+
+   while (tokens->count + count > tokens->size) {
+      tokens->size = (1 << ++tokens->order);
+   }
+
+   tokens->tokens = REALLOC(tokens->tokens, 
+                            old_size,
+                            tokens->size * sizeof(unsigned));
+   if (tokens->tokens == NULL) 
+      goto fail;
+
+   return;
+          
+fail:
+   tokens_error(tokens);
+}
+
+static void set_bad( struct ureg_program *ureg )
+{
+   tokens_error(&ureg->domain[0]);
+}
+
+
+
+static union tgsi_any_token *get_tokens( struct ureg_program *ureg,
+                                         unsigned domain,
+                                         unsigned count )
+{
+   struct ureg_tokens *tokens = &ureg->domain[domain];
+   union tgsi_any_token *result;
+
+   if (tokens->count + count > tokens->size) 
+      tokens_expand(tokens, count);
+
+   result = &tokens->tokens[tokens->count];
+   tokens->count += count;
+   return result;
+}
+
+
+static union tgsi_any_token *retrieve_token( struct ureg_program *ureg,
+                                            unsigned domain,
+                                            unsigned nr )
+{
+   if (ureg->domain[domain].tokens == error_tokens)
+      return &error_tokens[0];
+
+   return &ureg->domain[domain].tokens[nr];
+}
+
+
+
+static INLINE struct ureg_dst
+ureg_dst_register( unsigned file,
+                   unsigned index )
+{
+   struct ureg_dst dst;
+
+   dst.File      = file;
+   dst.WriteMask = TGSI_WRITEMASK_XYZW;
+   dst.Indirect  = 0;
+   dst.Saturate  = 0;
+   dst.Index     = index;
+   dst.Pad1      = 0;
+   dst.Pad2      = 0;
+
+   return dst;
+}
+
+static INLINE struct ureg_src 
+ureg_src_register( unsigned file,
+                   unsigned index )
+{
+   struct ureg_src src;
+
+   src.File     = file;
+   src.SwizzleX = TGSI_SWIZZLE_X;
+   src.SwizzleY = TGSI_SWIZZLE_Y;
+   src.SwizzleZ = TGSI_SWIZZLE_Z;
+   src.SwizzleW = TGSI_SWIZZLE_W;
+   src.Pad      = 0;
+   src.Indirect = 0;
+   src.Absolute = 0;
+   src.Index    = index;
+   src.Negate   = 0;
+
+   return src;
+}
+
+
+
+
+static struct ureg_src 
+ureg_DECL_input( struct ureg_program *ureg,
+                 unsigned name,
+                 unsigned index,
+                 unsigned interp_mode )
+{
+   unsigned i;
+
+   for (i = 0; i < ureg->nr_inputs; i++) {
+      if (ureg->input[i].semantic_name == name &&
+          ureg->input[i].semantic_index == index) 
+         goto out;
+   }
+
+   if (ureg->nr_inputs < UREG_MAX_INPUT) {
+      ureg->input[i].semantic_name = name;
+      ureg->input[i].semantic_index = index;
+      ureg->input[i].interp = interp_mode;
+      ureg->nr_inputs++;
+   }
+   else {
+      set_bad( ureg );
+   }
+
+out:
+   return ureg_src_register( TGSI_FILE_INPUT, i );
+}
+
+
+
+struct ureg_src 
+ureg_DECL_fs_input( struct ureg_program *ureg,
+                    unsigned name,
+                    unsigned index,
+                    unsigned interp )
+{
+   return ureg_DECL_input( ureg, name, index, interp );
+}
+
+
+struct ureg_src 
+ureg_DECL_vs_input( struct ureg_program *ureg,
+                    unsigned name,
+                    unsigned index )
+{
+   return ureg_DECL_input( ureg, name, index, TGSI_INTERPOLATE_CONSTANT );
+}
+
+
+struct ureg_dst 
+ureg_DECL_output( struct ureg_program *ureg,
+                  unsigned name,
+                  unsigned index )
+{
+   unsigned i;
+
+   for (i = 0; i < ureg->nr_outputs; i++) {
+      if (ureg->output[i].semantic_name == name &&
+          ureg->output[i].semantic_index == index) 
+         goto out;
+   }
+
+   if (ureg->nr_outputs < UREG_MAX_OUTPUT) {
+      ureg->output[i].semantic_name = name;
+      ureg->output[i].semantic_index = index;
+      ureg->nr_outputs++;
+   }
+   else {
+      set_bad( ureg );
+   }
+
+out:
+   return ureg_dst_register( TGSI_FILE_OUTPUT, i );
+}
+
+
+/* Returns a new constant register.  Keep track of which have been
+ * referred to so that we can emit decls later.
+ *
+ * There is nothing in this code to bind this constant to any tracked
+ * value or manage any constant_buffer contents -- that's the
+ * resposibility of the calling code.
+ */
+struct ureg_src ureg_DECL_constant(struct ureg_program *ureg )
+{
+   return ureg_src_register( TGSI_FILE_TEMPORARY, ureg->nr_constants++ );
+}
+
+
+/* Allocate a new temporary.  Temporaries greater than UREG_MAX_TEMP
+ * are legal, but will not be released.
+ */
+struct ureg_dst ureg_DECL_temporary( struct ureg_program *ureg )
+{
+   unsigned i;
+
+   for (i = 0; i < UREG_MAX_TEMP; i += 32) {
+      int bit = ffs(~ureg->temps_active[i/32]);
+      if (bit != 0) {
+         i += bit - 1;
+         goto out;
+      }
+   }
+
+   /* No reusable temps, so allocate a new one:
+    */
+   i = ureg->nr_temps++;
+
+out:
+   if (i < UREG_MAX_TEMP)
+      ureg->temps_active[i/32] |= 1 << (i % 32);
+
+   if (i >= ureg->nr_temps)
+      ureg->nr_temps = i + 1;
+
+   return ureg_dst_register( TGSI_FILE_TEMPORARY, i );
+}
+
+
+void ureg_release_temporary( struct ureg_program *ureg,
+                             struct ureg_dst tmp )
+{
+   if (tmp.Index < UREG_MAX_TEMP)
+      ureg->temps_active[tmp.Index/32] &= ~(1 << (tmp.Index % 32));
+}
+
+
+/* Allocate a new sampler.
+ */
+struct ureg_src ureg_DECL_sampler( struct ureg_program *ureg )
+{
+   return ureg_src_register( TGSI_FILE_SAMPLER, ureg->nr_samplers++ );
+}
+
+
+
+
+static int match_or_expand_immediate( const float *v,
+                                      unsigned nr,
+                                      float *v2,
+                                      unsigned *nr2,
+                                      unsigned *swizzle )
+{
+   unsigned i, j;
+
+   for (i = 0; i < nr; i++) {
+      boolean found = FALSE;
+
+      for (j = 0; j < *nr2 && !found; j++) {
+         if (v[i] == v2[j]) {
+            *swizzle |= j << (i * 2);
+            found = TRUE;
+         }
+      }
+
+      if (!found) {
+         if (*nr2 >= 4) 
+            return FALSE;
+
+         v2[*nr2] = v[i];
+         *swizzle |= *nr2 << (i * 2);
+         (*nr2)++;
+      }
+   }
+
+   return TRUE;
+}
+
+
+
+
+struct ureg_src ureg_DECL_immediate( struct ureg_program *ureg, 
+                                     const float *v,
+                                     unsigned nr )
+{
+   unsigned i;
+   unsigned swizzle;
+
+   /* Could do a first pass where we examine all existing immediates
+    * without expanding.
+    */
+
+   for (i = 0; i < ureg->nr_immediates; i++) {
+      if (match_or_expand_immediate( v, 
+                                     nr,
+                                     ureg->immediate[i].v,
+                                     &ureg->immediate[i].nr, 
+                                     &swizzle ))
+         goto out;
+   }
+
+   if (ureg->nr_immediates < UREG_MAX_IMMEDIATE) {
+      i = ureg->nr_immediates++;
+      if (match_or_expand_immediate( v,
+                                     nr,
+                                     ureg->immediate[i].v,
+                                     &ureg->immediate[i].nr, 
+                                     &swizzle ))
+         goto out;
+   }
+
+   set_bad( ureg );
+
+out:
+   return ureg_swizzle( ureg_src_register( TGSI_FILE_IMMEDIATE, i ),
+                        (swizzle >> 0) & 0x3,
+                        (swizzle >> 2) & 0x3,
+                        (swizzle >> 4) & 0x3,
+                        (swizzle >> 6) & 0x3);
+}
+
+
+void 
+ureg_emit_src( struct ureg_program *ureg,
+               struct ureg_src src )
+{
+   unsigned size = (1 + 
+                    (src.Absolute ? 1 : 0) +
+                    (src.Indirect ? 1 : 0));
+
+   union tgsi_any_token *out = get_tokens( ureg, DOMAIN_INSN, size );
+   unsigned n = 0;
+
+   out[n].value = 0;
+   out[n].src.File = src.File;
+   out[n].src.SwizzleX = src.SwizzleX;
+   out[n].src.SwizzleY = src.SwizzleY;
+   out[n].src.SwizzleZ = src.SwizzleZ;
+   out[n].src.SwizzleW = src.SwizzleW;
+   out[n].src.Indirect = src.Indirect;
+   out[n].src.Index = src.Index;
+   n++;
+   
+   if (src.Absolute) {
+      out[n].value = 0;
+      out[n].src_ext_mod.Absolute = 1;
+      n++;
+   }
+
+   if (src.Indirect) {
+      out[n].value = 0;
+      out[n].src.File = TGSI_FILE_ADDRESS;
+      out[n].src.SwizzleX = TGSI_SWIZZLE_X;
+      out[n].src.SwizzleY = TGSI_SWIZZLE_X;
+      out[n].src.SwizzleZ = TGSI_SWIZZLE_X;
+      out[n].src.SwizzleW = TGSI_SWIZZLE_X;
+      out[n].src.Indirect = 0;
+      out[n].src.Index = 0;
+      n++;
+   }
+
+   assert(n == size);
+}
+
+
+void 
+ureg_emit_dst( struct ureg_program *ureg,
+               struct ureg_dst dst )
+{
+   unsigned size = (1 + 
+                    (dst.Indirect ? 1 : 0));
+
+   union tgsi_any_token *out = get_tokens( ureg, DOMAIN_INSN, size );
+   unsigned n = 0;
+
+   out[n].value = 0;
+   out[n].dst.File = dst.File;
+   out[n].dst.WriteMask = dst.WriteMask;
+   out[n].dst.Indirect = dst.Indirect;
+   out[n].dst.Index = dst.Index;
+   n++;
+   
+   if (dst.Indirect) {
+      out[n].value = 0;
+      out[n].src.File = TGSI_FILE_ADDRESS;
+      out[n].src.SwizzleX = TGSI_SWIZZLE_X;
+      out[n].src.SwizzleY = TGSI_SWIZZLE_X;
+      out[n].src.SwizzleZ = TGSI_SWIZZLE_X;
+      out[n].src.SwizzleW = TGSI_SWIZZLE_X;
+      out[n].src.Indirect = 0;
+      out[n].src.Index = 0;
+      n++;
+   }
+
+   assert(n == size);
+}
+
+
+
+unsigned
+ureg_emit_insn(struct ureg_program *ureg,
+               unsigned opcode,
+               boolean saturate,
+               unsigned num_dst,
+               unsigned num_src )
+{
+   union tgsi_any_token *out;
+
+   out = get_tokens( ureg, DOMAIN_INSN, 1 );
+   out[0].value = 0;
+   out[0].insn.Type = TGSI_TOKEN_TYPE_INSTRUCTION;
+   out[0].insn.NrTokens = 0;
+   out[0].insn.Opcode = opcode;
+   out[0].insn.Saturate = saturate;
+   out[0].insn.NrTokens = 0;
+   out[0].insn.NumDstRegs = num_dst;
+   out[0].insn.NumSrcRegs = num_src;
+   out[0].insn.Padding = 0;
+   out[0].insn.Extended = 0;
+
+   return ureg->domain[DOMAIN_INSN].count - 1;
+}
+
+
+void
+ureg_emit_label(struct ureg_program *ureg,
+                unsigned insn_token,
+                unsigned *label_token )
+{
+   union tgsi_any_token *out, *insn;
+
+   out = get_tokens( ureg, DOMAIN_INSN, 1 );
+   insn = retrieve_token( ureg, DOMAIN_INSN, insn_token );
+
+   insn->insn.Extended = 1;
+
+   out[0].value = 0;
+   out[0].insn_ext_label.Type = TGSI_INSTRUCTION_EXT_TYPE_LABEL;
+}
+
+
+void
+ureg_emit_texture(struct ureg_program *ureg,
+                  unsigned insn_token,
+                  unsigned target )
+{
+   union tgsi_any_token *out, *insn;
+
+   out = get_tokens( ureg, DOMAIN_INSN, 1 );
+   insn = retrieve_token( ureg, DOMAIN_INSN, insn_token );
+
+   insn->insn.Extended = 1;
+
+   out[0].value = 0;
+   out[0].insn_ext_texture.Type = TGSI_INSTRUCTION_EXT_TYPE_TEXTURE;
+   out[0].insn_ext_texture.Texture = target;
+}
+
+
+void
+ureg_fixup_insn_size(struct ureg_program *ureg,
+                     unsigned insn )
+{
+   union tgsi_any_token *out = retrieve_token( ureg, DOMAIN_INSN, insn );
+
+   out->insn.NrTokens = ureg->domain[DOMAIN_INSN].count - insn - 1;
+}
+
+
+
+
+
+static void emit_decl( struct ureg_program *ureg,
+                       unsigned file,
+                       unsigned index,
+                       unsigned semantic_name,
+                       unsigned semantic_index,
+                       unsigned interp )
+{
+   union tgsi_any_token *out = get_tokens( ureg, DOMAIN_DECL, 3 );
+
+   out[0].value = 0;
+   out[0].decl.Type = TGSI_TOKEN_TYPE_DECLARATION;
+   out[0].decl.NrTokens = 3;
+   out[0].decl.File = file;
+   out[0].decl.UsageMask = TGSI_WRITEMASK_XYZW; /* FIXME! */
+   out[0].decl.Interpolate = interp;
+   out[0].decl.Semantic = 1;
+
+   out[1].value = 0;
+   out[1].decl_range.First = 
+      out[1].decl_range.Last = index;
+
+   out[2].value = 0;
+   out[2].decl_semantic.SemanticName = semantic_name;
+   out[2].decl_semantic.SemanticIndex = semantic_index;
+
+}
+
+
+static void emit_decl_range( struct ureg_program *ureg,
+                             unsigned file,
+                             unsigned first,
+                             unsigned count )
+{
+   union tgsi_any_token *out = get_tokens( ureg, DOMAIN_DECL, 2 );
+
+   out[0].value = 0;
+   out[0].decl.Type = TGSI_TOKEN_TYPE_DECLARATION;
+   out[0].decl.NrTokens = 2;
+   out[0].decl.File = file;
+   out[0].decl.UsageMask = 0xf;
+   out[0].decl.Interpolate = TGSI_INTERPOLATE_CONSTANT;
+   out[0].decl.Semantic = 0;
+
+   out[1].value = 0;
+   out[1].decl_range.First = first;
+   out[1].decl_range.Last = first + count - 1;
+}
+
+static void emit_immediate( struct ureg_program *ureg,
+                            const float *v )
+{
+   union tgsi_any_token *out = get_tokens( ureg, DOMAIN_DECL, 5 );
+
+   out[0].value = 0;
+   out[0].imm.Type = TGSI_TOKEN_TYPE_IMMEDIATE;
+   out[0].imm.NrTokens = 5;
+   out[0].imm.DataType = TGSI_IMM_FLOAT32;
+   out[0].imm.Padding = 0;
+   out[0].imm.Extended = 0;
+
+   out[1].imm_data.Float = v[0];
+   out[2].imm_data.Float = v[1];
+   out[3].imm_data.Float = v[2];
+   out[4].imm_data.Float = v[3];
+}
+
+
+
+
+static void emit_decls( struct ureg_program *ureg )
+{
+   unsigned i;
+
+   for (i = 0; i < ureg->nr_inputs; i++) {
+      emit_decl( ureg, 
+                 TGSI_FILE_INPUT, 
+                 i,
+                 ureg->input[i].semantic_name,
+                 ureg->input[i].semantic_index,
+                 ureg->input[i].interp );
+   }
+
+   for (i = 0; i < ureg->nr_outputs; i++) {
+      emit_decl( ureg, 
+                 TGSI_FILE_OUTPUT, 
+                 i,
+                 ureg->output[i].semantic_name,
+                 ureg->output[i].semantic_index,
+                 TGSI_INTERPOLATE_CONSTANT );
+   }
+
+   if (ureg->nr_samplers) {
+      emit_decl_range( ureg, 
+                       TGSI_FILE_SAMPLER,
+                       0, ureg->nr_samplers );
+   }
+
+   if (ureg->nr_constants) {
+      emit_decl_range( ureg,
+                       TGSI_FILE_CONSTANT,
+                       0, ureg->nr_constants );
+   }
+
+   if (ureg->nr_temps) {
+      emit_decl_range( ureg,
+                       TGSI_FILE_TEMPORARY,
+                       0, ureg->nr_temps );
+   }
+
+   for (i = 0; i < ureg->nr_immediates; i++) {
+      emit_immediate( ureg,
+                      ureg->immediate[i].v );
+   }
+}
+
+/* Append the instruction tokens onto the declarations to build a
+ * contiguous stream suitable to send to the driver.
+ */
+static void copy_instructions( struct ureg_program *ureg )
+{
+   unsigned nr_tokens = ureg->domain[DOMAIN_INSN].count;
+   union tgsi_any_token *out = get_tokens( ureg, 
+                                           DOMAIN_DECL, 
+                                           nr_tokens );
+
+   memcpy(out, 
+          ureg->domain[DOMAIN_INSN].tokens, 
+          nr_tokens * sizeof out[0] );
+}
+
+
+static void
+fixup_header_size(struct ureg_program *ureg,
+                     unsigned insn )
+{
+   union tgsi_any_token *out = retrieve_token( ureg, DOMAIN_DECL, 1 );
+
+   out->header.BodySize = ureg->domain[DOMAIN_DECL].count - 3;
+}
+
+
+static void
+emit_header( struct ureg_program *ureg )
+{
+   union tgsi_any_token *out = get_tokens( ureg, DOMAIN_DECL, 3 );
+
+   out[0].version.MajorVersion = 1;
+   out[0].version.MinorVersion = 1;
+   out[0].version.Padding = 0;
+
+   out[1].header.HeaderSize = 2;
+   out[1].header.BodySize = 0;
+
+   out[2].processor.Processor = ureg->processor;
+   out[2].processor.Padding = 0;
+}
+
+
+void *ureg_create_shader( struct ureg_program *ureg )
+{
+   struct pipe_shader_state state;
+   unsigned insn;
+
+   emit_header( ureg );
+   emit_decls( ureg );
+   copy_instructions( ureg );
+   fixup_header_size( ureg, insn );
+   
+   if (ureg->domain[0].tokens == error_tokens ||
+       ureg->domain[1].tokens == error_tokens) {
+      debug_printf("%s: error in generated shader\n", __FUNCTION__);
+      assert(0);
+      return NULL;
+   }
+
+   state.tokens = (const struct tgsi_token *)ureg->domain[DOMAIN_DECL].tokens;
+
+   if (0) {
+      debug_printf("%s: emitted shader %d tokens:\n", __FUNCTION__, 
+                   ureg->domain[DOMAIN_DECL].count);
+      tgsi_dump( state.tokens, 0 );
+   }
+
+   if (ureg->processor == TGSI_PROCESSOR_VERTEX)
+      return ureg->pipe->create_vs_state( ureg->pipe, &state );
+   else
+      return ureg->pipe->create_fs_state( ureg->pipe, &state );
+}
+
+
+
+
+struct ureg_program *ureg_create( struct pipe_context *pipe,
+                                  unsigned processor )
+{
+   struct ureg_program *ureg = CALLOC_STRUCT( ureg_program );
+   if (ureg == NULL)
+      return NULL;
+
+   ureg->pipe = pipe;
+   ureg->processor = processor;
+   return ureg;
+}
+
+
+void ureg_destroy( struct ureg_program *ureg )
+{
+   unsigned i;
+
+   for (i = 0; i < Elements(ureg->domain); i++) {
+      if (ureg->domain[i].tokens && 
+          ureg->domain[i].tokens != error_tokens)
+         FREE(ureg->domain[i].tokens);
+   }
+   
+   FREE(ureg);
+}
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
new file mode 100644 (file)
index 0000000..0a976fd
--- /dev/null
@@ -0,0 +1,439 @@
+/**************************************************************************
+ * 
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL VMWARE, INC AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+
+#ifndef TGSI_UREG_H
+#define TGSI_UREG_H
+
+#include "pipe/p_compiler.h"
+#include "pipe/p_shader_tokens.h"
+
+struct ureg_program;
+
+/* Almost a tgsi_src_register, but we need to pull in the Absolute
+ * flag from the _ext token.  Indirect flag always implies ADDR[0].
+ */
+struct ureg_src
+{
+   unsigned File        : 4;  /* TGSI_FILE_ */
+   unsigned SwizzleX    : 2;  /* TGSI_SWIZZLE_ */
+   unsigned SwizzleY    : 2;  /* TGSI_SWIZZLE_ */
+   unsigned SwizzleZ    : 2;  /* TGSI_SWIZZLE_ */
+   unsigned SwizzleW    : 2;  /* TGSI_SWIZZLE_ */
+   unsigned Pad         : 1;  /* BOOL */
+   unsigned Indirect    : 1;  /* BOOL */
+   unsigned Absolute    : 1;  /* BOOL */
+   int      Index       : 16; /* SINT */
+   unsigned Negate      : 1;  /* BOOL */
+};
+
+/* Very similar to a tgsi_dst_register, removing unsupported fields
+ * and adding a Saturate flag.  It's easier to push saturate into the
+ * destination register than to try and create a _SAT varient of each
+ * instruction function.
+ */
+struct ureg_dst
+{
+   unsigned File        : 4;  /* TGSI_FILE_ */
+   unsigned WriteMask   : 4;  /* TGSI_WRITEMASK_ */
+   unsigned Indirect    : 1;  /* BOOL */
+   unsigned Saturate    : 1;  /* BOOL */
+   int      Index       : 16; /* SINT */
+   unsigned Pad1        : 5;
+   unsigned Pad2        : 1;  /* BOOL */
+};
+
+struct pipe_context;
+
+struct ureg_program *
+ureg_create( struct pipe_context *pipe,
+             unsigned processor );
+
+void *
+ureg_create_shader( struct ureg_program * );
+
+void 
+ureg_destroy( struct ureg_program * );
+
+
+/***********************************************************************
+ * Convenience routine:
+ */
+static INLINE void *ureg_create_shader_and_destroy( struct ureg_program *p )
+{
+   void *result = ureg_create_shader( p );
+   ureg_destroy( p );
+   return result;
+}
+
+
+
+/***********************************************************************
+ * Build shader declarations:
+ */
+
+struct ureg_src
+ureg_DECL_fs_input( struct ureg_program *,
+                    unsigned semantic_name,
+                    unsigned semantic_index,
+                    unsigned interp_mode );
+
+struct ureg_src
+ureg_DECL_vs_input( struct ureg_program *,
+                    unsigned semantic_name,
+                    unsigned semantic_index );
+
+struct ureg_dst
+ureg_DECL_output( struct ureg_program *,
+                  unsigned semantic_name,
+                  unsigned semantic_index );
+
+struct ureg_src
+ureg_DECL_immediate( struct ureg_program *,
+                     const float *v,
+                     unsigned nr );
+
+struct ureg_src
+ureg_DECL_constant( struct ureg_program * );
+
+struct ureg_dst
+ureg_DECL_temporary( struct ureg_program * );
+
+void 
+ureg_release_temporary( struct ureg_program *ureg,
+                        struct ureg_dst tmp );
+
+struct ureg_src
+ureg_DECL_sampler( struct ureg_program * );
+
+
+static INLINE struct ureg_src
+ureg_DECL_immediate4f( struct ureg_program *ureg,
+                       float a, float b,
+                       float c, float d)
+{
+   float v[4];
+   v[0] = a;
+   v[1] = b;
+   v[2] = c;
+   v[3] = d;
+   return ureg_DECL_immediate( ureg, v, 4 );
+}
+
+static INLINE struct ureg_src
+ureg_DECL_immediate3f( struct ureg_program *ureg,
+                       float a, float b,
+                       float c)
+{
+   float v[3];
+   v[0] = a;
+   v[1] = b;
+   v[2] = c;
+   return ureg_DECL_immediate( ureg, v, 3 );
+}
+
+static INLINE struct ureg_src
+ureg_DECL_immediate2f( struct ureg_program *ureg,
+                       float a, float b)
+{
+   float v[2];
+   v[0] = a;
+   v[1] = b;
+   return ureg_DECL_immediate( ureg, v, 2 );
+}
+
+static INLINE struct ureg_src
+ureg_DECL_immediate1f( struct ureg_program *ureg,
+                       float a)
+{
+   float v[1];
+   v[0] = a;
+   return ureg_DECL_immediate( ureg, v, 1 );
+}
+
+/***********************************************************************
+ * Internal instruction helpers, don't call these directly:
+ */
+
+unsigned
+ureg_emit_insn(struct ureg_program *ureg,
+               unsigned opcode,
+               boolean saturate,
+               unsigned num_dst,
+               unsigned num_src );
+
+void
+ureg_emit_label(struct ureg_program *ureg,
+                unsigned insn_token,
+                unsigned *label_token );
+
+void
+ureg_emit_texture(struct ureg_program *ureg,
+                  unsigned insn_token,
+                  unsigned target );
+
+void 
+ureg_emit_dst( struct ureg_program *ureg,
+               struct ureg_dst dst );
+
+void 
+ureg_emit_src( struct ureg_program *ureg,
+               struct ureg_src src );
+
+void
+ureg_fixup_insn_size(struct ureg_program *ureg,
+                     unsigned insn );
+
+
+#define OP00( op )                                              \
+static INLINE void ureg_##op( struct ureg_program *ureg )       \
+{                                                               \
+   unsigned opcode = TGSI_OPCODE_##op;                          \
+   unsigned insn = ureg_emit_insn( ureg, opcode, FALSE, 0, 0 ); \
+   ureg_fixup_insn_size( ureg, insn );                          \
+}
+
+#define OP01( op )                                              \
+static INLINE void ureg_##op( struct ureg_program *ureg,        \
+                              struct ureg_src src )             \
+{                                                               \
+   unsigned opcode = TGSI_OPCODE_##op;                          \
+   unsigned insn = ureg_emit_insn( ureg, opcode, FALSE, 0, 1 ); \
+   ureg_emit_src( ureg, src );                                  \
+   ureg_fixup_insn_size( ureg, insn );                          \
+}
+
+#define OP00_LBL( op )                                          \
+static INLINE void ureg_##op( struct ureg_program *ureg,        \
+                              unsigned *label_token )           \
+{                                                               \
+   unsigned opcode = TGSI_OPCODE_##op;                          \
+   unsigned insn = ureg_emit_insn( ureg, opcode, FALSE, 0, 0 ); \
+   ureg_emit_label( ureg, insn, label_token );                  \
+   ureg_fixup_insn_size( ureg, insn );                          \
+}
+
+#define OP01_LBL( op )                                          \
+static INLINE void ureg_##op( struct ureg_program *ureg,        \
+                              struct ureg_src src,              \
+                              unsigned *label_token )          \
+{                                                               \
+   unsigned opcode = TGSI_OPCODE_##op;                          \
+   unsigned insn = ureg_emit_insn( ureg, opcode, FALSE, 0, 1 ); \
+   ureg_emit_label( ureg, insn, label_token );                  \
+   ureg_emit_src( ureg, src );                                  \
+   ureg_fixup_insn_size( ureg, insn );                          \
+}
+
+#define OP10( op )                                                      \
+static INLINE void ureg_##op( struct ureg_program *ureg,                \
+                              struct ureg_dst dst )                     \
+{                                                                       \
+   unsigned opcode = TGSI_OPCODE_##op;                                  \
+   unsigned insn = ureg_emit_insn( ureg, opcode, dst.Saturate, 1, 0 );  \
+   ureg_emit_dst( ureg, dst );                                          \
+   ureg_fixup_insn_size( ureg, insn );                                  \
+}
+
+
+#define OP11( op )                                                      \
+static INLINE void ureg_##op( struct ureg_program *ureg,                \
+                              struct ureg_dst dst,                      \
+                              struct ureg_src src )                     \
+{                                                                       \
+   unsigned opcode = TGSI_OPCODE_##op;                                  \
+   unsigned insn = ureg_emit_insn( ureg, opcode, dst.Saturate, 1, 1 );  \
+   ureg_emit_dst( ureg, dst );                                          \
+   ureg_emit_src( ureg, src );                                          \
+   ureg_fixup_insn_size( ureg, insn );                                  \
+}
+
+#define OP12( op )                                                      \
+static INLINE void ureg_##op( struct ureg_program *ureg,                \
+                              struct ureg_dst dst,                      \
+                              struct ureg_src src0,                     \
+                              struct ureg_src src1 )                    \
+{                                                                       \
+   unsigned opcode = TGSI_OPCODE_##op;                                  \
+   unsigned insn = ureg_emit_insn( ureg, opcode, dst.Saturate, 1, 2 );  \
+   ureg_emit_dst( ureg, dst );                                          \
+   ureg_emit_src( ureg, src0 );                                         \
+   ureg_emit_src( ureg, src1 );                                         \
+   ureg_fixup_insn_size( ureg, insn );                                  \
+}
+
+#define OP12_TEX( op )                                                  \
+static INLINE void ureg_##op( struct ureg_program *ureg,                \
+                              struct ureg_dst dst,                      \
+                              unsigned target,                          \
+                              struct ureg_src src0,                     \
+                              struct ureg_src src1 )                    \
+{                                                                       \
+   unsigned opcode = TGSI_OPCODE_##op;                                  \
+   unsigned insn = ureg_emit_insn( ureg, opcode, dst.Saturate, 1, 2 );  \
+   ureg_emit_texture( ureg, insn, target );                             \
+   ureg_emit_dst( ureg, dst );                                          \
+   ureg_emit_src( ureg, src0 );                                         \
+   ureg_emit_src( ureg, src1 );                                         \
+   ureg_fixup_insn_size( ureg, insn );                                  \
+}
+
+#define OP13( op )                                                      \
+static INLINE void ureg_##op( struct ureg_program *ureg,                \
+                              struct ureg_dst dst,                      \
+                              struct ureg_src src0,                     \
+                              struct ureg_src src1,                     \
+                              struct ureg_src src2 )                    \
+{                                                                       \
+   unsigned opcode = TGSI_OPCODE_##op;                                  \
+   unsigned insn = ureg_emit_insn( ureg, opcode, dst.Saturate, 1, 3 );  \
+   ureg_emit_dst( ureg, dst );                                          \
+   ureg_emit_src( ureg, src0 );                                         \
+   ureg_emit_src( ureg, src1 );                                         \
+   ureg_emit_src( ureg, src2 );                                         \
+   ureg_fixup_insn_size( ureg, insn );                                  \
+}
+
+#define OP14_TEX( op )                                                  \
+static INLINE void ureg_##op( struct ureg_program *ureg,                \
+                              struct ureg_dst dst,                      \
+                              unsigned target,                          \
+                              struct ureg_src src0,                     \
+                              struct ureg_src src1,                     \
+                              struct ureg_src src2,                     \
+                              struct ureg_src src3 )                    \
+{                                                                       \
+   unsigned opcode = TGSI_OPCODE_##op;                                  \
+   unsigned insn = ureg_emit_insn( ureg, opcode, dst.Saturate, 1, 4 );  \
+   ureg_emit_texture( ureg, insn, target );                             \
+   ureg_emit_dst( ureg, dst );                                          \
+   ureg_emit_src( ureg, src0 );                                         \
+   ureg_emit_src( ureg, src1 );                                         \
+   ureg_emit_src( ureg, src2 );                                         \
+   ureg_emit_src( ureg, src3 );                                         \
+   ureg_fixup_insn_size( ureg, insn );                                  \
+}
+
+
+/* Use a template include to generate a correctly-typed ureg_OP()
+ * function for each TGSI opcode:
+ */
+#include "tgsi_opcode_tmp.h"
+
+
+/***********************************************************************
+ * Inline helpers for manipulating register structs:
+ */
+static INLINE struct ureg_src 
+ureg_negate( struct ureg_src reg )
+{
+   reg.Negate ^= 1;
+   return reg;
+}
+
+static INLINE struct ureg_src
+ureg_abs( struct ureg_src reg )
+{
+   reg.Absolute = 1;
+   reg.Negate = 0;
+   return reg;
+}
+
+static INLINE struct ureg_src 
+ureg_swizzle( struct ureg_src reg, 
+              int x, int y, int z, int w )
+{
+   unsigned swz = ( (reg.SwizzleX << 0) |
+                    (reg.SwizzleY << 2) |
+                    (reg.SwizzleZ << 4) |
+                    (reg.SwizzleW << 6));
+
+   reg.SwizzleX = (swz >> (x*2)) & 0x3;
+   reg.SwizzleY = (swz >> (y*2)) & 0x3;
+   reg.SwizzleZ = (swz >> (z*2)) & 0x3;
+   reg.SwizzleW = (swz >> (w*2)) & 0x3;
+   return reg;
+}
+
+static INLINE struct ureg_src
+ureg_scalar( struct ureg_src reg, int x )
+{
+   return ureg_swizzle(reg, x, x, x, x);
+}
+
+static INLINE struct ureg_dst 
+ureg_writemask( struct ureg_dst reg,
+                unsigned writemask )
+{
+   reg.WriteMask &= writemask;
+   return reg;
+}
+
+static INLINE struct ureg_dst 
+ureg_saturate( struct ureg_dst reg )
+{
+   reg.Saturate = 1;
+   return reg;
+}
+
+static INLINE struct ureg_dst
+ureg_dst( struct ureg_src src )
+{
+   struct ureg_dst dst;
+
+   dst.File      = src.File;
+   dst.WriteMask = TGSI_WRITEMASK_XYZW;
+   dst.Indirect  = src.Indirect;
+   dst.Saturate  = 0;
+   dst.Index     = src.Index;
+   dst.Pad1      = 0;
+   dst.Pad2      = 0;
+
+   return dst;
+}
+
+static INLINE struct ureg_src
+ureg_src( struct ureg_dst dst )
+{
+   struct ureg_src src;
+
+   src.File      = dst.File;
+   src.SwizzleX  = TGSI_SWIZZLE_X;
+   src.SwizzleY  = TGSI_SWIZZLE_Y;
+   src.SwizzleZ  = TGSI_SWIZZLE_Z;
+   src.SwizzleW  = TGSI_SWIZZLE_W;
+   src.Pad       = 0;
+   src.Indirect  = dst.Indirect;
+   src.Absolute  = 0;
+   src.Index     = dst.Index;
+   src.Negate    = 0;
+
+   return src;
+}
+
+
+
+#endif
index 414cf91..cda6dbd 100644 (file)
@@ -45,6 +45,7 @@
 #include "util/u_math.h"
 #include "util/u_memory.h"
 #include "util/u_simple_shaders.h"
+#include "util/u_surface.h"
 
 #include "cso_cache/cso_context.h"
 
@@ -155,7 +156,11 @@ util_destroy_blit(struct blit_state *ctx)
 }
 
 
-static unsigned get_next_slot( struct blit_state *ctx )
+/**
+ * Get offset of next free slot in vertex buffer for quad vertices.
+ */
+static unsigned
+get_next_slot( struct blit_state *ctx )
 {
    const unsigned max_slots = 4096 / sizeof ctx->vertices;
 
@@ -173,7 +178,6 @@ static unsigned get_next_slot( struct blit_state *ctx )
 }
                                
 
-
 /**
  * Setup vertex data for the textured quad we'll draw.
  * Note: y=0=top
@@ -260,9 +264,38 @@ setup_vertex_data_tex(struct blit_state *ctx,
 
    return offset;
 }
+
+
+/**
+ * \return TRUE if two regions overlap, FALSE otherwise
+ */
+static boolean
+regions_overlap(int srcX0, int srcY0,
+                int srcX1, int srcY1,
+                int dstX0, int dstY0,
+                int dstX1, int dstY1)
+{
+   if (MAX2(srcX0, srcX1) < MIN2(dstX0, dstX1))
+      return FALSE; /* src completely left of dst */
+
+   if (MAX2(dstX0, dstX1) < MIN2(srcX0, srcX1))
+      return FALSE; /* dst completely left of src */
+
+   if (MAX2(srcY0, srcY1) < MIN2(dstY0, dstY1))
+      return FALSE; /* src completely above dst */
+
+   if (MAX2(dstY0, dstY1) < MIN2(srcY0, srcY1))
+      return FALSE; /* dst completely above src */
+
+   return TRUE; /* some overlap */
+}
+
+
 /**
  * Copy pixel block from src surface to dst surface.
  * Overlapping regions are acceptable.
+ * Flipping and stretching are supported.
+ * XXX what about clipping???
  * XXX need some control over blitting Z and/or stencil.
  */
 void
@@ -285,10 +318,41 @@ util_blit_pixels(struct blit_state *ctx,
    const int srcLeft = MIN2(srcX0, srcX1);
    const int srcTop = MIN2(srcY0, srcY1);
    unsigned offset;
+   boolean overlap;
 
    assert(filter == PIPE_TEX_MIPFILTER_NEAREST ||
           filter == PIPE_TEX_MIPFILTER_LINEAR);
 
+   assert(screen->is_format_supported(screen, src->format, PIPE_TEXTURE_2D,
+                                      PIPE_TEXTURE_USAGE_SAMPLER, 0));
+   assert(screen->is_format_supported(screen, dst->format, PIPE_TEXTURE_2D,
+                                      PIPE_TEXTURE_USAGE_RENDER_TARGET, 0));
+
+   /* do the regions overlap? */
+   overlap = util_same_surface(src, dst) &&
+      regions_overlap(srcX0, srcY0, srcX1, srcY1,
+                      dstX0, dstY0, dstX1, dstY1);
+
+   /*
+    * Check for simple case:  no format conversion, no flipping, no stretching,
+    * no overlapping.
+    * Filter mode should not matter since there's no stretching.
+    */
+   if (dst->format == src->format &&
+       srcX0 < srcX1 &&
+       dstX0 < dstX1 &&
+       srcY0 < srcY1 &&
+       dstY0 < dstY1 &&
+       (dstX1 - dstX0) == (srcX1 - srcX0) &&
+       (dstY1 - dstY0) == (srcY1 - srcY0) &&
+       !overlap) {
+      pipe->surface_copy(pipe,
+                        dst, dstX0, dstY0, /* dest */
+                        src, srcX0, srcY0, /* src */
+                        srcW, srcH);       /* size */
+      return;
+   }
+   
    if (srcLeft != srcX0) {
       /* left-right flip */
       int tmp = dstX0;
@@ -303,20 +367,6 @@ util_blit_pixels(struct blit_state *ctx,
       dstY1 = tmp;
    }
 
-   assert(screen->is_format_supported(screen, src->format, PIPE_TEXTURE_2D,
-                                      PIPE_TEXTURE_USAGE_SAMPLER, 0));
-   assert(screen->is_format_supported(screen, dst->format, PIPE_TEXTURE_2D,
-                                      PIPE_TEXTURE_USAGE_SAMPLER, 0));
-
-   if(dst->format == src->format && (dstX1 - dstX0) == srcW && (dstY1 - dstY0) == srcH) {
-      /* FIXME: this will most surely fail for overlapping rectangles */
-      pipe->surface_copy(pipe,
-                        dst, dstX0, dstY0,   /* dest */
-                        src, srcX0, srcY0, /* src */
-                        srcW, srcH);     /* size */
-      return;
-   }
-   
    assert(screen->is_format_supported(screen, dst->format, PIPE_TEXTURE_2D,
                                       PIPE_TEXTURE_USAGE_RENDER_TARGET, 0));
 
index a5ca0b7..96d400c 100644 (file)
@@ -143,11 +143,9 @@ void _debug_vprintf(const char *format, va_list ap)
 #elif defined(PIPE_SUBSYSTEM_WINDOWS_MINIPORT)
    /* TODO */
 #else /* !PIPE_SUBSYSTEM_WINDOWS */
-#ifdef DEBUG
    fflush(stdout);
    vfprintf(stderr, format, ap);
 #endif
-#endif
 }
 
 
index ca79748..edc3756 100644 (file)
 #include "util/u_gen_mipmap.h"
 #include "util/u_simple_shaders.h"
 
-#include "tgsi/tgsi_build.h"
-#include "tgsi/tgsi_dump.h"
-#include "tgsi/tgsi_parse.h"
-
 #include "cso_cache/cso_context.h"
 
 
index e5003af..57410e7 100644 (file)
@@ -53,11 +53,11 @@ __inline double ceil(double val)
 {
    double ceil_val;
 
-   if((val - (long) val) == 0) {
+   if ((val - (long) val) == 0) {
       ceil_val = val;
    }
    else {
-      if(val > 0) {
+      if (val > 0) {
          ceil_val = (long) val + 1;
       }
       else {
@@ -73,11 +73,11 @@ __inline double floor(double val)
 {
    double floor_val;
 
-   if((val - (long) val) == 0) {
+   if ((val - (long) val) == 0) {
       floor_val = val;
    }
    else {
-      if(val > 0) {
+      if (val > 0) {
          floor_val = (long) val;
       }
       else {
@@ -189,7 +189,10 @@ static INLINE double log2( double x )
 extern float pow2_table[POW2_TABLE_SIZE];
 
 
-
+/**
+ * Initialize math module.  This should be called before using any
+ * other functions in this module.
+ */
 extern void
 util_init_math(void);
 
@@ -216,23 +219,24 @@ util_fast_exp2(float x)
    int32_t ipart;
    float fpart, mpart;
    union fi epart;
-   
+
    if(x > 129.00000f)
       return 3.402823466e+38f;
-   
-   if(x < -126.99999f)
+
+   if (x < -126.99999f)
       return 0.0f;
 
    ipart = (int32_t) x;
    fpart = x - (float) ipart;
-   
+
    /* same as
     *   epart.f = (float) (1 << ipart)
-    * but faster and without integer overflow for ipart > 31 */
+    * but faster and without integer overflow for ipart > 31
+    */
    epart.i = (ipart + 127 ) << 23;
-   
+
    mpart = pow2_table[POW2_TABLE_OFFSET + (int)(fpart * POW2_TABLE_SCALE)];
-   
+
    return epart.f * mpart;
 }
 
@@ -254,6 +258,9 @@ util_fast_exp(float x)
 extern float log2_table[LOG2_TABLE_SIZE];
 
 
+/**
+ * Fast approximation to log2(x).
+ */
 static INLINE float
 util_fast_log2(float x)
 {
@@ -267,6 +274,9 @@ util_fast_log2(float x)
 }
 
 
+/**
+ * Fast approximation to x^y.
+ */
 static INLINE float
 util_fast_pow(float x, float y)
 {
@@ -274,7 +284,6 @@ util_fast_pow(float x, float y)
 }
 
 
-
 /**
  * Floor(x), returned as int.
  */
@@ -284,8 +293,8 @@ util_ifloor(float f)
    int ai, bi;
    double af, bf;
    union fi u;
-   af = (3 << 22) + 0.5 + (double)f;
-   bf = (3 << 22) + 0.5 - (double)f;
+   af = (3 << 22) + 0.5 + (double) f;
+   bf = (3 << 22) + 0.5 - (double) f;
    u.f = (float) af;  ai = u.i;
    u.f = (float) bf;  bi = u.i;
    return (ai - bi) >> 1;
@@ -305,9 +314,9 @@ util_iround(float f)
 #elif defined(PIPE_CC_MSVC) && defined(PIPE_ARCH_X86)
    int r;
    _asm {
-        fld f
-        fistp r
-       }
+      fld f
+      fistp r
+   }
    return r;
 #else
    if (f >= 0.0f)
@@ -340,7 +349,7 @@ static INLINE
 unsigned long ffs( unsigned long u )
 {
    unsigned long i;
-   if(_BitScanForward(&i, u))
+   if (_BitScanForward(&i, u))
       return i + 1;
    else
       return 0;
@@ -351,7 +360,7 @@ unsigned ffs( unsigned u )
 {
    unsigned i;
 
-   if( u == 0 ) {
+   if (u == 0) {
       return 0;
    }
 
@@ -378,7 +387,10 @@ fui( float f )
 }
 
 
-
+/**
+ * Convert ubyte to float in [0, 1].
+ * XXX a 256-entry lookup table would be slightly faster.
+ */
 static INLINE float
 ubyte_to_float(ubyte ub)
 {
@@ -409,7 +421,23 @@ float_to_ubyte(float f)
 }
 
 
+/**
+ * Calc log base 2
+ */
+static INLINE unsigned
+util_logbase2(unsigned n)
+{
+   unsigned log2 = 0;
+   while (n >>= 1)
+      ++log2;
+   return log2;
+}
+
 
+/**
+ * Clamp X to [MIN, MAX].
+ * This is a macro to allow float, int, uint, etc. types.
+ */
 #define CLAMP( X, MIN, MAX )  ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ? (MAX) : (X)) )
 
 #define MIN2( A, B )   ( (A)<(B) ? (A) : (B) )
@@ -422,6 +450,11 @@ align(int value, int alignment)
    return (value + alignment - 1) & ~(alignment - 1);
 }
 
+static INLINE unsigned
+minify(unsigned value)
+{
+    return MAX2(1, value >> 1);
+}
 
 #ifndef COPY_4V
 #define COPY_4V( DST, SRC )         \
index 0b18d04..c3f8c91 100644 (file)
@@ -100,8 +100,14 @@ ExFreePool(void *P);
 #define MALLOC( SIZE )  malloc( SIZE )
 #define CALLOC( COUNT, SIZE )   calloc( COUNT, SIZE )
 #define FREE( PTR )  free( PTR )
-#define REALLOC( OLDPTR, OLDSIZE, NEWSIZE )  realloc( OLDPTR, NEWSIZE )
 
+static INLINE void *
+_REALLOC( void *old_ptr, unsigned old_size, unsigned new_size )
+{
+   (void) old_size;
+   return realloc(old_ptr, new_size);
+}
+#define REALLOC( a, b, c ) _REALLOC( a, b, c )
 #endif
 
 
index 151a480..4b75d4b 100644 (file)
 void
 u_mmDumpMemInfo(const struct mem_block *heap)
 {
-   debug_printf("Memory heap %p:\n", (void *)heap);
+   debug_printf("Memory heap %p:\n", (void *) heap);
    if (heap == 0) {
       debug_printf("  heap == 0\n");
-   } else {
+   }
+   else {
       const struct mem_block *p;
 
-      for(p = heap->next; p != heap; p = p->next) {
-        debug_printf("  Offset:%08x, Size:%08x, %c%c\n",p->ofs,p->size,
-                p->free ? 'F':'.',
-                p->reserved ? 'R':'.');
+      for (p = heap->next; p != heap; p = p->next) {
+        debug_printf("  Offset:%08x, Size:%08x, %c%c\n", p->ofs, p->size,
+                      p->free ? 'F':'.',
+                      p->reserved ? 'R':'.');
       }
 
       debug_printf("\nFree list:\n");
 
-      for(p = heap->next_free; p != heap; p = p->next_free) {
-        debug_printf(" FREE Offset:%08x, Size:%08x, %c%c\n",p->ofs,p->size,
-                p->free ? 'F':'.',
-                p->reserved ? 'R':'.');
+      for (p = heap->next_free; p != heap; p = p->next_free) {
+        debug_printf(" FREE Offset:%08x, Size:%08x, %c%c\n", p->ofs, p->size,
+                      p->free ? 'F':'.',
+                      p->reserved ? 'R':'.');
       }
 
    }
    debug_printf("End of memory blocks\n");
 }
 
+
 struct mem_block *
 u_mmInit(int ofs, int size)
 {
index ce20e48..6b158aa 100644 (file)
@@ -84,7 +84,7 @@ extern struct mem_block *u_mmFindBlock(struct mem_block *heap, int start);
 extern void u_mmDestroy(struct mem_block *mmInit);
 
 /**
- * For debuging purpose.
+ * For debugging purposes.
  */
 extern void u_mmDumpMemInfo(const struct mem_block *mmInit);
 
index 8114b53..f01296b 100644 (file)
@@ -65,12 +65,13 @@ pass_surface_buffer_create(struct pipe_screen *screen,
                            unsigned width, unsigned height,
                            enum pipe_format format,
                            unsigned usage,
+                           unsigned tex_usage,
                            unsigned *stride)
 {
    struct pipe_buffer *buffer =
       screen->winsys->surface_buffer_create(screen->winsys,
                                                 width, height,
-                                                format, usage, stride);
+                                                format, usage, tex_usage, stride);
 
    buffer->screen = screen;
 
index e519c35..1152d62 100644 (file)
@@ -42,9 +42,7 @@
 #include "util/u_memory.h"
 #include "util/u_simple_shaders.h"
 
-#include "tgsi/tgsi_build.h"
-#include "tgsi/tgsi_dump.h"
-#include "tgsi/tgsi_parse.h"
+#include "tgsi/tgsi_ureg.h"
 
 
 
@@ -58,93 +56,31 @@ util_make_vertex_passthrough_shader(struct pipe_context *pipe,
                                     const uint *semantic_indexes)
                                     
 {
-   struct pipe_shader_state shader;
-   struct tgsi_token tokens[100];
-   struct tgsi_header *header;
-   struct tgsi_processor *processor;
-   struct tgsi_full_declaration decl;
-   struct tgsi_full_instruction inst;
-   const uint procType = TGSI_PROCESSOR_VERTEX;
-   uint ti, i;
+   struct ureg_program *ureg;
+   uint i;
 
-   /* shader header
-    */
-   *(struct tgsi_version *) &tokens[0] = tgsi_build_version();
+   ureg = ureg_create( pipe, TGSI_PROCESSOR_VERTEX );
+   if (ureg == NULL)
+      return NULL;
 
-   header = (struct tgsi_header *) &tokens[1];
-   *header = tgsi_build_header();
-
-   processor = (struct tgsi_processor *) &tokens[2];
-   *processor = tgsi_build_processor( procType, header );
-
-   ti = 3;
-
-   /* declare inputs */
-   for (i = 0; i < num_attribs; i++) {
-      decl = tgsi_default_full_declaration();
-      decl.Declaration.File = TGSI_FILE_INPUT;
-
-      decl.Declaration.Semantic = 1;
-      decl.Semantic.SemanticName = semantic_names[i];
-      decl.Semantic.SemanticIndex = semantic_indexes[i];
-
-      decl.DeclarationRange.First = 
-      decl.DeclarationRange.Last = i;
-      ti += tgsi_build_full_declaration(&decl,
-                                        &tokens[ti],
-                                        header,
-                                        Elements(tokens) - ti);
-   }
-
-   /* declare outputs */
    for (i = 0; i < num_attribs; i++) {
-      decl = tgsi_default_full_declaration();
-      decl.Declaration.File = TGSI_FILE_OUTPUT;
-      decl.Declaration.Semantic = 1;
-      decl.Semantic.SemanticName = semantic_names[i];
-      decl.Semantic.SemanticIndex = semantic_indexes[i];
-      decl.DeclarationRange.First = 
-         decl.DeclarationRange.Last = i;
-      ti += tgsi_build_full_declaration(&decl,
-                                        &tokens[ti],
-                                        header,
-                                        Elements(tokens) - ti);
+      struct ureg_src src;
+      struct ureg_dst dst;
+
+      src = ureg_DECL_vs_input( ureg,
+                                semantic_names[i],
+                                semantic_indexes[i]);
+      
+      dst = ureg_DECL_output( ureg,
+                              semantic_names[i],
+                              semantic_indexes[i]);
+      
+      ureg_MOV( ureg, dst, src );
    }
 
-   /* emit MOV instructions */
-   for (i = 0; i < num_attribs; i++) {
-      /* MOVE out[i], in[i]; */
-      inst = tgsi_default_full_instruction();
-      inst.Instruction.Opcode = TGSI_OPCODE_MOV;
-      inst.Instruction.NumDstRegs = 1;
-      inst.FullDstRegisters[0].DstRegister.File = TGSI_FILE_OUTPUT;
-      inst.FullDstRegisters[0].DstRegister.Index = i;
-      inst.Instruction.NumSrcRegs = 1;
-      inst.FullSrcRegisters[0].SrcRegister.File = TGSI_FILE_INPUT;
-      inst.FullSrcRegisters[0].SrcRegister.Index = i;
-      ti += tgsi_build_full_instruction(&inst,
-                                        &tokens[ti],
-                                        header,
-                                        Elements(tokens) - ti );
-   }
-
-   /* END instruction */
-   inst = tgsi_default_full_instruction();
-   inst.Instruction.Opcode = TGSI_OPCODE_END;
-   inst.Instruction.NumDstRegs = 0;
-   inst.Instruction.NumSrcRegs = 0;
-   ti += tgsi_build_full_instruction(&inst,
-                                     &tokens[ti],
-                                     header,
-                                     Elements(tokens) - ti );
-
-#if 0 /*debug*/
-   tgsi_dump(tokens, 0);
-#endif
-
-   shader.tokens = tokens;
+   ureg_END( ureg );
 
-   return pipe->create_vs_state(pipe, &shader);
+   return ureg_create_shader_and_destroy( ureg );
 }
 
 
@@ -158,99 +94,29 @@ util_make_vertex_passthrough_shader(struct pipe_context *pipe,
 void *
 util_make_fragment_tex_shader(struct pipe_context *pipe)
 {
-   struct pipe_shader_state shader;
-   struct tgsi_token tokens[100];
-   struct tgsi_header *header;
-   struct tgsi_processor *processor;
-   struct tgsi_full_declaration decl;
-   struct tgsi_full_instruction inst;
-   const uint procType = TGSI_PROCESSOR_FRAGMENT;
-   uint ti;
-
-   /* shader header
-    */
-   *(struct tgsi_version *) &tokens[0] = tgsi_build_version();
-
-   header = (struct tgsi_header *) &tokens[1];
-   *header = tgsi_build_header();
-
-   processor = (struct tgsi_processor *) &tokens[2];
-   *processor = tgsi_build_processor( procType, header );
-
-   ti = 3;
-
-   /* declare TEX[0] input */
-   decl = tgsi_default_full_declaration();
-   decl.Declaration.File = TGSI_FILE_INPUT;
-   /* XXX this could be linear... */
-   decl.Declaration.Interpolate = TGSI_INTERPOLATE_PERSPECTIVE;
-   decl.Declaration.Semantic = 1;
-   decl.Semantic.SemanticName = TGSI_SEMANTIC_GENERIC;
-   decl.Semantic.SemanticIndex = 0;
-   decl.DeclarationRange.First = 
-   decl.DeclarationRange.Last = 0;
-   ti += tgsi_build_full_declaration(&decl,
-                                     &tokens[ti],
-                                     header,
-                                     Elements(tokens) - ti);
-
-   /* declare color[0] output */
-   decl = tgsi_default_full_declaration();
-   decl.Declaration.File = TGSI_FILE_OUTPUT;
-   decl.Declaration.Semantic = 1;
-   decl.Semantic.SemanticName = TGSI_SEMANTIC_COLOR;
-   decl.Semantic.SemanticIndex = 0;
-   decl.DeclarationRange.First = 
-   decl.DeclarationRange.Last = 0;
-   ti += tgsi_build_full_declaration(&decl,
-                                     &tokens[ti],
-                                     header,
-                                     Elements(tokens) - ti);
-
-   /* declare sampler */
-   decl = tgsi_default_full_declaration();
-   decl.Declaration.File = TGSI_FILE_SAMPLER;
-   decl.DeclarationRange.First = 
-   decl.DeclarationRange.Last = 0;
-   ti += tgsi_build_full_declaration(&decl,
-                                     &tokens[ti],
-                                     header,
-                                     Elements(tokens) - ti);
-
-   /* TEX instruction */
-   inst = tgsi_default_full_instruction();
-   inst.Instruction.Opcode = TGSI_OPCODE_TEX;
-   inst.Instruction.NumDstRegs = 1;
-   inst.FullDstRegisters[0].DstRegister.File = TGSI_FILE_OUTPUT;
-   inst.FullDstRegisters[0].DstRegister.Index = 0;
-   inst.Instruction.NumSrcRegs = 2;
-   inst.InstructionExtTexture.Texture = TGSI_TEXTURE_2D;
-   inst.FullSrcRegisters[0].SrcRegister.File = TGSI_FILE_INPUT;
-   inst.FullSrcRegisters[0].SrcRegister.Index = 0;
-   inst.FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER;
-   inst.FullSrcRegisters[1].SrcRegister.Index = 0;
-   ti += tgsi_build_full_instruction(&inst,
-                                     &tokens[ti],
-                                     header,
-                                     Elements(tokens) - ti );
-
-   /* END instruction */
-   inst = tgsi_default_full_instruction();
-   inst.Instruction.Opcode = TGSI_OPCODE_END;
-   inst.Instruction.NumDstRegs = 0;
-   inst.Instruction.NumSrcRegs = 0;
-   ti += tgsi_build_full_instruction(&inst,
-                                     &tokens[ti],
-                                     header,
-                                     Elements(tokens) - ti );
-
-#if 0 /*debug*/
-   tgsi_dump(tokens, 0);
-#endif
-
-   shader.tokens = tokens;
-
-   return pipe->create_fs_state(pipe, &shader);
+   struct ureg_program *ureg;
+   struct ureg_src sampler;
+   struct ureg_src tex;
+   struct ureg_dst out;
+
+   ureg = ureg_create( pipe, TGSI_PROCESSOR_FRAGMENT );
+   if (ureg == NULL)
+      return NULL;
+   
+   sampler = ureg_DECL_sampler( ureg );
+
+   tex = ureg_DECL_fs_input( ureg, 
+                             TGSI_SEMANTIC_GENERIC, 0, 
+                             TGSI_INTERPOLATE_PERSPECTIVE );
+
+   out = ureg_DECL_output( ureg, 
+                           TGSI_SEMANTIC_COLOR,
+                           0 );
+
+   ureg_TEX( ureg, out, TGSI_TEXTURE_2D, tex, sampler );
+   ureg_END( ureg );
+
+   return ureg_create_shader_and_destroy( ureg );
 }
 
 
@@ -263,87 +129,23 @@ util_make_fragment_tex_shader(struct pipe_context *pipe)
 void *
 util_make_fragment_passthrough_shader(struct pipe_context *pipe)
 {
-   struct pipe_shader_state shader;
-   struct tgsi_token tokens[40];
-   struct tgsi_header *header;
-   struct tgsi_processor *processor;
-   struct tgsi_full_declaration decl;
-   struct tgsi_full_instruction inst;
-   const uint procType = TGSI_PROCESSOR_FRAGMENT;
-   uint ti;
-
-   /* shader header
-    */
-   *(struct tgsi_version *) &tokens[0] = tgsi_build_version();
-
-   header = (struct tgsi_header *) &tokens[1];
-   *header = tgsi_build_header();
-
-   processor = (struct tgsi_processor *) &tokens[2];
-   *processor = tgsi_build_processor( procType, header );
-
-   ti = 3;
-
-   /* declare input */
-   decl = tgsi_default_full_declaration();
-   decl.Declaration.File = TGSI_FILE_INPUT;
-   decl.Declaration.Semantic = 1;
-   decl.Semantic.SemanticName = TGSI_SEMANTIC_COLOR;
-   decl.Semantic.SemanticIndex = 0;
-   decl.DeclarationRange.First = 
-      decl.DeclarationRange.Last = 0;
-   ti += tgsi_build_full_declaration(&decl,
-                                     &tokens[ti],
-                                     header,
-                                     Elements(tokens) - ti);
-
-   /* declare output */
-   decl = tgsi_default_full_declaration();
-   decl.Declaration.File = TGSI_FILE_OUTPUT;
-   decl.Declaration.Semantic = 1;
-   decl.Semantic.SemanticName = TGSI_SEMANTIC_COLOR;
-   decl.Semantic.SemanticIndex = 0;
-   decl.DeclarationRange.First = 
-      decl.DeclarationRange.Last = 0;
-   ti += tgsi_build_full_declaration(&decl,
-                                     &tokens[ti],
-                                     header,
-                                     Elements(tokens) - ti);
-
-
-   /* MOVE out[0], in[0]; */
-   inst = tgsi_default_full_instruction();
-   inst.Instruction.Opcode = TGSI_OPCODE_MOV;
-   inst.Instruction.NumDstRegs = 1;
-   inst.FullDstRegisters[0].DstRegister.File = TGSI_FILE_OUTPUT;
-   inst.FullDstRegisters[0].DstRegister.Index = 0;
-   inst.Instruction.NumSrcRegs = 1;
-   inst.FullSrcRegisters[0].SrcRegister.File = TGSI_FILE_INPUT;
-   inst.FullSrcRegisters[0].SrcRegister.Index = 0;
-   ti += tgsi_build_full_instruction(&inst,
-                                     &tokens[ti],
-                                     header,
-                                     Elements(tokens) - ti );
-
-   /* END instruction */
-   inst = tgsi_default_full_instruction();
-   inst.Instruction.Opcode = TGSI_OPCODE_END;
-   inst.Instruction.NumDstRegs = 0;
-   inst.Instruction.NumSrcRegs = 0;
-   ti += tgsi_build_full_instruction(&inst,
-                                     &tokens[ti],
-                                     header,
-                                     Elements(tokens) - ti );
-
-   assert(ti < Elements(tokens));
-
-#if 0 /*debug*/
-   tgsi_dump(tokens, 0);
-#endif
-
-   shader.tokens = tokens;
-
-   return pipe->create_fs_state(pipe, &shader);
+   struct ureg_program *ureg;
+   struct ureg_src src;
+   struct ureg_dst dst;
+
+   ureg = ureg_create( pipe, TGSI_PROCESSOR_FRAGMENT );
+   if (ureg == NULL)
+      return NULL;
+
+   src = ureg_DECL_fs_input( ureg, TGSI_SEMANTIC_COLOR, 0, 
+                             TGSI_INTERPOLATE_PERSPECTIVE );
+
+   dst = ureg_DECL_output( ureg, TGSI_SEMANTIC_COLOR, 0 );
+
+   ureg_MOV( ureg, dst, src );
+   ureg_END( ureg );
+
+   return ureg_create_shader_and_destroy( ureg );
 }
 
 
index a5b73cf..ce84ed7 100644 (file)
@@ -37,6 +37,23 @@ struct pipe_texture;
 struct pipe_surface;
 
 
+/**
+ * Are s1 and s2 the same surface?
+ * Surfaces are basically views into textures so check if the two surfaces
+ * name the same part of the same texture.
+ */
+static INLINE boolean
+util_same_surface(const struct pipe_surface *s1, const struct pipe_surface *s2)
+{
+   return (s1->texture == s2->texture &&
+           s1->face == s2->face &&
+           s1->level == s2->level &&
+           s1->zslice == s2->zslice);
+}
+
+
+
+
 extern boolean
 util_create_rgba_surface(struct pipe_screen *screen,
                          uint width, uint height,
index a0c8ed8..422bc76 100644 (file)
@@ -153,7 +153,7 @@ a8r8g8b8_put_tile_rgba(unsigned *dst,
 }
 
 
-/*** PIPE_FORMAT_A8R8G8B8_UNORM ***/
+/*** PIPE_FORMAT_X8R8G8B8_UNORM ***/
 
 static void
 x8r8g8b8_get_tile_rgba(const unsigned *src,
index 5268cbf..c16cdd0 100644 (file)
@@ -35,7 +35,7 @@
 
 #include "pipe/p_config.h"
 
-#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS)
+#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE)
 #include <sys/time.h>
 #elif defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY)
 #include <windows.h>
@@ -77,7 +77,7 @@ util_time_get_frequency(void)
 void 
 util_time_get(struct util_time *t)
 {
-#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS)
+#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE)
    gettimeofday(&t->tv, NULL);
 #elif defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY)
    LONGLONG temp;
@@ -102,7 +102,7 @@ util_time_add(const struct util_time *t1,
               int64_t usecs,
               struct util_time *t2)
 {
-#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS)
+#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE)
    t2->tv.tv_sec = t1->tv.tv_sec + usecs / 1000000;
    t2->tv.tv_usec = t1->tv.tv_usec + usecs % 1000000;
 #elif defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY) || defined(PIPE_SUBSYSTEM_WINDOWS_USER) || defined(PIPE_SUBSYSTEM_WINDOWS_CE)
@@ -124,7 +124,7 @@ int64_t
 util_time_diff(const struct util_time *t1, 
                const struct util_time *t2)
 {
-#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS)
+#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE)
    return (t2->tv.tv_usec - t1->tv.tv_usec) + 
           (t2->tv.tv_sec - t1->tv.tv_sec)*1000000;
 #elif defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY) || defined(PIPE_SUBSYSTEM_WINDOWS_USER) || defined(PIPE_SUBSYSTEM_WINDOWS_CE)
@@ -144,7 +144,7 @@ util_time_micros( void )
    
    util_time_get(&t1);
    
-#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS)
+#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE)
    return t1.tv.tv_usec + t1.tv.tv_sec*1000000LL;
 #elif defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY) || defined(PIPE_SUBSYSTEM_WINDOWS_USER) || defined(PIPE_SUBSYSTEM_WINDOWS_CE)
    util_time_get_frequency();
@@ -166,7 +166,7 @@ static INLINE int
 util_time_compare(const struct util_time *t1, 
                   const struct util_time *t2)
 {
-#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS)
+#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE)
    if (t1->tv.tv_sec < t2->tv.tv_sec)
       return -1;
    else if(t1->tv.tv_sec > t2->tv.tv_sec)
index 6bca607..7a5c54d 100644 (file)
@@ -38,7 +38,7 @@
 
 #include "pipe/p_config.h"
 
-#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS)
+#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE)
 #include <time.h> /* timeval */
 #include <unistd.h> /* usleep */
 #endif
@@ -58,7 +58,7 @@ extern "C" {
  */
 struct util_time 
 {
-#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS)
+#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE)
    struct timeval tv;
 #else
    int64_t counter;
@@ -89,7 +89,7 @@ util_time_timeout(const struct util_time *start,
                   const struct util_time *end,
                   const struct util_time *curr);
 
-#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS)
+#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE)
 #define util_time_sleep usleep
 #else
 void
index 77b2a3a..178acdc 100644 (file)
@@ -212,13 +212,14 @@ timed_surface_buffer_create(struct pipe_winsys *winsys,
                               unsigned width, unsigned height,
                               enum pipe_format format, 
                               unsigned usage,
+                              unsigned tex_usage,
                               unsigned *stride)
 {
    struct pipe_winsys *backend = timed_winsys(winsys)->backend;
    uint64_t start = time_start();
 
    struct pipe_buffer *ret = backend->surface_buffer_create( backend, width, height, 
-                                                             format, usage, stride );
+                                                             format, usage, tex_usage, stride );
 
    time_finish(winsys, start, 7, __FUNCTION__);
    
index 5a889a6..58a8b5d 100644 (file)
@@ -1834,9 +1834,9 @@ emit_instruction(struct codegen *gen,
    case TGSI_OPCODE_ENDIF:
       return emit_ENDIF(gen, inst);
 
-   case TGSI_OPCODE_BGNLOOP2:
+   case TGSI_OPCODE_BGNLOOP:
       return emit_BGNLOOP(gen, inst);
-   case TGSI_OPCODE_ENDLOOP2:
+   case TGSI_OPCODE_ENDLOOP:
       return emit_ENDLOOP(gen, inst);
    case TGSI_OPCODE_BRK:
       return emit_BRK(gen, inst);
@@ -1875,9 +1875,9 @@ emit_immediate(struct codegen *gen, const struct tgsi_full_immediate *immed)
    assert(gen->num_imm < MAX_TEMPS);
 
    for (ch = 0; ch < 4; ch++) {
-      float val = immed->u.ImmediateFloat32[ch].Float;
+      float val = immed->u[ch].Float;
 
-      if (ch > 0 && val == immed->u.ImmediateFloat32[ch - 1].Float) {
+      if (ch > 0 && val == immed->u[ch - 1].Float) {
          /* re-use previous register */
          gen->imm_regs[gen->num_imm][ch] = gen->imm_regs[gen->num_imm][ch - 1];
       }
index e265944..6a63a0e 100644 (file)
 
 
 
-static unsigned
-minify(unsigned d)
-{
-   return MAX2(1, d>>1);
-}
-
-
 static void
 cell_texture_layout(struct cell_texture *ct)
 {
@@ -424,7 +417,8 @@ cell_transfer_map(struct pipe_screen *screen, struct pipe_transfer *transfer)
    if (!ctrans->map)
       return NULL; /* out of memory */
 
-   if (transfer->usage & PIPE_TRANSFER_READ) {
+   if (transfer->usage == PIPE_TRANSFER_READ ||
+       transfer->usage == PIPE_TRANSFER_READ_WRITE) {
       /* need to untwiddle the texture to make a linear version */
       const uint bpp = pf_get_size(ct->base.format);
       if (bpp == 4) {
@@ -465,7 +459,8 @@ cell_transfer_unmap(struct pipe_screen *screen,
                                    PIPE_BUFFER_USAGE_CPU_READ);
    }
 
-   if (transfer->usage & PIPE_TRANSFER_WRITE) {
+   if (transfer->usage == PIPE_TRANSFER_WRITE ||
+       transfer->usage == PIPE_TRANSFER_READ_WRITE) {
       /* The user wrote new texture data into the mapped buffer.
        * We need to convert the new linear data into the twiddled/tiled format.
        */
index e27df2d..6db9501 100644 (file)
@@ -952,7 +952,6 @@ exec_instruction(
       break;
 
    case TGSI_OPCODE_RCP:
-   /* TGSI_OPCODE_RECIP */
       FETCH( &r[0], 0, CHAN_X );
       r[0].q = micro_div(mach->Temps[TEMP_1_I].xyzw[TEMP_1_C].q, r[0].q);
       FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
@@ -961,7 +960,6 @@ exec_instruction(
       break;
 
    case TGSI_OPCODE_RSQ:
-   /* TGSI_OPCODE_RECIPSQRT */
       FETCH( &r[0], 0, CHAN_X );
       r[0].q = micro_sqrt(r[0].q);
       r[0].q = micro_div(mach->Temps[TEMP_1_I].xyzw[TEMP_1_C].q, r[0].q);
@@ -1115,7 +1113,6 @@ exec_instruction(
       break;
 
    case TGSI_OPCODE_MAD:
-   /* TGSI_OPCODE_MADD */
       FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
          FETCH( &r[0], 0, chan_index );
          FETCH( &r[1], 1, chan_index );
@@ -1136,8 +1133,7 @@ exec_instruction(
       }
       break;
 
-   case TGSI_OPCODE_LERP:
-   /* TGSI_OPCODE_LRP */
+   case TGSI_OPCODE_LRP:
       FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
          FETCH(&r[0], 0, chan_index);
          FETCH(&r[1], 1, chan_index);
@@ -1158,21 +1154,11 @@ exec_instruction(
       ASSERT (0);
       break;
 
-   case TGSI_OPCODE_DOT2ADD:
-      /* TGSI_OPCODE_DP2A */
+   case TGSI_OPCODE_DP2A:
       ASSERT (0);
       break;
 
-   case TGSI_OPCODE_INDEX:
-      ASSERT (0);
-      break;
-
-   case TGSI_OPCODE_NEGATE:
-      ASSERT (0);
-      break;
-
-   case TGSI_OPCODE_FRAC:
-   /* TGSI_OPCODE_FRC */
+   case TGSI_OPCODE_FRC:
       FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
          FETCH( &r[0], 0, chan_index );
          r[0].q = micro_frc(r[0].q);
@@ -1184,8 +1170,7 @@ exec_instruction(
       ASSERT (0);
       break;
 
-   case TGSI_OPCODE_FLOOR:
-   /* TGSI_OPCODE_FLR */
+   case TGSI_OPCODE_FLR:
       FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
          FETCH( &r[0], 0, chan_index );
          r[0].q = micro_flr(r[0].q);
@@ -1201,8 +1186,7 @@ exec_instruction(
       }
       break;
 
-   case TGSI_OPCODE_EXPBASE2:
-    /* TGSI_OPCODE_EX2 */
+   case TGSI_OPCODE_EX2:
       FETCH(&r[0], 0, CHAN_X);
 
       r[0].q = micro_pow(mach->Temps[TEMP_2_I].xyzw[TEMP_2_C].q, r[0].q);
@@ -1212,8 +1196,7 @@ exec_instruction(
       }
       break;
 
-   case TGSI_OPCODE_LOGBASE2:
-   /* TGSI_OPCODE_LG2 */
+   case TGSI_OPCODE_LG2:
       FETCH( &r[0], 0, CHAN_X );
       r[0].q = micro_lg2(r[0].q);
       FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
@@ -1221,8 +1204,7 @@ exec_instruction(
       }
       break;
 
-   case TGSI_OPCODE_POWER:
-      /* TGSI_OPCODE_POW */
+   case TGSI_OPCODE_POW:
       FETCH(&r[0], 0, CHAN_X);
       FETCH(&r[1], 1, CHAN_X);
 
@@ -1233,7 +1215,7 @@ exec_instruction(
       }
       break;
 
-   case TGSI_OPCODE_CROSSPRODUCT:
+   case TGSI_OPCODE_XPD:
       /* TGSI_OPCODE_XPD */
       FETCH(&r[0], 0, CHAN_Y);
       FETCH(&r[1], 1, CHAN_Z);
@@ -1275,10 +1257,6 @@ exec_instruction(
       }
       break;
 
-    case TGSI_OPCODE_MULTIPLYMATRIX:
-       ASSERT (0);
-       break;
-
     case TGSI_OPCODE_ABS:
        FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
           FETCH(&r[0], 0, chan_index);
@@ -1780,9 +1758,9 @@ exec_instruction(
       mach->Primitives[mach->Temps[TEMP_PRIMITIVE_I].xyzw[TEMP_PRIMITIVE_C].u[0]] = 0;
       break;
 
-   case TGSI_OPCODE_LOOP:
+   case TGSI_OPCODE_BGNFOR:
       /* fall-through (for now) */
-   case TGSI_OPCODE_BGNLOOP2:
+   case TGSI_OPCODE_BGNLOOP:
       /* push LoopMask and ContMasks */
       ASSERT(mach->LoopStackTop < TGSI_EXEC_MAX_LOOP_NESTING);
       mach->LoopStack[mach->LoopStackTop++] = mach->LoopMask;
@@ -1790,9 +1768,9 @@ exec_instruction(
       mach->ContStack[mach->ContStackTop++] = mach->ContMask;
       break;
 
-   case TGSI_OPCODE_ENDLOOP:
+   case TGSI_OPCODE_ENDFOR:
       /* fall-through (for now at least) */
-   case TGSI_OPCODE_ENDLOOP2:
+   case TGSI_OPCODE_ENDLOOP:
       /* Restore ContMask, but don't pop */
       ASSERT(mach->ContStackTop > 0);
       mach->ContMask = mach->ContStack[mach->ContStackTop - 1];
index a433cf0..c6e68ea 100644 (file)
@@ -50,8 +50,8 @@ i915_batchbuffer_check( struct i915_batchbuffer *batch,
                        size_t dwords,
                        size_t relocs )
 {
-   /** TODO JB: Check relocs */
-   return dwords * 4 <= batch->size - (batch->ptr - batch->map);
+   return dwords * 4 <= batch->size - (batch->ptr - batch->map) &&
+          relocs <= (batch->max_relocs - batch->relocs);
 }
 
 static INLINE size_t
index ccf9bb3..bf69c8e 100644 (file)
@@ -142,10 +142,14 @@ i915_is_texture_referenced( struct pipe_context *pipe,
                            unsigned face, unsigned level)
 {
    /**
-    * FIXME: Optimize.
+    * FIXME: Return the corrent result. We can't alays return referenced
+    *        since it causes a double flush within the vbo module.
     */
-
+#if 0
    return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE;
+#else
+   return 0;
+#endif
 }
 
 static unsigned int
@@ -153,10 +157,14 @@ i915_is_buffer_referenced( struct pipe_context *pipe,
                           struct pipe_buffer *buf)
 {
    /**
-    * FIXME: Optimize.
+    * FIXME: Return the corrent result. We can't alays return referenced
+    *        since it causes a double flush within the vbo module.
     */
-
+#if 0
    return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE;
+#else
+   return 0;
+#endif
 }
 
 
index 961c1bf..89504ce 100644 (file)
@@ -975,8 +975,9 @@ i915_translate_instructions(struct i915_fp_compile *p,
                = &parse.FullToken.FullImmediate;
             const uint pos = p->num_immediates++;
             uint j;
+            assert( imm->Immediate.NrTokens <= 4 + 1 );
             for (j = 0; j < imm->Immediate.NrTokens - 1; j++) {
-               p->immediates[pos][j] = imm->u.ImmediateFloat32[j].Float;
+               p->immediates[pos][j] = imm->u[j].Float;
             }
          }
          break;
index f4aa8e6..a3de38d 100644 (file)
@@ -232,6 +232,8 @@ i915_get_tex_transfer(struct pipe_screen *screen,
    if (trans) {
       pipe_texture_reference(&trans->base.texture, texture);
       trans->base.format = trans->base.format;
+      trans->base.x = x;
+      trans->base.y = y;
       trans->base.width = w;
       trans->base.height = h;
       trans->base.block = texture->block;
index ca8e87a..03f0e14 100644 (file)
@@ -72,11 +72,6 @@ static const int step_offsets[6][2] = {
    {-1, 1}
 };
 
-static unsigned minify( unsigned d )
-{
-   return MAX2(1, d>>1);
-}
-
 static unsigned
 power_of_two(unsigned x)
 {
@@ -160,10 +155,10 @@ i915_miptree_set_image_offset(struct i915_texture *tex,
 
 
 /**
- * Special case to deal with display targets.
+ * Special case to deal with scanout textures.
  */
 static boolean
-i915_displaytarget_layout(struct i915_texture *tex)
+i915_scanout_layout(struct i915_texture *tex)
 {
    struct pipe_texture *pt = &tex->base;
 
@@ -177,9 +172,13 @@ i915_displaytarget_layout(struct i915_texture *tex)
    i915_miptree_set_image_offset( tex, 0, 0, 0, 0 );
 
    if (tex->base.width[0] >= 128) {
+#if 0
       tex->stride = power_of_two(tex->base.nblocksx[0] * pt->block.size);
+#else
+      tex->stride = 2048 * 4; /* TODO fix when backend is smarter */
+#endif
       tex->total_nblocksy = round_up(tex->base.nblocksy[0], 8);
-#if 0 /* used for tiled display targets */
+#if 0 /* used for tiled textures */
       tex->tiled = 1;
 #endif
    } else {
@@ -209,9 +208,9 @@ i945_miptree_layout_2d( struct i915_texture *tex )
    unsigned nblocksx = pt->nblocksx[0];
    unsigned nblocksy = pt->nblocksy[0];
 
-   /* used for tiled display targets */
-   if (0)
-      if (i915_displaytarget_layout(tex))
+   /* used for scanouts that need special layouts */
+   if (tex->base.tex_usage & PIPE_TEXTURE_USAGE_PRIMARY)
+      if (i915_scanout_layout(tex))
         return;
 
    tex->stride = round_up(pt->nblocksx[0] * pt->block.size, 4);
@@ -584,6 +583,7 @@ i915_texture_create(struct pipe_screen *screen,
    struct i915_screen *i915screen = i915_screen(screen);
    struct i915_texture *tex = CALLOC_STRUCT(i915_texture);
    size_t tex_size;
+   unsigned buf_usage = 0;
 
    if (!tex)
       return NULL;
@@ -605,9 +605,11 @@ i915_texture_create(struct pipe_screen *screen,
 
    tex_size = tex->stride * tex->total_nblocksy;
 
-   tex->buffer = screen->buffer_create(screen, 64,
-                                    PIPE_BUFFER_USAGE_PIXEL,
-                                    tex_size);
+   buf_usage = PIPE_BUFFER_USAGE_PIXEL;
+   if (templat->tex_usage & PIPE_TEXTURE_USAGE_PRIMARY)
+      buf_usage |= I915_BUFFER_USAGE_SCANOUT;
+
+   tex->buffer = screen->buffer_create(screen, 64, buf_usage, tex_size);
 
    if (!tex->buffer)
       goto fail;
index ff5b34f..711db91 100644 (file)
@@ -109,6 +109,7 @@ struct i915_winsys {
 #define I915_BUFFER_ACCESS_READ    0x2
 
 #define I915_BUFFER_USAGE_LIT_VERTEX  (PIPE_BUFFER_USAGE_CUSTOM << 0)
+#define I915_BUFFER_USAGE_SCANOUT     (PIPE_BUFFER_USAGE_CUSTOM << 1)
 
 
 /**
index 8aea8c0..998ffae 100644 (file)
@@ -65,11 +65,6 @@ unsigned intel_compressed_alignment(unsigned internalFormat)
 }
 #endif
 
-static unsigned minify( unsigned d )
-{
-   return MAX2(1, d>>1);
-}
-
 
 static void intel_miptree_set_image_offset(struct brw_texture *tex,
                                            unsigned level,
index e03d653..3ee82d9 100644 (file)
@@ -1294,10 +1294,10 @@ void brw_vs_emit(struct brw_vs_compile *c)
       case TGSI_TOKEN_TYPE_IMMEDIATE: {
          struct tgsi_full_immediate *imm = &parse.FullToken.FullImmediate;
          assert(imm->Immediate.NrTokens == 4 + 1);
-         c->prog_data.imm_buf[c->prog_data.num_imm][0] = imm->u.ImmediateFloat32[0].Float;
-         c->prog_data.imm_buf[c->prog_data.num_imm][1] = imm->u.ImmediateFloat32[1].Float;
-         c->prog_data.imm_buf[c->prog_data.num_imm][2] = imm->u.ImmediateFloat32[2].Float;
-         c->prog_data.imm_buf[c->prog_data.num_imm][3] = imm->u.ImmediateFloat32[3].Float;
+         c->prog_data.imm_buf[c->prog_data.num_imm][0] = imm->u[0].Float;
+         c->prog_data.imm_buf[c->prog_data.num_imm][1] = imm->u[1].Float;
+         c->prog_data.imm_buf[c->prog_data.num_imm][2] = imm->u[2].Float;
+         c->prog_data.imm_buf[c->prog_data.num_imm][3] = imm->u[3].Float;
          c->prog_data.num_imm++;
       }
          break;
index ab6410a..db75963 100644 (file)
@@ -947,7 +947,7 @@ static void brw_wm_emit_instruction( struct brw_wm_compile *c,
 #endif
 
       break;
-   case TGSI_OPCODE_LOOP:
+   case TGSI_OPCODE_BGNFOR:
       c->loop_inst[c->loop_insn++] = brw_DO(p, BRW_EXECUTE_8);
       break;
    case TGSI_OPCODE_BRK:
@@ -958,11 +958,11 @@ static void brw_wm_emit_instruction( struct brw_wm_compile *c,
       brw_CONT(p);
       brw_set_predicate_control(p, BRW_PREDICATE_NONE);
       break;
-   case TGSI_OPCODE_ENDLOOP:
+   case TGSI_OPCODE_ENDFOR:
       c->loop_insn--;
       c->inst0 = c->inst1 = brw_WHILE(p, c->loop_inst[c->loop_insn]);
       /* patch all the BREAK instructions from
-        last BEGINLOOP */
+         last BGNFOR */
       while (c->inst0 > c->loop_inst[c->loop_insn]) {
         c->inst0--;
         if (c->inst0->header.opcode == BRW_OPCODE_BREAK) {
index a500ec6..4e70008 100644 (file)
@@ -501,7 +501,7 @@ identity_set_sampler_textures(struct pipe_context *_pipe,
 
    pipe->set_sampler_textures(pipe,
                               num_textures,
-                              _textures);
+                              textures);
 }
 
 static void
index 555220f..e5342ac 100644 (file)
@@ -60,7 +60,7 @@ identity_drm_create_screen(struct drm_api *_api, int fd,
    screen = api->create_screen(api, fd, arg);
 
    return identity_screen_create(screen);
-};
+}
 
 static struct pipe_context *
 identity_drm_create_context(struct drm_api *_api,
@@ -77,7 +77,7 @@ identity_drm_create_context(struct drm_api *_api,
    pipe = identity_context_create(_screen, pipe);
 
    return pipe;
-};
+}
 
 static boolean
 identity_drm_buffer_from_texture(struct drm_api *_api,
index 259f1be..2643963 100644 (file)
@@ -289,6 +289,7 @@ identity_screen_surface_buffer_create(struct pipe_screen *_screen,
                                       unsigned height,
                                       enum pipe_format format,
                                       unsigned usage,
+                                      unsigned tex_usage,
                                       unsigned *stride)
 {
    struct identity_screen *id_screen = identity_screen(_screen);
@@ -300,6 +301,7 @@ identity_screen_surface_buffer_create(struct pipe_screen *_screen,
                                           height,
                                           format,
                                           usage,
+                                          tex_usage,
                                           stride);
 
    if (result)
index 832366e..e4cf91c 100644 (file)
@@ -4,6 +4,8 @@
 
 #include <util/u_memory.h>
 
+#include <errno.h>
+
 #include "nouveau/nouveau_bo.h"
 #include "nouveau_winsys.h"
 #include "nouveau_screen.h"
@@ -141,12 +143,13 @@ nouveau_screen_bo_map_range(struct pipe_screen *pscreen, struct pipe_buffer *pb,
                            unsigned offset, unsigned length, unsigned usage)
 {
        struct nouveau_bo *bo = nouveau_bo(pb);
+       uint32_t flags = nouveau_screen_map_flags(usage);
        int ret;
 
-       ret = nouveau_bo_map_range(bo, offset, length,
-                                  nouveau_screen_map_flags(usage));
+       ret = nouveau_bo_map_range(bo, offset, length, flags);
        if (ret) {
-               debug_printf("map_range failed: %d\n", ret);
+               if (!(flags & NOUVEAU_BO_NOWAIT) || ret != -EBUSY)
+                       debug_printf("map_range failed: %d\n", ret);
                return NULL;
        }
 
index f315cf5..bbbcb54 100644 (file)
@@ -110,10 +110,10 @@ nv04_surface_copy_swizzle(struct nv04_surface_2d *ctx,
        unsigned cx;
        unsigned cy;
 
-       /* POT or GTFO */
-       assert(!(w & (w - 1)) && !(h & (h - 1)));
+#if 0
        /* That's the way she likes it */
        assert(src_pitch == ((struct nv04_surface *)dst)->pitch);
+#endif
 
        BEGIN_RING(chan, swzsurf, NV04_SWIZZLED_SURFACE_DMA_IMAGE, 1);
        OUT_RELOCo(chan, dst_bo,
@@ -133,7 +133,7 @@ nv04_surface_copy_swizzle(struct nv04_surface_2d *ctx,
        for (cy = 0; cy < h; cy += sub_h) {
          for (cx = 0; cx < w; cx += sub_w) {
            BEGIN_RING(chan, swzsurf, NV04_SWIZZLED_SURFACE_OFFSET, 1);
-           OUT_RELOCl(chan, dst_bo, dst->offset + nv04_swizzle_bits(cx, cy) *
+           OUT_RELOCl(chan, dst_bo, dst->offset + nv04_swizzle_bits(cx+dx, cy+dy) *
                             dst->texture->block.size, NOUVEAU_BO_GART |
                             NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
 
@@ -153,8 +153,8 @@ nv04_surface_copy_swizzle(struct nv04_surface_2d *ctx,
            OUT_RING  (chan, src_pitch |
                             NV04_SCALED_IMAGE_FROM_MEMORY_FORMAT_ORIGIN_CENTER |
                             NV04_SCALED_IMAGE_FROM_MEMORY_FORMAT_FILTER_POINT_SAMPLE);
-           OUT_RELOCl(chan, src_bo, src->offset + cy * src_pitch +
-                            cx * src->texture->block.size, NOUVEAU_BO_GART |
+           OUT_RELOCl(chan, src_bo, src->offset + (cy+sy) * src_pitch +
+                            (cx+sx) * src->texture->block.size, NOUVEAU_BO_GART |
                             NOUVEAU_BO_VRAM | NOUVEAU_BO_RD);
            OUT_RING  (chan, 0);
          }
@@ -210,6 +210,43 @@ nv04_surface_copy_m2mf(struct nv04_surface_2d *ctx,
 }
 
 static int
+nv04_surface_copy_m2mf_swizzle(struct nv04_surface_2d *ctx,
+                              struct pipe_surface *dst, int dx, int dy,
+                              struct pipe_surface *src, int sx, int sy)
+{
+       struct nouveau_channel *chan = ctx->m2mf->channel;
+       struct nouveau_grobj *m2mf = ctx->m2mf;
+       struct nouveau_bo *src_bo = nouveau_bo(ctx->buf(src));
+       struct nouveau_bo *dst_bo = nouveau_bo(ctx->buf(dst));
+       unsigned src_pitch = ((struct nv04_surface *)src)->pitch;
+       unsigned dst_pitch = ((struct nv04_surface *)dst)->pitch;
+       unsigned dst_offset = dst->offset + nv04_swizzle_bits(dx, dy) *
+                             dst->texture->block.size;
+       unsigned src_offset = src->offset + sy * src_pitch +
+                             sx * src->texture->block.size;
+
+       BEGIN_RING(chan, m2mf, NV04_MEMORY_TO_MEMORY_FORMAT_DMA_BUFFER_IN, 2);
+       OUT_RELOCo(chan, src_bo,
+                  NOUVEAU_BO_GART | NOUVEAU_BO_VRAM | NOUVEAU_BO_RD);
+       OUT_RELOCo(chan, dst_bo,
+                  NOUVEAU_BO_GART | NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
+
+       BEGIN_RING(chan, m2mf, NV04_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8);
+       OUT_RELOCl(chan, src_bo, src_offset,
+                  NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_RD);
+       OUT_RELOCl(chan, dst_bo, dst_offset,
+                  NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_WR);
+       OUT_RING  (chan, src_pitch);
+       OUT_RING  (chan, dst_pitch);
+       OUT_RING  (chan, 1 * src->texture->block.size);
+       OUT_RING  (chan, 1);
+       OUT_RING  (chan, 0x0101);
+       OUT_RING  (chan, 0);
+
+       return 0;
+}
+
+static int
 nv04_surface_copy_blit(struct nv04_surface_2d *ctx, struct pipe_surface *dst,
                       int dx, int dy, struct pipe_surface *src, int sx, int sy,
                       int w, int h)
@@ -258,8 +295,59 @@ nv04_surface_copy(struct nv04_surface_2d *ctx, struct pipe_surface *dst,
        assert(src->format == dst->format);
 
        /* Setup transfer to swizzle the texture to vram if needed */
-       if (src_linear && !dst_linear && w > 1 && h > 1) {
-               nv04_surface_copy_swizzle(ctx, dst, dx, dy, src, sx, sy, w, h);
+       if (src_linear && !dst_linear) {
+               int x,y;
+
+               if ((w>1) && (h>1)) {
+                       int potWidth = 1<<log2i(w);
+                       int potHeight = 1<<log2i(h);
+                       int remainWidth = w-potWidth;
+                       int remainHeight = h-potHeight;
+                       int squareDim = (potWidth>potHeight ? potHeight : potWidth);
+
+                       /* top left is always POT, but we can only swizzle squares */
+                       for (y=0; y<potHeight; y+=squareDim) {
+                               for (x=0; x<potWidth; x+= squareDim) {
+                                       nv04_surface_copy_swizzle(ctx, dst, dx+x, dy+y,
+                                                                 src, sx+x, sy+y,
+                                                                 squareDim, squareDim);
+                               }
+                       }
+
+                       /* top right */
+                       if (remainWidth>0) {
+                       nv04_surface_copy(ctx, dst, dx+potWidth, dy,
+                                                 src, sx+potWidth, sy,
+                                                 remainWidth, potHeight);
+                       }
+
+                       /* bottom left */
+                       if (remainHeight>0) {
+                               nv04_surface_copy(ctx, dst, dx, dy+potHeight,
+                                         src, sx, sy+potHeight,
+                                                 potWidth, remainHeight);
+                       }
+
+                       /* bottom right */
+                       if ((remainWidth>0) && (remainHeight>0)) {
+                               nv04_surface_copy(ctx, dst, dx+potWidth, dy+potHeight,
+                                                 src, sx+potWidth, sy+potHeight,
+                                                 remainWidth, remainHeight);
+                       }
+               } else if (w==1) {
+                       /* We have a column to copy to a swizzled texture */
+                       for (y=0; y<h; y++) {
+                               nv04_surface_copy_m2mf_swizzle(ctx, dst, dx, dy+y,
+                                                              src, sx, sy+y);
+                       }
+               } else if (h==1) {
+                       /* We have a row to copy to a swizzled texture */
+                       for (x=0; x<w; x++) {
+                               nv04_surface_copy_m2mf_swizzle(ctx, dst, dx+x, dy,
+                                                              src, sx+x, sy);
+                       }
+               }
+
                return;
        }
 
index c1e5889..388245e 100644 (file)
@@ -617,10 +617,10 @@ nv20_vertprog_translate(struct nv20_context *nv20,
                        assert(imm->Immediate.NrTokens == 4 + 1);
                        vpc->imm[vpc->nr_imm++] =
                                constant(vpc, -1,
-                                        imm->u.ImmediateFloat32[0].Float,
-                                        imm->u.ImmediateFloat32[1].Float,
-                                        imm->u.ImmediateFloat32[2].Float,
-                                        imm->u.ImmediateFloat32[3].Float);
+                                        imm->u[0].Float,
+                                        imm->u[1].Float,
+                                        imm->u[2].Float,
+                                        imm->u[3].Float);
                }
                        break;
                case TGSI_TOKEN_TYPE_INSTRUCTION:
index 1d1c556..a48ba97 100644 (file)
@@ -704,10 +704,10 @@ nv30_fragprog_prepare(struct nv30_fpc *fpc)
                        assert(imm->Immediate.DataType == TGSI_IMM_FLOAT32);
                        assert(fpc->nr_imm < MAX_IMM);
 
-                       vals[0] = imm->u.ImmediateFloat32[0].Float;
-                       vals[1] = imm->u.ImmediateFloat32[1].Float;
-                       vals[2] = imm->u.ImmediateFloat32[2].Float;
-                       vals[3] = imm->u.ImmediateFloat32[3].Float;
+                       vals[0] = imm->u[0].Float;
+                       vals[1] = imm->u[1].Float;
+                       vals[2] = imm->u[2].Float;
+                       vals[3] = imm->u[3].Float;
                        fpc->imm[fpc->nr_imm++] = constant(fpc, -1, vals);
                }
                        break;
index c8b4078..f8285e4 100644 (file)
@@ -95,7 +95,7 @@ nv30_screen_surface_format_supported(struct pipe_screen *pscreen,
                }
        } else
        if (tex_usage & PIPE_TEXTURE_USAGE_DEPTH_STENCIL) {
-               switch (tex_usage) {
+               switch (format) {
                case PIPE_FORMAT_Z24S8_UNORM:
                case PIPE_FORMAT_Z24X8_UNORM:
                case PIPE_FORMAT_Z16_UNORM:
index c7514ef..14a5c02 100644 (file)
@@ -617,10 +617,10 @@ nv30_vertprog_translate(struct nv30_context *nv30,
                        assert(imm->Immediate.NrTokens == 4 + 1);
                        vpc->imm[vpc->nr_imm++] =
                                constant(vpc, -1,
-                                        imm->u.ImmediateFloat32[0].Float,
-                                        imm->u.ImmediateFloat32[1].Float,
-                                        imm->u.ImmediateFloat32[2].Float,
-                                        imm->u.ImmediateFloat32[3].Float);
+                                        imm->u[0].Float,
+                                        imm->u[1].Float,
+                                        imm->u[2].Float,
+                                        imm->u[3].Float);
                }
                        break;
                case TGSI_TOKEN_TYPE_INSTRUCTION:
index 680976d..32d9ed1 100644 (file)
@@ -790,10 +790,10 @@ nv40_fragprog_prepare(struct nv40_fpc *fpc)
                        assert(imm->Immediate.DataType == TGSI_IMM_FLOAT32);
                        assert(fpc->nr_imm < MAX_IMM);
 
-                       vals[0] = imm->u.ImmediateFloat32[0].Float;
-                       vals[1] = imm->u.ImmediateFloat32[1].Float;
-                       vals[2] = imm->u.ImmediateFloat32[2].Float;
-                       vals[3] = imm->u.ImmediateFloat32[3].Float;
+                       vals[0] = imm->u[0].Float;
+                       vals[1] = imm->u[1].Float;
+                       vals[2] = imm->u[2].Float;
+                       vals[3] = imm->u[3].Float;
                        fpc->imm[fpc->nr_imm++] = constant(fpc, -1, vals);
                }
                        break;
index e75e8d3..0382dbb 100644 (file)
@@ -788,10 +788,10 @@ nv40_vertprog_translate(struct nv40_context *nv40,
                        assert(imm->Immediate.NrTokens == 4 + 1);
                        vpc->imm[vpc->nr_imm++] =
                                constant(vpc, -1,
-                                        imm->u.ImmediateFloat32[0].Float,
-                                        imm->u.ImmediateFloat32[1].Float,
-                                        imm->u.ImmediateFloat32[2].Float,
-                                        imm->u.ImmediateFloat32[3].Float);
+                                        imm->u[0].Float,
+                                        imm->u[1].Float,
+                                        imm->u[2].Float,
+                                        imm->u[3].Float);
                }
                        break;
                case TGSI_TOKEN_TYPE_INSTRUCTION:
index e02afc4..6e8f4f9 100644 (file)
@@ -31,15 +31,23 @@ static void
 nv50_flush(struct pipe_context *pipe, unsigned flags,
           struct pipe_fence_handle **fence)
 {
-       struct nv50_context *nv50 = (struct nv50_context *)pipe;
-       
-       FIRE_RING(nv50->screen->base.channel);
+       struct nv50_context *nv50 = nv50_context(pipe);
+       struct nouveau_channel *chan = nv50->screen->base.channel;
+       struct nouveau_grobj *eng2d = nv50->screen->eng2d;
+
+       /* We need this in the ddx for reliable composite, not sure what we're
+        * actually flushing. We generate all our own flushes with flags = 0. */
+       WAIT_RING(chan, 3);
+       BEGIN_RING(chan, eng2d, 0x0110, 1);
+       OUT_RING  (chan, 0);
+
+       FIRE_RING(chan);
 }
 
 static void
 nv50_destroy(struct pipe_context *pipe)
 {
-       struct nv50_context *nv50 = (struct nv50_context *)pipe;
+       struct nv50_context *nv50 = nv50_context(pipe);
 
        draw_destroy(nv50->draw);
        FREE(nv50);
@@ -112,5 +120,3 @@ nv50_create(struct pipe_screen *pscreen, unsigned pctx_id)
 
        return &nv50->pipe;
 }
-
-               
index 9b8cc4d..5cbc2c8 100644 (file)
@@ -71,6 +71,7 @@ struct nv50_sampler_stateobj {
 struct nv50_miptree_level {
        int *image_offset;
        unsigned pitch;
+       unsigned tile_mode;
 };
 
 struct nv50_miptree {
index 22465e0..dd1b030 100644 (file)
@@ -42,9 +42,14 @@ nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
        mt->base.screen = pscreen;
 
        switch (pt->format) {
-       case PIPE_FORMAT_Z24X8_UNORM:
+       case PIPE_FORMAT_Z32_FLOAT:
+               tile_flags = 0x4800;
+               break;
        case PIPE_FORMAT_Z24S8_UNORM:
-       case PIPE_FORMAT_Z16_UNORM:
+               tile_flags = 0x1800;
+               break;
+       case PIPE_FORMAT_X8Z24_UNORM:
+       case PIPE_FORMAT_S8Z24_UNORM:
                tile_flags = 0x2800;
                break;
        default:
@@ -82,20 +87,27 @@ nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
 
                lvl->image_offset = CALLOC(mt->image_nr, sizeof(int));
                lvl->pitch = align(pt->width[l] * pt->block.size, 64);
+               lvl->tile_mode = tile_mode;
 
                width = MAX2(1, width >> 1);
                height = MAX2(1, height >> 1);
                depth = MAX2(1, depth >> 1);
+
+               if (tile_mode && height <= (tile_h >> 1)) {
+                       tile_mode--;
+                       tile_h >>= 1;
+               }
        }
 
        for (i = 0; i < mt->image_nr; i++) {
                for (l = 0; l <= pt->last_level; l++) {
                        struct nv50_miptree_level *lvl = &mt->level[l];
                        int size;
+                       tile_h = 1 << (lvl->tile_mode + 2);
 
                        size  = align(pt->width[l], 8) * pt->block.size;
                        size  = align(size, 64);
-                       size *= align(pt->height[l], tile_h) * pt->block.size;
+                       size *= align(pt->height[l], tile_h);
 
                        lvl->image_offset[i] = mt->total_size;
 
@@ -104,12 +116,12 @@ nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
        }
 
        ret = nouveau_bo_new_tile(dev, NOUVEAU_BO_VRAM, 256, mt->total_size,
-                                 tile_mode, tile_flags, &mt->bo);
+                                 mt->level[0].tile_mode, tile_flags, &mt->bo);
        if (ret) {
                FREE(mt);
                return NULL;
        }
-                            
+
        return &mt->base;
 }
 
@@ -146,7 +158,7 @@ nv50_miptree_destroy(struct pipe_texture *pt)
        struct nv50_miptree *mt = nv50_miptree(pt);
 
        nouveau_bo_ref(NULL, &mt->bo);
-        FREE(mt);
+       FREE(mt);
 }
 
 static struct pipe_surface *
@@ -189,8 +201,8 @@ nv50_miptree_surface_del(struct pipe_surface *ps)
 {
        struct nv50_surface *s = nv50_surface(ps);
 
-        pipe_texture_reference(&ps->texture, NULL);
-        FREE(s);
+       pipe_texture_reference(&ps->texture, NULL);
+       FREE(s);
 }
 
 void
index 5f7d06d..289c348 100644 (file)
@@ -251,7 +251,7 @@ alloc_temp4(struct nv50_pc *pc, struct nv50_reg *dst[4], int idx)
 
        if (pc->r_temp[idx] || pc->r_temp[idx + 1] ||
            pc->r_temp[idx + 2] || pc->r_temp[idx + 3])
-               return alloc_temp4(pc, dst, idx + 1);
+               return alloc_temp4(pc, dst, idx + 4);
 
        for (i = 0; i < 4; i++) {
                dst[i] = CALLOC_STRUCT(nv50_reg);
@@ -296,7 +296,7 @@ kill_temp_temp(struct nv50_pc *pc)
 static int
 ctor_immd(struct nv50_pc *pc, float x, float y, float z, float w)
 {
-       pc->immd_buf = REALLOC(pc->immd_buf, (pc->immd_nr * r * sizeof(float)),
+       pc->immd_buf = REALLOC(pc->immd_buf, (pc->immd_nr * 4 * sizeof(float)),
                               (pc->immd_nr + 1) * 4 * sizeof(float));
        pc->immd_buf[(pc->immd_nr * 4) + 0] = x;
        pc->immd_buf[(pc->immd_nr * 4) + 1] = y;
@@ -1014,6 +1014,7 @@ emit_tex(struct nv50_pc *pc, struct nv50_reg **dst, unsigned mask,
                break;
        }
 
+       /* some cards need t[0]'s hw index to be a multiple of 4 */
        alloc_temp4(pc, t, 0);
 
        if (proj) {
@@ -1809,10 +1810,10 @@ nv50_program_tx_prep(struct nv50_pc *pc)
                        const struct tgsi_full_immediate *imm =
                                &p.FullToken.FullImmediate;
 
-                       ctor_immd(pc, imm->u.ImmediateFloat32[0].Float,
-                                     imm->u.ImmediateFloat32[1].Float,
-                                     imm->u.ImmediateFloat32[2].Float,
-                                     imm->u.ImmediateFloat32[3].Float);
+                       ctor_immd(pc, imm->u[0].Float,
+                                     imm->u[1].Float,
+                                     imm->u[2].Float,
+                                     imm->u[3].Float);
                }
                        break;
                case TGSI_TOKEN_TYPE_DECLARATION:
@@ -2221,9 +2222,9 @@ nv50_program_upload_data(struct nv50_context *nv50, float *map,
        while (count) {
                unsigned nr = count > 2047 ? 2047 : count;
 
-               BEGIN_RING(chan, tesla, 0x00000f00, 1);
+               BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
                OUT_RING  (chan, (cbuf << 0) | (start << 8));
-               BEGIN_RING(chan, tesla, 0x40000f04, nr);
+               BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, nr);
                OUT_RINGp (chan, map, nr);
 
                map += nr;
@@ -2345,7 +2346,7 @@ nv50_program_validate_code(struct nv50_context *nv50, struct nv50_program *p)
        }
 
        so = so_new(4,2);
-       so_method(so, nv50->screen->tesla, 0x1280, 3);
+       so_method(so, nv50->screen->tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
        so_reloc (so, p->bo, 0, flags | NOUVEAU_BO_HIGH, 0, 0);
        so_reloc (so, p->bo, 0, flags | NOUVEAU_BO_LOW, 0, 0);
        so_data  (so, (NV50_CB_PUPLOAD << 16) | 0x0800); //(p->exec_size * 4));
@@ -2364,9 +2365,9 @@ nv50_program_validate_code(struct nv50_context *nv50, struct nv50_program *p)
                        continue;
                }
 
-               BEGIN_RING(chan, tesla, 0x0f00, 1);
+               BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
                OUT_RING  (chan, (start << 8) | NV50_CB_PUPLOAD);
-               BEGIN_RING(chan, tesla, 0x40000f04, nr);        
+               BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, nr);
                OUT_RINGp (chan, up + start, nr);
 
                start += nr;
@@ -2399,15 +2400,15 @@ nv50_vertprog_validate(struct nv50_context *nv50)
                      NOUVEAU_BO_HIGH, 0, 0);
        so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD |
                      NOUVEAU_BO_LOW, 0, 0);
-       so_method(so, tesla, 0x1650, 2);
+       so_method(so, tesla, NV50TCL_VP_ATTR_EN_0, 2);
        so_data  (so, p->cfg.vp.attr[0]);
        so_data  (so, p->cfg.vp.attr[1]);
-       so_method(so, tesla, 0x16b8, 1);
+       so_method(so, tesla, NV50TCL_VP_REG_ALLOC_RESULT, 1);
        so_data  (so, p->cfg.high_result);
-       so_method(so, tesla, 0x16ac, 2);
+       so_method(so, tesla, NV50TCL_VP_RESULT_MAP_SIZE, 2);
        so_data  (so, p->cfg.high_result); //8);
        so_data  (so, p->cfg.high_temp);
-       so_method(so, tesla, 0x140c, 1);
+       so_method(so, tesla, NV50TCL_VP_START_ID, 1);
        so_data  (so, 0); /* program start offset */
        so_ref(so, &nv50->state.vertprog);
        so_ref(NULL, &so);
@@ -2436,24 +2437,24 @@ nv50_fragprog_validate(struct nv50_context *nv50)
                      NOUVEAU_BO_HIGH, 0, 0);
        so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD |
                      NOUVEAU_BO_LOW, 0, 0);
-       so_method(so, tesla, 0x1904, 4);
+       so_method(so, tesla, NV50TCL_MAP_SEMANTIC_0, 4);
        so_data  (so, p->cfg.fp.regs[0]); /* 0x01000404 / 0x00040404 */
        so_data  (so, 0x00000004);
        so_data  (so, 0x00000000);
        so_data  (so, 0x00000000);
-       so_method(so, tesla, 0x16bc, p->cfg.fp.high_map);
+       so_method(so, tesla, NV50TCL_VP_RESULT_MAP(0), p->cfg.fp.high_map);
        for (i = 0; i < p->cfg.fp.high_map; i++)
                so_data(so, p->cfg.fp.map[i]);
-       so_method(so, tesla, 0x1988, 2);
+       so_method(so, tesla, NV50TCL_FP_INTERPOLANT_CTRL, 2);
        so_data  (so, p->cfg.fp.regs[1]); /* 0x08040404 / 0x0f000401 */
        so_data  (so, p->cfg.high_temp);
-       so_method(so, tesla, 0x1298, 1);
+       so_method(so, tesla, NV50TCL_FP_RESULT_COUNT, 1);
        so_data  (so, p->cfg.high_result);
-       so_method(so, tesla, 0x19a8, 1);
+       so_method(so, tesla, NV50TCL_FP_CTRL_UNK19A8, 1);
        so_data  (so, p->cfg.fp.regs[2]);
-       so_method(so, tesla, 0x196c, 1);
+       so_method(so, tesla, NV50TCL_FP_CTRL_UNK196C, 1);
        so_data  (so, p->cfg.fp.regs[3]);
-       so_method(so, tesla, 0x1414, 1);
+       so_method(so, tesla, NV50TCL_FP_START_ID, 1);
        so_data  (so, 0); /* program start offset */
        so_ref(so, &nv50->state.fragprog);
        so_ref(NULL, &so);
@@ -2478,4 +2479,3 @@ nv50_program_destroy(struct nv50_context *nv50, struct nv50_program *p)
 
        p->translated = 0;
 }
-
index 940e043..5305c93 100644 (file)
@@ -94,7 +94,7 @@ nv50_query_end(struct pipe_context *pipe, struct pipe_query *pq)
        struct nv50_query *q = nv50_query(pq);
 
        WAIT_RING (chan, 5);
-       BEGIN_RING(chan, tesla, 0x1b00, 4);
+       BEGIN_RING(chan, tesla, NV50TCL_QUERY_ADDRESS_HIGH, 4);
        OUT_RELOCh(chan, q->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
        OUT_RELOCl(chan, q->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
        OUT_RING  (chan, 0x00000000);
@@ -107,13 +107,13 @@ nv50_query_result(struct pipe_context *pipe, struct pipe_query *pq,
                  boolean wait, uint64_t *result)
 {
        struct nv50_query *q = nv50_query(pq);
-
-       /*XXX: Want to be able to return FALSE here instead of blocking
-        *     until the result is available..
-        */
+       int ret;
 
        if (!q->ready) {
-               nouveau_bo_map(q->bo, NOUVEAU_BO_RD);
+               ret = nouveau_bo_map(q->bo, NOUVEAU_BO_RD |
+                                    wait ? 0 : NOUVEAU_BO_NOWAIT);
+               if (ret)
+                       return false;
                q->result = ((uint32_t *)q->bo->map)[1];
                q->ready = TRUE;
                nouveau_bo_unmap(q->bo);
index ce8f906..c7f80a2 100644 (file)
@@ -44,9 +44,10 @@ nv50_screen_is_format_supported(struct pipe_screen *pscreen,
        } else
        if (tex_usage & PIPE_TEXTURE_USAGE_DEPTH_STENCIL) {
                switch (format) {
+               case PIPE_FORMAT_Z32_FLOAT:
                case PIPE_FORMAT_Z24S8_UNORM:
-               case PIPE_FORMAT_Z24X8_UNORM:
-               case PIPE_FORMAT_Z16_UNORM:
+               case PIPE_FORMAT_X8Z24_UNORM:
+               case PIPE_FORMAT_S8Z24_UNORM:
                        return TRUE;
                default:
                        break;
@@ -188,7 +189,8 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
        nv50_transfer_init_screen_functions(pscreen);
 
        /* DMA engine object */
-       ret = nouveau_grobj_alloc(chan, 0xbeef5039, 0x5039, &screen->m2mf);
+       ret = nouveau_grobj_alloc(chan, 0xbeef5039,
+               NV50_MEMORY_TO_MEMORY_FORMAT, &screen->m2mf);
        if (ret) {
                NOUVEAU_ERR("Error creating M2MF object: %d\n", ret);
                nv50_screen_destroy(pscreen);
@@ -197,7 +199,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
        BIND_RING(chan, screen->m2mf, 1);
 
        /* 2D object */
-       ret = nouveau_grobj_alloc(chan, 0xbeef502d, 0x502d, &screen->eng2d);
+       ret = nouveau_grobj_alloc(chan, 0xbeef502d, NV50_2D, &screen->eng2d);
        if (ret) {
                NOUVEAU_ERR("Error creating 2D object: %d\n", ret);
                nv50_screen_destroy(pscreen);
@@ -208,14 +210,15 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
        /* 3D object */
        switch (chipset & 0xf0) {
        case 0x50:
-               tesla_class = 0x5097;
+               tesla_class = NV50TCL;
                break;
        case 0x80:
        case 0x90:
-               tesla_class = 0x8297;
+               /* this stupid name should be corrected. */
+               tesla_class = NV54TCL;
                break;
        case 0xa0:
-               tesla_class = 0x8397;
+               tesla_class = NVA0TCL;
                break;
        default:
                NOUVEAU_ERR("Not a known NV50 chipset: NV%02x\n", chipset);
@@ -229,7 +232,8 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
                return NULL;
        }
 
-       ret = nouveau_grobj_alloc(chan, 0xbeef5097, tesla_class, &screen->tesla);
+       ret = nouveau_grobj_alloc(chan, 0xbeef5097, tesla_class,
+               &screen->tesla);
        if (ret) {
                NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
                nv50_screen_destroy(pscreen);
@@ -247,7 +251,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
 
        /* Static M2MF init */
        so = so_new(32, 0);
-       so_method(so, screen->m2mf, 0x0180, 3);
+       so_method(so, screen->m2mf, NV04_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 3);
        so_data  (so, screen->sync->handle);
        so_data  (so, chan->vram->handle);
        so_data  (so, chan->vram->handle);
@@ -290,9 +294,10 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
 
        so_method(so, screen->tesla, 0x13bc, 1);
        so_data  (so, 0x54);
+       /* origin is top left (set to 1 for bottom left) */
        so_method(so, screen->tesla, 0x13ac, 1);
-       so_data  (so, 1);
-       so_method(so, screen->tesla, 0x16b8, 1);
+       so_data  (so, 0);
+       so_method(so, screen->tesla, NV50TCL_VP_REG_ALLOC_RESULT, 1);
        so_data  (so, 8);
 
        /* constant buffers for immediates and VP/FP parameters */
@@ -330,33 +335,33 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
        so_data  (so, 0x000BBNP1);
        */
 
-       so_method(so, screen->tesla, 0x1280, 3);
+       so_method(so, screen->tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
        so_reloc (so, screen->constbuf_misc[0], 0, NOUVEAU_BO_VRAM |
                  NOUVEAU_BO_RD | NOUVEAU_BO_HIGH, 0, 0);
        so_reloc (so, screen->constbuf_misc[0], 0, NOUVEAU_BO_VRAM |
                  NOUVEAU_BO_RD | NOUVEAU_BO_LOW, 0, 0);
        so_data  (so, (NV50_CB_PMISC << 16) | 0x00000800);
-       so_method(so, screen->tesla, 0x1694, 1);
+       so_method(so, screen->tesla, NV50TCL_SET_PROGRAM_CB, 1);
        so_data  (so, 0x00000001 | (NV50_CB_PMISC << 12));
-       so_method(so, screen->tesla, 0x1694, 1);
+       so_method(so, screen->tesla, NV50TCL_SET_PROGRAM_CB, 1);
        so_data  (so, 0x00000031 | (NV50_CB_PMISC << 12));
 
-       so_method(so, screen->tesla, 0x1280, 3);
+       so_method(so, screen->tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
        so_reloc (so, screen->constbuf_parm[0], 0, NOUVEAU_BO_VRAM |
                  NOUVEAU_BO_RD | NOUVEAU_BO_HIGH, 0, 0);
        so_reloc (so, screen->constbuf_parm[0], 0, NOUVEAU_BO_VRAM |
                  NOUVEAU_BO_RD | NOUVEAU_BO_LOW, 0, 0);
        so_data  (so, (NV50_CB_PVP << 16) | 0x00000800);
-       so_method(so, screen->tesla, 0x1694, 1);
+       so_method(so, screen->tesla, NV50TCL_SET_PROGRAM_CB, 1);
        so_data  (so, 0x00000101 | (NV50_CB_PVP << 12));
 
-       so_method(so, screen->tesla, 0x1280, 3);
+       so_method(so, screen->tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
        so_reloc (so, screen->constbuf_parm[1], 0, NOUVEAU_BO_VRAM |
                  NOUVEAU_BO_RD | NOUVEAU_BO_HIGH, 0, 0);
        so_reloc (so, screen->constbuf_parm[1], 0, NOUVEAU_BO_VRAM |
                  NOUVEAU_BO_RD | NOUVEAU_BO_LOW, 0, 0);
        so_data  (so, (NV50_CB_PFP << 16) | 0x00000800);
-       so_method(so, screen->tesla, 0x1694, 1);
+       so_method(so, screen->tesla, NV50TCL_SET_PROGRAM_CB, 1);
        so_data  (so, 0x00000131 | (NV50_CB_PFP << 12));
 
        /* Texture sampler/image unit setup - we abuse the constant buffer
@@ -370,13 +375,13 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
                return NULL;
        }
 
-       so_method(so, screen->tesla, 0x1280, 3);
+       so_method(so, screen->tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
        so_reloc (so, screen->tic, 0, NOUVEAU_BO_VRAM |
                  NOUVEAU_BO_RD | NOUVEAU_BO_HIGH, 0, 0);
        so_reloc (so, screen->tic, 0, NOUVEAU_BO_VRAM |
                  NOUVEAU_BO_RD | NOUVEAU_BO_LOW, 0, 0);
        so_data  (so, (NV50_CB_TIC << 16) | 0x0800);
-       so_method(so, screen->tesla, 0x1574, 3);
+       so_method(so, screen->tesla, NV50TCL_TIC_ADDRESS_HIGH, 3);
        so_reloc (so, screen->tic, 0, NOUVEAU_BO_VRAM |
                  NOUVEAU_BO_RD | NOUVEAU_BO_HIGH, 0, 0);
        so_reloc (so, screen->tic, 0, NOUVEAU_BO_VRAM |
@@ -389,13 +394,13 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
                return NULL;
        }
 
-       so_method(so, screen->tesla, 0x1280, 3);
+       so_method(so, screen->tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3);
        so_reloc (so, screen->tsc, 0, NOUVEAU_BO_VRAM |
                  NOUVEAU_BO_RD | NOUVEAU_BO_HIGH, 0, 0);
        so_reloc (so, screen->tsc, 0, NOUVEAU_BO_VRAM |
                  NOUVEAU_BO_RD | NOUVEAU_BO_LOW, 0, 0);
        so_data  (so, (NV50_CB_TSC << 16) | 0x0800);
-       so_method(so, screen->tesla, 0x155c, 3);
+       so_method(so, screen->tesla, NV50TCL_TSC_ADDRESS_HIGH, 3);
        so_reloc (so, screen->tsc, 0, NOUVEAU_BO_VRAM |
                  NOUVEAU_BO_RD | NOUVEAU_BO_HIGH, 0, 0);
        so_reloc (so, screen->tsc, 0, NOUVEAU_BO_VRAM |
@@ -405,7 +410,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
 
        /* Vertex array limits - max them out */
        for (i = 0; i < 16; i++) {
-               so_method(so, screen->tesla, 0x1080 + (i * 8), 2);
+               so_method(so, screen->tesla, NV50TCL_UNK1080_OFFSET_HIGH(i), 2);
                so_data  (so, 0x000000ff);
                so_data  (so, 0xffffffff);
        }
@@ -417,6 +422,10 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
        so_method(so, screen->tesla, 0x1234, 1);
        so_data  (so, 1);
 
+       /* activate first scissor rectangle */
+       so_method(so, screen->tesla, NV50TCL_SCISSOR_ENABLE, 1);
+       so_data  (so, 1);
+
        so_emit(chan, so);
        so_ref (so, &screen->static_init);
        so_ref (NULL, &so);
index 116866a..ef4154d 100644 (file)
@@ -205,11 +205,16 @@ nv50_sampler_state_create(struct pipe_context *pipe,
        }
 
        limit = CLAMP(cso->lod_bias, -16.0, 15.0);
-       tsc[1] |= ((int)(limit * 256.0) & 0x1fff) << 11;
+       tsc[1] |= ((int)(limit * 256.0) & 0x1fff) << 12;
 
        tsc[2] |= ((int)CLAMP(cso->max_lod, 0.0, 15.0) << 20) |
                  ((int)CLAMP(cso->min_lod, 0.0, 15.0) << 8);
 
+       tsc[4] = fui(cso->border_color[0]);
+       tsc[5] = fui(cso->border_color[1]);
+       tsc[6] = fui(cso->border_color[2]);
+       tsc[7] = fui(cso->border_color[3]);
+
        sso->normalized = cso->normalized_coords;
        return (void *)sso;
 }
@@ -404,35 +409,35 @@ nv50_depth_stencil_alpha_state_create(struct pipe_context *pipe,
                so_data  (so, 0);
        }
 
-       /*XXX: yes, I know they're backwards.. header needs fixing */
+       /* XXX: keep hex values until header is updated (names reversed) */
        if (cso->stencil[0].enabled) {
-               so_method(so, tesla, NV50TCL_STENCIL_BACK_ENABLE, 5);
+               so_method(so, tesla, 0x1380, 8);
                so_data  (so, 1);
                so_data  (so, nvgl_stencil_op(cso->stencil[0].fail_op));
                so_data  (so, nvgl_stencil_op(cso->stencil[0].zfail_op));
                so_data  (so, nvgl_stencil_op(cso->stencil[0].zpass_op));
                so_data  (so, nvgl_comparison_op(cso->stencil[0].func));
-               so_method(so, tesla, NV50TCL_STENCIL_BACK_FUNC_REF, 3);
                so_data  (so, cso->stencil[0].ref_value);
                so_data  (so, cso->stencil[0].writemask);
                so_data  (so, cso->stencil[0].valuemask);
        } else {
-               so_method(so, tesla, NV50TCL_STENCIL_BACK_ENABLE, 1);
+               so_method(so, tesla, 0x1380, 1);
                so_data  (so, 0);
        }
 
        if (cso->stencil[1].enabled) {
-               so_method(so, tesla, NV50TCL_STENCIL_FRONT_ENABLE, 8);
+               so_method(so, tesla, 0x1594, 5);
                so_data  (so, 1);
                so_data  (so, nvgl_stencil_op(cso->stencil[1].fail_op));
                so_data  (so, nvgl_stencil_op(cso->stencil[1].zfail_op));
                so_data  (so, nvgl_stencil_op(cso->stencil[1].zpass_op));
                so_data  (so, nvgl_comparison_op(cso->stencil[1].func));
+               so_method(so, tesla, 0x0f54, 3);
                so_data  (so, cso->stencil[1].ref_value);
                so_data  (so, cso->stencil[1].writemask);
                so_data  (so, cso->stencil[1].valuemask);
        } else {
-               so_method(so, tesla, NV50TCL_STENCIL_FRONT_ENABLE, 1);
+               so_method(so, tesla, 0x1594, 1);
                so_data  (so, 0);
        }
 
index d313e9d..a879df2 100644 (file)
@@ -55,15 +55,15 @@ nv50_state_validate_fb(struct nv50_context *nv50)
                              NOUVEAU_BO_LOW | NOUVEAU_BO_RDWR, 0, 0);
                switch (fb->cbufs[i]->format) {
                case PIPE_FORMAT_A8R8G8B8_UNORM:
-                       so_data(so, 0xcf);
+                       so_data(so, NV50TCL_RT_FORMAT_A8R8G8B8_UNORM);
                        break;
                case PIPE_FORMAT_R5G6B5_UNORM:
-                       so_data(so, 0xe8);
+                       so_data(so, NV50TCL_RT_FORMAT_R5G6B5_UNORM);
                        break;
                default:
                        NOUVEAU_ERR("AIIII unknown format %s\n",
                                    pf_name(fb->cbufs[i]->format));
-                       so_data(so, 0xe6);
+                       so_data(so, NV50TCL_RT_FORMAT_X8R8G8B8_UNORM);
                        break;
                }
                so_data(so, bo->tile_mode << 4);
@@ -92,17 +92,22 @@ nv50_state_validate_fb(struct nv50_context *nv50)
                so_reloc (so, bo, fb->zsbuf->offset, NOUVEAU_BO_VRAM |
                              NOUVEAU_BO_LOW | NOUVEAU_BO_RDWR, 0, 0);
                switch (fb->zsbuf->format) {
+               case PIPE_FORMAT_Z32_FLOAT:
+                       so_data(so, NV50TCL_ZETA_FORMAT_Z32_FLOAT);
+                       break;
                case PIPE_FORMAT_Z24S8_UNORM:
-               case PIPE_FORMAT_Z24X8_UNORM:
-                       so_data(so, 0x16);
+                       so_data(so, NV50TCL_ZETA_FORMAT_Z24S8_UNORM);
+                       break;
+               case PIPE_FORMAT_X8Z24_UNORM:
+                       so_data(so, NV50TCL_ZETA_FORMAT_X8Z24_UNORM);
                        break;
-               case PIPE_FORMAT_Z16_UNORM:
-                       so_data(so, 0x15);
+               case PIPE_FORMAT_S8Z24_UNORM:
+                       so_data(so, NV50TCL_ZETA_FORMAT_S8Z24_UNORM);
                        break;
                default:
                        NOUVEAU_ERR("AIIII unknown format %s\n",
                                    pf_name(fb->zsbuf->format));
-                       so_data(so, 0x16);
+                       so_data(so, NV50TCL_ZETA_FORMAT_S8Z24_UNORM);
                        break;
                }
                so_data(so, bo->tile_mode << 4);
@@ -110,7 +115,7 @@ nv50_state_validate_fb(struct nv50_context *nv50)
 
                so_method(so, tesla, 0x1538, 1);
                so_data  (so, 1);
-               so_method(so, tesla, 0x1228, 3);
+               so_method(so, tesla, NV50TCL_ZETA_HORIZ, 3);
                so_data  (so, fb->zsbuf->width);
                so_data  (so, fb->zsbuf->height);
                so_data  (so, 0x00010001);
@@ -119,12 +124,18 @@ nv50_state_validate_fb(struct nv50_context *nv50)
        so_method(so, tesla, NV50TCL_VIEWPORT_HORIZ, 2);
        so_data  (so, w << 16);
        so_data  (so, h << 16);
-       so_method(so, tesla, 0x0e04, 2);
+       /* set window lower left corner */
+       so_method(so, tesla, NV50TCL_WINDOW_LEFT, 2);
+       so_data  (so, 0);
+       so_data  (so, 0);
+       /* set screen scissor rectangle */
+       so_method(so, tesla, NV50TCL_SCREEN_SCISSOR_HORIZ, 2);
        so_data  (so, w << 16);
        so_data  (so, h << 16);
-       so_method(so, tesla, 0xdf8, 2);
-       so_data  (so, 0);
-       so_data  (so, h);
+
+       /* we set scissors to framebuffer size when they're 'turned off' */
+       nv50->dirty |= NV50_NEW_SCISSOR;
+       so_ref(NULL, &nv50->state.scissor);
 
        so_ref(so, &nv50->state.fb);
        so_ref(NULL, &so);
@@ -137,7 +148,32 @@ nv50_state_emit(struct nv50_context *nv50)
        struct nouveau_channel *chan = screen->base.channel;
 
        if (nv50->pctx_id != screen->cur_pctx) {
-               nv50->state.dirty |= 0xffffffff;
+               if (nv50->state.fb)
+                       nv50->state.dirty |= NV50_NEW_FRAMEBUFFER;
+               if (nv50->state.blend)
+                       nv50->state.dirty |= NV50_NEW_BLEND;
+               if (nv50->state.zsa)
+                       nv50->state.dirty |= NV50_NEW_ZSA;
+               if (nv50->state.vertprog)
+                       nv50->state.dirty |= NV50_NEW_VERTPROG;
+               if (nv50->state.fragprog)
+                       nv50->state.dirty |= NV50_NEW_FRAGPROG;
+               if (nv50->state.rast)
+                       nv50->state.dirty |= NV50_NEW_RASTERIZER;
+               if (nv50->state.blend_colour)
+                       nv50->state.dirty |= NV50_NEW_BLEND_COLOUR;
+               if (nv50->state.stipple)
+                       nv50->state.dirty |= NV50_NEW_STIPPLE;
+               if (nv50->state.scissor)
+                       nv50->state.dirty |= NV50_NEW_SCISSOR;
+               if (nv50->state.viewport)
+                       nv50->state.dirty |= NV50_NEW_VIEWPORT;
+               if (nv50->state.tsc_upload)
+                       nv50->state.dirty |= NV50_NEW_SAMPLER;
+               if (nv50->state.tic_upload)
+                       nv50->state.dirty |= NV50_NEW_TEXTURE;
+               if (nv50->state.vtxfmt && nv50->state.vtxbuf)
+                       nv50->state.dirty |= NV50_NEW_ARRAYS;
                screen->cur_pctx = nv50->pctx_id;
        }
 
@@ -233,13 +269,13 @@ nv50_state_validate(struct nv50_context *nv50)
                nv50->state.scissor_enabled = rast->scissor;
 
                so = so_new(3, 0);
-               so_method(so, tesla, 0x0ff4, 2);
+               so_method(so, tesla, NV50TCL_SCISSOR_HORIZ, 2);
                if (nv50->state.scissor_enabled) {
-                       so_data(so, ((s->maxx - s->minx) << 16) | s->minx);
-                       so_data(so, ((s->maxy - s->miny) << 16) | s->miny);
+                       so_data(so, (s->maxx << 16) | s->minx);
+                       so_data(so, (s->maxy << 16) | s->miny);
                } else {
-                       so_data(so, (8192 << 16));
-                       so_data(so, (8192 << 16));
+                       so_data(so, (nv50->framebuffer.width << 16));
+                       so_data(so, (nv50->framebuffer.height << 16));
                }
                so_ref(so, &nv50->state.scissor);
                so_ref(NULL, &so);
@@ -263,20 +299,22 @@ scissor_uptodate:
 
                so = so_new(12, 0);
                if (!bypass) {
-                       so_method(so, tesla, NV50TCL_VIEWPORT_UNK1(0), 3);
+                       so_method(so, tesla, NV50TCL_VIEWPORT_TRANSLATE(0), 3);
                        so_data  (so, fui(nv50->viewport.translate[0]));
                        so_data  (so, fui(nv50->viewport.translate[1]));
                        so_data  (so, fui(nv50->viewport.translate[2]));
-                       so_method(so, tesla, NV50TCL_VIEWPORT_UNK0(0), 3);
+                       so_method(so, tesla, NV50TCL_VIEWPORT_SCALE(0), 3);
                        so_data  (so, fui(nv50->viewport.scale[0]));
-                       so_data  (so, fui(-nv50->viewport.scale[1]));
+                       so_data  (so, fui(nv50->viewport.scale[1]));
                        so_data  (so, fui(nv50->viewport.scale[2]));
-                       so_method(so, tesla, 0x192c, 1);
+
+                       so_method(so, tesla, NV50TCL_VIEWPORT_TRANSFORM_EN, 1);
                        so_data  (so, 1);
+                       /* no idea what 0f90 does */
                        so_method(so, tesla, 0x0f90, 1);
                        so_data  (so, 0);
                } else {
-                       so_method(so, tesla, 0x192c, 1);
+                       so_method(so, tesla, NV50TCL_VIEWPORT_TRANSFORM_EN, 1);
                        so_data  (so, 0);
                        so_method(so, tesla, 0x0f90, 1);
                        so_data  (so, 1);
@@ -292,9 +330,10 @@ viewport_uptodate:
                int i;
 
                so = so_new(nv50->sampler_nr * 8 + 3, 0);
-               so_method(so, tesla, 0x0f00, 1);
+               so_method(so, tesla, NV50TCL_CB_ADDR, 1);
                so_data  (so, NV50_CB_TSC);
-               so_method(so, tesla, 0x40000f04, nv50->sampler_nr * 8);
+               so_method(so, tesla, NV50TCL_CB_DATA(0) | 0x40000000,
+                       nv50->sampler_nr * 8);
                for (i = 0; i < nv50->sampler_nr; i++)
                        so_datap (so, nv50->sampler[i]->tsc, 8);
                so_ref(so, &nv50->state.tsc_upload);
index 3da9d6e..edaf4b0 100644 (file)
@@ -35,13 +35,13 @@ nv50_format(enum pipe_format format)
 {
        switch (format) {
        case PIPE_FORMAT_A8R8G8B8_UNORM:
-               return NV50_2D_DST_FORMAT_32BPP;
+               return NV50_2D_DST_FORMAT_A8R8G8B8_UNORM;
        case PIPE_FORMAT_X8R8G8B8_UNORM:
-               return NV50_2D_DST_FORMAT_24BPP;
+               return NV50_2D_DST_FORMAT_X8R8G8B8_UNORM;
        case PIPE_FORMAT_R5G6B5_UNORM:
-               return NV50_2D_DST_FORMAT_16BPP;
+               return NV50_2D_DST_FORMAT_R5G6B5_UNORM;
        case PIPE_FORMAT_A8_UNORM:
-               return NV50_2D_DST_FORMAT_8BPP;
+               return NV50_2D_DST_FORMAT_R8_UNORM;
        default:
                return -1;
        }
@@ -144,7 +144,7 @@ nv50_surface_copy(struct pipe_context *pipe,
                  struct pipe_surface *src, unsigned srcx, unsigned srcy,
                  unsigned width, unsigned height)
 {
-       struct nv50_context *nv50 = (struct nv50_context *)pipe;
+       struct nv50_context *nv50 = nv50_context(pipe);
        struct nv50_screen *screen = nv50->screen;
 
        assert(src->format == dest->format);
@@ -158,7 +158,7 @@ nv50_surface_fill(struct pipe_context *pipe, struct pipe_surface *dest,
                  unsigned destx, unsigned desty, unsigned width,
                  unsigned height, unsigned value)
 {
-       struct nv50_context *nv50 = (struct nv50_context *)pipe;
+       struct nv50_context *nv50 = nv50_context(pipe);
        struct nv50_screen *screen = nv50->screen;
        struct nouveau_channel *chan = screen->eng2d->channel;
        struct nouveau_grobj *eng2d = screen->eng2d;
index ff40c2a..14c68b9 100644 (file)
@@ -32,30 +32,30 @@ nv50_tex_construct(struct nv50_context *nv50, struct nouveau_stateobj *so,
        switch (mt->base.format) {
        case PIPE_FORMAT_A8R8G8B8_UNORM:
                so_data(so, NV50TIC_0_0_MAPA_C3 | NV50TIC_0_0_TYPEA_UNORM |
-                           NV50TIC_0_0_MAPR_C0 | NV50TIC_0_0_TYPER_UNORM |
+                           NV50TIC_0_0_MAPR_C2 | NV50TIC_0_0_TYPER_UNORM |
                            NV50TIC_0_0_MAPG_C1 | NV50TIC_0_0_TYPEG_UNORM |
-                           NV50TIC_0_0_MAPB_C2 | NV50TIC_0_0_TYPEB_UNORM |
+                           NV50TIC_0_0_MAPB_C0 | NV50TIC_0_0_TYPEB_UNORM |
                            NV50TIC_0_0_FMT_8_8_8_8);
                break;
        case PIPE_FORMAT_A1R5G5B5_UNORM:
                so_data(so, NV50TIC_0_0_MAPA_C3 | NV50TIC_0_0_TYPEA_UNORM |
-                           NV50TIC_0_0_MAPR_C0 | NV50TIC_0_0_TYPER_UNORM |
+                           NV50TIC_0_0_MAPR_C2 | NV50TIC_0_0_TYPER_UNORM |
                            NV50TIC_0_0_MAPG_C1 | NV50TIC_0_0_TYPEG_UNORM |
-                           NV50TIC_0_0_MAPB_C2 | NV50TIC_0_0_TYPEB_UNORM |
+                           NV50TIC_0_0_MAPB_C0 | NV50TIC_0_0_TYPEB_UNORM |
                            NV50TIC_0_0_FMT_1_5_5_5);
                break;
        case PIPE_FORMAT_A4R4G4B4_UNORM:
                so_data(so, NV50TIC_0_0_MAPA_C3 | NV50TIC_0_0_TYPEA_UNORM |
-                           NV50TIC_0_0_MAPR_C0 | NV50TIC_0_0_TYPER_UNORM |
+                           NV50TIC_0_0_MAPR_C2 | NV50TIC_0_0_TYPER_UNORM |
                            NV50TIC_0_0_MAPG_C1 | NV50TIC_0_0_TYPEG_UNORM |
-                           NV50TIC_0_0_MAPB_C2 | NV50TIC_0_0_TYPEB_UNORM |
+                           NV50TIC_0_0_MAPB_C0 | NV50TIC_0_0_TYPEB_UNORM |
                            NV50TIC_0_0_FMT_4_4_4_4);
                break;
        case PIPE_FORMAT_R5G6B5_UNORM:
                so_data(so, NV50TIC_0_0_MAPA_ONE | NV50TIC_0_0_TYPEA_UNORM |
-                           NV50TIC_0_0_MAPR_C0 | NV50TIC_0_0_TYPER_UNORM |
+                           NV50TIC_0_0_MAPR_C2 | NV50TIC_0_0_TYPER_UNORM |
                            NV50TIC_0_0_MAPG_C1 | NV50TIC_0_0_TYPEG_UNORM |
-                           NV50TIC_0_0_MAPB_C2 | NV50TIC_0_0_TYPEB_UNORM |
+                           NV50TIC_0_0_MAPB_C0 | NV50TIC_0_0_TYPEB_UNORM |
                            NV50TIC_0_0_FMT_5_6_5);
                break;
        case PIPE_FORMAT_L8_UNORM:
@@ -145,25 +145,28 @@ nv50_tex_validate(struct nv50_context *nv50)
        push += MAX2(nv50->miptree_nr, nv50->state.miptree_nr) * 2;
 
        so = so_new(push, nv50->miptree_nr * 2);
-       so_method(so, tesla, 0x0f00, 1);
+       so_method(so, tesla, NV50TCL_CB_ADDR, 1);
        so_data  (so, NV50_CB_TIC);
        for (unit = 0; unit < nv50->miptree_nr; unit++) {
                struct nv50_miptree *mt = nv50->miptree[unit];
 
-               so_method(so, tesla, 0x40000f04, 8);
+               so_method(so, tesla, NV50TCL_CB_DATA(0) | 0x40000000, 8);
                if (nv50_tex_construct(nv50, so, mt, unit)) {
                        NOUVEAU_ERR("failed tex validate\n");
                        so_ref(NULL, &so);
                        return;
                }
 
-               so_method(so, tesla, 0x1458, 1);
-               so_data  (so, (unit << 9) | (unit << 1) | 1);
+               so_method(so, tesla, NV50TCL_SET_SAMPLER_TEX, 1);
+               so_data  (so, (unit << NV50TCL_SET_SAMPLER_TEX_TIC_SHIFT) |
+                       (unit << NV50TCL_SET_SAMPLER_TEX_SAMPLER_SHIFT) |
+                       NV50TCL_SET_SAMPLER_TEX_VALID);
        }
 
        for (; unit < nv50->state.miptree_nr; unit++) {
-               so_method(so, tesla, 0x1458, 1);
-               so_data  (so, (unit << 1) | 0);
+               so_method(so, tesla, NV50TCL_SET_SAMPLER_TEX, 1);
+               so_data  (so,
+                       (unit << NV50TCL_SET_SAMPLER_TEX_SAMPLER_SHIFT) | 0);
        }
 
        so_ref(so, &nv50->state.tic_upload);
index aca622c..207fb03 100644 (file)
 #define NV50TIC_0_0_MAPA_C2                                       0x20000000
 #define NV50TIC_0_0_MAPA_C3                                       0x28000000
 #define NV50TIC_0_0_MAPA_ONE                                      0x38000000
-#define NV50TIC_0_0_MAPR_MASK                                     0x07000000
-#define NV50TIC_0_0_MAPR_ZERO                                     0x00000000
-#define NV50TIC_0_0_MAPR_C0                                       0x02000000
-#define NV50TIC_0_0_MAPR_C1                                       0x03000000
-#define NV50TIC_0_0_MAPR_C2                                       0x04000000
-#define NV50TIC_0_0_MAPR_C3                                       0x05000000
-#define NV50TIC_0_0_MAPR_ONE                                      0x07000000
+#define NV50TIC_0_0_MAPB_MASK                                     0x07000000
+#define NV50TIC_0_0_MAPB_ZERO                                     0x00000000
+#define NV50TIC_0_0_MAPB_C0                                       0x02000000
+#define NV50TIC_0_0_MAPB_C1                                       0x03000000
+#define NV50TIC_0_0_MAPB_C2                                       0x04000000
+#define NV50TIC_0_0_MAPB_C3                                       0x05000000
+#define NV50TIC_0_0_MAPB_ONE                                      0x07000000
 #define NV50TIC_0_0_MAPG_MASK                                     0x00e00000
 #define NV50TIC_0_0_MAPG_ZERO                                     0x00000000
 #define NV50TIC_0_0_MAPG_C0                                       0x00400000
 #define NV50TIC_0_0_MAPG_C2                                       0x00800000
 #define NV50TIC_0_0_MAPG_C3                                       0x00a00000
 #define NV50TIC_0_0_MAPG_ONE                                      0x00e00000
-#define NV50TIC_0_0_MAPB_MASK                                     0x001c0000
-#define NV50TIC_0_0_MAPB_ZERO                                     0x00000000
-#define NV50TIC_0_0_MAPB_C0                                       0x00080000
-#define NV50TIC_0_0_MAPB_C1                                       0x000c0000
-#define NV50TIC_0_0_MAPB_C2                                       0x00100000
-#define NV50TIC_0_0_MAPB_C3                                       0x00140000
-#define NV50TIC_0_0_MAPB_ONE                                      0x001c0000
+#define NV50TIC_0_0_MAPR_MASK                                     0x001c0000
+#define NV50TIC_0_0_MAPR_ZERO                                     0x00000000
+#define NV50TIC_0_0_MAPR_C0                                       0x00080000
+#define NV50TIC_0_0_MAPR_C1                                       0x000c0000
+#define NV50TIC_0_0_MAPR_C2                                       0x00100000
+#define NV50TIC_0_0_MAPR_C3                                       0x00140000
+#define NV50TIC_0_0_MAPR_ONE                                      0x001c0000
 #define NV50TIC_0_0_TYPEA_MASK                                    0x00038000
 #define NV50TIC_0_0_TYPEA_UNORM                                   0x00010000
-#define NV50TIC_0_0_TYPER_MASK                                    0x00007000
-#define NV50TIC_0_0_TYPER_UNORM                                   0x00002000
+#define NV50TIC_0_0_TYPEA_SNORM                                   0x00008000
+#define NV50TIC_0_0_TYPEA_FLOAT                                   0x00038000
+#define NV50TIC_0_0_TYPEB_MASK                                    0x00007000
+#define NV50TIC_0_0_TYPEB_UNORM                                   0x00002000
+#define NV50TIC_0_0_TYPEB_SNORM                                   0x00001000
+#define NV50TIC_0_0_TYPEB_FLOAT                                   0x00007000
 #define NV50TIC_0_0_TYPEG_MASK                                    0x00000e00
 #define NV50TIC_0_0_TYPEG_UNORM                                   0x00000400
-#define NV50TIC_0_0_TYPEB_MASK                                    0x000001c0
-#define NV50TIC_0_0_TYPEB_UNORM                                   0x00000080
-#define NV50TIC_0_0_FMT_MASK                                      0x0000003c
+#define NV50TIC_0_0_TYPEG_SNORM                                   0x00000200
+#define NV50TIC_0_0_TYPEG_FLOAT                                   0x00000e00
+#define NV50TIC_0_0_TYPER_MASK                                    0x000001c0
+#define NV50TIC_0_0_TYPER_UNORM                                   0x00000080
+#define NV50TIC_0_0_TYPER_SNORM                                   0x00000040
+#define NV50TIC_0_0_TYPER_FLOAT                                   0x000001c0
+#define NV50TIC_0_0_FMT_MASK                                      0x0000003f
+#define NV50TIC_0_0_FMT_32_32_32_32                               0x00000001
+#define NV50TIC_0_0_FMT_16_16_16_16                               0x00000003
+#define NV50TIC_0_0_FMT_32_32                                     0x00000004
 #define NV50TIC_0_0_FMT_8_8_8_8                                   0x00000008
+#define NV50TIC_0_0_FMT_2_10_10_10                                0x00000009
+#define NV50TIC_0_0_FMT_32                                        0x0000000f
 #define NV50TIC_0_0_FMT_4_4_4_4                                   0x00000012
-#define NV50TIC_0_0_FMT_1_5_5_5                                   0x00000013
+/* #define NV50TIC_0_0_FMT_1_5_5_5                                0x00000013 */
+#define NV50TIC_0_0_FMT_1_5_5_5                                   0x00000014
 #define NV50TIC_0_0_FMT_5_6_5                                     0x00000015
 #define NV50TIC_0_0_FMT_8_8                                       0x00000018
+#define NV50TIC_0_0_FMT_16                                        0x0000001b
 #define NV50TIC_0_0_FMT_8                                         0x0000001d
+#define NV50TIC_0_0_FMT_10_11_11                                  0x00000021
 #define NV50TIC_0_0_FMT_DXT1                                      0x00000024
 #define NV50TIC_0_0_FMT_DXT3                                      0x00000025
 #define NV50TIC_0_0_FMT_DXT5                                      0x00000026
+#define NV50TIC_0_0_FMT_RGTC1                                     0x00000027
+#define NV50TIC_0_0_FMT_RGTC2                                     0x00000028
 
 #define NV50TIC_0_1_OFFSET_LOW_MASK                               0xffffffff
 #define NV50TIC_0_1_OFFSET_LOW_SHIFT                                       0
 #define NV50TSC_1_0_WRAPR_MIRROR_CLAMP_TO_EDGE                   0x00000140
 #define NV50TSC_1_0_WRAPR_MIRROR_CLAMP_TO_BORDER                 0x00000180
 #define NV50TSC_1_0_WRAPR_MIRROR_CLAMP                           0x000001c0
+#define NV50TSC_1_0_MAX_ANISOTROPY_MASK                          0x00700000
 
 #define NV50TSC_1_1_MAGF_MASK                                    0x00000003
 #define NV50TSC_1_1_MAGF_NEAREST                                 0x00000001
 #define NV50TSC_1_1_MIPF_NONE                                    0x00000040
 #define NV50TSC_1_1_MIPF_NEAREST                                 0x00000080
 #define NV50TSC_1_1_MIPF_LINEAR                                  0x000000c0
+#define NV50TSC_1_1_LOD_BIAS_MASK                                0x01fff000
 
-#define NV50TSC_1_2_UNKNOWN_MASK                                 0xffffffff
+#define NV50TSC_1_2_MIN_LOD_MASK                                 0x00000f00
+#define NV50TSC_1_2_MAX_LOD_MASK                                 0x00f00000
 
 #define NV50TSC_1_3_UNKNOWN_MASK                                 0xffffffff
 
-#define NV50TSC_1_4_UNKNOWN_MASK                                 0xffffffff
+#define NV50TSC_1_4_BORDER_COLOR_RED_MASK                        0xffffffff
 
-#define NV50TSC_1_5_UNKNOWN_MASK                                 0xffffffff
+#define NV50TSC_1_5_BORDER_COLOR_GREEN_MASK                      0xffffffff
 
-#define NV50TSC_1_6_UNKNOWN_MASK                                 0xffffffff
+#define NV50TSC_1_6_BORDER_COLOR_BLUE_MASK                       0xffffffff
 
-#define NV50TSC_1_7_UNKNOWN_MASK                                 0xffffffff
+#define NV50TSC_1_7_BORDER_COLOR_ALPHA_MASK                      0xffffffff
 
 #endif
index d0b7f0b..d2b5e4d 100644 (file)
@@ -8,6 +8,7 @@ struct nv50_transfer {
        struct pipe_transfer base;
        struct nouveau_bo *bo;
        unsigned level_offset;
+       unsigned level_tiling;
        int level_pitch;
        int level_width;
        int level_height;
@@ -16,11 +17,14 @@ struct nv50_transfer {
 };
 
 static void
-nv50_transfer_rect_m2mf(struct pipe_screen *pscreen, struct nouveau_bo *src_bo,
-                       unsigned src_offset, int src_pitch, int sx, int sy,
-                       int sw, int sh, struct nouveau_bo *dst_bo,
-                       unsigned dst_offset, int dst_pitch, int dx, int dy,
-                       int dw, int dh, int cpp, int width, int height,
+nv50_transfer_rect_m2mf(struct pipe_screen *pscreen,
+                       struct nouveau_bo *src_bo, unsigned src_offset,
+                       int src_pitch, unsigned src_tile_mode,
+                       int sx, int sy, int sw, int sh,
+                       struct nouveau_bo *dst_bo, unsigned dst_offset,
+                       int dst_pitch, unsigned dst_tile_mode,
+                       int dx, int dy, int dw, int dh,
+                       int cpp, int width, int height,
                        unsigned src_reloc, unsigned dst_reloc)
 {
        struct nv50_screen *screen = nv50_screen(pscreen);
@@ -33,15 +37,18 @@ nv50_transfer_rect_m2mf(struct pipe_screen *pscreen, struct nouveau_bo *src_bo,
        WAIT_RING (chan, 14);
 
        if (!src_bo->tile_flags) {
-               BEGIN_RING(chan, m2mf, 0x0200, 1);
+               BEGIN_RING(chan, m2mf,
+                       NV50_MEMORY_TO_MEMORY_FORMAT_LINEAR_IN, 1);
                OUT_RING  (chan, 1);
-               BEGIN_RING(chan, m2mf, 0x0314, 1);
+               BEGIN_RING(chan, m2mf,
+                       NV50_MEMORY_TO_MEMORY_FORMAT_PITCH_IN, 1);
                OUT_RING  (chan, src_pitch);
                src_offset += (sy * src_pitch) + (sx * cpp);
        } else {
-               BEGIN_RING(chan, m2mf, 0x0200, 6);
+               BEGIN_RING(chan, m2mf,
+                       NV50_MEMORY_TO_MEMORY_FORMAT_LINEAR_IN, 6);
                OUT_RING  (chan, 0);
-               OUT_RING  (chan, src_bo->tile_mode << 4);
+               OUT_RING  (chan, src_tile_mode << 4);
                OUT_RING  (chan, sw * cpp);
                OUT_RING  (chan, sh);
                OUT_RING  (chan, 1);
@@ -49,15 +56,18 @@ nv50_transfer_rect_m2mf(struct pipe_screen *pscreen, struct nouveau_bo *src_bo,
        }
 
        if (!dst_bo->tile_flags) {
-               BEGIN_RING(chan, m2mf, 0x021c, 1);
+               BEGIN_RING(chan, m2mf,
+                       NV50_MEMORY_TO_MEMORY_FORMAT_LINEAR_OUT, 1);
                OUT_RING  (chan, 1);
-               BEGIN_RING(chan, m2mf, 0x0318, 1);
+               BEGIN_RING(chan, m2mf,
+                       NV50_MEMORY_TO_MEMORY_FORMAT_PITCH_OUT, 1);
                OUT_RING  (chan, dst_pitch);
                dst_offset += (dy * dst_pitch) + (dx * cpp);
        } else {
-               BEGIN_RING(chan, m2mf, 0x021c, 6);
+               BEGIN_RING(chan, m2mf,
+                       NV50_MEMORY_TO_MEMORY_FORMAT_LINEAR_OUT, 6);
                OUT_RING  (chan, 0);
-               OUT_RING  (chan, dst_bo->tile_mode << 4);
+               OUT_RING  (chan, dst_tile_mode << 4);
                OUT_RING  (chan, dw * cpp);
                OUT_RING  (chan, dh);
                OUT_RING  (chan, 1);
@@ -68,25 +78,30 @@ nv50_transfer_rect_m2mf(struct pipe_screen *pscreen, struct nouveau_bo *src_bo,
                int line_count = height > 2047 ? 2047 : height;
 
                WAIT_RING (chan, 15);
-               BEGIN_RING(chan, m2mf, 0x0238, 2);
+               BEGIN_RING(chan, m2mf,
+                       NV50_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN_HIGH, 2);
                OUT_RELOCh(chan, src_bo, src_offset, src_reloc);
                OUT_RELOCh(chan, dst_bo, dst_offset, dst_reloc);
-               BEGIN_RING(chan, m2mf, 0x030c, 2);
+               BEGIN_RING(chan, m2mf,
+                       NV50_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 2);
                OUT_RELOCl(chan, src_bo, src_offset, src_reloc);
                OUT_RELOCl(chan, dst_bo, dst_offset, dst_reloc);
                if (src_bo->tile_flags) {
-                       BEGIN_RING(chan, m2mf, 0x0218, 1);
-                       OUT_RING  (chan, (dy << 16) | sx);
+                       BEGIN_RING(chan, m2mf,
+                               NV50_MEMORY_TO_MEMORY_FORMAT_TILING_POSITION_IN, 1);
+                       OUT_RING  (chan, (sy << 16) | sx);
                } else {
                        src_offset += (line_count * src_pitch);
                }
                if (dst_bo->tile_flags) {
-                       BEGIN_RING(chan, m2mf, 0x0234, 1);
-                       OUT_RING  (chan, (sy << 16) | dx);
+                       BEGIN_RING(chan, m2mf,
+                               NV50_MEMORY_TO_MEMORY_FORMAT_TILING_POSITION_OUT, 1);
+                       OUT_RING  (chan, (dy << 16) | dx);
                } else {
                        dst_offset += (line_count * dst_pitch);
                }
-               BEGIN_RING(chan, m2mf, 0x031c, 4);
+               BEGIN_RING(chan, m2mf,
+                       NV50_MEMORY_TO_MEMORY_FORMAT_LINE_LENGTH_IN, 4);
                OUT_RING  (chan, width * cpp);
                OUT_RING  (chan, line_count);
                OUT_RING  (chan, 0x00000101);
@@ -136,6 +151,7 @@ nv50_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
        tx->level_width = mt->base.width[level];
        tx->level_height = mt->base.height[level];
        tx->level_offset = lvl->image_offset[image];
+       tx->level_tiling = lvl->tile_mode;
        tx->level_x = x;
        tx->level_y = y;
        ret = nouveau_bo_new(dev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, 0,
@@ -147,9 +163,11 @@ nv50_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
 
        if (usage != PIPE_TRANSFER_WRITE) {
                nv50_transfer_rect_m2mf(pscreen, mt->bo, tx->level_offset,
-                                       tx->level_pitch, x, y, tx->level_width,
-                                       tx->level_height, tx->bo, 0,
-                                       tx->base.stride, 0, 0,
+                                       tx->level_pitch, tx->level_tiling,
+                                       x, y,
+                                       tx->level_width, tx->level_height,
+                                       tx->bo, 0, tx->base.stride,
+                                       tx->bo->tile_mode, 0, 0,
                                        tx->base.width, tx->base.height,
                                        tx->base.block.size, w, h,
                                        NOUVEAU_BO_VRAM | NOUVEAU_BO_GART,
@@ -168,12 +186,14 @@ nv50_transfer_del(struct pipe_transfer *ptx)
        if (ptx->usage != PIPE_TRANSFER_READ) {
                struct pipe_screen *pscreen = ptx->texture->screen;
                nv50_transfer_rect_m2mf(pscreen, tx->bo, 0, tx->base.stride,
-                                       0, 0, tx->base.width, tx->base.height,
-                                       mt->bo, tx->level_offset,
-                                       tx->level_pitch, tx->level_x,
-                                       tx->level_y, tx->level_width,
-                                       tx->level_height, tx->base.block.size,
+                                       tx->bo->tile_mode, 0, 0,
                                        tx->base.width, tx->base.height,
+                                       mt->bo, tx->level_offset,
+                                       tx->level_pitch, tx->level_tiling,
+                                       tx->level_x, tx->level_y,
+                                       tx->level_width, tx->level_height,
+                                       tx->base.block.size, tx->base.width,
+                                       tx->base.height,
                                        NOUVEAU_BO_GART, NOUVEAU_BO_VRAM |
                                        NOUVEAU_BO_GART);
        }
index f81929f..17283f3 100644 (file)
@@ -49,6 +49,57 @@ nv50_prim(unsigned mode)
        return NV50TCL_VERTEX_BEGIN_POINTS;
 }
 
+static INLINE unsigned
+nv50_vtxeltfmt(unsigned pf)
+{
+       static const uint8_t vtxelt_32[4] = { 0x90, 0x20, 0x10, 0x08 };
+       static const uint8_t vtxelt_16[4] = { 0xd8, 0x78, 0x28, 0x18 };
+       static const uint8_t vtxelt_08[4] = { 0xe8, 0xc0, 0x98, 0x50 };
+
+       unsigned nf, c = 0;
+
+       switch (pf_type(pf)) {
+       case PIPE_FORMAT_TYPE_FLOAT:
+               nf = NV50TCL_VERTEX_ARRAY_ATTRIB_TYPE_FLOAT; break;
+       case PIPE_FORMAT_TYPE_UNORM:
+               nf = NV50TCL_VERTEX_ARRAY_ATTRIB_TYPE_UNORM; break;
+       case PIPE_FORMAT_TYPE_SNORM:
+               nf = NV50TCL_VERTEX_ARRAY_ATTRIB_TYPE_SNORM; break;
+       case PIPE_FORMAT_TYPE_USCALED:
+               nf = NV50TCL_VERTEX_ARRAY_ATTRIB_TYPE_USCALED; break;
+       case PIPE_FORMAT_TYPE_SSCALED:
+               nf = NV50TCL_VERTEX_ARRAY_ATTRIB_TYPE_SSCALED; break;
+       default:
+               NOUVEAU_ERR("invalid vbo type %d\n",pf_type(pf));
+               assert(0);
+               nf = NV50TCL_VERTEX_ARRAY_ATTRIB_TYPE_FLOAT;
+               break;
+       }
+
+       if (pf_size_y(pf)) c++;
+       if (pf_size_z(pf)) c++;
+       if (pf_size_w(pf)) c++;
+
+       if (pf_exp2(pf) == 3) {
+               switch (pf_size_x(pf)) {
+               case 1: return (nf | (vtxelt_08[c] << 16));
+               case 2: return (nf | (vtxelt_16[c] << 16));
+               case 4: return (nf | (vtxelt_32[c] << 16));
+               default:
+                       break;
+               }
+       } else
+       if (pf_exp2(pf) == 6 && pf_size_x(pf) == 1) {
+               NOUVEAU_ERR("unsupported vbo component size 64\n");
+               assert(0);
+               return (nf | 0x08000000);
+       }
+
+       NOUVEAU_ERR("invalid vbo format %s\n",pf_name(pf));
+       assert(0);
+       return (nf | 0x08000000);
+}
+
 boolean
 nv50_draw_arrays(struct pipe_context *pipe, unsigned mode, unsigned start,
                 unsigned count)
@@ -139,7 +190,7 @@ nv50_draw_elements_inline_u16(struct nv50_context *nv50, uint16_t *map,
 }
 
 static INLINE void
-nv50_draw_elements_inline_u32(struct nv50_context *nv50, uint8_t *map,
+nv50_draw_elements_inline_u32(struct nv50_context *nv50, uint32_t *map,
                              unsigned start, unsigned count)
 {
        struct nouveau_channel *chan = nv50->screen->tesla->channel;
@@ -208,9 +259,14 @@ nv50_vbo_validate(struct nv50_context *nv50)
        struct nouveau_stateobj *vtxbuf, *vtxfmt;
        int i;
 
+       /* don't validate if Gallium took away our buffers */
+       if (nv50->vtxbuf_nr == 0)
+               return;
+
        vtxbuf = so_new(nv50->vtxelt_nr * 4, nv50->vtxelt_nr * 2);
        vtxfmt = so_new(nv50->vtxelt_nr + 1, 0);
-       so_method(vtxfmt, tesla, 0x1ac0, nv50->vtxelt_nr);
+       so_method(vtxfmt, tesla, NV50TCL_VERTEX_ARRAY_ATTRIB(0),
+               nv50->vtxelt_nr);
 
        for (i = 0; i < nv50->vtxelt_nr; i++) {
                struct pipe_vertex_element *ve = &nv50->vtxelt[i];
@@ -218,32 +274,9 @@ nv50_vbo_validate(struct nv50_context *nv50)
                        &nv50->vtxbuf[ve->vertex_buffer_index];
                struct nouveau_bo *bo = nouveau_bo(vb->buffer);
 
-               switch (ve->src_format) {
-               case PIPE_FORMAT_R32G32B32A32_FLOAT:
-                       so_data(vtxfmt, 0x7e080000 | i);
-                       break;
-               case PIPE_FORMAT_R32G32B32_FLOAT:
-                       so_data(vtxfmt, 0x7e100000 | i);
-                       break;
-               case PIPE_FORMAT_R32G32_FLOAT:
-                       so_data(vtxfmt, 0x7e200000 | i);
-                       break;
-               case PIPE_FORMAT_R32_FLOAT:
-                       so_data(vtxfmt, 0x7e900000 | i);
-                       break;
-               case PIPE_FORMAT_R8G8B8A8_UNORM:
-                       so_data(vtxfmt, 0x24500000 | i);
-                       break;
-               default:
-               {
-                       NOUVEAU_ERR("invalid vbo format %s\n",
-                                   pf_name(ve->src_format));
-                       assert(0);
-                       return;
-               }
-               }
+               so_data(vtxfmt, nv50_vtxeltfmt(ve->src_format) | i);
 
-               so_method(vtxbuf, tesla, 0x900 + (i * 16), 3);
+               so_method(vtxbuf, tesla, NV50TCL_VERTEX_ARRAY_FORMAT(i), 3);
                so_data  (vtxbuf, 0x20000000 | vb->stride);
                so_reloc (vtxbuf, bo, vb->buffer_offset +
                          ve->src_offset, NOUVEAU_BO_VRAM | NOUVEAU_BO_GART |
index faceec9..d7a2c8c 100644 (file)
@@ -9,7 +9,6 @@ C_SOURCES = \
        r300_chipset.c \
        r300_clear.c \
        r300_context.c \
-       r300_debug.c \
        r300_emit.c \
        r300_flush.c \
        r300_fs.c \
@@ -21,6 +20,22 @@ C_SOURCES = \
        r300_state_invariant.c \
        r300_vs.c \
        r300_surface.c \
-       r300_texture.c
+       r300_texture.c \
+       r300_tgsi_to_rc.c
+
+LIBRARY_INCLUDES = \
+       -I$(TOP)/src/mesa/drivers/dri/r300/compiler \
+       -I$(TOP)/src/mesa \
+       -I$(TOP)/include
+
+COMPILER_ARCHIVE = $(TOP)/src/mesa/drivers/dri/r300/compiler/libr300compiler.a
+
+EXTRA_OBJECTS = \
+       $(COMPILER_ARCHIVE)
 
 include ../../Makefile.template
+
+.PHONY : $(COMPILER_ARCHIVE)
+
+$(COMPILER_ARCHIVE):
+       cd $(TOP)/src/mesa/drivers/dri/r300/compiler; make
index 233a32b..c8510bc 100644 (file)
@@ -52,7 +52,7 @@ static boolean r300_draw_range_elements(struct pipe_context* pipe,
 
     draw_set_mapped_constant_buffer(r300->draw,
             r300->shader_constants[PIPE_SHADER_VERTEX].constants,
-            r300->shader_constants[PIPE_SHADER_VERTEX].user_count *
+            r300->shader_constants[PIPE_SHADER_VERTEX].count *
                 (sizeof(float) * 4));
 
     draw_arrays(r300->draw, mode, start, count);
index d891fd6..fc8a449 100644 (file)
@@ -34,6 +34,9 @@
 #include "r300_screen.h"
 #include "r300_winsys.h"
 
+struct r300_fragment_shader;
+struct r300_vertex_shader;
+
 struct r300_blend_state {
     uint32_t blend_control;       /* R300_RB3D_CBLEND: 0x4e04 */
     uint32_t alpha_blend_control; /* R300_RB3D_ABLEND: 0x4e08 */
@@ -143,71 +146,10 @@ struct r300_constant_buffer {
     /* Buffer of constants */
     /* XXX first number should be raised */
     float constants[32][4];
-    /* Number of user-defined constants */
-    unsigned user_count;
     /* Total number of constants */
     unsigned count;
 };
 
-struct r300_fragment_shader {
-    /* Parent class */
-    struct pipe_shader_state state;
-    struct tgsi_shader_info info;
-
-    /* Has this shader been translated yet? */
-    boolean translated;
-
-    /* Pixel stack size */
-    int stack_size;
-
-    /* Are there immediates in this shader?
-     * If not, we can heavily optimize recompilation. */
-    boolean uses_imms;
-};
-
-struct r3xx_fragment_shader {
-    /* Parent class */
-    struct r300_fragment_shader shader;
-
-    /* Number of ALU instructions */
-    int alu_instruction_count;
-
-    /* Number of texture instructions */
-    int tex_instruction_count;
-
-    /* Number of texture indirections */
-    int indirections;
-
-    /* Indirection node offsets */
-    int alu_offset[4];
-
-    /* Machine instructions */
-    struct {
-        uint32_t alu_rgb_inst;
-        uint32_t alu_rgb_addr;
-        uint32_t alu_alpha_inst;
-        uint32_t alu_alpha_addr;
-    } instructions[64]; /* XXX magic num */
-};
-
-struct r5xx_fragment_shader {
-    /* Parent class */
-    struct r300_fragment_shader shader;
-
-    /* Number of used instructions */
-    int instruction_count;
-
-    /* Machine instructions */
-    struct {
-        uint32_t inst0;
-        uint32_t inst1;
-        uint32_t inst2;
-        uint32_t inst3;
-        uint32_t inst4;
-        uint32_t inst5;
-    } instructions[256]; /*< XXX magic number */
-};
-
 struct r300_texture {
     /* Parent class */
     struct pipe_texture tex;
@@ -242,33 +184,6 @@ struct r300_vertex_format {
     int fs_tab[16];
 };
 
-struct r300_vertex_shader {
-    /* Parent class */
-    struct pipe_shader_state state;
-    struct tgsi_shader_info info;
-
-    /* Fallback shader, because Draw has issues */
-    struct draw_vertex_shader* draw;
-
-    /* Has this shader been translated yet? */
-    boolean translated;
-
-    /* Are there immediates in this shader?
-     * If not, we can heavily optimize recompilation. */
-    boolean uses_imms;
-
-    /* Number of used instructions */
-    int instruction_count;
-
-    /* Machine instructions */
-    struct {
-        uint32_t inst0;
-        uint32_t inst1;
-        uint32_t inst2;
-        uint32_t inst3;
-    } instructions[128]; /*< XXX magic number */
-};
-
 static struct pipe_viewport_state r300_viewport_identity = {
     .scale = {1.0, 1.0, 1.0, 1.0},
     .translate = {0.0, 0.0, 0.0, 0.0},
diff --git a/src/gallium/drivers/r300/r300_debug.c b/src/gallium/drivers/r300/r300_debug.c
deleted file mode 100644 (file)
index c83e852..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright 2009 Corbin Simpson <MostAwesomeDude@gmail.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * on the rights to use, copy, modify, merge, publish, distribute, sub
- * license, and/or sell copies of the Software, and to permit persons to whom
- * the Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- * USE OR OTHER DEALINGS IN THE SOFTWARE. */
-
-#include "r300_debug.h"
-
-void r3xx_dump_fs(struct r3xx_fragment_shader* fs)
-{
-    int i;
-
-    for (i = 0; i < fs->alu_instruction_count; i++) {
-    }
-}
-
-void r5xx_fs_dump(struct r5xx_fragment_shader* fs)
-{
-    int i;
-    uint32_t inst;
-
-    for (i = 0; i < fs->instruction_count; i++) {
-        inst = fs->instructions[i].inst0;
-        debug_printf("%d:  0: CMN_INST   0x%08x:", i, inst);
-        switch (inst & 0x3) {
-            case R500_INST_TYPE_ALU:
-                debug_printf("ALU ");
-                break;
-            case R500_INST_TYPE_OUT:
-                debug_printf("OUT ");
-                break;
-            case R500_INST_TYPE_FC:
-                debug_printf("FC  ");
-                break;
-            case R500_INST_TYPE_TEX:
-                debug_printf("TEX ");
-                break;
-        }
-        debug_printf("%s %s %s %s ",
-                inst & R500_INST_TEX_SEM_WAIT ? "TEX_WAIT" : "",
-                inst & R500_INST_LAST ? "LAST" : "",
-                inst & R500_INST_NOP ? "NOP" : "",
-                inst & R500_INST_ALU_WAIT ? "ALU_WAIT" : "");
-        debug_printf("wmask: %s omask: %s\n",
-                r5xx_fs_mask[(inst >> 11) & 0xf],
-                r5xx_fs_mask[(inst >> 15) & 0xf]);
-        switch (inst & 0x3) {
-            case R500_INST_TYPE_ALU:
-            case R500_INST_TYPE_OUT:
-                inst = fs->instructions[i].inst1;
-                debug_printf("    1: RGB_ADDR   0x%08x:", inst);
-                debug_printf("Addr0: %d%c, Addr1: %d%c, "
-                        "Addr2: %d%c, srcp:%d\n",
-                        inst & 0xff, (inst & (1 << 8)) ? 'c' : 't',
-                        (inst >> 10) & 0xff, (inst & (1 << 18)) ? 'c' : 't',
-                        (inst >> 20) & 0xff, (inst & (1 << 28)) ? 'c' : 't',
-                        (inst >> 30));
-
-                inst = fs->instructions[i].inst2;
-                debug_printf("    2: ALPHA_ADDR 0x%08x:", inst);
-                debug_printf("Addr0: %d%c, Addr1: %d%c, "
-                        "Addr2: %d%c, srcp:%d\n",
-                        inst & 0xff, (inst & (1 << 8)) ? 'c' : 't',
-                        (inst >> 10) & 0xff, (inst & (1 << 18)) ? 'c' : 't',
-                        (inst >> 20) & 0xff, (inst & (1 << 28)) ? 'c' : 't',
-                        (inst >> 30));
-
-                inst = fs->instructions[i].inst3;
-                debug_printf("    3: RGB_INST   0x%08x:", inst);
-                debug_printf("rgb_A_src:%d %s/%s/%s %d "
-                        "rgb_B_src:%d %s/%s/%s %d\n",
-                        inst & 0x3, r5xx_fs_swiz[(inst >> 2) & 0x7],
-                        r5xx_fs_swiz[(inst >> 5) & 0x7],
-                        r5xx_fs_swiz[(inst >> 8) & 0x7],
-                        (inst >> 11) & 0x3, (inst >> 13) & 0x3,
-                        r5xx_fs_swiz[(inst >> 15) & 0x7],
-                        r5xx_fs_swiz[(inst >> 18) & 0x7],
-                        r5xx_fs_swiz[(inst >> 21) & 0x7],
-                        (inst >> 24) & 0x3);
-
-                inst = fs->instructions[i].inst4;
-                debug_printf("    4: ALPHA_INST 0x%08x:", inst);
-                debug_printf("%s dest:%d%s alp_A_src:%d %s %d "
-                        "alp_B_src:%d %s %d w:%d\n",
-                        r5xx_fs_op_alpha[inst & 0xf], (inst >> 4) & 0x7f,
-                        inst & (1<<11) ? "(rel)":"", (inst >> 12) & 0x3,
-                        r5xx_fs_swiz[(inst >> 14) & 0x7], (inst >> 17) & 0x3,
-                        (inst >> 19) & 0x3, r5xx_fs_swiz[(inst >> 21) & 0x7],
-                        (inst >> 24) & 0x3, (inst >> 31) & 0x1);
-
-                inst = fs->instructions[i].inst5;
-                debug_printf("    5: RGBA_INST  0x%08x:", inst);
-                debug_printf("%s dest:%d%s rgb_C_src:%d %s/%s/%s %d "
-                        "alp_C_src:%d %s %d\n",
-                        r5xx_fs_op_rgb[inst & 0xf], (inst >> 4) & 0x7f,
-                        inst & (1 << 11) ? "(rel)":"", (inst >> 12) & 0x3,
-                        r5xx_fs_swiz[(inst >> 14) & 0x7],
-                        r5xx_fs_swiz[(inst >> 17) & 0x7],
-                        r5xx_fs_swiz[(inst >> 20) & 0x7],
-                        (inst >> 23) & 0x3, (inst >> 25) & 0x3,
-                        r5xx_fs_swiz[(inst >> 27) & 0x7], (inst >> 30) & 0x3);
-                break;
-            case R500_INST_TYPE_FC:
-                /* XXX don't even bother yet */
-                break;
-            case R500_INST_TYPE_TEX:
-                inst = fs->instructions[i].inst1;
-                debug_printf("    1: TEX_INST   0x%08x: id: %d "
-                        "op:%s, %s, %s %s\n",
-                        inst, (inst >> 16) & 0xf,
-                        r5xx_fs_tex[(inst >> 22) & 0x7],
-                        (inst & (1 << 25)) ? "ACQ" : "",
-                        (inst & (1 << 26)) ? "IGNUNC" : "",
-                        (inst & (1 << 27)) ? "UNSCALED" : "SCALED");
-
-                inst = fs->instructions[i].inst2;
-                debug_printf("    2: TEX_ADDR   0x%08x: "
-                        "src: %d%s %s/%s/%s/%s dst: %d%s %s/%s/%s/%s\n",
-                        inst, inst & 0x7f, inst & (1 << 7) ? "(rel)" : "",
-                        r5xx_fs_swiz[(inst >> 8) & 0x3],
-                        r5xx_fs_swiz[(inst >> 10) & 0x3],
-                        r5xx_fs_swiz[(inst >> 12) & 0x3],
-                        r5xx_fs_swiz[(inst >> 14) & 0x3],
-                        (inst >> 16) & 0x7f, inst & (1 << 23) ? "(rel)" : "",
-                        r5xx_fs_swiz[(inst >> 24) & 0x3],
-                        r5xx_fs_swiz[(inst >> 26) & 0x3],
-                        r5xx_fs_swiz[(inst >> 28) & 0x3],
-                        r5xx_fs_swiz[(inst >> 30) & 0x3]);
-                
-                inst = fs->instructions[i].inst3;
-                debug_printf("    3: TEX_DXDY   0x%08x\n", inst);
-                break;
-        }
-    }
-}
-
-static void r300_vs_op_dump(uint32_t op)
-{
-    debug_printf(" dst: %d%s op: ",
-            (op >> 13) & 0x7f, r300_vs_dst_debug[(op >> 8) & 0x7]);
-    if (op & 0x80) {
-        if (op & 0x1) {
-            debug_printf("PVS_MACRO_OP_2CLK_M2X_ADD\n");
-        } else {
-            debug_printf("   PVS_MACRO_OP_2CLK_MADD\n");
-        }
-    } else if (op & 0x40) {
-        debug_printf("%s\n", r300_vs_me_ops[op & 0x1f]);
-    } else {
-        debug_printf("%s\n", r300_vs_ve_ops[op & 0x1f]);
-    }
-}
-
-void r300_vs_src_dump(uint32_t src)
-{
-    debug_printf(" reg: %d%s swiz: %s%s/%s%s/%s%s/%s%s\n",
-            (src >> 5) & 0x7f, r300_vs_src_debug[src & 0x3],
-            src & (1 << 25) ? "-" : " ",
-            r300_vs_swiz_debug[(src >> 13) & 0x7],
-            src & (1 << 26) ? "-" : " ",
-            r300_vs_swiz_debug[(src >> 16) & 0x7],
-            src & (1 << 27) ? "-" : " ",
-            r300_vs_swiz_debug[(src >> 19) & 0x7],
-            src & (1 << 28) ? "-" : " ",
-            r300_vs_swiz_debug[(src >> 22) & 0x7]);
-}
-
-void r300_vs_dump(struct r300_vertex_shader* vs)
-{
-    int i;
-
-    for (i = 0; i < vs->instruction_count; i++) {
-        debug_printf("%d: op: 0x%08x", i, vs->instructions[i].inst0);
-        r300_vs_op_dump(vs->instructions[i].inst0);
-        debug_printf(" src0: 0x%08x", vs->instructions[i].inst1);
-        r300_vs_src_dump(vs->instructions[i].inst1);
-        debug_printf(" src1: 0x%08x", vs->instructions[i].inst2);
-        r300_vs_src_dump(vs->instructions[i].inst2);
-        debug_printf(" src2: 0x%08x", vs->instructions[i].inst3);
-        r300_vs_src_dump(vs->instructions[i].inst3);
-    }
-}
diff --git a/src/gallium/drivers/r300/r300_debug.h b/src/gallium/drivers/r300/r300_debug.h
deleted file mode 100644 (file)
index 6b58c1e..0000000
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright 2009 Corbin Simpson <MostAwesomeDude@gmail.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * on the rights to use, copy, modify, merge, publish, distribute, sub
- * license, and/or sell copies of the Software, and to permit persons to whom
- * the Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- * USE OR OTHER DEALINGS IN THE SOFTWARE. */
-
-#ifndef R300_DEBUG_H
-#define R300_DEBUG_H
-
-#include "r300_reg.h"
-#include "r300_fs.h"
-#include "r300_vs.h"
-
-static char* r5xx_fs_swiz[] = {
-    " R",
-    " G",
-    " B",
-    " A",
-    " 0",
-    ".5",
-    " 1",
-    " U",
-};
-
-static char* r5xx_fs_op_rgb[] = {
-    "MAD",
-    "DP3",
-    "DP4",
-    "D2A",
-    "MIN",
-    "MAX",
-    "---",
-    "CND",
-    "CMP",
-    "FRC",
-    "SOP",
-    "MDH",
-    "MDV",
-};
-
-static char* r5xx_fs_op_alpha[] = {
-    "MAD",
-    " DP",
-    "MIN",
-    "MAX",
-    "---",
-    "CND",
-    "CMP",
-    "FRC",
-    "EX2",
-    "LN2",
-    "RCP",
-    "RSQ",
-    "SIN",
-    "COS",
-    "MDH",
-    "MDV",
-};
-
-static char* r5xx_fs_mask[] = {
-    "NONE",
-    "R   ",
-    " G  ",
-    "RG  ",
-    "  B ",
-    "R B ",
-    " GB ",
-    "RGB ",
-    "   A",
-    "R  A",
-    " G A",
-    "RG A",
-    "  BA",
-    "R BA",
-    " GBA",
-    "RGBA",
-};
-
-static char* r5xx_fs_tex[] = {
-    "    NOP",
-    "     LD",
-    "TEXKILL",
-    "   PROJ",
-    "LODBIAS",
-    "    LOD",
-    "   DXDY",
-};
-
-static char* r300_vs_ve_ops[] = {
-    /* R300 vector ops */
-    "                 VE_NO_OP",
-    "           VE_DOT_PRODUCT",
-    "              VE_MULTIPLY",
-    "                   VE_ADD",
-    "          VE_MULTIPLY_ADD",
-    "       VE_DISTANCE_FACTOR",
-    "              VE_FRACTION",
-    "               VE_MAXIMUM",
-    "               VE_MINIMUM",
-    "VE_SET_GREATER_THAN_EQUAL",
-    "         VE_SET_LESS_THAN",
-    "        VE_MULTIPLYX2_ADD",
-    "        VE_MULTIPLY_CLAMP",
-    "            VE_FLT2FIX_DX",
-    "        VE_FLT2FIX_DX_RND",
-    /* R500 vector ops */
-    "      VE_PRED_SET_EQ_PUSH",
-    "      VE_PRED_SET_GT_PUSH",
-    "     VE_PRED_SET_GTE_PUSH",
-    "     VE_PRED_SET_NEQ_PUSH",
-    "         VE_COND_WRITE_EQ",
-    "         VE_COND_WRITE_GT",
-    "        VE_COND_WRITE_GTE",
-    "        VE_COND_WRITE_NEQ",
-    "      VE_SET_GREATER_THAN",
-    "             VE_SET_EQUAL",
-    "         VE_SET_NOT_EQUAL",
-    "               (reserved)",
-    "               (reserved)",
-    "               (reserved)",
-};
-
-static char* r300_vs_me_ops[] = {
-    /* R300 math ops */
-    "                 ME_NO_OP",
-    "          ME_EXP_BASE2_DX",
-    "          ME_LOG_BASE2_DX",
-    "          ME_EXP_BASEE_FF",
-    "        ME_LIGHT_COEFF_DX",
-    "         ME_POWER_FUNC_FF",
-    "              ME_RECIP_DX",
-    "              ME_RECIP_FF",
-    "         ME_RECIP_SQRT_DX",
-    "         ME_RECIP_SQRT_FF",
-    "              ME_MULTIPLY",
-    "     ME_EXP_BASE2_FULL_DX",
-    "     ME_LOG_BASE2_FULL_DX",
-    " ME_POWER_FUNC_FF_CLAMP_B",
-    "ME_POWER_FUNC_FF_CLAMP_B1",
-    "ME_POWER_FUNC_FF_CLAMP_01",
-    "                   ME_SIN",
-    "                   ME_COS",
-    /* R500 math ops */
-    "        ME_LOG_BASE2_IEEE",
-    "            ME_RECIP_IEEE",
-    "       ME_RECIP_SQRT_IEEE",
-    "           ME_PRED_SET_EQ",
-    "           ME_PRED_SET_GT",
-    "          ME_PRED_SET_GTE",
-    "          ME_PRED_SET_NEQ",
-    "          ME_PRED_SET_CLR",
-    "          ME_PRED_SET_INV",
-    "          ME_PRED_SET_POP",
-    "      ME_PRED_SET_RESTORE",
-    "               (reserved)",
-    "               (reserved)",
-    "               (reserved)",
-};
-
-/* XXX refactor to avoid clashing symbols */
-static char* r300_vs_src_debug[] = {
-    "t",
-    "i",
-    "c",
-    "a",
-};
-
-static char* r300_vs_dst_debug[] = {
-    "t",
-    "a0",
-    "o",
-    "ox",
-    "a",
-    "i",
-    "u",
-    "u",
-};
-
-static char* r300_vs_swiz_debug[] = {
-    "X",
-    "Y",
-    "Z",
-    "W",
-    "0",
-    "1",
-    "U",
-    "U",
-};
-
-void r5xx_fs_dump(struct r5xx_fragment_shader* fs);
-void r3xx_dump_fs(struct r3xx_fragment_shader* fs);
-
-void r300_vs_dump(struct r300_vertex_shader* vs);
-
-#endif /* R300_DEBUG_H */
index 7ba56cd..53256fc 100644 (file)
@@ -24,6 +24,9 @@
 
 #include "r300_emit.h"
 
+#include "r300_fs.h"
+#include "r300_vs.h"
+
 void r300_emit_blend_state(struct r300_context* r300,
                            struct r300_blend_state* blend)
 {
@@ -109,73 +112,158 @@ void r300_emit_dsa_state(struct r300_context* r300,
     END_CS;
 }
 
-void r300_emit_fragment_shader(struct r300_context* r300,
-                               struct r3xx_fragment_shader* fs)
+static const float * get_shader_constant(
+    struct r300_context * r300,
+    struct rc_constant * constant,
+    struct r300_constant_buffer * externals)
+{
+    static const float zero[4] = { 0.0, 0.0, 0.0, 0.0 };
+    switch(constant->Type) {
+        case RC_CONSTANT_EXTERNAL:
+            return externals->constants[constant->u.External];
+
+        case RC_CONSTANT_IMMEDIATE:
+            return constant->u.Immediate;
+
+        default:
+            debug_printf("r300: Implementation error: Unhandled constant type %i\n",
+                constant->Type);
+            return zero;
+    }
+}
+
+/* Convert a normal single-precision float into the 7.16 format
+ * used by the R300 fragment shader.
+ */
+static uint32_t pack_float24(float f)
 {
+    union {
+        float fl;
+        uint32_t u;
+    } u;
+    float mantissa;
+    int exponent;
+    uint32_t float24 = 0;
+
+    if (f == 0.0)
+        return 0;
+
+    u.fl = f;
+
+    mantissa = frexpf(f, &exponent);
+
+    /* Handle -ve */
+    if (mantissa < 0) {
+        float24 |= (1 << 23);
+        mantissa = mantissa * -1.0;
+    }
+    /* Handle exponent, bias of 63 */
+    exponent += 62;
+    float24 |= (exponent << 16);
+    /* Kill 7 LSB of mantissa */
+    float24 |= (u.u & 0x7FFFFF) >> 7;
+
+    return float24;
+}
+
+void r300_emit_fragment_program_code(struct r300_context* r300,
+                                     struct rX00_fragment_program_code* generic_code,
+                                     struct r300_constant_buffer* externals)
+{
+    struct r300_fragment_program_code * code = &generic_code->code.r300;
+    struct rc_constant_list * constants = &generic_code->constants;
     int i;
     CS_LOCALS(r300);
 
-    BEGIN_CS(22);
-
-    OUT_CS_REG(R300_US_CONFIG, fs->indirections);
-    OUT_CS_REG(R300_US_PIXSIZE, fs->shader.stack_size);
-    /* XXX figure out exactly how big the sizes are on this reg */
-    OUT_CS_REG(R300_US_CODE_OFFSET, 0x40);
-    /* XXX figure these ones out a bit better kthnx */
-    OUT_CS_REG(R300_US_CODE_ADDR_0, 0x0);
-    OUT_CS_REG(R300_US_CODE_ADDR_1, 0x0);
-    OUT_CS_REG(R300_US_CODE_ADDR_2, 0x0);
-    OUT_CS_REG(R300_US_CODE_ADDR_3, 0x40 | R300_RGBA_OUT);
-
-    for (i = 0; i < fs->alu_instruction_count; i++) {
-        OUT_CS_REG(R300_US_ALU_RGB_INST_0 + (4 * i),
-            fs->instructions[i].alu_rgb_inst);
-        OUT_CS_REG(R300_US_ALU_RGB_ADDR_0 + (4 * i),
-            fs->instructions[i].alu_rgb_addr);
-        OUT_CS_REG(R300_US_ALU_ALPHA_INST_0 + (4 * i),
-            fs->instructions[i].alu_alpha_inst);
-        OUT_CS_REG(R300_US_ALU_ALPHA_ADDR_0 + (4 * i),
-            fs->instructions[i].alu_alpha_addr);
+    BEGIN_CS(15 +
+             code->alu.length * 4 +
+             (code->tex.length ? (1 + code->tex.length) : 0) +
+             (constants->Count ? (1 + constants->Count * 4) : 0));
+
+    OUT_CS_REG(R300_US_CONFIG, code->config);
+    OUT_CS_REG(R300_US_PIXSIZE, code->pixsize);
+    OUT_CS_REG(R300_US_CODE_OFFSET, code->code_offset);
+
+    OUT_CS_REG_SEQ(R300_US_CODE_ADDR_0, 4);
+    for(i = 0; i < 4; ++i)
+        OUT_CS(code->code_addr[i]);
+
+    OUT_CS_REG_SEQ(R300_US_ALU_RGB_INST_0, code->alu.length);
+    for (i = 0; i < code->alu.length; i++)
+        OUT_CS(code->alu.inst[i].rgb_inst);
+
+    OUT_CS_REG_SEQ(R300_US_ALU_RGB_ADDR_0, code->alu.length);
+    for (i = 0; i < code->alu.length; i++)
+        OUT_CS(code->alu.inst[i].rgb_addr);
+
+    OUT_CS_REG_SEQ(R300_US_ALU_ALPHA_INST_0, code->alu.length);
+    for (i = 0; i < code->alu.length; i++)
+        OUT_CS(code->alu.inst[i].alpha_inst);
+
+    OUT_CS_REG_SEQ(R300_US_ALU_ALPHA_ADDR_0, code->alu.length);
+    for (i = 0; i < code->alu.length; i++)
+        OUT_CS(code->alu.inst[i].alpha_addr);
+
+    if (code->tex.length) {
+        OUT_CS_REG_SEQ(R300_US_TEX_INST_0, code->tex.length);
+        for(i = 0; i < code->tex.length; ++i)
+            OUT_CS(code->tex.inst[i]);
+    }
+
+    if (constants->Count) {
+        OUT_CS_ONE_REG(R300_PFS_PARAM_0_X, constants->Count * 4);
+        for(i = 0; i < constants->Count; ++i) {
+            const float * data = get_shader_constant(r300, &constants->Constants[i], externals);
+            OUT_CS(pack_float24(data[0]));
+            OUT_CS(pack_float24(data[1]));
+            OUT_CS(pack_float24(data[2]));
+            OUT_CS(pack_float24(data[3]));
+        }
     }
 
     END_CS;
 }
 
-void r500_emit_fragment_shader(struct r300_context* r300,
-                               struct r5xx_fragment_shader* fs)
+void r500_emit_fragment_program_code(struct r300_context* r300,
+                                     struct rX00_fragment_program_code* generic_code,
+                                     struct r300_constant_buffer* externals)
 {
+    struct r500_fragment_program_code * code = &generic_code->code.r500;
+    struct rc_constant_list * constants = &generic_code->constants;
     int i;
-    struct r300_constant_buffer* constants =
-        &r300->shader_constants[PIPE_SHADER_FRAGMENT];
     CS_LOCALS(r300);
 
-    BEGIN_CS(9 + (fs->instruction_count * 6) + (constants->count ? 3 : 0) +
-            (constants->count * 4));
-    OUT_CS_REG(R500_US_CONFIG, R500_ZERO_TIMES_ANYTHING_EQUALS_ZERO);
-    OUT_CS_REG(R500_US_PIXSIZE, fs->shader.stack_size);
-    OUT_CS_REG(R500_US_CODE_ADDR, R500_US_CODE_START_ADDR(0) |
-            R500_US_CODE_END_ADDR(fs->instruction_count));
+    BEGIN_CS(13 +
+             ((code->inst_end + 1) * 6) +
+             (constants->Count ? (3 + (constants->Count * 4)) : 0));
+    OUT_CS_REG(R500_US_CONFIG, 0);
+    OUT_CS_REG(R500_US_PIXSIZE, code->max_temp_idx);
+    OUT_CS_REG(R500_US_CODE_RANGE,
+               R500_US_CODE_RANGE_ADDR(0) | R500_US_CODE_RANGE_SIZE(code->inst_end));
+    OUT_CS_REG(R500_US_CODE_OFFSET, 0);
+    OUT_CS_REG(R500_US_CODE_ADDR,
+               R500_US_CODE_START_ADDR(0) | R500_US_CODE_END_ADDR(code->inst_end));
 
     OUT_CS_REG(R500_GA_US_VECTOR_INDEX, R500_GA_US_VECTOR_INDEX_TYPE_INSTR);
-    OUT_CS_ONE_REG(R500_GA_US_VECTOR_DATA, fs->instruction_count * 6);
-    for (i = 0; i < fs->instruction_count; i++) {
-        OUT_CS(fs->instructions[i].inst0);
-        OUT_CS(fs->instructions[i].inst1);
-        OUT_CS(fs->instructions[i].inst2);
-        OUT_CS(fs->instructions[i].inst3);
-        OUT_CS(fs->instructions[i].inst4);
-        OUT_CS(fs->instructions[i].inst5);
-    }
-
-    if (constants->count) {
-        OUT_CS_REG(R500_GA_US_VECTOR_INDEX,
-                R500_GA_US_VECTOR_INDEX_TYPE_CONST);
-        OUT_CS_ONE_REG(R500_GA_US_VECTOR_DATA, constants->count * 4);
-        for (i = 0; i < constants->count; i++) {
-            OUT_CS_32F(constants->constants[i][0]);
-            OUT_CS_32F(constants->constants[i][1]);
-            OUT_CS_32F(constants->constants[i][2]);
-            OUT_CS_32F(constants->constants[i][3]);
+    OUT_CS_ONE_REG(R500_GA_US_VECTOR_DATA, (code->inst_end + 1) * 6);
+    for (i = 0; i <= code->inst_end; i++) {
+        OUT_CS(code->inst[i].inst0);
+        OUT_CS(code->inst[i].inst1);
+        OUT_CS(code->inst[i].inst2);
+        OUT_CS(code->inst[i].inst3);
+        OUT_CS(code->inst[i].inst4);
+        OUT_CS(code->inst[i].inst5);
+    }
+
+    if (constants->Count) {
+        OUT_CS_REG(R500_GA_US_VECTOR_INDEX, R500_GA_US_VECTOR_INDEX_TYPE_CONST);
+        OUT_CS_ONE_REG(R500_GA_US_VECTOR_DATA, constants->Count * 4);
+        for (i = 0; i < constants->Count; i++) {
+            const float * data = get_shader_constant(r300, &constants->Constants[i], externals);
+            OUT_CS_32F(data[0]);
+            OUT_CS_32F(data[1]);
+            OUT_CS_32F(data[2]);
+            OUT_CS_32F(data[3]);
         }
     }
 
@@ -190,7 +278,7 @@ void r300_emit_fb_state(struct r300_context* r300,
     int i;
     CS_LOCALS(r300);
 
-    BEGIN_CS((8 * fb->nr_cbufs) + (fb->zsbuf ? 8 : 0) + 4);
+    BEGIN_CS((10 * fb->nr_cbufs) + (fb->zsbuf ? 10 : 0) + 4);
     for (i = 0; i < fb->nr_cbufs; i++) {
         tex = (struct r300_texture*)fb->cbufs[i]->texture;
         assert(tex && tex->buffer && "cbuf is marked, but NULL!");
@@ -199,8 +287,10 @@ void r300_emit_fb_state(struct r300_context* r300,
         OUT_CS_REG_SEQ(R300_RB3D_COLOROFFSET0 + (4 * i), 1);
         OUT_CS_RELOC(tex->buffer, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
 
-        OUT_CS_REG(R300_RB3D_COLORPITCH0 + (4 * i), pixpitch |
-            r300_translate_colorformat(tex->tex.format));
+        OUT_CS_REG_SEQ(R300_RB3D_COLORPITCH0 + (4 * i), 1);
+        OUT_CS_RELOC(tex->buffer, pixpitch |
+                     r300_translate_colorformat(tex->tex.format), 0,
+                     RADEON_GEM_DOMAIN_VRAM, 0);
 
         OUT_CS_REG(R300_US_OUT_FMT_0 + (4 * i),
             r300_translate_out_fmt(fb->cbufs[i]->format));
@@ -216,7 +306,8 @@ void r300_emit_fb_state(struct r300_context* r300,
 
         OUT_CS_REG(R300_ZB_FORMAT, r300_translate_zsformat(tex->tex.format));
 
-        OUT_CS_REG(R300_ZB_DEPTHPITCH, pixpitch);
+        OUT_CS_REG_SEQ(R300_ZB_DEPTHPITCH, 1);
+        OUT_CS_RELOC(tex->buffer, pixpitch, 0, RADEON_GEM_DOMAIN_VRAM, 0);
     }
 
     OUT_CS_REG(R300_RB3D_DSTCACHE_CTLSTAT,
@@ -380,13 +471,13 @@ void r300_emit_vertex_format_state(struct r300_context* r300)
     END_CS;
 }
 
-void r300_emit_vertex_shader(struct r300_context* r300,
-                             struct r300_vertex_shader* vs)
+void r300_emit_vertex_program_code(struct r300_context* r300,
+                                   struct r300_vertex_program_code* code,
+                                   struct r300_constant_buffer* constants)
 {
     int i;
     struct r300_screen* r300screen = r300_screen(r300->context.screen);
-    struct r300_constant_buffer* constants =
-        &r300->shader_constants[PIPE_SHADER_VERTEX];
+    unsigned instruction_count = code->length / 4;
     CS_LOCALS(r300);
 
     if (!r300screen->caps->has_tcl) {
@@ -395,10 +486,10 @@ void r300_emit_vertex_shader(struct r300_context* r300,
         return;
     }
 
-    if (constants->count) {
-        BEGIN_CS(14 + (vs->instruction_count * 4) + (constants->count * 4));
+    if (code->constants.Count) {
+        BEGIN_CS(14 + code->length + (code->constants.Count * 4));
     } else {
-        BEGIN_CS(11 + (vs->instruction_count * 4));
+        BEGIN_CS(11 + code->length);
     }
 
     /* R300_VAP_PVS_CODE_CNTL_0
@@ -408,30 +499,27 @@ void r300_emit_vertex_shader(struct r300_context* r300,
      * XXX these could be optimized to select better values... */
     OUT_CS_REG_SEQ(R300_VAP_PVS_CODE_CNTL_0, 3);
     OUT_CS(R300_PVS_FIRST_INST(0) |
-            R300_PVS_XYZW_VALID_INST(vs->instruction_count - 1) |
-            R300_PVS_LAST_INST(vs->instruction_count - 1));
-    OUT_CS(R300_PVS_MAX_CONST_ADDR(constants->count - 1));
-    OUT_CS(vs->instruction_count - 1);
+            R300_PVS_XYZW_VALID_INST(instruction_count - 1) |
+            R300_PVS_LAST_INST(instruction_count - 1));
+    OUT_CS(R300_PVS_MAX_CONST_ADDR(code->constants.Count - 1));
+    OUT_CS(instruction_count - 1);
 
     OUT_CS_REG(R300_VAP_PVS_VECTOR_INDX_REG, 0);
-    OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, vs->instruction_count * 4);
-    for (i = 0; i < vs->instruction_count; i++) {
-        OUT_CS(vs->instructions[i].inst0);
-        OUT_CS(vs->instructions[i].inst1);
-        OUT_CS(vs->instructions[i].inst2);
-        OUT_CS(vs->instructions[i].inst3);
-    }
+    OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, code->length);
+    for (i = 0; i < code->length; i++)
+        OUT_CS(code->body.d[i]);
 
-    if (constants->count) {
+    if (code->constants.Count) {
         OUT_CS_REG(R300_VAP_PVS_VECTOR_INDX_REG,
                 (r300screen->caps->is_r500 ?
                  R500_PVS_CONST_START : R300_PVS_CONST_START));
-        OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, constants->count * 4);
-        for (i = 0; i < constants->count; i++) {
-            OUT_CS_32F(constants->constants[i][0]);
-            OUT_CS_32F(constants->constants[i][1]);
-            OUT_CS_32F(constants->constants[i][2]);
-            OUT_CS_32F(constants->constants[i][3]);
+        OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, code->constants.Count * 4);
+        for (i = 0; i < code->constants.Count; i++) {
+            const float * data = get_shader_constant(r300, &code->constants.Constants[i], constants);
+            OUT_CS_32F(data[0]);
+            OUT_CS_32F(data[1]);
+            OUT_CS_32F(data[2]);
+            OUT_CS_32F(data[3]);
         }
     }
 
@@ -443,6 +531,12 @@ void r300_emit_vertex_shader(struct r300_context* r300,
     END_CS;
 }
 
+void r300_emit_vertex_shader(struct r300_context* r300,
+                             struct r300_vertex_shader* vs)
+{
+    r300_emit_vertex_program_code(r300, &vs->code, &r300->shader_constants[PIPE_SHADER_VERTEX]);
+}
+
 void r300_emit_viewport_state(struct r300_context* r300,
                               struct r300_viewport_state* viewport)
 {
@@ -531,10 +625,11 @@ validate:
     } else {
         debug_printf("No VBO while emitting dirty state!\n");
     }
-    if (r300->winsys->validate(r300->winsys)) {
+    if (!r300->winsys->validate(r300->winsys)) {
         r300->context.flush(&r300->context, 0, NULL);
         if (invalid) {
             /* Well, hell. */
+            debug_printf("r300: Stuck in validation loop, gonna quit now.");
             exit(1);
         }
         invalid = TRUE;
@@ -563,11 +658,9 @@ validate:
 
     if (r300->dirty_state & R300_NEW_FRAGMENT_SHADER) {
         if (r300screen->caps->is_r500) {
-            r500_emit_fragment_shader(r300,
-                (struct r5xx_fragment_shader*)r300->fs);
+            r500_emit_fragment_program_code(r300, &r300->fs->code, &r300->shader_constants[PIPE_SHADER_FRAGMENT]);
         } else {
-            r300_emit_fragment_shader(r300,
-                (struct r3xx_fragment_shader*)r300->fs);
+            r300_emit_fragment_program_code(r300, &r300->fs->code, &r300->shader_constants[PIPE_SHADER_FRAGMENT]);
         }
         r300->dirty_state &= ~R300_NEW_FRAGMENT_SHADER;
     }
index fda26f3..350691d 100644 (file)
@@ -30,6 +30,9 @@
 #include "r300_screen.h"
 #include "r300_state_inlines.h"
 
+struct rX00_fragment_program_code;
+struct r300_vertex_program_code;
+
 void r300_emit_blend_state(struct r300_context* r300,
                            struct r300_blend_state* blend);
 
@@ -42,11 +45,13 @@ void r300_emit_clip_state(struct r300_context* r300,
 void r300_emit_dsa_state(struct r300_context* r300,
                          struct r300_dsa_state* dsa);
 
-void r300_emit_fragment_shader(struct r300_context* r300,
-                               struct r3xx_fragment_shader* fs);
+void r300_emit_fragment_program_code(struct r300_context* r300,
+                                     struct rX00_fragment_program_code* generic_code,
+                                     struct r300_constant_buffer* externals);
 
-void r500_emit_fragment_shader(struct r300_context* r300,
-                               struct r5xx_fragment_shader* fs);
+void r500_emit_fragment_program_code(struct r300_context* r300,
+                                     struct rX00_fragment_program_code* generic_code,
+                                     struct r300_constant_buffer* externals);
 
 void r300_emit_fb_state(struct r300_context* r300,
                         struct pipe_framebuffer_state* fb);
@@ -68,6 +73,10 @@ void r300_emit_vertex_buffer(struct r300_context* r300);
 
 void r300_emit_vertex_format_state(struct r300_context* r300);
 
+void r300_emit_vertex_program_code(struct r300_context* r300,
+                                   struct r300_vertex_program_code* code,
+                                   struct r300_constant_buffer* constants);
+
 void r300_emit_vertex_shader(struct r300_context* r300,
                              struct r300_vertex_shader* vs);
 
index 4b30430..36463b9 100644 (file)
 
 #include "r300_fs.h"
 
-void r300_translate_fragment_shader(struct r300_context* r300,
-                                    struct r300_fragment_shader* fs)
+#include "r300_tgsi_to_rc.h"
+
+#include "radeon_compiler.h"
+
+static void find_output_registers(struct r300_fragment_program_compiler * compiler,
+                                  struct r300_fragment_shader * fs)
 {
-    struct tgsi_parse_context parser;
-    int i;
-    boolean is_r500 = r300_screen(r300->context.screen)->caps->is_r500;
-    struct r300_constant_buffer* consts =
-        &r300->shader_constants[PIPE_SHADER_FRAGMENT];
+    unsigned i;
 
-    struct r300_fs_asm* assembler = CALLOC_STRUCT(r300_fs_asm);
-    if (assembler == NULL) {
-        return;
-    }
-    /* Setup starting offset for immediates. */
-    assembler->imm_offset = consts->user_count;
-    /* Enable depth writes, if needed. */
-    assembler->writes_depth = fs->info.writes_z;
-
-    /* Make sure we start at the beginning of the shader. */
-    if (is_r500) {
-        ((struct r5xx_fragment_shader*)fs)->instruction_count = 0;
-    }
+    /* Mark the outputs as not present initially */
+    compiler->OutputColor = fs->info.num_outputs;
+    compiler->OutputDepth = fs->info.num_outputs;
 
-    tgsi_parse_init(&parser, fs->state.tokens);
+    /* Now see where they really are. */
+    for(i = 0; i < fs->info.num_outputs; ++i) {
+        switch(fs->info.output_semantic_name[i]) {
+            case TGSI_SEMANTIC_COLOR:
+                compiler->OutputColor = i;
+                break;
+            case TGSI_SEMANTIC_POSITION:
+                compiler->OutputDepth = i;
+                break;
+        }
+    }
+}
 
-    while (!tgsi_parse_end_of_tokens(&parser)) {
-        tgsi_parse_token(&parser);
+static void allocate_hardware_inputs(
+    struct r300_fragment_program_compiler * c,
+    void (*allocate)(void * data, unsigned input, unsigned hwreg),
+    void * mydata)
+{
+    struct tgsi_shader_info* info = &((struct r300_fragment_shader*)c->UserData)->info;
+    int total_colors = 0;
+    int colors = 0;
+    int total_generic = 0;
+    int generic = 0;
+    int i;
 
-        /* This is seriously the lamest way to create fragment programs ever.
-         * I blame TGSI. */
-        switch (parser.FullToken.Token.Type) {
-            case TGSI_TOKEN_TYPE_DECLARATION:
-                /* Allocated registers sitting at the beginning
-                 * of the program. */
-                r300_fs_declare(assembler, &parser.FullToken.FullDeclaration);
+    for (i = 0; i < info->num_inputs; i++) {
+        switch (info->input_semantic_name[i]) {
+            case TGSI_SEMANTIC_COLOR:
+                total_colors++;
                 break;
-            case TGSI_TOKEN_TYPE_IMMEDIATE:
-                debug_printf("r300: Emitting immediate to constant buffer, "
-                        "position %d\n",
-                        assembler->imm_offset + assembler->imm_count);
-                /* I am not amused by the length of these. */
-                for (i = 0; i < 4; i++) {
-                    consts->constants[assembler->imm_offset +
-                        assembler->imm_count][i] =
-                        parser.FullToken.FullImmediate.u.ImmediateFloat32[i]
-                        .Float;
-                }
-                assembler->imm_count++;
+            case TGSI_SEMANTIC_FOG:
+            case TGSI_SEMANTIC_GENERIC:
+                total_generic++;
                 break;
-            case TGSI_TOKEN_TYPE_INSTRUCTION:
-                if (is_r500) {
-                    r5xx_fs_instruction((struct r5xx_fragment_shader*)fs,
-                            assembler, &parser.FullToken.FullInstruction);
-                } else {
-                    r3xx_fs_instruction((struct r3xx_fragment_shader*)fs,
-                            assembler, &parser.FullToken.FullInstruction);
-                }
+        }
+    }
+
+    for(i = 0; i < info->num_inputs; i++) {
+        switch (info->input_semantic_name[i]) {
+            case TGSI_SEMANTIC_COLOR:
+                allocate(mydata, i, colors);
+                colors++;
+                break;
+            case TGSI_SEMANTIC_FOG:
+            case TGSI_SEMANTIC_GENERIC:
+                allocate(mydata, i, total_colors + generic);
+                generic++;
                 break;
         }
     }
+}
+
+void r300_translate_fragment_shader(struct r300_context* r300,
+                                    struct r300_fragment_shader* fs)
+{
+    struct r300_fragment_program_compiler compiler;
+    struct tgsi_to_rc ttr;
+
+    memset(&compiler, 0, sizeof(compiler));
+    rc_init(&compiler.Base);
+    compiler.Base.Debug = 1;
+
+    compiler.code = &fs->code;
+    compiler.is_r500 = r300_screen(r300->context.screen)->caps->is_r500;
+    compiler.AllocateHwInputs = &allocate_hardware_inputs;
+    compiler.UserData = fs;
+
+    /* TODO: Program compilation depends on texture compare modes,
+     * which are sampler state. Therefore, programs need to be recompiled
+     * depending on this state as in the classic Mesa driver.
+     *
+     * This is not yet handled correctly.
+     */
 
-    debug_printf("r300: fs: %d texs and %d colors, first free reg is %d\n",
-            assembler->tex_count, assembler->color_count,
-            assembler->tex_count + assembler->color_count);
-
-    consts->count = consts->user_count + assembler->imm_count;
-    fs->uses_imms = assembler->imm_count;
-    debug_printf("r300: fs: %d total constants, "
-            "%d from user and %d from immediates\n", consts->count,
-            consts->user_count, assembler->imm_count);
-    r3xx_fs_finalize(fs, assembler);
-    if (is_r500) {
-        r5xx_fs_finalize((struct r5xx_fragment_shader*)fs, assembler);
+    find_output_registers(&compiler, fs);
+
+    if (compiler.Base.Debug) {
+        debug_printf("r300: Initial fragment program\n");
+        tgsi_dump(fs->state.tokens, 0);
     }
 
-    tgsi_dump(fs->state.tokens, 0);
-    /* XXX finish r300 dumper too */
-    if (is_r500) {
-        r5xx_fs_dump((struct r5xx_fragment_shader*)fs);
+    /* Translate TGSI to our internal representation */
+    ttr.compiler = &compiler.Base;
+    ttr.info = &fs->info;
+
+    r300_tgsi_to_rc(&ttr, fs->state.tokens);
+
+    /* Invoke the compiler */
+    r3xx_compile_fragment_program(&compiler);
+    if (compiler.Base.Error) {
+        /* Todo: Fail gracefully */
+        fprintf(stderr, "r300 FP: Compiler error\n");
+        abort();
     }
 
-    tgsi_parse_free(&parser);
-    FREE(assembler);
+    /* And, finally... */
+    rc_destroy(&compiler.Base);
+    fs->translated = TRUE;
 }
index 18deb7a..9fab789 100644 (file)
 #include "r3xx_fs.h"
 #include "r5xx_fs.h"
 
+#include "radeon_code.h"
+
+struct r300_fragment_shader {
+    /* Parent class */
+    struct pipe_shader_state state;
+    struct tgsi_shader_info info;
+
+    /* Has this shader been translated yet? */
+    boolean translated;
+
+    /* Compiled code */
+    struct rX00_fragment_program_code code;
+};
+
+
 void r300_translate_fragment_shader(struct r300_context* r300,
                                     struct r300_fragment_shader* fs);
 
diff --git a/src/gallium/drivers/r300/r300_fs_inlines.h b/src/gallium/drivers/r300/r300_fs_inlines.h
deleted file mode 100644 (file)
index be4be94..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com>
- *                Joakim Sindholt <opensource@zhasha.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * on the rights to use, copy, modify, merge, publish, distribute, sub
- * license, and/or sell copies of the Software, and to permit persons to whom
- * the Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- * USE OR OTHER DEALINGS IN THE SOFTWARE. */
-
-#ifndef R300_FS_INLINES_H
-#define R300_FS_INLINES_H
-
-#include "tgsi/tgsi_parse.h"
-
-#include "r300_context.h"
-#include "r300_debug.h"
-#include "r300_reg.h"
-#include "r300_screen.h"
-#include "r300_shader_inlines.h"
-
-/* Temporary struct used to hold assembly state while putting together
- * fragment programs. */
-struct r300_fs_asm {
-    /* Pipe context. */
-    struct r300_context* r300;
-    /* Number of colors. */
-    unsigned color_count;
-    /* Number of texcoords. */
-    unsigned tex_count;
-    /* Offset for temporary registers. Inputs and temporaries have no
-     * distinguishing markings, so inputs start at 0 and the first usable
-     * temporary register is after all inputs. */
-    unsigned temp_offset;
-    /* Number of requested temporary registers. */
-    unsigned temp_count;
-    /* Offset for immediate constants. Neither R300 nor R500 can do four
-     * inline constants per source, so instead we copy immediates into the
-     * constant buffer. */
-    unsigned imm_offset;
-    /* Number of immediate constants. */
-    unsigned imm_count;
-    /* Are depth writes enabled? */
-    boolean writes_depth;
-    /* Depth write offset. This is the TGSI output that corresponds to
-     * depth writes. */
-    unsigned depth_output;
-};
-
-static INLINE void r300_fs_declare(struct r300_fs_asm* assembler,
-                            struct tgsi_full_declaration* decl)
-{
-    switch (decl->Declaration.File) {
-        case TGSI_FILE_INPUT:
-            switch (decl->Semantic.SemanticName) {
-                case TGSI_SEMANTIC_COLOR:
-                    assembler->color_count++;
-                    break;
-                case TGSI_SEMANTIC_FOG:
-                case TGSI_SEMANTIC_GENERIC:
-                    assembler->tex_count++;
-                    break;
-                default:
-                    debug_printf("r300: fs: Bad semantic declaration %d\n",
-                        decl->Semantic.SemanticName);
-                    break;
-            }
-            break;
-        case TGSI_FILE_OUTPUT:
-            /* Depth write. Mark the position of the output so we can
-             * identify it later. */
-            if (decl->Semantic.SemanticName == TGSI_SEMANTIC_POSITION) {
-                assembler->depth_output = decl->DeclarationRange.First;
-            }
-            break;
-        case TGSI_FILE_CONSTANT:
-            break;
-        case TGSI_FILE_TEMPORARY:
-            assembler->temp_count++;
-            break;
-        default:
-            debug_printf("r300: fs: Bad file %d\n", decl->Declaration.File);
-            break;
-    }
-
-    assembler->temp_offset = assembler->color_count + assembler->tex_count;
-}
-
-static INLINE unsigned r300_fs_src(struct r300_fs_asm* assembler,
-                                   struct tgsi_src_register* src)
-{
-    switch (src->File) {
-        case TGSI_FILE_NULL:
-            return 0;
-        case TGSI_FILE_INPUT:
-            /* XXX may be wrong */
-            return src->Index;
-            break;
-        case TGSI_FILE_TEMPORARY:
-            return src->Index + assembler->temp_offset;
-            break;
-        case TGSI_FILE_IMMEDIATE:
-            return (src->Index + assembler->imm_offset) | (1 << 8);
-            break;
-        case TGSI_FILE_CONSTANT:
-            /* XXX magic */
-            return src->Index | (1 << 8);
-            break;
-        default:
-            debug_printf("r300: fs: Unimplemented src %d\n", src->File);
-            break;
-    }
-    return 0;
-}
-
-static INLINE unsigned r300_fs_dst(struct r300_fs_asm* assembler,
-                                   struct tgsi_dst_register* dst)
-{
-    switch (dst->File) {
-        case TGSI_FILE_NULL:
-            /* This happens during KIL instructions. */
-            return 0;
-            break;
-        case TGSI_FILE_OUTPUT:
-            return 0;
-            break;
-        case TGSI_FILE_TEMPORARY:
-            return dst->Index + assembler->temp_offset;
-            break;
-        default:
-            debug_printf("r300: fs: Unimplemented dst %d\n", dst->File);
-            break;
-    }
-    return 0;
-}
-
-static INLINE boolean r300_fs_is_depr(struct r300_fs_asm* assembler,
-                                      struct tgsi_dst_register* dst)
-{
-    return (assembler->writes_depth &&
-            (dst->File == TGSI_FILE_OUTPUT) &&
-            (dst->Index == assembler->depth_output));
-}
-
-#endif /* R300_FS_INLINES_H */
index da1d5ff..96a7304 100644 (file)
@@ -147,6 +147,8 @@ static int r300_get_param(struct pipe_screen* pscreen, int param)
         case PIPE_CAP_TGSI_CONT_SUPPORTED:
             /* XXX */
             return 0;
+        case PIPE_CAP_BLEND_EQUATION_SEPARATE:
+            return 1;
         default:
             debug_printf("r300: Implementation error: Bad param %d\n",
                 param);
@@ -320,13 +322,14 @@ r300_get_tex_transfer(struct pipe_screen *screen,
     trans = CALLOC_STRUCT(r300_transfer);
     if (trans) {
         pipe_texture_reference(&trans->transfer.texture, texture);
-        trans->transfer.format = trans->transfer.format;
+        trans->transfer.format = texture->format;
         trans->transfer.width = w;
         trans->transfer.height = h;
         trans->transfer.block = texture->block;
         trans->transfer.nblocksx = texture->nblocksx[level];
         trans->transfer.nblocksy = texture->nblocksy[level];
-        trans->transfer.stride = tex->stride;
+        trans->transfer.stride = align(pf_get_stride(&trans->transfer.block,
+                                                     texture->width[level]), 32);
         trans->transfer.usage = usage;
         trans->offset = offset;
     }
index 68da0aa..a02fb34 100644 (file)
@@ -32,6 +32,7 @@
 #include "r300_reg.h"
 #include "r300_state_inlines.h"
 #include "r300_fs.h"
+#include "r300_vs.h"
 
 /* r300_state: Functions used to intialize state context by translating
  * Gallium state objects into semi-native r300 state objects. */
@@ -137,7 +138,6 @@ static void
                              const struct pipe_constant_buffer* buffer)
 {
     struct r300_context* r300 = r300_context(pipe);
-    int i = r300->shader_constants[shader].user_count;
 
     /* This entire chunk of code seems ever-so-slightly baked.
      * It's as if I've got pipe_buffer* matryoshkas... */
@@ -148,26 +148,13 @@ static void
             map, buffer->buffer->size);
         pipe->winsys->buffer_unmap(pipe->winsys, buffer->buffer);
 
-        r300->shader_constants[shader].user_count =
+        r300->shader_constants[shader].count =
             buffer->buffer->size / (sizeof(float) * 4);
     } else {
-        r300->shader_constants[shader].user_count = 0;
+        r300->shader_constants[shader].count = 0;
     }
 
     r300->dirty_state |= R300_NEW_CONSTANTS;
-
-    /* If the number of constants have changed, invalidate the shader. */
-    if (r300->shader_constants[shader].user_count != i) {
-        if (shader == PIPE_SHADER_FRAGMENT && r300->fs &&
-                r300->fs->uses_imms) {
-            r300->fs->translated = FALSE;
-            r300_translate_fragment_shader(r300, r300->fs);
-        } else if (shader == PIPE_SHADER_VERTEX && r300->vs &&
-                r300->vs->uses_imms) {
-            r300->vs->translated = FALSE;
-            r300_translate_vertex_shader(r300, r300->vs);
-        }
-    }
 }
 
 /* Create a new depth, stencil, and alpha state based on the CSO dsa state.
@@ -284,14 +271,9 @@ static void
 static void* r300_create_fs_state(struct pipe_context* pipe,
                                   const struct pipe_shader_state* shader)
 {
-    struct r300_context* r300 = r300_context(pipe);
     struct r300_fragment_shader* fs = NULL;
 
-    if (r300_screen(r300->context.screen)->caps->is_r500) {
-        fs = (struct r300_fragment_shader*)CALLOC_STRUCT(r5xx_fragment_shader);
-    } else {
-        fs = (struct r300_fragment_shader*)CALLOC_STRUCT(r3xx_fragment_shader);
-    }
+    fs = (struct r300_fragment_shader*)CALLOC_STRUCT(r300_fragment_shader);
 
     /* Copy state directly into shader. */
     fs->state = *shader;
@@ -315,7 +297,6 @@ static void r300_bind_fs_state(struct pipe_context* pipe, void* shader)
         r300_translate_fragment_shader(r300, fs);
     }
 
-    fs->translated = TRUE;
     r300->fs = fs;
 
     r300->dirty_state |= R300_NEW_FRAGMENT_SHADER;
@@ -325,6 +306,7 @@ static void r300_bind_fs_state(struct pipe_context* pipe, void* shader)
 static void r300_delete_fs_state(struct pipe_context* pipe, void* shader)
 {
     struct r300_fragment_shader* fs = (struct r300_fragment_shader*)shader;
+    rc_constants_destroy(&fs->code.constants);
     FREE(fs->state.tokens);
     FREE(shader);
 }
@@ -688,6 +670,7 @@ static void r300_delete_vs_state(struct pipe_context* pipe, void* shader)
     if (r300_screen(pipe->screen)->caps->has_tcl) {
         struct r300_vertex_shader* vs = (struct r300_vertex_shader*)shader;
 
+        rc_constants_destroy(&vs->code.constants);
         draw_delete_vertex_shader(r300->draw, vs->draw);
         FREE(vs->state.tokens);
         FREE(shader);
index 2477b30..ea670f4 100644 (file)
@@ -22,6 +22,9 @@
 
 #include "r300_state_derived.h"
 
+#include "r300_fs.h"
+#include "r300_vs.h"
+
 /* r300_state_derived: Various bits of state which are dependent upon
  * currently bound CSO data. */
 
index 430129d..1e92374 100644 (file)
@@ -34,7 +34,7 @@ void r300_emit_invariant_state(struct r300_context* r300)
     struct r300_capabilities* caps = r300_screen(r300->context.screen)->caps;
     CS_LOCALS(r300);
 
-    BEGIN_CS(22 + (caps->has_tcl ? 2: 0));
+    BEGIN_CS(24 + (caps->has_tcl ? 2: 0));
 
     /*** Graphics Backend (GB) ***/
     /* Various GB enables */
@@ -56,6 +56,7 @@ void r300_emit_invariant_state(struct r300_context* r300)
     OUT_CS_REG(R300_FG_FOG_COLOR_G, 0x0);
     OUT_CS_REG(R300_FG_FOG_COLOR_B, 0x0);
     OUT_CS_REG(R300_FG_DEPTH_SRC, 0x0);
+    OUT_CS_REG(R300_US_W_FMT, 0x0);
 
     /*** VAP ***/
     /* Max and min vertex index clamp. */
@@ -72,7 +73,7 @@ void r300_emit_invariant_state(struct r300_context* r300)
     END_CS;
 
     /* XXX unsorted stuff from surface_fill */
-    BEGIN_CS(71 + (caps->has_tcl ? 5 : 0) + (caps->is_r500 ? 4 : 0));
+    BEGIN_CS(64 + (caps->has_tcl ? 5 : 0) + (caps->is_r500 ? 4 : 0));
     /* Flush PVS. */
     OUT_CS_REG(R300_VAP_PVS_STATE_FLUSH_REG, 0x0);
 
@@ -132,11 +133,5 @@ void r300_emit_invariant_state(struct r300_context* r300)
     /* XXX */
     OUT_CS_REG(R300_SC_CLIP_RULE, 0xaaaa);
 
-    OUT_CS_REG_SEQ(R300_US_OUT_FMT_0, 4);
-    OUT_CS(R300_C0_SEL_B | R300_C1_SEL_G | R300_C2_SEL_R | R300_C3_SEL_A);
-    OUT_CS(R300_US_OUT_FMT_UNUSED);
-    OUT_CS(R300_US_OUT_FMT_UNUSED);
-    OUT_CS(R300_US_OUT_FMT_UNUSED);
-    OUT_CS_REG(R300_US_W_FMT, R300_W_FMT_W0);
     END_CS;
 }
index fdabe4d..a093f83 100644 (file)
@@ -37,7 +37,7 @@ static void r300_surface_setup(struct r300_context* r300,
     r300_emit_dsa_state(r300, &dsa_clear_state);
     r300_emit_rs_state(r300, &rs_clear_state);
 
-    BEGIN_CS(24);
+    BEGIN_CS(26);
 
     /* Viewport setup */
     OUT_CS_REG_SEQ(R300_SE_VPORT_XSCALE, 6);
@@ -78,8 +78,10 @@ static void r300_surface_setup(struct r300_context* r300,
     /* Setup colorbuffer. */
     OUT_CS_REG_SEQ(R300_RB3D_COLOROFFSET0, 1);
     OUT_CS_RELOC(dest->buffer, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
-    OUT_CS_REG(R300_RB3D_COLORPITCH0, pixpitch |
-        r300_translate_colorformat(dest->tex.format));
+    OUT_CS_REG_SEQ(R300_RB3D_COLORPITCH0, 1);
+    OUT_CS_RELOC(dest->buffer, pixpitch |
+                 r300_translate_colorformat(dest->tex.format), 0,
+                 RADEON_GEM_DOMAIN_VRAM, 0);
     OUT_CS_REG(RB3D_COLOR_CHANNEL_MASK, 0xf);
 
     END_CS;
@@ -125,9 +127,10 @@ validate:
         r300->context.flush(&r300->context, 0, NULL);
         goto validate;
     }
-    if (r300->winsys->validate(r300->winsys)) {
+    if (!r300->winsys->validate(r300->winsys)) {
         r300->context.flush(&r300->context, 0, NULL);
         if (invalid) {
+            debug_printf("r300: Stuck in validation loop, gonna fallback.");
             goto fallback;
         }
         invalid = TRUE;
@@ -138,10 +141,14 @@ validate:
 
     /* Vertex shader setup */
     if (caps->has_tcl) {
-        r300_emit_vertex_shader(r300, &r300_passthrough_vertex_shader);
+        r300_emit_vertex_program_code(r300, &r300_passthrough_vertex_shader, 0);
     } else {
         BEGIN_CS(4);
-        OUT_CS_REG(R300_VAP_CNTL_STATUS, R300_VAP_TCL_BYPASS);
+        OUT_CS_REG(R300_VAP_CNTL_STATUS,
+#ifdef PIPE_ARCH_BIG_ENDIAN
+                   R300_VC_32BIT_SWAP |
+#endif
+                   R300_VAP_TCL_BYPASS);
         OUT_CS_REG(R300_VAP_CNTL, R300_PVS_NUM_SLOTS(5) |
                 R300_PVS_NUM_CNTLRS(5) |
                 R300_PVS_NUM_FPUS(caps->num_vert_fpus) |
@@ -151,10 +158,10 @@ validate:
 
     /* Fragment shader setup */
     if (caps->is_r500) {
-        r500_emit_fragment_shader(r300, &r5xx_passthrough_fragment_shader);
+        r500_emit_fragment_program_code(r300, &r5xx_passthrough_fragment_shader, 0);
         r300_emit_rs_block_state(r300, &r5xx_rs_block_clear_state);
     } else {
-        r300_emit_fragment_shader(r300, &r3xx_passthrough_fragment_shader);
+        r300_emit_fragment_program_code(r300, &r3xx_passthrough_fragment_shader, 0);
         r300_emit_rs_block_state(r300, &r3xx_rs_block_clear_state);
     }
 
@@ -256,9 +263,10 @@ validate:
         r300->context.flush(&r300->context, 0, NULL);
         goto validate;
     }
-    if (r300->winsys->validate(r300->winsys)) {
+    if (!r300->winsys->validate(r300->winsys)) {
         r300->context.flush(&r300->context, 0, NULL);
         if (invalid) {
+            debug_printf("r300: Stuck in validation loop, gonna fallback.");
             goto fallback;
         }
         invalid = TRUE;
@@ -275,10 +283,14 @@ validate:
 
     /* Vertex shader setup */
     if (caps->has_tcl) {
-        r300_emit_vertex_shader(r300, &r300_passthrough_vertex_shader);
+        r300_emit_vertex_program_code(r300, &r300_passthrough_vertex_shader, 0);
     } else {
         BEGIN_CS(4);
-        OUT_CS_REG(R300_VAP_CNTL_STATUS, R300_VAP_TCL_BYPASS);
+        OUT_CS_REG(R300_VAP_CNTL_STATUS,
+#ifdef PIPE_ARCH_BIG_ENDIAN
+                   R300_VC_32BIT_SWAP |
+#endif
+                   R300_VAP_TCL_BYPASS);
         OUT_CS_REG(R300_VAP_CNTL, R300_PVS_NUM_SLOTS(5) |
                 R300_PVS_NUM_CNTLRS(5) |
                 R300_PVS_NUM_FPUS(caps->num_vert_fpus) |
@@ -288,10 +300,10 @@ validate:
 
     /* Fragment shader setup */
     if (caps->is_r500) {
-        r500_emit_fragment_shader(r300, &r5xx_texture_fragment_shader);
+        r500_emit_fragment_program_code(r300, &r5xx_texture_fragment_shader, 0);
         r300_emit_rs_block_state(r300, &r5xx_rs_block_copy_state);
     } else {
-        r300_emit_fragment_shader(r300, &r3xx_texture_fragment_shader);
+        r300_emit_fragment_program_code(r300, &r3xx_texture_fragment_shader, 0);
         r300_emit_rs_block_state(r300, &r3xx_rs_block_copy_state);
     }
 
index 11c7858..5900525 100644 (file)
 
 #include "r300_texture.h"
 
-/* XXX maths need to go to util */
-
-static int minify(int i)
-{
-    return MAX2(1, i >> 1);
-}
-
 static void r300_setup_texture_state(struct r300_texture* tex,
                                      unsigned width,
                                      unsigned height,
@@ -55,6 +48,9 @@ static void r300_setup_texture_state(struct r300_texture* tex,
     if (height > 2048) {
         state->format2 |= R500_TXHEIGHT_BIT11;
     }
+
+    debug_printf("r300: Set texture state (%dx%d, pitch %d, %d levels)\n",
+            width, height, pitch, levels);
 }
 
 static void r300_setup_miptree(struct r300_texture* tex)
@@ -71,19 +67,23 @@ static void r300_setup_miptree(struct r300_texture* tex)
         }
 
         base->nblocksx[i] = pf_get_nblocksx(&base->block, base->width[i]);
-        base->nblocksy[i] = pf_get_nblocksy(&base->block, base->width[i]);
+        base->nblocksy[i] = pf_get_nblocksy(&base->block, base->height[i]);
 
         /* Radeons enjoy things in multiples of 64.
          *
          * XXX
          * POT, uncompressed, unmippmapped textures can be aligned to 32,
          * instead of 64. */
-        stride = align(base->nblocksx[i] * base->block.size, 64);
+        stride = align(pf_get_stride(&base->block, base->width[i]), 32);
         size = stride * base->nblocksy[i] * base->depth[i];
 
-        tex->offset[i] = align(tex->size, 64);
+        tex->offset[i] = align(tex->size, 32);
         tex->size = tex->offset[i] + size;
 
+        debug_printf("r300: Texture miptree: Level %d "
+                "(%dx%dx%d px, pitch %d bytes)\n",
+                i, base->width[i], base->height[i], base->depth[i],
+                stride);
         /* Save stride of first level to the texture. */
         if (i == 0) {
             tex->stride = stride;
@@ -111,7 +111,7 @@ static struct pipe_texture*
     r300_setup_texture_state(tex, template->width[0], template->height[0],
             template->width[0], template->last_level);
 
-    tex->buffer = screen->buffer_create(screen, 64,
+    tex->buffer = screen->buffer_create(screen, 1024,
                                         PIPE_BUFFER_USAGE_PIXEL,
                                         tex->size);
 
diff --git a/src/gallium/drivers/r300/r300_tgsi_to_rc.c b/src/gallium/drivers/r300/r300_tgsi_to_rc.c
new file mode 100644 (file)
index 0000000..3adbb71
--- /dev/null
@@ -0,0 +1,337 @@
+/*
+ * Copyright 2009 Nicolai Hähnle <nhaehnle@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#include "r300_tgsi_to_rc.h"
+
+#include "radeon_compiler.h"
+#include "radeon_program.h"
+
+#include "tgsi/tgsi_parse.h"
+#include "tgsi/tgsi_scan.h"
+#include "tgsi/tgsi_util.h"
+
+
+static unsigned translate_opcode(unsigned opcode)
+{
+    switch(opcode) {
+        case TGSI_OPCODE_ARL: return OPCODE_ARL;
+        case TGSI_OPCODE_MOV: return OPCODE_MOV;
+        case TGSI_OPCODE_LIT: return OPCODE_LIT;
+        case TGSI_OPCODE_RCP: return OPCODE_RCP;
+        case TGSI_OPCODE_RSQ: return OPCODE_RSQ;
+        case TGSI_OPCODE_EXP: return OPCODE_EXP;
+        case TGSI_OPCODE_LOG: return OPCODE_LOG;
+        case TGSI_OPCODE_MUL: return OPCODE_MUL;
+        case TGSI_OPCODE_ADD: return OPCODE_ADD;
+        case TGSI_OPCODE_DP3: return OPCODE_DP3;
+        case TGSI_OPCODE_DP4: return OPCODE_DP4;
+        case TGSI_OPCODE_DST: return OPCODE_DST;
+        case TGSI_OPCODE_MIN: return OPCODE_MIN;
+        case TGSI_OPCODE_MAX: return OPCODE_MAX;
+        case TGSI_OPCODE_SLT: return OPCODE_SLT;
+        case TGSI_OPCODE_SGE: return OPCODE_SGE;
+        case TGSI_OPCODE_MAD: return OPCODE_MAD;
+        case TGSI_OPCODE_SUB: return OPCODE_SUB;
+        case TGSI_OPCODE_LRP: return OPCODE_LRP;
+     /* case TGSI_OPCODE_CND: return OPCODE_CND; */
+     /* case TGSI_OPCODE_CND0: return OPCODE_CND0; */
+        case TGSI_OPCODE_DP2A: return OPCODE_DP2A;
+                                        /* gap */
+        case TGSI_OPCODE_FRC: return OPCODE_FRC;
+     /* case TGSI_OPCODE_CLAMP: return OPCODE_CLAMP; */
+        case TGSI_OPCODE_FLR: return OPCODE_FLR;
+     /* case TGSI_OPCODE_ROUND: return OPCODE_ROUND; */
+        case TGSI_OPCODE_EX2: return OPCODE_EX2;
+        case TGSI_OPCODE_LG2: return OPCODE_LG2;
+        case TGSI_OPCODE_POW: return OPCODE_POW;
+        case TGSI_OPCODE_XPD: return OPCODE_XPD;
+                                        /* gap */
+        case TGSI_OPCODE_ABS: return OPCODE_ABS;
+        case TGSI_OPCODE_RCC: return OPCODE_RCC;
+        case TGSI_OPCODE_DPH: return OPCODE_DPH;
+        case TGSI_OPCODE_COS: return OPCODE_COS;
+        case TGSI_OPCODE_DDX: return OPCODE_DDX;
+        case TGSI_OPCODE_DDY: return OPCODE_DDY;
+     /* case TGSI_OPCODE_KILP: return OPCODE_KILP; */
+        case TGSI_OPCODE_PK2H: return OPCODE_PK2H;
+        case TGSI_OPCODE_PK2US: return OPCODE_PK2US;
+        case TGSI_OPCODE_PK4B: return OPCODE_PK4B;
+        case TGSI_OPCODE_PK4UB: return OPCODE_PK4UB;
+        case TGSI_OPCODE_RFL: return OPCODE_RFL;
+        case TGSI_OPCODE_SEQ: return OPCODE_SEQ;
+        case TGSI_OPCODE_SFL: return OPCODE_SFL;
+        case TGSI_OPCODE_SGT: return OPCODE_SGT;
+        case TGSI_OPCODE_SIN: return OPCODE_SIN;
+        case TGSI_OPCODE_SLE: return OPCODE_SLE;
+        case TGSI_OPCODE_SNE: return OPCODE_SNE;
+        case TGSI_OPCODE_STR: return OPCODE_STR;
+        case TGSI_OPCODE_TEX: return OPCODE_TEX;
+        case TGSI_OPCODE_TXD: return OPCODE_TXD;
+        case TGSI_OPCODE_TXP: return OPCODE_TXP;
+        case TGSI_OPCODE_UP2H: return OPCODE_UP2H;
+        case TGSI_OPCODE_UP2US: return OPCODE_UP2US;
+        case TGSI_OPCODE_UP4B: return OPCODE_UP4B;
+        case TGSI_OPCODE_UP4UB: return OPCODE_UP4UB;
+        case TGSI_OPCODE_X2D: return OPCODE_X2D;
+        case TGSI_OPCODE_ARA: return OPCODE_ARA;
+        case TGSI_OPCODE_ARR: return OPCODE_ARR;
+        case TGSI_OPCODE_BRA: return OPCODE_BRA;
+        case TGSI_OPCODE_CAL: return OPCODE_CAL;
+        case TGSI_OPCODE_RET: return OPCODE_RET;
+        case TGSI_OPCODE_SSG: return OPCODE_SSG;
+        case TGSI_OPCODE_CMP: return OPCODE_CMP;
+        case TGSI_OPCODE_SCS: return OPCODE_SCS;
+        case TGSI_OPCODE_TXB: return OPCODE_TXB;
+     /* case TGSI_OPCODE_NRM: return OPCODE_NRM; */
+     /* case TGSI_OPCODE_DIV: return OPCODE_DIV; */
+        case TGSI_OPCODE_DP2: return OPCODE_DP2;
+        case TGSI_OPCODE_TXL: return OPCODE_TXL;
+        case TGSI_OPCODE_BRK: return OPCODE_BRK;
+        case TGSI_OPCODE_IF: return OPCODE_IF;
+     /* case TGSI_OPCODE_LOOP: return OPCODE_LOOP; */
+     /* case TGSI_OPCODE_REP: return OPCODE_REP; */
+        case TGSI_OPCODE_ELSE: return OPCODE_ELSE;
+        case TGSI_OPCODE_ENDIF: return OPCODE_ENDIF;
+        case TGSI_OPCODE_ENDLOOP: return OPCODE_ENDLOOP;
+     /* case TGSI_OPCODE_ENDREP: return OPCODE_ENDREP; */
+        case TGSI_OPCODE_PUSHA: return OPCODE_PUSHA;
+        case TGSI_OPCODE_POPA: return OPCODE_POPA;
+     /* case TGSI_OPCODE_CEIL: return OPCODE_CEIL; */
+     /* case TGSI_OPCODE_I2F: return OPCODE_I2F; */
+        case TGSI_OPCODE_NOT: return OPCODE_NOT;
+        case TGSI_OPCODE_TRUNC: return OPCODE_TRUNC;
+     /* case TGSI_OPCODE_SHL: return OPCODE_SHL; */
+     /* case TGSI_OPCODE_SHR: return OPCODE_SHR; */
+        case TGSI_OPCODE_AND: return OPCODE_AND;
+        case TGSI_OPCODE_OR: return OPCODE_OR;
+     /* case TGSI_OPCODE_MOD: return OPCODE_MOD; */
+        case TGSI_OPCODE_XOR: return OPCODE_XOR;
+     /* case TGSI_OPCODE_SAD: return OPCODE_SAD; */
+     /* case TGSI_OPCODE_TXF: return OPCODE_TXF; */
+     /* case TGSI_OPCODE_TXQ: return OPCODE_TXQ; */
+        case TGSI_OPCODE_CONT: return OPCODE_CONT;
+     /* case TGSI_OPCODE_EMIT: return OPCODE_EMIT; */
+     /* case TGSI_OPCODE_ENDPRIM: return OPCODE_ENDPRIM; */
+     /* case TGSI_OPCODE_BGNLOOP2: return OPCODE_BGNLOOP2; */
+        case TGSI_OPCODE_BGNSUB: return OPCODE_BGNSUB;
+     /* case TGSI_OPCODE_ENDLOOP2: return OPCODE_ENDLOOP2; */
+        case TGSI_OPCODE_ENDSUB: return OPCODE_ENDSUB;
+        case TGSI_OPCODE_NOISE1: return OPCODE_NOISE1;
+        case TGSI_OPCODE_NOISE2: return OPCODE_NOISE2;
+        case TGSI_OPCODE_NOISE3: return OPCODE_NOISE3;
+        case TGSI_OPCODE_NOISE4: return OPCODE_NOISE4;
+        case TGSI_OPCODE_NOP: return OPCODE_NOP;
+                                        /* gap */
+        case TGSI_OPCODE_NRM4: return OPCODE_NRM4;
+     /* case TGSI_OPCODE_CALLNZ: return OPCODE_CALLNZ; */
+     /* case TGSI_OPCODE_IFC: return OPCODE_IFC; */
+     /* case TGSI_OPCODE_BREAKC: return OPCODE_BREAKC; */
+        case TGSI_OPCODE_KIL: return OPCODE_KIL;
+        case TGSI_OPCODE_END: return OPCODE_END;
+        case TGSI_OPCODE_SWZ: return OPCODE_SWZ;
+    }
+
+    fprintf(stderr, "Unknown opcode: %i\n", opcode);
+    abort();
+}
+
+static unsigned translate_saturate(unsigned saturate)
+{
+    switch(saturate) {
+        case TGSI_SAT_NONE: return SATURATE_OFF;
+        case TGSI_SAT_ZERO_ONE: return SATURATE_ZERO_ONE;
+        case TGSI_SAT_MINUS_PLUS_ONE: return SATURATE_PLUS_MINUS_ONE;
+    }
+
+    fprintf(stderr, "Unknown saturate mode: %i\n", saturate);
+    abort();
+}
+
+static unsigned translate_register_file(unsigned file)
+{
+    switch(file) {
+        case TGSI_FILE_CONSTANT: return PROGRAM_CONSTANT;
+        case TGSI_FILE_IMMEDIATE: return PROGRAM_CONSTANT;
+        case TGSI_FILE_INPUT: return PROGRAM_INPUT;
+        case TGSI_FILE_OUTPUT: return PROGRAM_OUTPUT;
+        case TGSI_FILE_TEMPORARY: return PROGRAM_TEMPORARY;
+        case TGSI_FILE_ADDRESS: return PROGRAM_ADDRESS;
+    }
+
+    fprintf(stderr, "Unhandled register file: %i\n", file);
+    abort();
+}
+
+static int translate_register_index(
+    struct tgsi_to_rc * ttr,
+    unsigned file,
+    int index)
+{
+    if (file == TGSI_FILE_IMMEDIATE)
+        return ttr->immediate_offset + index;
+
+    return index;
+}
+
+static void transform_dstreg(
+    struct tgsi_to_rc * ttr,
+    struct prog_dst_register * dst,
+    struct tgsi_full_dst_register * src)
+{
+    dst->File = translate_register_file(src->DstRegister.File);
+    dst->Index = translate_register_index(ttr, src->DstRegister.File, src->DstRegister.Index);
+    dst->WriteMask = src->DstRegister.WriteMask;
+    dst->RelAddr = src->DstRegister.Indirect;
+}
+
+static void transform_srcreg(
+    struct tgsi_to_rc * ttr,
+    struct prog_src_register * dst,
+    struct tgsi_full_src_register * src)
+{
+    dst->File = translate_register_file(src->SrcRegister.File);
+    dst->Index = translate_register_index(ttr, src->SrcRegister.File, src->SrcRegister.Index);
+    dst->RelAddr = src->SrcRegister.Indirect;
+    dst->Swizzle = tgsi_util_get_full_src_register_extswizzle(src, 0);
+    dst->Swizzle |= tgsi_util_get_full_src_register_extswizzle(src, 1) << 3;
+    dst->Swizzle |= tgsi_util_get_full_src_register_extswizzle(src, 2) << 6;
+    dst->Swizzle |= tgsi_util_get_full_src_register_extswizzle(src, 3) << 9;
+    dst->Abs = src->SrcRegisterExtMod.Absolute;
+    dst->Negate =
+        src->SrcRegisterExtSwz.NegateX |
+        (src->SrcRegisterExtSwz.NegateY << 1) |
+        (src->SrcRegisterExtSwz.NegateZ << 2) |
+        (src->SrcRegisterExtSwz.NegateW << 3);
+    dst->Negate ^= src->SrcRegister.Negate ? NEGATE_XYZW : 0;
+}
+
+static void transform_texture(struct rc_instruction * dst, struct tgsi_instruction_ext_texture src)
+{
+    switch(src.Texture) {
+        case TGSI_TEXTURE_1D:
+            dst->I.TexSrcTarget = TEXTURE_1D_INDEX;
+            break;
+        case TGSI_TEXTURE_2D:
+            dst->I.TexSrcTarget = TEXTURE_2D_INDEX;
+            break;
+        case TGSI_TEXTURE_3D:
+            dst->I.TexSrcTarget = TEXTURE_3D_INDEX;
+            break;
+        case TGSI_TEXTURE_CUBE:
+            dst->I.TexSrcTarget = TEXTURE_CUBE_INDEX;
+            break;
+        case TGSI_TEXTURE_RECT:
+            dst->I.TexSrcTarget = TEXTURE_RECT_INDEX;
+            break;
+        case TGSI_TEXTURE_SHADOW1D:
+            dst->I.TexSrcTarget = TEXTURE_1D_INDEX;
+            dst->I.TexShadow = 1;
+            break;
+        case TGSI_TEXTURE_SHADOW2D:
+            dst->I.TexSrcTarget = TEXTURE_2D_INDEX;
+            dst->I.TexShadow = 1;
+            break;
+        case TGSI_TEXTURE_SHADOWRECT:
+            dst->I.TexSrcTarget = TEXTURE_RECT_INDEX;
+            dst->I.TexShadow = 1;
+            break;
+    }
+}
+
+static void transform_instruction(struct tgsi_to_rc * ttr, struct tgsi_full_instruction * src)
+{
+    if (src->Instruction.Opcode == TGSI_OPCODE_END)
+        return;
+
+    struct rc_instruction * dst = rc_insert_new_instruction(ttr->compiler, ttr->compiler->Program.Instructions.Prev);
+    int i;
+
+    dst->I.Opcode = translate_opcode(src->Instruction.Opcode);
+    dst->I.SaturateMode = translate_saturate(src->Instruction.Saturate);
+
+    if (src->Instruction.NumDstRegs)
+        transform_dstreg(ttr, &dst->I.DstReg, &src->FullDstRegisters[0]);
+
+    for(i = 0; i < src->Instruction.NumSrcRegs; ++i) {
+        if (src->FullSrcRegisters[i].SrcRegister.File == TGSI_FILE_SAMPLER)
+            dst->I.TexSrcUnit = src->FullSrcRegisters[i].SrcRegister.Index;
+        else
+            transform_srcreg(ttr, &dst->I.SrcReg[i], &src->FullSrcRegisters[i]);
+    }
+
+    /* Texturing. */
+    transform_texture(dst, src->InstructionExtTexture);
+}
+
+static void handle_immediate(struct tgsi_to_rc * ttr, struct tgsi_full_immediate * imm)
+{
+    struct rc_constant constant;
+    int i;
+
+    constant.Type = RC_CONSTANT_IMMEDIATE;
+    constant.Size = 4;
+    for(i = 0; i < 4; ++i)
+        constant.u.Immediate[i] = imm->u[i].Float;
+    rc_constants_add(&ttr->compiler->Program.Constants, &constant);
+}
+
+void r300_tgsi_to_rc(struct tgsi_to_rc * ttr, const struct tgsi_token * tokens)
+{
+    struct tgsi_parse_context parser;
+    int i;
+
+    /* Allocate constants placeholders.
+     *
+     * Note: What if declared constants are not contiguous? */
+    for(i = 0; i <= ttr->info->file_max[TGSI_FILE_CONSTANT]; ++i) {
+        struct rc_constant constant;
+        memset(&constant, 0, sizeof(constant));
+        constant.Type = RC_CONSTANT_EXTERNAL;
+        constant.Size = 4;
+        constant.u.External = i;
+        rc_constants_add(&ttr->compiler->Program.Constants, &constant);
+    }
+
+    ttr->immediate_offset = ttr->compiler->Program.Constants.Count;
+
+    tgsi_parse_init(&parser, tokens);
+
+    while (!tgsi_parse_end_of_tokens(&parser)) {
+        tgsi_parse_token(&parser);
+
+        switch (parser.FullToken.Token.Type) {
+            case TGSI_TOKEN_TYPE_DECLARATION:
+                break;
+            case TGSI_TOKEN_TYPE_IMMEDIATE:
+                handle_immediate(ttr, &parser.FullToken.FullImmediate);
+                break;
+            case TGSI_TOKEN_TYPE_INSTRUCTION:
+                transform_instruction(ttr, &parser.FullToken.FullInstruction);
+                break;
+        }
+    }
+
+    tgsi_parse_free(&parser);
+
+    rc_calculate_inputs_outputs(ttr->compiler);
+}
+
diff --git a/src/gallium/drivers/r300/r300_tgsi_to_rc.h b/src/gallium/drivers/r300/r300_tgsi_to_rc.h
new file mode 100644 (file)
index 0000000..93e90ec
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2009 Nicolai Hähnle <nhaehnle@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#ifndef R300_TGSI_TO_RC_H
+#define R300_TGSI_TO_RC_H
+
+struct radeon_compiler;
+
+struct tgsi_full_declaration;
+struct tgsi_shader_info;
+struct tgsi_token;
+
+struct tgsi_to_rc {
+    struct radeon_compiler * compiler;
+    const struct tgsi_shader_info * info;
+
+    int immediate_offset;
+};
+
+void r300_tgsi_to_rc(struct tgsi_to_rc * ttr, const struct tgsi_token * tokens);
+
+#endif /* R300_TGSI_TO_RC_H */
index f87435f..2cb903b 100644 (file)
 
 #include "r300_vs.h"
 
-static void r300_vs_declare(struct r300_vs_asm* assembler,
-                            struct tgsi_full_declaration* decl)
-{
-    switch (decl->Declaration.File) {
-        case TGSI_FILE_INPUT:
-            break;
-        case TGSI_FILE_OUTPUT:
-            switch (decl->Semantic.SemanticName) {
-                case TGSI_SEMANTIC_POSITION:
-                    assembler->tab[decl->DeclarationRange.First] = 0;
-                    break;
-                case TGSI_SEMANTIC_COLOR:
-                    assembler->tab[decl->DeclarationRange.First] =
-                        (assembler->point_size ? 1 : 0) +
-                        assembler->out_colors;
-                    break;
-                case TGSI_SEMANTIC_FOG:
-                case TGSI_SEMANTIC_GENERIC:
-                    /* XXX multiple? */
-                    assembler->tab[decl->DeclarationRange.First] =
-                        (assembler->point_size ? 1 : 0) +
-                        assembler->out_colors +
-                        assembler->out_texcoords;
-                    break;
-                case TGSI_SEMANTIC_PSIZE:
-                    assembler->tab[decl->DeclarationRange.First] = 1;
-                    break;
-                default:
-                    debug_printf("r300: vs: Bad semantic declaration %d\n",
-                        decl->Semantic.SemanticName);
-                    break;
-            }
-            break;
-        case TGSI_FILE_CONSTANT:
-            break;
-        case TGSI_FILE_TEMPORARY:
-            assembler->temp_count++;
-            break;
-        default:
-            debug_printf("r300: vs: Bad file %d\n", decl->Declaration.File);
-            break;
-    }
-}
+#include "r300_context.h"
+#include "r300_tgsi_to_rc.h"
 
-static INLINE unsigned r300_vs_src_type(struct r300_vs_asm* assembler,
-                                        struct tgsi_src_register* src)
-{
-    switch (src->File) {
-        case TGSI_FILE_NULL:
-        case TGSI_FILE_INPUT:
-            /* Probably a zero or one swizzle */
-            return R300_PVS_SRC_REG_INPUT;
-        case TGSI_FILE_TEMPORARY:
-            return R300_PVS_SRC_REG_TEMPORARY;
-        case TGSI_FILE_CONSTANT:
-        case TGSI_FILE_IMMEDIATE:
-            return R300_PVS_SRC_REG_CONSTANT;
-        default:
-            debug_printf("r300: vs: Unimplemented src type %d\n", src->File);
-            break;
-    }
-    return 0;
-}
+#include "tgsi/tgsi_dump.h"
+#include "tgsi/tgsi_parse.h"
 
-static INLINE unsigned r300_vs_src(struct r300_vs_asm* assembler,
-                                   struct tgsi_src_register* src)
-{
-    switch (src->File) {
-        case TGSI_FILE_NULL:
-        case TGSI_FILE_INPUT:
-        case TGSI_FILE_TEMPORARY:
-        case TGSI_FILE_CONSTANT:
-            return src->Index;
-        case TGSI_FILE_IMMEDIATE:
-            return src->Index + assembler->imm_offset;
-        default:
-            debug_printf("r300: vs: Unimplemented src type %d\n", src->File);
-            break;
-    }
-    return 0;
-}
+#include "radeon_compiler.h"
 
-static INLINE unsigned r300_vs_dst_type(struct r300_vs_asm* assembler,
-                                        struct tgsi_dst_register* dst)
-{
-    switch (dst->File) {
-        case TGSI_FILE_TEMPORARY:
-            return R300_PVS_DST_REG_TEMPORARY;
-        case TGSI_FILE_OUTPUT:
-            return R300_PVS_DST_REG_OUT;
-        default:
-            debug_printf("r300: vs: Unimplemented dst type %d\n", dst->File);
-            break;
-    }
-    return 0;
-}
 
-static INLINE unsigned r300_vs_dst(struct r300_vs_asm* assembler,
-                                   struct tgsi_dst_register* dst)
+static void set_vertex_inputs_outputs(struct r300_vertex_program_compiler * c)
 {
-    switch (dst->File) {
-        case TGSI_FILE_TEMPORARY:
-            return dst->Index;
-        case TGSI_FILE_OUTPUT:
-            return assembler->tab[dst->Index];
-        default:
-            debug_printf("r300: vs: Unimplemented dst %d\n", dst->File);
-            break;
-    }
-    return 0;
-}
+    struct r300_vertex_shader * vs = c->UserData;
+    struct tgsi_shader_info* info = &vs->info;
+    boolean pointsize = false;
+    int out_colors = 0;
+    int colors = 0;
+    int out_generic = 0;
+    int generic = 0;
+    int i;
 
-static uint32_t r300_vs_op(unsigned op)
-{
-    switch (op) {
-        case TGSI_OPCODE_DP3:
-        case TGSI_OPCODE_DP4:
-            return R300_VE_DOT_PRODUCT;
-        case TGSI_OPCODE_MUL:
-            return R300_VE_MULTIPLY;
-        case TGSI_OPCODE_ADD:
-        case TGSI_OPCODE_MOV:
-        case TGSI_OPCODE_SUB:
-        case TGSI_OPCODE_SWZ:
-            return R300_VE_ADD;
-        case TGSI_OPCODE_MAX:
-            return R300_VE_MAXIMUM;
-        case TGSI_OPCODE_SLT:
-            return R300_VE_SET_LESS_THAN;
-        case TGSI_OPCODE_RSQ:
-            return R300_PVS_DST_MATH_INST | R300_ME_RECIP_DX;
-        case TGSI_OPCODE_MAD:
-            return R300_PVS_DST_MACRO_INST | R300_PVS_MACRO_OP_2CLK_MADD;
-        default:
-            break;
-    }
-    return 0;
-}
+    /* Fill in the input mapping */
+    for (i = 0; i < info->num_inputs; i++)
+        c->code->inputs[i] = i;
 
-static uint32_t r300_vs_swiz(struct tgsi_full_src_register* reg)
-{
-    if (reg->SrcRegister.Extended) {
-        return (reg->SrcRegister.Negate ? (0xf << 12) : 0) |
-            reg->SrcRegisterExtSwz.ExtSwizzleX |
-            (reg->SrcRegisterExtSwz.ExtSwizzleY << 3) |
-            (reg->SrcRegisterExtSwz.ExtSwizzleZ << 6) |
-            (reg->SrcRegisterExtSwz.ExtSwizzleW << 9);
-    } else {
-        return (reg->SrcRegister.Negate ? (0xf << 12) : 0) |
-            reg->SrcRegister.SwizzleX |
-            (reg->SrcRegister.SwizzleY << 3) |
-            (reg->SrcRegister.SwizzleZ << 6) |
-            (reg->SrcRegister.SwizzleW << 9);
+    /* Fill in the output mapping */
+    for (i = 0; i < info->num_outputs; i++) {
+        switch (info->output_semantic_name[i]) {
+            case TGSI_SEMANTIC_PSIZE:
+                pointsize = true;
+                break;
+            case TGSI_SEMANTIC_COLOR:
+                out_colors++;
+                break;
+            case TGSI_SEMANTIC_FOG:
+            case TGSI_SEMANTIC_GENERIC:
+                out_generic++;
+                break;
+        }
     }
-}
 
-/* XXX icky icky icky icky */
-static uint32_t r300_vs_scalar_swiz(struct tgsi_full_src_register* reg)
-{
-    if (reg->SrcRegister.Extended) {
-        return (reg->SrcRegister.Negate ? (0xf << 12) : 0) |
-            reg->SrcRegisterExtSwz.ExtSwizzleX |
-            (reg->SrcRegisterExtSwz.ExtSwizzleX << 3) |
-            (reg->SrcRegisterExtSwz.ExtSwizzleX << 6) |
-            (reg->SrcRegisterExtSwz.ExtSwizzleX << 9);
-    } else {
-        return (reg->SrcRegister.Negate ? (0xf << 12) : 0) |
-            reg->SrcRegister.SwizzleX |
-            (reg->SrcRegister.SwizzleX << 3) |
-            (reg->SrcRegister.SwizzleX << 6) |
-            (reg->SrcRegister.SwizzleX << 9);
-    }
-}
+    struct tgsi_parse_context parser;
 
-/* XXX scalar stupidity */
-static void r300_vs_emit_inst(struct r300_vertex_shader* vs,
-                              struct r300_vs_asm* assembler,
-                              struct tgsi_full_src_register* src,
-                              struct tgsi_full_dst_register* dst,
-                              unsigned op,
-                              unsigned count,
-                              boolean is_scalar)
-{
-    int i = vs->instruction_count;
-    vs->instructions[i].inst0 = R300_PVS_DST_OPCODE(r300_vs_op(op)) |
-        R300_PVS_DST_REG_TYPE(r300_vs_dst_type(assembler, &dst->DstRegister)) |
-        R300_PVS_DST_OFFSET(r300_vs_dst(assembler, &dst->DstRegister)) |
-        R300_PVS_DST_WE(dst->DstRegister.WriteMask);
-    switch (count) {
-        case 3:
-            vs->instructions[i].inst3 =
-                R300_PVS_SRC_REG_TYPE(r300_vs_src_type(assembler,
-                            &src[2].SrcRegister)) |
-                R300_PVS_SRC_OFFSET(r300_vs_src(assembler,
-                            &src[2].SrcRegister)) |
-                R300_PVS_SRC_SWIZZLE(r300_vs_swiz(&src[2]));
-            /* Fall through */
-        case 2:
-            vs->instructions[i].inst2 =
-                R300_PVS_SRC_REG_TYPE(r300_vs_src_type(assembler,
-                            &src[1].SrcRegister)) |
-                R300_PVS_SRC_OFFSET(r300_vs_src(assembler,
-                            &src[1].SrcRegister)) |
-                R300_PVS_SRC_SWIZZLE(r300_vs_swiz(&src[1]));
-            /* Fall through */
-        case 1:
-            vs->instructions[i].inst1 =
-                R300_PVS_SRC_REG_TYPE(r300_vs_src_type(assembler,
-                            &src[0].SrcRegister)) |
-                R300_PVS_SRC_OFFSET(r300_vs_src(assembler,
-                            &src[0].SrcRegister)) |
-                /* XXX the icky, it burns */
-                R300_PVS_SRC_SWIZZLE(is_scalar ? r300_vs_scalar_swiz(&src[0])
-                        : r300_vs_swiz(&src[0]));
-            break;
-    }
-    vs->instruction_count++;
-}
+    tgsi_parse_init(&parser, vs->state.tokens);
 
-static void r300_vs_instruction(struct r300_vertex_shader* vs,
-                                struct r300_vs_asm* assembler,
-                                struct tgsi_full_instruction* inst)
-{
-    switch (inst->Instruction.Opcode) {
-        case TGSI_OPCODE_RSQ:
-            r300_vs_emit_inst(vs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], inst->Instruction.Opcode,
-                    1, TRUE);
-            break;
-        case TGSI_OPCODE_SUB:
-            inst->FullSrcRegisters[1].SrcRegister.Negate =
-                !inst->FullSrcRegisters[1].SrcRegister.Negate;
-            /* Fall through */
-        case TGSI_OPCODE_ADD:
-        case TGSI_OPCODE_MUL:
-        case TGSI_OPCODE_MAX:
-        case TGSI_OPCODE_SLT:
-            r300_vs_emit_inst(vs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], inst->Instruction.Opcode,
-                    2, FALSE);
-            break;
-        case TGSI_OPCODE_DP3:
-            /* Set alpha swizzle to zero for src0 and src1 */
-            if (!inst->FullSrcRegisters[0].SrcRegister.Extended) {
-                inst->FullSrcRegisters[0].SrcRegister.Extended = TRUE;
-                inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleX =
-                    inst->FullSrcRegisters[0].SrcRegister.SwizzleX;
-                inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleY =
-                    inst->FullSrcRegisters[0].SrcRegister.SwizzleY;
-                inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleZ =
-                    inst->FullSrcRegisters[0].SrcRegister.SwizzleZ;
-            }
-            inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleW =
-                TGSI_EXTSWIZZLE_ZERO;
-            if (!inst->FullSrcRegisters[1].SrcRegister.Extended) {
-                inst->FullSrcRegisters[1].SrcRegister.Extended = TRUE;
-                inst->FullSrcRegisters[1].SrcRegisterExtSwz.ExtSwizzleX =
-                    inst->FullSrcRegisters[1].SrcRegister.SwizzleX;
-                inst->FullSrcRegisters[1].SrcRegisterExtSwz.ExtSwizzleY =
-                    inst->FullSrcRegisters[1].SrcRegister.SwizzleY;
-                inst->FullSrcRegisters[1].SrcRegisterExtSwz.ExtSwizzleZ =
-                    inst->FullSrcRegisters[1].SrcRegister.SwizzleZ;
-            }
-            inst->FullSrcRegisters[1].SrcRegisterExtSwz.ExtSwizzleW =
-                TGSI_EXTSWIZZLE_ZERO;
-            /* Fall through */
-        case TGSI_OPCODE_DP4:
-            r300_vs_emit_inst(vs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], inst->Instruction.Opcode,
-                    2, FALSE);
-            break;
-        case TGSI_OPCODE_MOV:
-        case TGSI_OPCODE_SWZ:
-            inst->FullSrcRegisters[1] = r300_constant_zero;
-            r300_vs_emit_inst(vs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], inst->Instruction.Opcode,
-                    2, FALSE);
-            break;
-        case TGSI_OPCODE_MAD:
-            r300_vs_emit_inst(vs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], inst->Instruction.Opcode,
-                    3, FALSE);
-            break;
-        case TGSI_OPCODE_END:
-            break;
-        default:
-            debug_printf("r300: vs: Bad opcode %d\n",
-                    inst->Instruction.Opcode);
-            break;
-    }
-}
+    while (!tgsi_parse_end_of_tokens(&parser)) {
+        tgsi_parse_token(&parser);
 
-static void r300_vs_init(struct r300_vertex_shader* vs,
-                         struct r300_vs_asm* assembler)
-{
-    struct tgsi_shader_info* info = &vs->info;
-    int i;
+        if (parser.FullToken.Token.Type != TGSI_TOKEN_TYPE_DECLARATION)
+            continue;
 
-    for (i = 0; i < info->num_outputs; i++) {
-        switch (info->output_semantic_name[i]) {
+        struct tgsi_full_declaration * decl = &parser.FullToken.FullDeclaration;
+
+        if (decl->Declaration.File != TGSI_FILE_OUTPUT)
+            continue;
+
+        switch (decl->Semantic.SemanticName) {
+            case TGSI_SEMANTIC_POSITION:
+                c->code->outputs[decl->DeclarationRange.First] = 0;
+                break;
             case TGSI_SEMANTIC_PSIZE:
-                assembler->point_size = TRUE;
+                c->code->outputs[decl->DeclarationRange.First] = 1;
                 break;
             case TGSI_SEMANTIC_COLOR:
-                assembler->out_colors++;
+                c->code->outputs[decl->DeclarationRange.First] = 1 +
+                    (pointsize ? 1 : 0) +
+                    colors++;
                 break;
             case TGSI_SEMANTIC_FOG:
             case TGSI_SEMANTIC_GENERIC:
-                assembler->out_texcoords++;
+                c->code->outputs[decl->DeclarationRange.First] = 1 +
+                    (pointsize ? 1 : 0) +
+                    out_colors +
+                    generic++;
+                break;
+            default:
+                debug_printf("r300: vs: Bad semantic declaration %d\n",
+                    decl->Semantic.SemanticName);
                 break;
         }
     }
 
-    vs->instruction_count = 0;
+    tgsi_parse_free(&parser);
 }
 
+
 void r300_translate_vertex_shader(struct r300_context* r300,
                                   struct r300_vertex_shader* vs)
 {
-    struct tgsi_parse_context parser;
-    int i;
-    struct r300_constant_buffer* consts =
-        &r300->shader_constants[PIPE_SHADER_VERTEX];
+    struct r300_vertex_program_compiler compiler;
+    struct tgsi_to_rc ttr;
 
-    struct r300_vs_asm* assembler = CALLOC_STRUCT(r300_vs_asm);
-    if (assembler == NULL) {
-        return;
-    }
+    /* Setup the compiler */
+    rc_init(&compiler.Base);
 
-    /* Init assembler. */
-    r300_vs_init(vs, assembler);
+    compiler.Base.Debug = 1;
+    compiler.code = &vs->code;
+    compiler.UserData = vs;
 
-    /* Setup starting offset for immediates. */
-    assembler->imm_offset = consts->user_count;
+    if (compiler.Base.Debug) {
+        debug_printf("r300: Initial vertex program\n");
+        tgsi_dump(vs->state.tokens, 0);
+    }
 
-    tgsi_parse_init(&parser, vs->state.tokens);
+    /* Translate TGSI to our internal representation */
+    ttr.compiler = &compiler.Base;
+    ttr.info = &vs->info;
 
-    while (!tgsi_parse_end_of_tokens(&parser)) {
-        tgsi_parse_token(&parser);
+    r300_tgsi_to_rc(&ttr, vs->state.tokens);
 
-        /* This is seriously the lamest way to create fragment programs ever.
-         * I blame TGSI. */
-        switch (parser.FullToken.Token.Type) {
-            case TGSI_TOKEN_TYPE_DECLARATION:
-                /* Allocated registers sitting at the beginning
-                 * of the program. */
-                r300_vs_declare(assembler, &parser.FullToken.FullDeclaration);
-                break;
-            case TGSI_TOKEN_TYPE_IMMEDIATE:
-                debug_printf("r300: Emitting immediate to constant buffer, "
-                        "position %d\n",
-                        assembler->imm_offset + assembler->imm_count);
-                /* I am not amused by the length of these. */
-                for (i = 0; i < 4; i++) {
-                    consts->constants[assembler->imm_offset +
-                        assembler->imm_count][i] =
-                        parser.FullToken.FullImmediate.u.ImmediateFloat32[i]
-                        .Float;
-                }
-                assembler->imm_count++;
-                break;
-            case TGSI_TOKEN_TYPE_INSTRUCTION:
-                r300_vs_instruction(vs, assembler,
-                        &parser.FullToken.FullInstruction);
-                break;
-        }
-    }
+    compiler.RequiredOutputs = ~(~0 << vs->info.num_outputs);
+    compiler.SetHwInputOutput = &set_vertex_inputs_outputs;
 
-    debug_printf("r300: vs: %d texs and %d colors, first free reg is %d\n",
-            assembler->tex_count, assembler->color_count,
-            assembler->tex_count + assembler->color_count);
+    /* Invoke the compiler */
+    r3xx_compile_vertex_program(&compiler);
+    if (compiler.Base.Error) {
+        /* Todo: Fail gracefully */
+        fprintf(stderr, "r300 VP: Compiler error\n");
+        abort();
+    }
 
-    consts->count = consts->user_count + assembler->imm_count;
-    vs->uses_imms = assembler->imm_count;
-    debug_printf("r300: vs: %d total constants, "
-            "%d from user and %d from immediates\n", consts->count,
-            consts->user_count, assembler->imm_count);
+    /* And, finally... */
+    rc_destroy(&compiler.Base);
+    vs->translated = TRUE;
+}
 
-    debug_printf("r300: vs: tab: %d %d %d %d\n", assembler->tab[0],
-            assembler->tab[1], assembler->tab[2], assembler->tab[3]);
 
-    tgsi_dump(vs->state.tokens, 0);
-    /* XXX finish r300 vertex shader dumper */
-    r300_vs_dump(vs);
+/* XXX get these to r300_reg */
+#define R300_PVS_DST_OPCODE(x)   ((x) << 0)
+#   define R300_VE_DOT_PRODUCT            1
+#   define R300_VE_MULTIPLY               2
+#   define R300_VE_ADD                    3
+#   define R300_VE_MAXIMUM                7
+#   define R300_VE_SET_LESS_THAN          10
+#define R300_PVS_DST_MATH_INST     (1 << 6)
+#   define R300_ME_RECIP_DX               6
+#define R300_PVS_DST_MACRO_INST    (1 << 7)
+#   define R300_PVS_MACRO_OP_2CLK_MADD    0
+#define R300_PVS_DST_REG_TYPE(x) ((x) << 8)
+#   define R300_PVS_DST_REG_TEMPORARY     0
+#   define R300_PVS_DST_REG_A0            1
+#   define R300_PVS_DST_REG_OUT           2
+#   define R300_PVS_DST_REG_OUT_REPL_X    3
+#   define R300_PVS_DST_REG_ALT_TEMPORARY 4
+#   define R300_PVS_DST_REG_INPUT         5
+#define R300_PVS_DST_OFFSET(x)   ((x) << 13)
+#define R300_PVS_DST_WE(x)       ((x) << 20)
+#define R300_PVS_DST_WE_XYZW     (0xf << 20)
+
+#define R300_PVS_SRC_REG_TYPE(x) ((x) << 0)
+#   define R300_PVS_SRC_REG_TEMPORARY     0
+#   define R300_PVS_SRC_REG_INPUT         1
+#   define R300_PVS_SRC_REG_CONSTANT      2
+#   define R300_PVS_SRC_REG_ALT_TEMPORARY 3
+#define R300_PVS_SRC_OFFSET(x)   ((x) << 5)
+#define R300_PVS_SRC_SWIZZLE(x)  ((x) << 13)
+#   define R300_PVS_SRC_SELECT_X          0
+#   define R300_PVS_SRC_SELECT_Y          1
+#   define R300_PVS_SRC_SELECT_Z          2
+#   define R300_PVS_SRC_SELECT_W          3
+#   define R300_PVS_SRC_SELECT_FORCE_0    4
+#   define R300_PVS_SRC_SELECT_FORCE_1    5
+#   define R300_PVS_SRC_SWIZZLE_XYZW \
+    ((R300_PVS_SRC_SELECT_X | (R300_PVS_SRC_SELECT_Y << 3) | \
+     (R300_PVS_SRC_SELECT_Z << 6) | (R300_PVS_SRC_SELECT_W << 9)) << 13)
+#   define R300_PVS_SRC_SWIZZLE_ZERO \
+    ((R300_PVS_SRC_SELECT_FORCE_0 | (R300_PVS_SRC_SELECT_FORCE_0 << 3) | \
+     (R300_PVS_SRC_SELECT_FORCE_0 << 6) | \
+      (R300_PVS_SRC_SELECT_FORCE_0 << 9)) << 13)
+#   define R300_PVS_SRC_SWIZZLE_ONE \
+    ((R300_PVS_SRC_SELECT_FORCE_1 | (R300_PVS_SRC_SELECT_FORCE_1 << 3) | \
+     (R300_PVS_SRC_SELECT_FORCE_1 << 6) | \
+      (R300_PVS_SRC_SELECT_FORCE_1 << 9)) << 13)
+#define R300_PVS_MODIFIER_X        (1 << 25)
+#define R300_PVS_MODIFIER_Y        (1 << 26)
+#define R300_PVS_MODIFIER_Z        (1 << 27)
+#define R300_PVS_MODIFIER_W        (1 << 28)
+#define R300_PVS_NEGATE_XYZW \
+    (R300_PVS_MODIFIER_X | R300_PVS_MODIFIER_Y | \
+     R300_PVS_MODIFIER_Z | R300_PVS_MODIFIER_W)
+
+struct r300_vertex_program_code r300_passthrough_vertex_shader = {
+    .length = 8, /* two instructions */
+
+    /* MOV out[0], in[0] */
+    .body.d[0] = R300_PVS_DST_OPCODE(R300_VE_ADD) |
+        R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) |
+        R300_PVS_DST_OFFSET(0) | R300_PVS_DST_WE_XYZW,
+    .body.d[1] = R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
+        R300_PVS_SRC_OFFSET(0) | R300_PVS_SRC_SWIZZLE_XYZW,
+    .body.d[2] = R300_PVS_SRC_SWIZZLE_ZERO,
+    .body.d[3] = 0x0,
+
+    /* MOV out[1], in[1] */
+    .body.d[4] = R300_PVS_DST_OPCODE(R300_VE_ADD) |
+        R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) |
+        R300_PVS_DST_OFFSET(1) | R300_PVS_DST_WE_XYZW,
+    .body.d[5] = R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
+        R300_PVS_SRC_OFFSET(1) | R300_PVS_SRC_SWIZZLE_XYZW,
+    .body.d[6] = R300_PVS_SRC_SWIZZLE_ZERO,
+    .body.d[7] = 0x0,
+
+    .inputs[0] = 0,
+    .inputs[1] = 1,
+    .outputs[0] = 0,
+    .outputs[1] = 1,
+
+    .InputsRead = 3,
+    .OutputsWritten = 3
+};
 
-    tgsi_parse_free(&parser);
-    FREE(assembler);
-}
index 165d717..2a4ce31 100644 (file)
 #ifndef R300_VS_H
 #define R300_VS_H
 
-#include "tgsi/tgsi_parse.h"
-#include "tgsi/tgsi_dump.h"
+#include "pipe/p_state.h"
+#include "tgsi/tgsi_scan.h"
 
-#include "r300_context.h"
-#include "r300_debug.h"
-#include "r300_reg.h"
-#include "r300_screen.h"
-#include "r300_shader_inlines.h"
+#include "radeon_code.h"
 
-/* XXX get these to r300_reg */
-#define R300_PVS_DST_OPCODE(x)   ((x) << 0)
-#   define R300_VE_DOT_PRODUCT            1
-#   define R300_VE_MULTIPLY               2
-#   define R300_VE_ADD                    3
-#   define R300_VE_MAXIMUM                7
-#   define R300_VE_SET_LESS_THAN          10
-#define R300_PVS_DST_MATH_INST     (1 << 6)
-#   define R300_ME_RECIP_DX               6
-#define R300_PVS_DST_MACRO_INST    (1 << 7)
-#   define R300_PVS_MACRO_OP_2CLK_MADD    0
-#define R300_PVS_DST_REG_TYPE(x) ((x) << 8)
-#   define R300_PVS_DST_REG_TEMPORARY     0
-#   define R300_PVS_DST_REG_A0            1
-#   define R300_PVS_DST_REG_OUT           2
-#   define R300_PVS_DST_REG_OUT_REPL_X    3
-#   define R300_PVS_DST_REG_ALT_TEMPORARY 4
-#   define R300_PVS_DST_REG_INPUT         5
-#define R300_PVS_DST_OFFSET(x)   ((x) << 13)
-#define R300_PVS_DST_WE(x)       ((x) << 20)
-#define R300_PVS_DST_WE_XYZW     (0xf << 20)
+struct r300_context;
 
-#define R300_PVS_SRC_REG_TYPE(x) ((x) << 0)
-#   define R300_PVS_SRC_REG_TEMPORARY     0
-#   define R300_PVS_SRC_REG_INPUT         1
-#   define R300_PVS_SRC_REG_CONSTANT      2
-#   define R300_PVS_SRC_REG_ALT_TEMPORARY 3
-#define R300_PVS_SRC_OFFSET(x)   ((x) << 5)
-#define R300_PVS_SRC_SWIZZLE(x)  ((x) << 13)
-#   define R300_PVS_SRC_SELECT_X          0
-#   define R300_PVS_SRC_SELECT_Y          1
-#   define R300_PVS_SRC_SELECT_Z          2
-#   define R300_PVS_SRC_SELECT_W          3
-#   define R300_PVS_SRC_SELECT_FORCE_0    4
-#   define R300_PVS_SRC_SELECT_FORCE_1    5
-#   define R300_PVS_SRC_SWIZZLE_XYZW \
-    ((R300_PVS_SRC_SELECT_X | (R300_PVS_SRC_SELECT_Y << 3) | \
-     (R300_PVS_SRC_SELECT_Z << 6) | (R300_PVS_SRC_SELECT_W << 9)) << 13)
-#   define R300_PVS_SRC_SWIZZLE_ZERO \
-    ((R300_PVS_SRC_SELECT_FORCE_0 | (R300_PVS_SRC_SELECT_FORCE_0 << 3) | \
-     (R300_PVS_SRC_SELECT_FORCE_0 << 6) | \
-      (R300_PVS_SRC_SELECT_FORCE_0 << 9)) << 13)
-#   define R300_PVS_SRC_SWIZZLE_ONE \
-    ((R300_PVS_SRC_SELECT_FORCE_1 | (R300_PVS_SRC_SELECT_FORCE_1 << 3) | \
-     (R300_PVS_SRC_SELECT_FORCE_1 << 6) | \
-      (R300_PVS_SRC_SELECT_FORCE_1 << 9)) << 13)
-#define R300_PVS_MODIFIER_X        (1 << 25)
-#define R300_PVS_MODIFIER_Y        (1 << 26)
-#define R300_PVS_MODIFIER_Z        (1 << 27)
-#define R300_PVS_MODIFIER_W        (1 << 28)
-#define R300_PVS_NEGATE_XYZW \
-    (R300_PVS_MODIFIER_X | R300_PVS_MODIFIER_Y | \
-     R300_PVS_MODIFIER_Z | R300_PVS_MODIFIER_W)
+struct r300_vertex_shader {
+    /* Parent class */
+    struct pipe_shader_state state;
+    struct tgsi_shader_info info;
 
-/* Temporary struct used to hold assembly state while putting together
- * fragment programs. */
-struct r300_vs_asm {
-    /* Pipe context. */
-    struct r300_context* r300;
-    /* Number of colors. */
-    unsigned color_count;
-    /* Number of texcoords. */
-    unsigned tex_count;
-    /* Number of requested temporary registers. */
-    unsigned temp_count;
-    /* Offset for immediate constants. Neither R300 nor R500 can do four
-     * inline constants per source, so instead we copy immediates into the
-     * constant buffer. */
-    unsigned imm_offset;
-    /* Number of immediate constants. */
-    unsigned imm_count;
-    /* Number of colors to write. */
-    unsigned out_colors;
-    /* Number of texcoords to write. */
-    unsigned out_texcoords;
-    /* Whether to emit point size. */
-    boolean point_size;
-    /* Tab of declared outputs to OVM outputs. */
-    unsigned tab[16];
-};
+    /* Fallback shader, because Draw has issues */
+    struct draw_vertex_shader* draw;
 
-static struct r300_vertex_shader r300_passthrough_vertex_shader = {
-        /* XXX translate these back into normal instructions */
-    .instruction_count = 2,
-    .instructions[0].inst0 = R300_PVS_DST_OPCODE(R300_VE_ADD) |
-        R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) |
-        R300_PVS_DST_OFFSET(0) | R300_PVS_DST_WE_XYZW,
-    .instructions[0].inst1 = R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
-        R300_PVS_SRC_OFFSET(0) | R300_PVS_SRC_SWIZZLE_XYZW,
-    .instructions[0].inst2 = R300_PVS_SRC_SWIZZLE_ZERO,
-    .instructions[0].inst3 = 0x0,
-    .instructions[1].inst0 = R300_PVS_DST_OPCODE(R300_VE_ADD) |
-        R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) |
-        R300_PVS_DST_OFFSET(1) | R300_PVS_DST_WE_XYZW,
-    .instructions[1].inst1 = R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
-        R300_PVS_SRC_OFFSET(1) | R300_PVS_SRC_SWIZZLE_XYZW,
-    .instructions[1].inst2 = R300_PVS_SRC_SWIZZLE_ZERO,
-    .instructions[1].inst3 = 0x0,
-};
+    /* Has this shader been translated yet? */
+    boolean translated;
 
-static struct r300_vertex_shader r300_texture_vertex_shader = {
-        /* XXX translate these back into normal instructions */
-    .instruction_count = 2,
-    .instructions[0].inst0 = R300_PVS_DST_OPCODE(R300_VE_ADD) |
-        R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) |
-        R300_PVS_DST_OFFSET(0) | R300_PVS_DST_WE_XYZW,
-    .instructions[0].inst1 = R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
-        R300_PVS_SRC_OFFSET(0) | R300_PVS_SRC_SWIZZLE_XYZW,
-    .instructions[0].inst2 = R300_PVS_SRC_SWIZZLE_ZERO,
-    .instructions[0].inst3 = 0x0,
-    .instructions[1].inst0 = R300_PVS_DST_OPCODE(R300_VE_ADD) |
-        R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) |
-        R300_PVS_DST_OFFSET(1) | R300_PVS_DST_WE_XYZW,
-    .instructions[1].inst1 = R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) |
-        R300_PVS_SRC_OFFSET(1) | R300_PVS_SRC_SWIZZLE_XYZW,
-    .instructions[1].inst2 = R300_PVS_SRC_SWIZZLE_ZERO,
-    .instructions[1].inst3 = 0x0,
+    /* Machine code (if translated) */
+    struct r300_vertex_program_code code;
 };
 
+
+extern struct r300_vertex_program_code r300_passthrough_vertex_shader;
+
 void r300_translate_vertex_shader(struct r300_context* r300,
                                   struct r300_vertex_shader* vs);
 
index 6e05d76..c1c1194 100644 (file)
 
 #include "r3xx_fs.h"
 
-static INLINE uint32_t r3xx_rgb_op(unsigned op)
-{
-    switch (op) {
-        case TGSI_OPCODE_MOV:
-            return R300_ALU_OUTC_CMP;
-        default:
-            return 0;
-    }
-}
+#include "r300_reg.h"
 
-static INLINE uint32_t r3xx_alpha_op(unsigned op)
-{
-    switch (op) {
-        case TGSI_OPCODE_MOV:
-            return R300_ALU_OUTA_CMP;
-        default:
-            return 0;
-    }
-}
+struct rX00_fragment_program_code r3xx_passthrough_fragment_shader = {
+    .code.r300.alu.length = 1,
+    .code.r300.tex.length = 0,
 
-static INLINE void r3xx_emit_maths(struct r3xx_fragment_shader* fs,
-                                   struct r300_fs_asm* assembler,
-                                   struct tgsi_full_src_register* src,
-                                   struct tgsi_full_dst_register* dst,
-                                   unsigned op,
-                                   unsigned count)
-{
-    int i = fs->alu_instruction_count;
+    .code.r300.config = 0,
+    .code.r300.pixsize = 0,
+    .code.r300.code_offset = 0,
+    .code.r300.code_addr[3] = R300_RGBA_OUT,
 
-    fs->instructions[i].alu_rgb_inst = R300_RGB_SWIZA(R300_ALU_ARGC_SRC0C_XYZ) |
+    .code.r300.alu.inst[0].rgb_inst = R300_RGB_SWIZA(R300_ALU_ARGC_SRC0C_XYZ) |
         R300_RGB_SWIZB(R300_ALU_ARGC_SRC0C_XYZ) |
         R300_RGB_SWIZC(R300_ALU_ARGC_ZERO) |
-        r3xx_rgb_op(op);
-    fs->instructions[i].alu_rgb_addr = R300_RGB_ADDR0(0) | R300_RGB_ADDR1(0) |
-        R300_RGB_ADDR2(0) | R300_ALU_DSTC_OUTPUT_XYZ;
-    fs->instructions[i].alu_alpha_inst = R300_ALPHA_SWIZA(R300_ALU_ARGA_SRC0A) |
+        R300_ALU_OUTC_CMP,
+    .code.r300.alu.inst[0].rgb_addr = R300_RGB_ADDR0(0) | R300_RGB_ADDR1(0) |
+        R300_RGB_ADDR2(0) | R300_ALU_DSTC_OUTPUT_XYZ,
+    .code.r300.alu.inst[0].alpha_inst = R300_ALPHA_SWIZA(R300_ALU_ARGA_SRC0A) |
         R300_ALPHA_SWIZB(R300_ALU_ARGA_SRC0A) |
         R300_ALPHA_SWIZC(R300_ALU_ARGA_ZERO) |
-        r3xx_alpha_op(op);
-    fs->instructions[i].alu_alpha_addr = R300_ALPHA_ADDR0(0) |
-        R300_ALPHA_ADDR1(0) | R300_ALPHA_ADDR2(0) | R300_ALU_DSTA_OUTPUT;
+        R300_ALU_OUTA_CMP,
+    .code.r300.alu.inst[0].alpha_addr = R300_ALPHA_ADDR0(0) |
+        R300_ALPHA_ADDR1(0) | R300_ALPHA_ADDR2(0) | R300_ALU_DSTA_OUTPUT,
+};
 
-    fs->alu_instruction_count++;
-}
+struct rX00_fragment_program_code r3xx_texture_fragment_shader = {
+    .code.r300.alu.length = 1,
+    .code.r300.tex.length = 1,
 
-void r3xx_fs_finalize(struct r300_fragment_shader* fs,
-                      struct r300_fs_asm* assembler)
-{
-    fs->stack_size = assembler->temp_count + assembler->temp_offset + 1;
-}
+    .code.r300.config = R300_PFS_CNTL_FIRST_NODE_HAS_TEX,
+    .code.r300.pixsize = 0,
+    .code.r300.code_offset = 0,
+    .code.r300.code_addr[3] = R300_RGBA_OUT,
 
-void r3xx_fs_instruction(struct r3xx_fragment_shader* fs,
-                         struct r300_fs_asm* assembler,
-                         struct tgsi_full_instruction* inst)
-{
-    switch (inst->Instruction.Opcode) {
-        case TGSI_OPCODE_MOV:
-            /* src0 -> src1 and src2 forced to zero */
-            inst->FullSrcRegisters[1] = inst->FullSrcRegisters[0];
-            inst->FullSrcRegisters[2] = r300_constant_zero;
-            r3xx_emit_maths(fs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], inst->Instruction.Opcode, 3);
-            break;
-        case TGSI_OPCODE_END:
-            break;
-        default:
-            debug_printf("r300: fs: Bad opcode %d\n",
-                    inst->Instruction.Opcode);
-            break;
-    }
-}
+    .code.r300.tex.inst[0] = R300_TEX_OP_LD << R300_TEX_INST_SHIFT,
+
+    .code.r300.alu.inst[0].rgb_inst = R300_RGB_SWIZA(R300_ALU_ARGC_SRC0C_XYZ) |
+        R300_RGB_SWIZB(R300_ALU_ARGC_SRC0C_XYZ) |
+        R300_RGB_SWIZC(R300_ALU_ARGC_ZERO) |
+        R300_ALU_OUTC_CMP,
+    .code.r300.alu.inst[0].rgb_addr = R300_RGB_ADDR0(0) | R300_RGB_ADDR1(0) |
+        R300_RGB_ADDR2(0) | R300_ALU_DSTC_OUTPUT_XYZ,
+    .code.r300.alu.inst[0].alpha_inst = R300_ALPHA_SWIZA(R300_ALU_ARGA_SRC0A) |
+        R300_ALPHA_SWIZB(R300_ALU_ARGA_SRC0A) |
+        R300_ALPHA_SWIZC(R300_ALU_ARGA_ZERO) |
+        R300_ALU_OUTA_CMP,
+    .code.r300.alu.inst[0].alpha_addr = R300_ALPHA_ADDR0(0) |
+        R300_ALPHA_ADDR1(0) | R300_ALPHA_ADDR2(0) | R300_ALU_DSTA_OUTPUT,
+};
index 3da39ec..51cd245 100644 (file)
 #ifndef R3XX_FS_H
 #define R3XX_FS_H
 
-#include "r300_fs_inlines.h"
+#include "radeon_code.h"
 
-static struct r3xx_fragment_shader r3xx_passthrough_fragment_shader = {
-    .alu_instruction_count = 1,
-    .tex_instruction_count = 0,
-    .indirections = 0,
-    .shader.stack_size = 1,
-
-    .instructions[0].alu_rgb_inst = R300_RGB_SWIZA(R300_ALU_ARGC_SRC0C_XYZ) |
-        R300_RGB_SWIZB(R300_ALU_ARGC_SRC0C_XYZ) |
-        R300_RGB_SWIZC(R300_ALU_ARGC_ZERO) |
-        R300_ALU_OUTC_CMP,
-    .instructions[0].alu_rgb_addr = R300_RGB_ADDR0(0) | R300_RGB_ADDR1(0) |
-        R300_RGB_ADDR2(0) | R300_ALU_DSTC_OUTPUT_XYZ,
-    .instructions[0].alu_alpha_inst = R300_ALPHA_SWIZA(R300_ALU_ARGA_SRC0A) |
-        R300_ALPHA_SWIZB(R300_ALU_ARGA_SRC0A) |
-        R300_ALPHA_SWIZC(R300_ALU_ARGA_ZERO) |
-        R300_ALU_OUTA_CMP,
-    .instructions[0].alu_alpha_addr = R300_ALPHA_ADDR0(0) |
-        R300_ALPHA_ADDR1(0) | R300_ALPHA_ADDR2(0) | R300_ALU_DSTA_OUTPUT,
-};
-
-static struct r3xx_fragment_shader r3xx_texture_fragment_shader = {
-    .alu_instruction_count = 1,
-    .tex_instruction_count = 0,
-    .indirections = 0,
-    .shader.stack_size = 1,
-
-    .instructions[0].alu_rgb_inst = R300_RGB_SWIZA(R300_ALU_ARGC_SRC0C_XYZ) |
-        R300_RGB_SWIZB(R300_ALU_ARGC_SRC0C_XYZ) |
-        R300_RGB_SWIZC(R300_ALU_ARGC_ZERO) |
-        R300_ALU_OUTC_CMP,
-    .instructions[0].alu_rgb_addr = R300_RGB_ADDR0(0) | R300_RGB_ADDR1(0) |
-        R300_RGB_ADDR2(0) | R300_ALU_DSTC_OUTPUT_XYZ,
-    .instructions[0].alu_alpha_inst = R300_ALPHA_SWIZA(R300_ALU_ARGA_SRC0A) |
-        R300_ALPHA_SWIZB(R300_ALU_ARGA_SRC0A) |
-        R300_ALPHA_SWIZC(R300_ALU_ARGA_ZERO) |
-        R300_ALU_OUTA_CMP,
-    .instructions[0].alu_alpha_addr = R300_ALPHA_ADDR0(0) |
-        R300_ALPHA_ADDR1(0) | R300_ALPHA_ADDR2(0) | R300_ALU_DSTA_OUTPUT,
-};
-
-void r3xx_fs_finalize(struct r300_fragment_shader* fs,
-                      struct r300_fs_asm* assembler);
-
-void r3xx_fs_instruction(struct r3xx_fragment_shader* fs,
-                         struct r300_fs_asm* assembler,
-                         struct tgsi_full_instruction* inst);
+struct rX00_fragment_program_code r3xx_passthrough_fragment_shader;
+struct rX00_fragment_program_code r3xx_texture_fragment_shader;
 
 #endif /* R3XX_FS_H */
index 99d8262..f072dea 100644 (file)
 
 #include "r5xx_fs.h"
 
-static INLINE unsigned r5xx_fix_swiz(unsigned s)
-{
-    /* For historical reasons, the swizzle values x, y, z, w, and 0 are
-     * equivalent to the actual machine code, but 1 is not. Thus, we just
-     * adjust it a bit... */
-    if (s == TGSI_EXTSWIZZLE_ONE) {
-        return R500_SWIZZLE_ONE;
-    } else {
-        return s;
-    }
-}
-
-static uint32_t r5xx_rgba_swiz(struct tgsi_full_src_register* reg)
-{
-    if (reg->SrcRegister.Extended) {
-        return r5xx_fix_swiz(reg->SrcRegisterExtSwz.ExtSwizzleX) |
-            (r5xx_fix_swiz(reg->SrcRegisterExtSwz.ExtSwizzleY) << 3) |
-            (r5xx_fix_swiz(reg->SrcRegisterExtSwz.ExtSwizzleZ) << 6) |
-            (r5xx_fix_swiz(reg->SrcRegisterExtSwz.ExtSwizzleW) << 9);
-    } else {
-        return reg->SrcRegister.SwizzleX |
-            (reg->SrcRegister.SwizzleY << 3) |
-            (reg->SrcRegister.SwizzleZ << 6) |
-            (reg->SrcRegister.SwizzleW << 9);
-    }
-}
-
-static uint32_t r5xx_strq_swiz(struct tgsi_full_src_register* reg)
-{
-    return reg->SrcRegister.SwizzleX |
-        (reg->SrcRegister.SwizzleY << 2) |
-        (reg->SrcRegister.SwizzleZ << 4) |
-        (reg->SrcRegister.SwizzleW << 6);
-}
-
-static INLINE uint32_t r5xx_rgb_swiz(struct tgsi_full_src_register* reg)
-{
-    /* Only the first 9 bits... */
-    return (r5xx_rgba_swiz(reg) & 0x1ff) |
-        (reg->SrcRegister.Negate ? (1 << 9) : 0) |
-        (reg->SrcRegisterExtMod.Absolute ? (1 << 10) : 0);
-}
-
-static INLINE uint32_t r5xx_alpha_swiz(struct tgsi_full_src_register* reg)
-{
-    /* Only the last 3 bits... */
-    return (r5xx_rgba_swiz(reg) >> 9) |
-        (reg->SrcRegister.Negate ? (1 << 9) : 0) |
-        (reg->SrcRegisterExtMod.Absolute ? (1 << 10) : 0);
-}
-
-static INLINE uint32_t r5xx_rgba_op(unsigned op)
-{
-    switch (op) {
-        case TGSI_OPCODE_COS:
-        case TGSI_OPCODE_EX2:
-        case TGSI_OPCODE_LG2:
-        case TGSI_OPCODE_RCP:
-        case TGSI_OPCODE_RSQ:
-        case TGSI_OPCODE_SIN:
-            return R500_ALU_RGBA_OP_SOP;
-        case TGSI_OPCODE_DDX:
-            return R500_ALU_RGBA_OP_MDH;
-        case TGSI_OPCODE_DDY:
-            return R500_ALU_RGBA_OP_MDV;
-        case TGSI_OPCODE_FRC:
-            return R500_ALU_RGBA_OP_FRC;
-        case TGSI_OPCODE_DP3:
-            return R500_ALU_RGBA_OP_DP3;
-        case TGSI_OPCODE_DP4:
-        case TGSI_OPCODE_DPH:
-            return R500_ALU_RGBA_OP_DP4;
-        case TGSI_OPCODE_ABS:
-        case TGSI_OPCODE_CMP:
-        case TGSI_OPCODE_MOV:
-        case TGSI_OPCODE_SWZ:
-            return R500_ALU_RGBA_OP_CMP;
-        case TGSI_OPCODE_ADD:
-        case TGSI_OPCODE_MAD:
-        case TGSI_OPCODE_MUL:
-        case TGSI_OPCODE_SUB:
-            return R500_ALU_RGBA_OP_MAD;
-        default:
-            return 0;
-    }
-}
-
-static INLINE uint32_t r5xx_alpha_op(unsigned op)
-{
-    switch (op) {
-        case TGSI_OPCODE_COS:
-            return R500_ALPHA_OP_COS;
-        case TGSI_OPCODE_EX2:
-            return R500_ALPHA_OP_EX2;
-        case TGSI_OPCODE_LG2:
-            return R500_ALPHA_OP_LN2;
-        case TGSI_OPCODE_RCP:
-            return R500_ALPHA_OP_RCP;
-        case TGSI_OPCODE_RSQ:
-            return R500_ALPHA_OP_RSQ;
-        case TGSI_OPCODE_FRC:
-            return R500_ALPHA_OP_FRC;
-        case TGSI_OPCODE_SIN:
-            return R500_ALPHA_OP_SIN;
-        case TGSI_OPCODE_DDX:
-            return R500_ALPHA_OP_MDH;
-        case TGSI_OPCODE_DDY:
-            return R500_ALPHA_OP_MDV;
-        case TGSI_OPCODE_DP3:
-        case TGSI_OPCODE_DP4:
-        case TGSI_OPCODE_DPH:
-            return R500_ALPHA_OP_DP;
-        case TGSI_OPCODE_ABS:
-        case TGSI_OPCODE_CMP:
-        case TGSI_OPCODE_MOV:
-        case TGSI_OPCODE_SWZ:
-            return R500_ALPHA_OP_CMP;
-        case TGSI_OPCODE_ADD:
-        case TGSI_OPCODE_MAD:
-        case TGSI_OPCODE_MUL:
-        case TGSI_OPCODE_SUB:
-            return R500_ALPHA_OP_MAD;
-        default:
-            return 0;
-    }
-}
-
-static INLINE uint32_t r5xx_tex_op(unsigned op)
-{
-    switch (op) {
-        case TGSI_OPCODE_KIL:
-            return R500_TEX_INST_TEXKILL;
-        case TGSI_OPCODE_TEX:
-            return R500_TEX_INST_LD;
-        case TGSI_OPCODE_TXB:
-            return R500_TEX_INST_LODBIAS;
-        case TGSI_OPCODE_TXP:
-            return R500_TEX_INST_PROJ;
-        default:
-            return 0;
-    }
-}
-
-/* Setup an ALU operation. */
-static INLINE void r5xx_emit_maths(struct r5xx_fragment_shader* fs,
-                                   struct r300_fs_asm* assembler,
-                                   struct tgsi_full_src_register* src,
-                                   struct tgsi_full_dst_register* dst,
-                                   unsigned op,
-                                   unsigned count)
-{
-    int i = fs->instruction_count;
-
-    if (dst->DstRegister.File == TGSI_FILE_OUTPUT) {
-        fs->instructions[i].inst0 = R500_INST_TYPE_OUT;
-        if (r300_fs_is_depr(assembler, dst)) {
-            fs->instructions[i].inst4 = R500_W_OMASK;
-        } else {
-            fs->instructions[i].inst0 |=
-                R500_ALU_OMASK(dst->DstRegister.WriteMask);
-        }
-    } else {
-        fs->instructions[i].inst0 = R500_INST_TYPE_ALU |
-            R500_ALU_WMASK(dst->DstRegister.WriteMask);
-    }
-
-    fs->instructions[i].inst0 |= R500_INST_TEX_SEM_WAIT;
-
-    fs->instructions[i].inst4 |=
-        R500_ALPHA_ADDRD(r300_fs_dst(assembler, &dst->DstRegister));
-    fs->instructions[i].inst5 =
-        R500_ALU_RGBA_ADDRD(r300_fs_dst(assembler, &dst->DstRegister));
-
-    switch (count) {
-        case 3:
-            fs->instructions[i].inst1 =
-                R500_RGB_ADDR2(r300_fs_src(assembler, &src[2].SrcRegister));
-            fs->instructions[i].inst2 =
-                R500_ALPHA_ADDR2(r300_fs_src(assembler, &src[2].SrcRegister));
-            fs->instructions[i].inst5 |=
-                R500_ALU_RGBA_SEL_C_SRC2 |
-                R500_SWIZ_RGBA_C(r5xx_rgb_swiz(&src[2])) |
-                R500_ALU_RGBA_ALPHA_SEL_C_SRC2 |
-                R500_SWIZ_ALPHA_C(r5xx_alpha_swiz(&src[2]));
-        case 2:
-            fs->instructions[i].inst1 |=
-                R500_RGB_ADDR1(r300_fs_src(assembler, &src[1].SrcRegister));
-            fs->instructions[i].inst2 |=
-                R500_ALPHA_ADDR1(r300_fs_src(assembler, &src[1].SrcRegister));
-            fs->instructions[i].inst3 =
-                R500_ALU_RGB_SEL_B_SRC1 |
-                R500_SWIZ_RGB_B(r5xx_rgb_swiz(&src[1]));
-            fs->instructions[i].inst4 |=
-                R500_ALPHA_SEL_B_SRC1 |
-                R500_SWIZ_ALPHA_B(r5xx_alpha_swiz(&src[1]));
-        case 1:
-        case 0:
-        default:
-            fs->instructions[i].inst1 |=
-                R500_RGB_ADDR0(r300_fs_src(assembler, &src[0].SrcRegister));
-            fs->instructions[i].inst2 |=
-                R500_ALPHA_ADDR0(r300_fs_src(assembler, &src[0].SrcRegister));
-            fs->instructions[i].inst3 |=
-                R500_ALU_RGB_SEL_A_SRC0 |
-                R500_SWIZ_RGB_A(r5xx_rgb_swiz(&src[0]));
-            fs->instructions[i].inst4 |=
-                R500_ALPHA_SEL_A_SRC0 |
-                R500_SWIZ_ALPHA_A(r5xx_alpha_swiz(&src[0]));
-            break;
-    }
-
-    fs->instructions[i].inst4 |= r5xx_alpha_op(op);
-    fs->instructions[i].inst5 |= r5xx_rgba_op(op);
-
-    fs->instruction_count++;
-}
-
-static INLINE void r5xx_emit_tex(struct r5xx_fragment_shader* fs,
-                                 struct r300_fs_asm* assembler,
-                                 struct tgsi_full_src_register* src,
-                                 struct tgsi_full_dst_register* dst,
-                                 uint32_t op)
-{
-    int i = fs->instruction_count;
-
-    fs->instructions[i].inst0 = R500_INST_TYPE_TEX |
-        R500_TEX_WMASK(dst->DstRegister.WriteMask) |
-        R500_INST_TEX_SEM_WAIT;
-    fs->instructions[i].inst1 = R500_TEX_ID(0) |
-        R500_TEX_SEM_ACQUIRE | //R500_TEX_IGNORE_UNCOVERED |
-        r5xx_tex_op(op);
-    fs->instructions[i].inst2 =
-        R500_TEX_SRC_ADDR(r300_fs_src(assembler, &src->SrcRegister)) |
-        R500_SWIZ_TEX_STRQ(r5xx_strq_swiz(src)) |
-        R500_TEX_DST_ADDR(r300_fs_dst(assembler, &dst->DstRegister)) |
+#include "r300_reg.h"
+
+/* XXX this all should find its way back to r300_reg */
+/* Swizzle tools */
+#define R500_SWIZZLE_ZERO 4
+#define R500_SWIZZLE_HALF 5
+#define R500_SWIZZLE_ONE 6
+#define R500_SWIZ_RGB_ZERO ((4 << 0) | (4 << 3) | (4 << 6))
+#define R500_SWIZ_RGB_ONE ((6 << 0) | (6 << 3) | (6 << 6))
+#define R500_SWIZ_RGB_RGB ((0 << 0) | (1 << 3) | (2 << 6))
+#define R500_SWIZ_MOD_NEG 1
+#define R500_SWIZ_MOD_ABS 2
+#define R500_SWIZ_MOD_NEG_ABS 3
+/* Swizzles for inst2 */
+#define R500_SWIZ_TEX_STRQ(x) ((x) << 8)
+#define R500_SWIZ_TEX_RGBA(x) ((x) << 24)
+/* Swizzles for inst3 */
+#define R500_SWIZ_RGB_A(x) ((x) << 2)
+#define R500_SWIZ_RGB_B(x) ((x) << 15)
+/* Swizzles for inst4 */
+#define R500_SWIZ_ALPHA_A(x) ((x) << 14)
+#define R500_SWIZ_ALPHA_B(x) ((x) << 21)
+/* Swizzle for inst5 */
+#define R500_SWIZ_RGBA_C(x) ((x) << 14)
+#define R500_SWIZ_ALPHA_C(x) ((x) << 27)
+/* Writemasks */
+#define R500_TEX_WMASK(x) ((x) << 11)
+#define R500_ALU_WMASK(x) ((x) << 11)
+#define R500_ALU_OMASK(x) ((x) << 15)
+#define R500_W_OMASK (1 << 31)
+
+struct rX00_fragment_program_code r5xx_passthrough_fragment_shader = {
+    .code.r500.max_temp_idx = 0,
+    .code.r500.inst_end = 0,
+
+    .code.r500.inst[0].inst0 = R500_INST_TYPE_OUT |
+        R500_INST_TEX_SEM_WAIT | R500_INST_LAST |
+        R500_INST_RGB_OMASK_RGB | R500_INST_ALPHA_OMASK |
+        R500_INST_RGB_CLAMP | R500_INST_ALPHA_CLAMP,
+    .code.r500.inst[0].inst1 =
+        R500_RGB_ADDR0(0) | R500_RGB_ADDR1(0) | R500_RGB_ADDR1_CONST |
+        R500_RGB_ADDR2(0) | R500_RGB_ADDR2_CONST,
+    .code.r500.inst[0].inst2 =
+        R500_ALPHA_ADDR0(0) | R500_ALPHA_ADDR1(0) | R500_ALPHA_ADDR1_CONST |
+        R500_ALPHA_ADDR2(0) | R500_ALPHA_ADDR2_CONST,
+    .code.r500.inst[0].inst3 =
+        R500_ALU_RGB_SEL_A_SRC0 | R500_ALU_RGB_R_SWIZ_A_R |
+        R500_ALU_RGB_G_SWIZ_A_G | R500_ALU_RGB_B_SWIZ_A_B |
+        R500_ALU_RGB_SEL_B_SRC0 | R500_ALU_RGB_R_SWIZ_B_R |
+        R500_ALU_RGB_B_SWIZ_B_G | R500_ALU_RGB_G_SWIZ_B_B,
+    .code.r500.inst[0].inst4 =
+        R500_ALPHA_OP_CMP | R500_ALPHA_SWIZ_A_A | R500_ALPHA_SWIZ_B_A,
+    .code.r500.inst[0].inst5 =
+        R500_ALU_RGBA_OP_CMP | R500_ALU_RGBA_R_SWIZ_0 |
+        R500_ALU_RGBA_G_SWIZ_0 | R500_ALU_RGBA_B_SWIZ_0 |
+        R500_ALU_RGBA_A_SWIZ_0,
+};
+
+struct rX00_fragment_program_code r5xx_texture_fragment_shader = {
+    .code.r500.max_temp_idx = 0,
+    .code.r500.inst_end = 1,
+
+    .code.r500.inst[0].inst0 = R500_INST_TYPE_TEX |
+        R500_INST_TEX_SEM_WAIT |
+        R500_INST_RGB_WMASK_RGB | R500_INST_ALPHA_WMASK |
+        R500_INST_RGB_CLAMP | R500_INST_ALPHA_CLAMP,
+    .code.r500.inst[0].inst1 = R500_TEX_ID(0) | R500_TEX_INST_LD |
+        R500_TEX_SEM_ACQUIRE | R500_TEX_IGNORE_UNCOVERED,
+    .code.r500.inst[0].inst2 = R500_TEX_SRC_ADDR(0) |
+        R500_TEX_SRC_S_SWIZ_R | R500_TEX_SRC_T_SWIZ_G |
+        R500_TEX_SRC_R_SWIZ_B | R500_TEX_SRC_Q_SWIZ_A |
+        R500_TEX_DST_ADDR(0) |
         R500_TEX_DST_R_SWIZ_R | R500_TEX_DST_G_SWIZ_G |
-        R500_TEX_DST_B_SWIZ_B | R500_TEX_DST_A_SWIZ_A;
-
-    if (dst->DstRegister.File == TGSI_FILE_OUTPUT) {
-        fs->instructions[i].inst2 |=
-            R500_TEX_DST_ADDR(assembler->temp_count +
-                    assembler->temp_offset);
-
-        fs->instruction_count++;
-
-        /* Setup and emit a MOV. */
-        src[0].SrcRegister.Index = assembler->temp_count;
-        src[0].SrcRegister.File = TGSI_FILE_TEMPORARY;
-
-        src[1] = src[0];
-        src[2] = r300_constant_zero;
-        r5xx_emit_maths(fs, assembler, src, dst, TGSI_OPCODE_MOV, 3);
-    } else {
-        fs->instruction_count++;
-    }
-}
-
-void r5xx_fs_finalize(struct r5xx_fragment_shader* fs,
-                      struct r300_fs_asm* assembler)
-{
-    /* XXX should this just go with OPCODE_END? */
-    fs->instructions[fs->instruction_count - 1].inst0 |=
-        R500_INST_LAST;
-}
-
-void r5xx_fs_instruction(struct r5xx_fragment_shader* fs,
-                         struct r300_fs_asm* assembler,
-                         struct tgsi_full_instruction* inst)
-{
-    /* Switch between opcodes. When possible, prefer using the official
-     * AMD/ATI names for opcodes, please, as it facilitates using the
-     * documentation. */
-    switch (inst->Instruction.Opcode) {
-        /* XXX trig needs extra prep */
-        case TGSI_OPCODE_COS:
-        case TGSI_OPCODE_SIN:
-        /* The simple scalar ops. */
-        case TGSI_OPCODE_EX2:
-        case TGSI_OPCODE_LG2:
-        case TGSI_OPCODE_RCP:
-        case TGSI_OPCODE_RSQ:
-            /* Copy red swizzle to alpha for src0 */
-            inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleW =
-                inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleX;
-            inst->FullSrcRegisters[0].SrcRegister.SwizzleW =
-                inst->FullSrcRegisters[0].SrcRegister.SwizzleX;
-            /* Fall through */
-        case TGSI_OPCODE_DDX:
-        case TGSI_OPCODE_DDY:
-        case TGSI_OPCODE_FRC:
-            r5xx_emit_maths(fs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], inst->Instruction.Opcode, 1);
-            break;
-
-        /* The dot products. */
-        case TGSI_OPCODE_DPH:
-            /* Set alpha swizzle to one for src0 */
-            if (!inst->FullSrcRegisters[0].SrcRegister.Extended) {
-                inst->FullSrcRegisters[0].SrcRegister.Extended = TRUE;
-                inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleX =
-                    inst->FullSrcRegisters[0].SrcRegister.SwizzleX;
-                inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleY =
-                    inst->FullSrcRegisters[0].SrcRegister.SwizzleY;
-                inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleZ =
-                    inst->FullSrcRegisters[0].SrcRegister.SwizzleZ;
-            }
-            inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleW =
-                TGSI_EXTSWIZZLE_ONE;
-            /* Fall through */
-        case TGSI_OPCODE_DP3:
-        case TGSI_OPCODE_DP4:
-            r5xx_emit_maths(fs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], inst->Instruction.Opcode, 2);
-            break;
-
-        /* Simple three-source operations. */
-        case TGSI_OPCODE_CMP:
-            /* Swap src0 and src2 */
-            inst->FullSrcRegisters[3] = inst->FullSrcRegisters[2];
-            inst->FullSrcRegisters[2] = inst->FullSrcRegisters[0];
-            inst->FullSrcRegisters[0] = inst->FullSrcRegisters[3];
-            r5xx_emit_maths(fs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], inst->Instruction.Opcode, 3);
-            break;
-
-        /* The MAD variants. */
-        case TGSI_OPCODE_SUB:
-            /* Just like ADD, but flip the negation on src1 first */
-            inst->FullSrcRegisters[1].SrcRegister.Negate =
-                !inst->FullSrcRegisters[1].SrcRegister.Negate;
-            /* Fall through */
-        case TGSI_OPCODE_ADD:
-            /* Force src0 to one, move all registers over */
-            inst->FullSrcRegisters[2] = inst->FullSrcRegisters[1];
-            inst->FullSrcRegisters[1] = inst->FullSrcRegisters[0];
-            inst->FullSrcRegisters[0] = r300_constant_one;
-            r5xx_emit_maths(fs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], inst->Instruction.Opcode, 3);
-            break;
-        case TGSI_OPCODE_MUL:
-            /* Force our src2 to zero */
-            inst->FullSrcRegisters[2] = r300_constant_zero;
-            r5xx_emit_maths(fs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], inst->Instruction.Opcode, 3);
-            break;
-        case TGSI_OPCODE_MAD:
-            r5xx_emit_maths(fs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], inst->Instruction.Opcode, 3);
-            break;
-
-        /* The MOV variants. */
-        case TGSI_OPCODE_ABS:
-            /* Set absolute value modifiers. */
-            inst->FullSrcRegisters[0].SrcRegisterExtMod.Absolute = TRUE;
-            /* Fall through */
-        case TGSI_OPCODE_MOV:
-        case TGSI_OPCODE_SWZ:
-            /* src0 -> src1 and src2 forced to zero */
-            inst->FullSrcRegisters[1] = inst->FullSrcRegisters[0];
-            inst->FullSrcRegisters[2] = r300_constant_zero;
-            r5xx_emit_maths(fs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], inst->Instruction.Opcode, 3);
-            break;
-
-        /* The compound and hybrid insts. */
-        case TGSI_OPCODE_LRP:
-            /* LRP DST A, B, C -> MAD TMP -A, C, C; MAD DST A, B, TMP */
-            inst->FullSrcRegisters[3] = inst->FullSrcRegisters[1];
-            inst->FullSrcRegisters[1] = inst->FullSrcRegisters[2];
-            inst->FullSrcRegisters[0].SrcRegister.Negate =
-                !(inst->FullSrcRegisters[0].SrcRegister.Negate);
-            inst->FullDstRegisters[1] = inst->FullDstRegisters[0];
-            inst->FullDstRegisters[0].DstRegister.Index =
-                assembler->temp_count;
-            inst->FullDstRegisters[0].DstRegister.File = TGSI_FILE_TEMPORARY;
-            r5xx_emit_maths(fs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], TGSI_OPCODE_MAD, 3);
-            inst->FullSrcRegisters[2].SrcRegister.Index =
-                assembler->temp_count;
-            inst->FullSrcRegisters[2].SrcRegister.File = TGSI_FILE_TEMPORARY;
-            inst->FullSrcRegisters[2].SrcRegister.SwizzleX = TGSI_SWIZZLE_X;
-            inst->FullSrcRegisters[2].SrcRegister.SwizzleY = TGSI_SWIZZLE_Y;
-            inst->FullSrcRegisters[2].SrcRegister.SwizzleZ = TGSI_SWIZZLE_Z;
-            inst->FullSrcRegisters[2].SrcRegister.SwizzleW = TGSI_SWIZZLE_W;
-            inst->FullSrcRegisters[1] = inst->FullSrcRegisters[3];
-            inst->FullSrcRegisters[0].SrcRegister.Negate =
-                !(inst->FullSrcRegisters[0].SrcRegister.Negate);
-            inst->FullDstRegisters[0] = inst->FullDstRegisters[1];
-            r5xx_emit_maths(fs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], TGSI_OPCODE_MAD, 3);
-            break;
-        case TGSI_OPCODE_POW:
-            /* POW DST A, B -> LG2 TMP A; MUL TMP TMP, B; EX2 DST TMP */
-            inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleW =
-                inst->FullSrcRegisters[0].SrcRegisterExtSwz.ExtSwizzleX;
-            inst->FullSrcRegisters[0].SrcRegister.SwizzleW =
-                inst->FullSrcRegisters[0].SrcRegister.SwizzleX;
-            inst->FullDstRegisters[1] = inst->FullDstRegisters[0];
-            inst->FullDstRegisters[0].DstRegister.Index =
-                assembler->temp_count;
-            inst->FullDstRegisters[0].DstRegister.File = TGSI_FILE_TEMPORARY;
-            r5xx_emit_maths(fs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], TGSI_OPCODE_LG2, 1);
-            inst->FullSrcRegisters[0].SrcRegister.Index =
-                assembler->temp_count;
-            inst->FullSrcRegisters[0].SrcRegister.File = TGSI_FILE_TEMPORARY;
-            inst->FullSrcRegisters[0].SrcRegister.SwizzleX = TGSI_SWIZZLE_X;
-            inst->FullSrcRegisters[0].SrcRegister.SwizzleY = TGSI_SWIZZLE_Y;
-            inst->FullSrcRegisters[0].SrcRegister.SwizzleZ = TGSI_SWIZZLE_Z;
-            inst->FullSrcRegisters[0].SrcRegister.SwizzleW = TGSI_SWIZZLE_W;
-            inst->FullSrcRegisters[2] = r300_constant_zero;
-            r5xx_emit_maths(fs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], TGSI_OPCODE_MUL, 3);
-            inst->FullDstRegisters[0] = inst->FullDstRegisters[1];
-            r5xx_emit_maths(fs, assembler, inst->FullSrcRegisters,
-                    &inst->FullDstRegisters[0], TGSI_OPCODE_EX2, 1);
-            break;
-
-        /* The texture instruction set. */
-        case TGSI_OPCODE_KIL:
-        case TGSI_OPCODE_TEX:
-        case TGSI_OPCODE_TXB:
-        case TGSI_OPCODE_TXP:
-            r5xx_emit_tex(fs, assembler, &inst->FullSrcRegisters[0],
-                    &inst->FullDstRegisters[0], inst->Instruction.Opcode);
-            break;
-
-        /* This is the end. My only friend, the end. */
-        case TGSI_OPCODE_END:
-            break;
-        default:
-            debug_printf("r300: fs: Bad opcode %d\n",
-                    inst->Instruction.Opcode);
-            break;
-    }
-
-    /* Clamp, if saturation flags are set. */
-    if (inst->Instruction.Saturate == TGSI_SAT_ZERO_ONE) {
-        fs->instructions[fs->instruction_count - 1].inst0 |=
-            R500_INST_RGB_CLAMP | R500_INST_ALPHA_CLAMP;
-    }
-}
+        R500_TEX_DST_B_SWIZ_B | R500_TEX_DST_A_SWIZ_A,
+    .code.r500.inst[0].inst3 = 0x0,
+    .code.r500.inst[0].inst4 = 0x0,
+    .code.r500.inst[0].inst5 = 0x0,
+
+    .code.r500.inst[1].inst0 = R500_INST_TYPE_OUT |
+        R500_INST_TEX_SEM_WAIT | R500_INST_LAST |
+        R500_INST_RGB_OMASK_RGB | R500_INST_ALPHA_OMASK |
+        R500_INST_RGB_CLAMP | R500_INST_ALPHA_CLAMP,
+    .code.r500.inst[1].inst1 =
+        R500_RGB_ADDR0(0) | R500_RGB_ADDR1(0) | R500_RGB_ADDR1_CONST |
+        R500_RGB_ADDR2(0) | R500_RGB_ADDR2_CONST,
+    .code.r500.inst[1].inst2 =
+        R500_ALPHA_ADDR0(0) | R500_ALPHA_ADDR1(0) | R500_ALPHA_ADDR1_CONST |
+        R500_ALPHA_ADDR2(0) | R500_ALPHA_ADDR2_CONST,
+    .code.r500.inst[1].inst3 =
+        R500_ALU_RGB_SEL_A_SRC0 | R500_ALU_RGB_R_SWIZ_A_R |
+        R500_ALU_RGB_G_SWIZ_A_G | R500_ALU_RGB_B_SWIZ_A_B |
+        R500_ALU_RGB_SEL_B_SRC0 | R500_ALU_RGB_R_SWIZ_B_R |
+        R500_ALU_RGB_B_SWIZ_B_G | R500_ALU_RGB_G_SWIZ_B_B,
+    .code.r500.inst[1].inst4 =
+        R500_ALPHA_OP_CMP | R500_ALPHA_SWIZ_A_A | R500_ALPHA_SWIZ_B_A,
+    .code.r500.inst[1].inst5 =
+        R500_ALU_RGBA_OP_CMP | R500_ALU_RGBA_R_SWIZ_0 |
+        R500_ALU_RGBA_G_SWIZ_0 | R500_ALU_RGBA_B_SWIZ_0 |
+        R500_ALU_RGBA_A_SWIZ_0,
+};
index 629e587..a4addde 100644 (file)
 #ifndef R5XX_FS_H
 #define R5XX_FS_H
 
-#include "r300_fs_inlines.h"
+#include "radeon_code.h"
 
-/* XXX this all should find its way back to r300_reg */
-/* Swizzle tools */
-#define R500_SWIZZLE_ZERO 4
-#define R500_SWIZZLE_HALF 5
-#define R500_SWIZZLE_ONE 6
-#define R500_SWIZ_RGB_ZERO ((4 << 0) | (4 << 3) | (4 << 6))
-#define R500_SWIZ_RGB_ONE ((6 << 0) | (6 << 3) | (6 << 6))
-#define R500_SWIZ_RGB_RGB ((0 << 0) | (1 << 3) | (2 << 6))
-#define R500_SWIZ_MOD_NEG 1
-#define R500_SWIZ_MOD_ABS 2
-#define R500_SWIZ_MOD_NEG_ABS 3
-/* Swizzles for inst2 */
-#define R500_SWIZ_TEX_STRQ(x) ((x) << 8)
-#define R500_SWIZ_TEX_RGBA(x) ((x) << 24)
-/* Swizzles for inst3 */
-#define R500_SWIZ_RGB_A(x) ((x) << 2)
-#define R500_SWIZ_RGB_B(x) ((x) << 15)
-/* Swizzles for inst4 */
-#define R500_SWIZ_ALPHA_A(x) ((x) << 14)
-#define R500_SWIZ_ALPHA_B(x) ((x) << 21)
-/* Swizzle for inst5 */
-#define R500_SWIZ_RGBA_C(x) ((x) << 14)
-#define R500_SWIZ_ALPHA_C(x) ((x) << 27)
-/* Writemasks */
-#define R500_TEX_WMASK(x) ((x) << 11)
-#define R500_ALU_WMASK(x) ((x) << 11)
-#define R500_ALU_OMASK(x) ((x) << 15)
-#define R500_W_OMASK (1 << 31)
-
-static struct r5xx_fragment_shader r5xx_passthrough_fragment_shader = {
-    .shader.stack_size = 0,
-    .instruction_count = 1,
-    .instructions[0].inst0 = R500_INST_TYPE_OUT |
-        R500_INST_TEX_SEM_WAIT | R500_INST_LAST |
-        R500_INST_RGB_OMASK_RGB | R500_INST_ALPHA_OMASK |
-        R500_INST_RGB_CLAMP | R500_INST_ALPHA_CLAMP,
-    .instructions[0].inst1 =
-        R500_RGB_ADDR0(0) | R500_RGB_ADDR1(0) | R500_RGB_ADDR1_CONST |
-        R500_RGB_ADDR2(0) | R500_RGB_ADDR2_CONST,
-    .instructions[0].inst2 =
-        R500_ALPHA_ADDR0(0) | R500_ALPHA_ADDR1(0) | R500_ALPHA_ADDR1_CONST |
-        R500_ALPHA_ADDR2(0) | R500_ALPHA_ADDR2_CONST,
-    .instructions[0].inst3 =
-        R500_ALU_RGB_SEL_A_SRC0 | R500_ALU_RGB_R_SWIZ_A_R |
-        R500_ALU_RGB_G_SWIZ_A_G | R500_ALU_RGB_B_SWIZ_A_B |
-        R500_ALU_RGB_SEL_B_SRC0 | R500_ALU_RGB_R_SWIZ_B_R |
-        R500_ALU_RGB_B_SWIZ_B_G | R500_ALU_RGB_G_SWIZ_B_B,
-    .instructions[0].inst4 =
-        R500_ALPHA_OP_CMP | R500_ALPHA_SWIZ_A_A | R500_ALPHA_SWIZ_B_A,
-    .instructions[0].inst5 =
-        R500_ALU_RGBA_OP_CMP | R500_ALU_RGBA_R_SWIZ_0 |
-        R500_ALU_RGBA_G_SWIZ_0 | R500_ALU_RGBA_B_SWIZ_0 |
-        R500_ALU_RGBA_A_SWIZ_0,
-};
-
-static struct r5xx_fragment_shader r5xx_texture_fragment_shader = {
-    .shader.stack_size = 1,
-    .instruction_count = 2,
-    .instructions[0].inst0 = R500_INST_TYPE_TEX |
-        R500_INST_TEX_SEM_WAIT |
-        R500_INST_RGB_WMASK_RGB | R500_INST_ALPHA_WMASK |
-        R500_INST_RGB_CLAMP | R500_INST_ALPHA_CLAMP,
-    .instructions[0].inst1 = R500_TEX_ID(0) | R500_TEX_INST_LD |
-        R500_TEX_SEM_ACQUIRE | R500_TEX_IGNORE_UNCOVERED,
-    .instructions[0].inst2 = R500_TEX_SRC_ADDR(0) |
-        R500_TEX_SRC_S_SWIZ_R | R500_TEX_SRC_T_SWIZ_G |
-        R500_TEX_SRC_R_SWIZ_B | R500_TEX_SRC_Q_SWIZ_A |
-        R500_TEX_DST_ADDR(0) |
-        R500_TEX_DST_R_SWIZ_R | R500_TEX_DST_G_SWIZ_G |
-        R500_TEX_DST_B_SWIZ_B | R500_TEX_DST_A_SWIZ_A,
-    .instructions[0].inst3 = 0x0,
-    .instructions[0].inst4 = 0x0,
-    .instructions[0].inst5 = 0x0,
-    .instructions[1].inst0 = R500_INST_TYPE_OUT |
-        R500_INST_TEX_SEM_WAIT | R500_INST_LAST |
-        R500_INST_RGB_OMASK_RGB | R500_INST_ALPHA_OMASK |
-        R500_INST_RGB_CLAMP | R500_INST_ALPHA_CLAMP,
-    .instructions[1].inst1 =
-        R500_RGB_ADDR0(0) | R500_RGB_ADDR1(0) | R500_RGB_ADDR1_CONST |
-        R500_RGB_ADDR2(0) | R500_RGB_ADDR2_CONST,
-    .instructions[1].inst2 =
-        R500_ALPHA_ADDR0(0) | R500_ALPHA_ADDR1(0) | R500_ALPHA_ADDR1_CONST |
-        R500_ALPHA_ADDR2(0) | R500_ALPHA_ADDR2_CONST,
-    .instructions[1].inst3 =
-        R500_ALU_RGB_SEL_A_SRC0 | R500_ALU_RGB_R_SWIZ_A_R |
-        R500_ALU_RGB_G_SWIZ_A_G | R500_ALU_RGB_B_SWIZ_A_B |
-        R500_ALU_RGB_SEL_B_SRC0 | R500_ALU_RGB_R_SWIZ_B_R |
-        R500_ALU_RGB_B_SWIZ_B_G | R500_ALU_RGB_G_SWIZ_B_B,
-    .instructions[1].inst4 =
-        R500_ALPHA_OP_CMP | R500_ALPHA_SWIZ_A_A | R500_ALPHA_SWIZ_B_A,
-    .instructions[1].inst5 =
-        R500_ALU_RGBA_OP_CMP | R500_ALU_RGBA_R_SWIZ_0 |
-        R500_ALU_RGBA_G_SWIZ_0 | R500_ALU_RGBA_B_SWIZ_0 |
-        R500_ALU_RGBA_A_SWIZ_0,
-};
-
-void r5xx_fs_finalize(struct r5xx_fragment_shader* fs,
-                      struct r300_fs_asm* assembler);
-
-void r5xx_fs_instruction(struct r5xx_fragment_shader* fs,
-                         struct r300_fs_asm* assembler,
-                         struct tgsi_full_instruction* inst);
+struct rX00_fragment_program_code r5xx_passthrough_fragment_shader;
+struct rX00_fragment_program_code r5xx_texture_fragment_shader;
 
 #endif /* R5XX_FS_H */
index 7a533da..70f0932 100644 (file)
 /* Simple, maximally packed layout.
  */
 
-static unsigned minify( unsigned d )
-{
-   return MAX2(1, d>>1);
-}
-
 
 /* Conventional allocation path for non-display textures:
  */
@@ -100,6 +95,7 @@ softpipe_displaytarget_layout(struct pipe_screen *screen,
 {
    unsigned usage = (PIPE_BUFFER_USAGE_CPU_READ_WRITE |
                      PIPE_BUFFER_USAGE_GPU_READ_WRITE);
+   unsigned tex_usage = spt->base.tex_usage;
 
    spt->base.nblocksx[0] = pf_get_nblocksx(&spt->base.block, spt->base.width[0]);  
    spt->base.nblocksy[0] = pf_get_nblocksy(&spt->base.block, spt->base.height[0]);  
@@ -109,6 +105,7 @@ softpipe_displaytarget_layout(struct pipe_screen *screen,
                                                 spt->base.height[0],
                                                 spt->base.format,
                                                 usage,
+                                                tex_usage,
                                                 &spt->stride[0]);
 
    return spt->buffer != NULL;
@@ -130,7 +127,8 @@ softpipe_texture_create(struct pipe_screen *screen,
    pipe_reference_init(&spt->base.reference, 1);
    spt->base.screen = screen;
 
-   if (spt->base.tex_usage & PIPE_TEXTURE_USAGE_DISPLAY_TARGET) {
+   if (spt->base.tex_usage & (PIPE_TEXTURE_USAGE_DISPLAY_TARGET |
+                              PIPE_TEXTURE_USAGE_PRIMARY)) {
       if (!softpipe_displaytarget_layout(screen, spt))
          goto fail;
    }
@@ -224,12 +222,6 @@ softpipe_get_tex_surface(struct pipe_screen *screen,
       if (ps->usage & PIPE_BUFFER_USAGE_GPU_READ)
          ps->usage |= PIPE_BUFFER_USAGE_CPU_READ;
 
-      if (ps->usage & (PIPE_BUFFER_USAGE_CPU_WRITE |
-                       PIPE_BUFFER_USAGE_GPU_WRITE)) {
-         /* Mark the surface as dirty.  The tile cache will look for this. */
-         spt->modified = TRUE;
-      }
-
       ps->face = face;
       ps->level = level;
       ps->zslice = zslice;
@@ -376,6 +368,11 @@ softpipe_transfer_unmap(struct pipe_screen *screen,
    spt = softpipe_texture(transfer->texture);
 
    pipe_buffer_unmap( screen, spt->buffer );
+
+   if (transfer->usage != PIPE_TRANSFER_READ) {
+      /* Mark the texture as dirty to expire the tile caches. */
+      spt->modified = TRUE;
+   }
 }
 
 
index 98ac75e..93c569c 100644 (file)
@@ -63,7 +63,7 @@ trace_drm_create_screen(struct drm_api *_api, int fd,
    screen = api->create_screen(api, fd, arg);
 
    return trace_screen_create(screen);
-};
+}
 
 static struct pipe_context *
 trace_drm_create_context(struct drm_api *_api,
@@ -82,7 +82,7 @@ trace_drm_create_context(struct drm_api *_api,
    pipe = trace_context_create(_screen, pipe);
 
    return pipe;
-};
+}
 
 static boolean
 trace_drm_buffer_from_texture(struct drm_api *_api,
@@ -102,7 +102,7 @@ trace_drm_buffer_from_texture(struct drm_api *_api,
    result = api->buffer_from_texture(api, texture, &buffer, stride);
 
    if (result && _buffer)
-      buffer = trace_buffer_create(trace_screen(texture->screen), buffer);
+      buffer = trace_buffer_create(trace_screen(_texture->screen), buffer);
 
    if (_buffer)
       *_buffer = buffer;
index 5b1e26a..26f1c04 100644 (file)
@@ -462,6 +462,7 @@ trace_screen_surface_buffer_create(struct pipe_screen *_screen,
                                    unsigned width, unsigned height,
                                    enum pipe_format format,
                                    unsigned usage,
+                                   unsigned tex_usage,
                                    unsigned *pstride)
 {
    struct trace_screen *tr_scr = trace_screen(_screen);
@@ -476,11 +477,13 @@ trace_screen_surface_buffer_create(struct pipe_screen *_screen,
    trace_dump_arg(uint, height);
    trace_dump_arg(format, format);
    trace_dump_arg(uint, usage);
+   trace_dump_arg(uint, tex_usage);
 
    result = screen->surface_buffer_create(screen,
                                           width, height,
                                           format,
                                           usage,
+                                          tex_usage,
                                           pstride);
 
    stride = *pstride;
index f4a29e6..a1542da 100644 (file)
@@ -140,6 +140,7 @@ struct pipe_winsys
                                                unsigned width, unsigned height,
                                                enum pipe_format format,
                                                unsigned usage,
+                                               unsigned tex_usage,
                                                unsigned *stride);
 
 
index bc4bc70..b01ab6d 100644 (file)
@@ -191,9 +191,9 @@ enum pipe_texture_target {
  * Transfer object usage flags
  */
 enum pipe_transfer_usage {
-   PIPE_TRANSFER_READ,
-   PIPE_TRANSFER_WRITE,
-   PIPE_TRANSFER_READ_WRITE  /**< Read/modify/write */
+   PIPE_TRANSFER_READ = (1 << 0),
+   PIPE_TRANSFER_WRITE = (1 << 1),
+   PIPE_TRANSFER_READ_WRITE = PIPE_TRANSFER_READ | PIPE_TRANSFER_WRITE /**< Read/modify/write */
 };
 
 
index 6cbdd75..3f30c52 100644 (file)
@@ -194,6 +194,7 @@ struct pipe_screen {
                                                unsigned width, unsigned height,
                                                enum pipe_format format,
                                                unsigned usage,
+                                               unsigned tex_usage,
                                                unsigned *stride);
 
 
index b00cfe3..f0ba4fb 100644 (file)
@@ -78,6 +78,7 @@ enum tgsi_file_type {
    TGSI_FILE_SAMPLER     =5,
    TGSI_FILE_ADDRESS     =6,
    TGSI_FILE_IMMEDIATE   =7,
+   TGSI_FILE_LOOP        =8,
    TGSI_FILE_COUNT      /**< how many TGSI_FILE_ types */
 };
 
@@ -152,13 +153,16 @@ struct tgsi_immediate
    unsigned Extended   : 1;  /**< BOOL */
 };
 
-struct tgsi_immediate_float32
+union tgsi_immediate_data
 {
    float Float;
 };
 
-/*
- * GL_NV_vertex_program
+/* TGSI opcodes.  
+ * 
+ * For more information on semantics of opcodes and
+ * which APIs are known to use which opcodes, see
+ * auxiliary/tgsi/tgsi-instruction-set.txt
  */
 #define TGSI_OPCODE_ARL                 0
 #define TGSI_OPCODE_MOV                 1
@@ -177,62 +181,32 @@ struct tgsi_immediate_float32
 #define TGSI_OPCODE_SLT                 14
 #define TGSI_OPCODE_SGE                 15
 #define TGSI_OPCODE_MAD                 16
-
-/*
- * GL_ATI_fragment_shader
- */
 #define TGSI_OPCODE_SUB                 17
-#define TGSI_OPCODE_DOT3                TGSI_OPCODE_DP3
-#define TGSI_OPCODE_DOT4                TGSI_OPCODE_DP4
-#define TGSI_OPCODE_LERP                18
+#define TGSI_OPCODE_LRP                 18
 #define TGSI_OPCODE_CND                 19
 #define TGSI_OPCODE_CND0                20
-#define TGSI_OPCODE_DOT2ADD             21
-
-/*
- * GL_EXT_vertex_shader
- */
-#define TGSI_OPCODE_INDEX               22   /* considered for removal */
-#define TGSI_OPCODE_NEGATE              23   /* considered for removal */
-#define TGSI_OPCODE_MADD                TGSI_OPCODE_MAD
-#define TGSI_OPCODE_FRAC                24
-#define TGSI_OPCODE_SETGE               TGSI_OPCODE_SGE
-#define TGSI_OPCODE_SETLT               TGSI_OPCODE_SLT
+#define TGSI_OPCODE_DP2A                21
+                                /* gap */
+#define TGSI_OPCODE_FRC                 24
 #define TGSI_OPCODE_CLAMP               25
-#define TGSI_OPCODE_FLOOR               26
+#define TGSI_OPCODE_FLR                 26
 #define TGSI_OPCODE_ROUND               27
-#define TGSI_OPCODE_EXPBASE2            28
-#define TGSI_OPCODE_LOGBASE2            29
-#define TGSI_OPCODE_POWER               30
-#define TGSI_OPCODE_RECIP               TGSI_OPCODE_RCP
-#define TGSI_OPCODE_RECIPSQRT           TGSI_OPCODE_RSQ
-#define TGSI_OPCODE_CROSSPRODUCT        31
-#define TGSI_OPCODE_MULTIPLYMATRIX      32   /* considered for removal */
-
-/*
- * GL_NV_vertex_program1_1
- */
+#define TGSI_OPCODE_EX2                 28
+#define TGSI_OPCODE_LG2                 29
+#define TGSI_OPCODE_POW                 30
+#define TGSI_OPCODE_XPD                 31
+                                /* gap */
 #define TGSI_OPCODE_ABS                 33
 #define TGSI_OPCODE_RCC                 34
 #define TGSI_OPCODE_DPH                 35
-
-/*
- * GL_NV_fragment_program
- */
 #define TGSI_OPCODE_COS                 36
 #define TGSI_OPCODE_DDX                 37
 #define TGSI_OPCODE_DDY                 38
-#define TGSI_OPCODE_EX2                 TGSI_OPCODE_EXPBASE2
-#define TGSI_OPCODE_FLR                 TGSI_OPCODE_FLOOR
-#define TGSI_OPCODE_FRC                 TGSI_OPCODE_FRAC
 #define TGSI_OPCODE_KILP                39  /* predicated kill */
-#define TGSI_OPCODE_LG2                 TGSI_OPCODE_LOGBASE2
-#define TGSI_OPCODE_LRP                 TGSI_OPCODE_LERP
 #define TGSI_OPCODE_PK2H                40
 #define TGSI_OPCODE_PK2US               41
 #define TGSI_OPCODE_PK4B                42
 #define TGSI_OPCODE_PK4UB               43
-#define TGSI_OPCODE_POW                 TGSI_OPCODE_POWER
 #define TGSI_OPCODE_RFL                 44
 #define TGSI_OPCODE_SEQ                 45
 #define TGSI_OPCODE_SFL                 46
@@ -249,66 +223,29 @@ struct tgsi_immediate_float32
 #define TGSI_OPCODE_UP4B                57
 #define TGSI_OPCODE_UP4UB               58
 #define TGSI_OPCODE_X2D                 59
-
-/*
- * GL_NV_vertex_program2
- */
 #define TGSI_OPCODE_ARA                 60
 #define TGSI_OPCODE_ARR                 61
 #define TGSI_OPCODE_BRA                 62
 #define TGSI_OPCODE_CAL                 63
 #define TGSI_OPCODE_RET                 64
-#define TGSI_OPCODE_SSG                 65
-
-/*
- * GL_ARB_vertex_program
- */
-#define TGSI_OPCODE_SWZ                 118
-#define TGSI_OPCODE_XPD                 TGSI_OPCODE_CROSSPRODUCT
-
-/*
- * GL_ARB_fragment_program
- */
+#define TGSI_OPCODE_SSG                 65 /* SGN */
 #define TGSI_OPCODE_CMP                 66
-#define TGSI_OPCODE_KIL                 116  /* conditional kill */
 #define TGSI_OPCODE_SCS                 67
 #define TGSI_OPCODE_TXB                 68
-
-/*
- * GL_NV_fragment_program_option
- */
-/* No new opcode */
-
-/*
- * GL_NV_fragment_program2
- */
 #define TGSI_OPCODE_NRM                 69
 #define TGSI_OPCODE_DIV                 70
 #define TGSI_OPCODE_DP2                 71
-#define TGSI_OPCODE_DP2A                TGSI_OPCODE_DOT2ADD
 #define TGSI_OPCODE_TXL                 72
 #define TGSI_OPCODE_BRK                 73
 #define TGSI_OPCODE_IF                  74
-#define TGSI_OPCODE_LOOP                75
+#define TGSI_OPCODE_BGNFOR              75
 #define TGSI_OPCODE_REP                 76
 #define TGSI_OPCODE_ELSE                77
 #define TGSI_OPCODE_ENDIF               78
-#define TGSI_OPCODE_ENDLOOP             79
+#define TGSI_OPCODE_ENDFOR              79
 #define TGSI_OPCODE_ENDREP              80
-
-/*
- * GL_NV_vertex_program2_option
- */
-
-/*
- * GL_NV_vertex_program3
- */
 #define TGSI_OPCODE_PUSHA               81
 #define TGSI_OPCODE_POPA                82
-
-/*
- * GL_NV_gpu_program4
- */
 #define TGSI_OPCODE_CEIL                83
 #define TGSI_OPCODE_I2F                 84
 #define TGSI_OPCODE_NOT                 85
@@ -323,103 +260,25 @@ struct tgsi_immediate_float32
 #define TGSI_OPCODE_TXF                 94
 #define TGSI_OPCODE_TXQ                 95
 #define TGSI_OPCODE_CONT                96
-
-/*
- * GL_NV_vertex_program4
- */
-/* Same as GL_NV_gpu_program4 */
-
-/*
- * GL_NV_fragment_program4
- */
-/* Same as GL_NV_gpu_program4 */
-
-/*
- * GL_NV_geometry_program4
- */
-/* Same as GL_NV_gpu_program4 */
 #define TGSI_OPCODE_EMIT                97
 #define TGSI_OPCODE_ENDPRIM             98
-
-/*
- * GLSL
- */
-#define TGSI_OPCODE_BGNLOOP2            99
+#define TGSI_OPCODE_BGNLOOP             99
 #define TGSI_OPCODE_BGNSUB              100
-#define TGSI_OPCODE_ENDLOOP2            101
+#define TGSI_OPCODE_ENDLOOP             101
 #define TGSI_OPCODE_ENDSUB              102
-#define TGSI_OPCODE_INT                 TGSI_OPCODE_TRUNC
 #define TGSI_OPCODE_NOISE1              103
 #define TGSI_OPCODE_NOISE2              104
 #define TGSI_OPCODE_NOISE3              105
 #define TGSI_OPCODE_NOISE4              106
 #define TGSI_OPCODE_NOP                 107
-
-/*
- * ps_1_1
- */
-#define TGSI_OPCODE_TEXKILL             TGSI_OPCODE_KIL
-
-/*
- * ps_1_2
- */
-/* CMP - use TGSI_OPCODE_CND0 */
-
-/*
- * ps_1_3
- */
-/* CMP - use TGSI_OPCODE_CND0 */
-
-/*
- * ps_1_4
- */
-#define TGSI_OPCODE_TEXLD               TGSI_OPCODE_TEX
-
-/*
- * ps_2_0
- */
-#define TGSI_OPCODE_M4X4                TGSI_OPCODE_MULTIPLYMATRIX
-#define TGSI_OPCODE_M4X3                108
-#define TGSI_OPCODE_M3X4                109
-#define TGSI_OPCODE_M3X3                110
-#define TGSI_OPCODE_M3X2                111
-#define TGSI_OPCODE_CRS                 TGSI_OPCODE_XPD
+                                /* gap */
 #define TGSI_OPCODE_NRM4                112
-#define TGSI_OPCODE_SINCOS              TGSI_OPCODE_SCS
-#define TGSI_OPCODE_TEXLDB              TGSI_OPCODE_TXB
-#define TGSI_OPCODE_DP2ADD              TGSI_OPCODE_DP2A
-
-/*
- * ps_2_x
- */
-#define TGSI_OPCODE_CALL                TGSI_OPCODE_CAL
 #define TGSI_OPCODE_CALLNZ              113
 #define TGSI_OPCODE_IFC                 114
-#define TGSI_OPCODE_BREAK               TGSI_OPCODE_BRK
 #define TGSI_OPCODE_BREAKC              115
-#define TGSI_OPCODE_DSX                 TGSI_OPCODE_DDX
-#define TGSI_OPCODE_DSY                 TGSI_OPCODE_DDY
-#define TGSI_OPCODE_TEXLDD              TGSI_OPCODE_TXD
-
-/*
- * vs_1_1
- */
-#define TGSI_OPCODE_EXPP                TGSI_OPCODE_EXP
-#define TGSI_OPCODE_LOGP                TGSI_OPCODE_LG2
-
-/*
- * vs_2_0
- */
-#define TGSI_OPCODE_SGN                 TGSI_OPCODE_SSG
-#define TGSI_OPCODE_MOVA                TGSI_OPCODE_ARR
-/* EXPP - use TGSI_OPCODE_EX2 */
-
-/*
- * vs_2_x
- */
-
+#define TGSI_OPCODE_KIL                 116  /* conditional kill */
 #define TGSI_OPCODE_END                 117  /* aka HALT */
-
+#define TGSI_OPCODE_SWZ                 118
 #define TGSI_OPCODE_LAST                119
 
 #define TGSI_SAT_NONE            0  /* do not saturate */
index 6c61719..830e511 100644 (file)
@@ -109,9 +109,6 @@ dri_destroy_context(__DRIcontextPrivate * cPriv)
     */
    st_flush(ctx->st, 0, NULL);
 
-   if (screen->dummyContext == ctx)
-      screen->dummyContext = NULL;
-
    /* Also frees ctx->pipe?
     */
    st_destroy_context(ctx->st);
@@ -153,11 +150,6 @@ dri_make_current(__DRIcontextPrivate * cPriv,
 
       ++ctx->bind_count;
 
-      /* This is for situations in which we need a rendering context but
-       * there may not be any currently bound.
-       */
-      screen->dummyContext = ctx;
-
       if (ctx->dPriv != driDrawPriv) {
         ctx->dPriv = driDrawPriv;
         ctx->d_stamp = driDrawPriv->lastStamp - 1;
index 1d91fbb..0a952f7 100644 (file)
@@ -204,6 +204,30 @@ dri_get_buffers(__DRIdrawablePrivate * dPriv)
    st_resize_framebuffer(drawable->stfb, dri_drawable->w, dri_drawable->h);
 }
 
+/**
+ * These are used for GLX_EXT_texture_from_pixmap
+ */
+void dri2_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target,
+                          GLint format, __DRIdrawable *dPriv)
+{
+   struct dri_drawable *drawable = dri_drawable(dPriv);
+   struct pipe_surface *ps;
+
+   dri_get_buffers(drawable->dPriv);
+   st_get_framebuffer_surface(drawable->stfb, ST_SURFACE_FRONT_LEFT, &ps);
+
+   st_bind_texture_surface(ps, target == GL_TEXTURE_2D ? ST_TEXTURE_2D :
+                           ST_TEXTURE_RECT, 0,
+                           format == GLX_TEXTURE_FORMAT_RGBA_EXT ?
+                           PIPE_FORMAT_R8G8B8A8_UNORM : PIPE_FORMAT_R8G8B8X8_UNORM);
+}
+
+void dri2_set_tex_buffer(__DRIcontext *pDRICtx, GLint target,
+                         __DRIdrawable *dPriv)
+{
+   dri2_set_tex_buffer2(pDRICtx, target, GLX_TEXTURE_FORMAT_RGBA_EXT, dPriv);
+}
+
 void
 dri_flush_frontbuffer(struct pipe_screen *screen,
                      struct pipe_surface *surf, void *context_private)
index 2fbd5f1..dfd0b87 100644 (file)
@@ -91,6 +91,12 @@ void dri_get_buffers(__DRIdrawablePrivate * dPriv);
 
 void dri_destroy_buffer(__DRIdrawablePrivate * dPriv);
 
+void dri2_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target,
+                          GLint glx_texture_format, __DRIdrawable *dPriv);
+
+void dri2_set_tex_buffer(__DRIcontext *pDRICtx, GLint target,
+                         __DRIdrawable *dPriv);
+
 void
 dri1_update_drawables(struct dri_context *ctx,
                      struct dri_drawable *draw, struct dri_drawable *read);
index 5f78b72..2555512 100644 (file)
@@ -57,12 +57,19 @@ PUBLIC const char __driConfigOptions[] =
 
    const uint __driNConfigOptions = 3;
 
+static const __DRItexBufferExtension dri2TexBufferExtension = {
+    { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION },
+   dri2_set_tex_buffer,
+   dri2_set_tex_buffer2,
+};
+
    static const __DRIextension *dri_screen_extensions[] = {
       &driReadDrawableExtension,
       &driCopySubBufferExtension.base,
       &driSwapControlExtension.base,
       &driFrameTrackingExtension.base,
       &driMediaStreamCounterExtension.base,
+      &dri2TexBufferExtension.base,
       NULL
    };
 
index f3335bb..f6c56d0 100644 (file)
@@ -49,12 +49,6 @@ struct dri_screen
     */
    driOptionCache optionCache;
 
-   /**
-    * Temporary(?) context to use for SwapBuffers or other situations in
-    * which we need a rendering context, but none is currently bound.
-    */
-   struct dri_context *dummyContext;
-
    /* drm */
    int fd;
    drmLock *drmLock;
index e2da218..2c8f51c 100644 (file)
@@ -148,7 +148,7 @@ drm_destroy_context(_EGLDriver *drv, EGLDisplay dpy, EGLContext context)
 {
        struct drm_context *c = lookup_drm_context(context);
         _eglUnlinkContext(&c->base);
-       if (!c->base.IsBound) {
+       if (!_eglIsContextBound(&c->base)) {
                st_destroy_context(c->st);
                c->pipe->destroy(c->pipe);
                free(c);
index 86f2ea9..d4cd2d3 100644 (file)
@@ -98,8 +98,8 @@ drm_create_texture(_EGLDriver *drv,
                goto err_buf;
 
        memset(&templat, 0, sizeof(templat));
-       templat.tex_usage |= PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
-       templat.tex_usage |= PIPE_TEXTURE_USAGE_RENDER_TARGET;
+       templat.tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET;
+       templat.tex_usage |= PIPE_TEXTURE_USAGE_PRIMARY;
        templat.target = PIPE_TEXTURE_2D;
        templat.last_level = 0;
        templat.depth[0] = 1;
@@ -366,7 +366,7 @@ drm_destroy_surface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
        struct drm_surface *surf = lookup_drm_surface(surface);
        _eglUnlinkSurface(&surf->base);
 
-       if (!surf->base.IsBound) {
+       if (!_eglIsSurfaceBound(&surf->base)) {
                if (surf->screen)
                        drm_takedown_shown_screen(drv, surf->screen);
                st_unreference_framebuffer(surf->stfb);
index 6d10b09..7b2adc6 100644 (file)
@@ -5,13 +5,12 @@ LIBNAME = xlib
 
 LIBRARY_INCLUDES = \
        -I$(TOP)/include \
-       -I$(TOP)/src/mesa \
-       -I$(TOP)/src/mesa/main
+       -I$(TOP)/src/mesa
 
 C_SOURCES = \
-       glxapi.c \
-       fakeglx.c \
-       fakeglx_fonts.c \
+       glx_api.c \
+       glx_getproc.c \
+       glx_usefont.c \
        xm_api.c
 
 include ../../../Makefile.template
index 0dbe341..04a44c3 100644 (file)
@@ -18,9 +18,10 @@ if env['platform'] == 'linux' \
 
     st_xlib = env.ConvenienceLibrary(
        target = 'st_xlib',
-       source = [ 'glxapi.c',
-               'fakeglx.c',
-               'fakeglx_fonts.c',
+       source = [
+               'glx_api.c',
+               'glx_getproc.c',
+               'glx_usefont.c',
                'xm_api.c',
                ]
     )
diff --git a/src/gallium/state_trackers/glx/xlib/fakeglx.h b/src/gallium/state_trackers/glx/xlib/fakeglx.h
deleted file mode 100644 (file)
index e5fd960..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-
-/*
- * Mesa 3-D graphics library
- * Version:  3.5
- *
- * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-#ifndef FAKEGLX_H
-#define FAKEGLX_H
-
-
-#include <X11/Xlib.h>
-
-struct _glxapi_table;
-
-extern struct _glxapi_table *_mesa_GetGLXDispatchTable(void);
-
-extern void Fake_glXUseXFont( Font font, int first, int count, int listbase );
-
-
-#endif
-
@@ -1,8 +1,9 @@
 /*
  * Mesa 3-D graphics library
- * Version:  7.1
+ * Version:  7.6
  *
  * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
+ * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  */
 
 
-/*
- * This is an emulation of the GLX API which allows Mesa/GLX-based programs
- * to run on X servers which do not have the real GLX extension.
- *
- * Thanks to the contributors:
- *
- * Initial version:  Philip Brown (phil@bolthole.com)
- * Better glXGetConfig() support: Armin Liebchen (liebchen@asylum.cs.utah.edu)
- * Further visual-handling refinements: Wolfram Gloger
- *    (wmglo@Dent.MED.Uni-Muenchen.DE).
- *
- * Notes:
- *   Don't be fooled, stereo isn't supported yet.
+/**
+ * "Fake" GLX API implemented in terms of the XMesa*() functions.
  */
 
 
 
-#include "glxapi.h"
+#define GLX_GLXEXT_PROTOTYPES
+#include "GL/glx.h"
+
 #include "xm_api.h"
-#include "context.h"
-#include "config.h"
-#include "macros.h"
-#include "imports.h"
-#include "version.h"
-#include "fakeglx.h"
+#include "main/context.h"
+#include "main/config.h"
+#include "main/macros.h"
+#include "main/imports.h"
+#include "main/version.h"
 #include "state_tracker/st_context.h"
 #include "state_tracker/st_public.h"
 
    "GLX_SGIX_fbconfig " \
    "GLX_SGIX_pbuffer "
 
-/*
- * Our fake GLX context will contain a "real" GLX context and an XMesa context.
- *
- * Note that a pointer to a __GLXcontext is a pointer to a fake_glx_context,
- * and vice versa.
- *
- * We really just need this structure in order to make the libGL functions
- * glXGetCurrentContext(), glXGetCurrentDrawable() and glXGetCurrentDisplay()
- * work correctly.
+#define DEFAULT_DIRECT GL_TRUE
+
+
+
+/**
+ * The GLXContext typedef is defined as a pointer to this structure.
  */
-struct fake_glx_context {
-   __GLXcontext glxContext;   /* this MUST be first! */
+struct __GLXcontextRec
+{
+   Display *currentDpy;
+   GLboolean isDirect;
+   GLXDrawable currentDrawable;
+   GLXDrawable currentReadable;
+   XID xid;
+
    XMesaContext xmesaContext;
 };
 
 
 
-#define DEFAULT_DIRECT GL_TRUE
+static pipe_tsd ContextTSD;
+
+/** Set current context for calling thread */
+static void
+SetCurrentContext(GLXContext c)
+{
+   pipe_tsd_set(&ContextTSD, c);
+}
+
+/** Get current context for calling thread */
+static GLXContext
+GetCurrentContext(void)
+{
+   return pipe_tsd_get(&ContextTSD);
+}
+
+
+
+/**********************************************************************/
+/***                     Debug helper code                          ***/
+/**********************************************************************/
+
+extern void _kw_ungrab_all( Display *dpy );
+void _kw_ungrab_all( Display *dpy )
+{
+   XUngrabPointer( dpy, CurrentTime );
+   XUngrabKeyboard( dpy, CurrentTime );
+}
+
 
 
 /**********************************************************************/
@@ -366,10 +388,6 @@ find_glx_visual( Display *dpy, XVisualInfo *vinfo )
 }
 
 
-
-
-
-
 /**
  * Try to get an X visual which matches the given arguments.
  */
@@ -418,7 +436,6 @@ get_visual( Display *dpy, int scr, unsigned int depth, int xclass )
 }
 
 
-
 /*
  * Retrieve the value of the given environment variable and find
  * the X visual which matches it.
@@ -1002,8 +1019,8 @@ choose_visual( Display *dpy, int screen, const int *list, GLboolean fbConfig )
 }
 
 
-static XVisualInfo *
-Fake_glXChooseVisual( Display *dpy, int screen, int *list )
+XVisualInfo *
+glXChooseVisual( Display *dpy, int screen, int *list )
 {
    XMesaVisual xmvis;
 
@@ -1024,18 +1041,18 @@ Fake_glXChooseVisual( Display *dpy, int screen, int *list )
 }
 
 
-static GLXContext
-Fake_glXCreateContext( Display *dpy, XVisualInfo *visinfo,
-                       GLXContext share_list, Bool direct )
+GLXContext
+glXCreateContext( Display *dpy, XVisualInfo *visinfo,
+                  GLXContext share_list, Bool direct )
 {
    XMesaVisual xmvis;
-   struct fake_glx_context *glxCtx;
-   struct fake_glx_context *shareCtx = (struct fake_glx_context *) share_list;
+   GLXContext glxCtx;
+   GLXContext shareCtx = share_list;
 
    if (!dpy || !visinfo)
       return 0;
 
-   glxCtx = CALLOC_STRUCT(fake_glx_context);
+   glxCtx = CALLOC_STRUCT(__GLXcontextRec);
    if (!glxCtx)
       return 0;
 
@@ -1062,13 +1079,11 @@ Fake_glXCreateContext( Display *dpy, XVisualInfo *visinfo,
       return NULL;
    }
 
-   glxCtx->glxContext.isDirect = DEFAULT_DIRECT;
-   glxCtx->glxContext.currentDpy = dpy;
-   glxCtx->glxContext.xid = (XID) glxCtx;  /* self pointer */
-
-   assert((void *) glxCtx == (void *) &(glxCtx->glxContext));
+   glxCtx->isDirect = DEFAULT_DIRECT;
+   glxCtx->currentDpy = dpy;
+   glxCtx->xid = (XID) glxCtx;  /* self pointer */
 
-   return (GLXContext) glxCtx;
+   return glxCtx;
 }
 
 
@@ -1081,11 +1096,11 @@ static XMesaBuffer MakeCurrent_PrevReadBuffer = 0;
 
 
 /* GLX 1.3 and later */
-static Bool
-Fake_glXMakeContextCurrent( Display *dpy, GLXDrawable draw,
-                            GLXDrawable read, GLXContext ctx )
+Bool
+glXMakeContextCurrent( Display *dpy, GLXDrawable draw,
+                       GLXDrawable read, GLXContext ctx )
 {
-   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
+   GLXContext glxCtx = ctx;
    static boolean firsttime = 1, no_rast = 0;
 
    if (firsttime) {
@@ -1093,7 +1108,6 @@ Fake_glXMakeContextCurrent( Display *dpy, GLXDrawable draw,
       firsttime = 0;
    }
 
-
    if (ctx && draw && read) {
       XMesaBuffer drawBuffer, readBuffer;
       XMesaContext xmctx = glxCtx->xmesaContext;
@@ -1148,9 +1162,10 @@ Fake_glXMakeContextCurrent( Display *dpy, GLXDrawable draw,
 
       /* Now make current! */
       if (XMesaMakeCurrent2(xmctx, drawBuffer, readBuffer)) {
-         ((__GLXcontext *) ctx)->currentDpy = dpy;
-         ((__GLXcontext *) ctx)->currentDrawable = draw;
-         ((__GLXcontext *) ctx)->currentReadable = read;
+         ctx->currentDpy = dpy;
+         ctx->currentDrawable = draw;
+         ctx->currentReadable = read;
+         SetCurrentContext(ctx);
          return True;
       }
       else {
@@ -1165,6 +1180,7 @@ Fake_glXMakeContextCurrent( Display *dpy, GLXDrawable draw,
       MakeCurrent_PrevReadable = 0;
       MakeCurrent_PrevDrawBuffer = 0;
       MakeCurrent_PrevReadBuffer = 0;
+      SetCurrentContext(NULL);
       return True;
    }
    else {
@@ -1176,15 +1192,61 @@ Fake_glXMakeContextCurrent( Display *dpy, GLXDrawable draw,
 }
 
 
-static Bool
-Fake_glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx )
+Bool
+glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx )
 {
-   return Fake_glXMakeContextCurrent( dpy, drawable, drawable, ctx );
+   return glXMakeContextCurrent( dpy, drawable, drawable, ctx );
 }
 
 
-static GLXPixmap
-Fake_glXCreateGLXPixmap( Display *dpy, XVisualInfo *visinfo, Pixmap pixmap )
+GLXContext
+glXGetCurrentContext(void)
+{
+   return GetCurrentContext();
+}
+
+
+Display *
+glXGetCurrentDisplay(void)
+{
+   GLXContext glxCtx = glXGetCurrentContext();
+
+   return glxCtx ? glxCtx->currentDpy : NULL;
+}
+
+
+Display *
+glXGetCurrentDisplayEXT(void)
+{
+   return glXGetCurrentDisplay();
+}
+
+
+GLXDrawable
+glXGetCurrentDrawable(void)
+{
+   GLXContext gc = glXGetCurrentContext();
+   return gc ? gc->currentDrawable : 0;
+}
+
+
+GLXDrawable
+glXGetCurrentReadDrawable(void)
+{
+   GLXContext gc = glXGetCurrentContext();
+   return gc ? gc->currentReadable : 0;
+}
+
+
+GLXDrawable
+glXGetCurrentReadDrawableSGI(void)
+{
+   return glXGetCurrentReadDrawable();
+}
+
+
+GLXPixmap
+glXCreateGLXPixmap( Display *dpy, XVisualInfo *visinfo, Pixmap pixmap )
 {
    XMesaVisual v;
    XMesaBuffer b;
@@ -1208,9 +1270,9 @@ Fake_glXCreateGLXPixmap( Display *dpy, XVisualInfo *visinfo, Pixmap pixmap )
 
 /*** GLX_MESA_pixmap_colormap ***/
 
-static GLXPixmap
-Fake_glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visinfo,
-                             Pixmap pixmap, Colormap cmap )
+GLXPixmap
+glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visinfo,
+                        Pixmap pixmap, Colormap cmap )
 {
    XMesaVisual v;
    XMesaBuffer b;
@@ -1232,8 +1294,8 @@ Fake_glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visinfo,
 }
 
 
-static void
-Fake_glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap )
+void
+glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap )
 {
    XMesaBuffer b = XMesaFindBuffer(dpy, pixmap);
    if (b) {
@@ -1245,12 +1307,12 @@ Fake_glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap )
 }
 
 
-static void
-Fake_glXCopyContext( Display *dpy, GLXContext src, GLXContext dst,
-                     unsigned long mask )
+void
+glXCopyContext( Display *dpy, GLXContext src, GLXContext dst,
+                unsigned long mask )
 {
-   struct fake_glx_context *fakeSrc = (struct fake_glx_context *) src;
-   struct fake_glx_context *fakeDst = (struct fake_glx_context *) dst;
+   GLXContext fakeSrc = src;
+   GLXContext fakeDst = dst;
    XMesaContext xm_src = fakeSrc->xmesaContext;
    XMesaContext xm_dst = fakeDst->xmesaContext;
    (void) dpy;
@@ -1261,8 +1323,8 @@ Fake_glXCopyContext( Display *dpy, GLXContext src, GLXContext dst,
 }
 
 
-static Bool
-Fake_glXQueryExtension( Display *dpy, int *errorb, int *event )
+Bool
+glXQueryExtension( Display *dpy, int *errorb, int *event )
 {
    /* Mesa's GLX isn't really an X extension but we try to act like one. */
    (void) dpy;
@@ -1272,18 +1334,10 @@ Fake_glXQueryExtension( Display *dpy, int *errorb, int *event )
 }
 
 
-extern void _kw_ungrab_all( Display *dpy );
-void _kw_ungrab_all( Display *dpy )
-{
-   XUngrabPointer( dpy, CurrentTime );
-   XUngrabKeyboard( dpy, CurrentTime );
-}
-
-
-static void
-Fake_glXDestroyContext( Display *dpy, GLXContext ctx )
+void
+glXDestroyContext( Display *dpy, GLXContext ctx )
 {
-   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
+   GLXContext glxCtx = ctx;
    (void) dpy;
    MakeCurrent_PrevContext = 0;
    MakeCurrent_PrevDrawable = 0;
@@ -1296,18 +1350,18 @@ Fake_glXDestroyContext( Display *dpy, GLXContext ctx )
 }
 
 
-static Bool
-Fake_glXIsDirect( Display *dpy, GLXContext ctx )
+Bool
+glXIsDirect( Display *dpy, GLXContext ctx )
 {
-   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
+   GLXContext glxCtx = ctx;
    (void) ctx;
-   return glxCtx->glxContext.isDirect;
+   return glxCtx->isDirect;
 }
 
 
 
-static void
-Fake_glXSwapBuffers( Display *dpy, GLXDrawable drawable )
+void
+glXSwapBuffers( Display *dpy, GLXDrawable drawable )
 {
    XMesaBuffer buffer = XMesaFindBuffer( dpy, drawable );
    static boolean firsttime = 1, no_rast = 0;
@@ -1333,8 +1387,8 @@ Fake_glXSwapBuffers( Display *dpy, GLXDrawable drawable )
 
 /*** GLX_MESA_copy_sub_buffer ***/
 
-static void
-Fake_glXCopySubBufferMESA( Display *dpy, GLXDrawable drawable,
+void
+glXCopySubBufferMESA( Display *dpy, GLXDrawable drawable,
                            int x, int y, int width, int height )
 {
    XMesaBuffer buffer = XMesaFindBuffer( dpy, drawable );
@@ -1347,8 +1401,8 @@ Fake_glXCopySubBufferMESA( Display *dpy, GLXDrawable drawable,
 }
 
 
-static Bool
-Fake_glXQueryVersion( Display *dpy, int *maj, int *min )
+Bool
+glXQueryVersion( Display *dpy, int *maj, int *min )
 {
    (void) dpy;
    /* Return GLX version, not Mesa version */
@@ -1564,8 +1618,8 @@ get_config( XMesaVisual xmvis, int attrib, int *value, GLboolean fbconfig )
 }
 
 
-static int
-Fake_glXGetConfig( Display *dpy, XVisualInfo *visinfo,
+int
+glXGetConfig( Display *dpy, XVisualInfo *visinfo,
                    int attrib, int *value )
 {
    XMesaVisual xmvis;
@@ -1594,8 +1648,8 @@ Fake_glXGetConfig( Display *dpy, XVisualInfo *visinfo,
 }
 
 
-static void
-Fake_glXWaitGL( void )
+void
+glXWaitGL( void )
 {
    XMesaContext xmesa = XMesaGetCurrentContext();
    XMesaFlush( xmesa );
@@ -1603,8 +1657,8 @@ Fake_glXWaitGL( void )
 
 
 
-static void
-Fake_glXWaitX( void )
+void
+glXWaitX( void )
 {
    XMesaContext xmesa = XMesaGetCurrentContext();
    XMesaFlush( xmesa );
@@ -1620,8 +1674,8 @@ get_extensions( void )
 
 
 /* GLX 1.1 and later */
-static const char *
-Fake_glXQueryExtensionsString( Display *dpy, int screen )
+const char *
+glXQueryExtensionsString( Display *dpy, int screen )
 {
    (void) dpy;
    (void) screen;
@@ -1631,8 +1685,8 @@ Fake_glXQueryExtensionsString( Display *dpy, int screen )
 
 
 /* GLX 1.1 and later */
-static const char *
-Fake_glXQueryServerString( Display *dpy, int screen, int name )
+const char *
+glXQueryServerString( Display *dpy, int screen, int name )
 {
    static char version[1000];
    _mesa_sprintf(version, "%d.%d %s",
@@ -1656,8 +1710,8 @@ Fake_glXQueryServerString( Display *dpy, int screen, int name )
 
 
 /* GLX 1.1 and later */
-static const char *
-Fake_glXGetClientString( Display *dpy, int name )
+const char *
+glXGetClientString( Display *dpy, int name )
 {
    static char version[1000];
    _mesa_sprintf(version, "%d.%d %s", CLIENT_MAJOR_VERSION,
@@ -1684,8 +1738,8 @@ Fake_glXGetClientString( Display *dpy, int name )
  */
 
 
-static int
-Fake_glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config,
+int
+glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config,
                            int attribute, int *value )
 {
    XMesaVisual v = (XMesaVisual) config;
@@ -1699,8 +1753,8 @@ Fake_glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config,
 }
 
 
-static GLXFBConfig *
-Fake_glXGetFBConfigs( Display *dpy, int screen, int *nelements )
+GLXFBConfig *
+glXGetFBConfigs( Display *dpy, int screen, int *nelements )
 {
    XVisualInfo *visuals, visTemplate;
    const long visMask = VisualScreenMask;
@@ -1725,15 +1779,15 @@ Fake_glXGetFBConfigs( Display *dpy, int screen, int *nelements )
 }
 
 
-static GLXFBConfig *
-Fake_glXChooseFBConfig( Display *dpy, int screen,
+GLXFBConfig *
+glXChooseFBConfig( Display *dpy, int screen,
                         const int *attribList, int *nitems )
 {
    XMesaVisual xmvis;
 
    if (!attribList || !attribList[0]) {
       /* return list of all configs (per GLX_SGIX_fbconfig spec) */
-      return Fake_glXGetFBConfigs(dpy, screen, nitems);
+      return glXGetFBConfigs(dpy, screen, nitems);
    }
 
    xmvis = choose_visual(dpy, screen, attribList, GL_TRUE);
@@ -1754,8 +1808,8 @@ Fake_glXChooseFBConfig( Display *dpy, int screen,
 }
 
 
-static XVisualInfo *
-Fake_glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config )
+XVisualInfo *
+glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config )
 {
    if (dpy && config) {
       XMesaVisual xmvis = (XMesaVisual) config;
@@ -1776,8 +1830,8 @@ Fake_glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config )
 }
 
 
-static GLXWindow
-Fake_glXCreateWindow( Display *dpy, GLXFBConfig config, Window win,
+GLXWindow
+glXCreateWindow( Display *dpy, GLXFBConfig config, Window win,
                       const int *attribList )
 {
    XMesaVisual xmvis = (XMesaVisual) config;
@@ -1796,8 +1850,8 @@ Fake_glXCreateWindow( Display *dpy, GLXFBConfig config, Window win,
 }
 
 
-static void
-Fake_glXDestroyWindow( Display *dpy, GLXWindow window )
+void
+glXDestroyWindow( Display *dpy, GLXWindow window )
 {
    XMesaBuffer b = XMesaFindBuffer(dpy, (Drawable) window);
    if (b)
@@ -1807,8 +1861,8 @@ Fake_glXDestroyWindow( Display *dpy, GLXWindow window )
 
 
 /* XXX untested */
-static GLXPixmap
-Fake_glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap,
+GLXPixmap
+glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap,
                       const int *attribList )
 {
    XMesaVisual v = (XMesaVisual) config;
@@ -1917,8 +1971,8 @@ Fake_glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap,
 }
 
 
-static void
-Fake_glXDestroyPixmap( Display *dpy, GLXPixmap pixmap )
+void
+glXDestroyPixmap( Display *dpy, GLXPixmap pixmap )
 {
    XMesaBuffer b = XMesaFindBuffer(dpy, (Drawable)pixmap);
    if (b)
@@ -1927,8 +1981,8 @@ Fake_glXDestroyPixmap( Display *dpy, GLXPixmap pixmap )
 }
 
 
-static GLXPbuffer
-Fake_glXCreatePbuffer( Display *dpy, GLXFBConfig config,
+GLXPbuffer
+glXCreatePbuffer( Display *dpy, GLXFBConfig config,
                        const int *attribList )
 {
    XMesaVisual xmvis = (XMesaVisual) config;
@@ -1980,8 +2034,8 @@ Fake_glXCreatePbuffer( Display *dpy, GLXFBConfig config,
 }
 
 
-static void
-Fake_glXDestroyPbuffer( Display *dpy, GLXPbuffer pbuf )
+void
+glXDestroyPbuffer( Display *dpy, GLXPbuffer pbuf )
 {
    XMesaBuffer b = XMesaFindBuffer(dpy, pbuf);
    if (b) {
@@ -1990,8 +2044,8 @@ Fake_glXDestroyPbuffer( Display *dpy, GLXPbuffer pbuf )
 }
 
 
-static void
-Fake_glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute,
+void
+glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute,
                        unsigned int *value )
 {
    XMesaBuffer xmbuf = XMesaFindBuffer(dpy, draw);
@@ -2032,19 +2086,19 @@ Fake_glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute,
 }
 
 
-static GLXContext
-Fake_glXCreateNewContext( Display *dpy, GLXFBConfig config,
+GLXContext
+glXCreateNewContext( Display *dpy, GLXFBConfig config,
                           int renderType, GLXContext shareList, Bool direct )
 {
-   struct fake_glx_context *glxCtx;
-   struct fake_glx_context *shareCtx = (struct fake_glx_context *) shareList;
+   GLXContext glxCtx;
+   GLXContext shareCtx = shareList;
    XMesaVisual xmvis = (XMesaVisual) config;
 
    if (!dpy || !config ||
        (renderType != GLX_RGBA_TYPE && renderType != GLX_COLOR_INDEX_TYPE))
       return 0;
 
-   glxCtx = CALLOC_STRUCT(fake_glx_context);
+   glxCtx = CALLOC_STRUCT(__GLXcontextRec);
    if (!glxCtx)
       return 0;
 
@@ -2058,20 +2112,18 @@ Fake_glXCreateNewContext( Display *dpy, GLXFBConfig config,
       return NULL;
    }
 
-   glxCtx->glxContext.isDirect = DEFAULT_DIRECT;
-   glxCtx->glxContext.currentDpy = dpy;
-   glxCtx->glxContext.xid = (XID) glxCtx;  /* self pointer */
-
-   assert((void *) glxCtx == (void *) &(glxCtx->glxContext));
+   glxCtx->isDirect = DEFAULT_DIRECT;
+   glxCtx->currentDpy = dpy;
+   glxCtx->xid = (XID) glxCtx;  /* self pointer */
 
-   return (GLXContext) glxCtx;
+   return glxCtx;
 }
 
 
-static int
-Fake_glXQueryContext( Display *dpy, GLXContext ctx, int attribute, int *value )
+int
+glXQueryContext( Display *dpy, GLXContext ctx, int attribute, int *value )
 {
-   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
+   GLXContext glxCtx = ctx;
    XMesaContext xmctx = glxCtx->xmesaContext;
 
    (void) dpy;
@@ -2097,8 +2149,8 @@ Fake_glXQueryContext( Display *dpy, GLXContext ctx, int attribute, int *value )
 }
 
 
-static void
-Fake_glXSelectEvent( Display *dpy, GLXDrawable drawable, unsigned long mask )
+void
+glXSelectEvent( Display *dpy, GLXDrawable drawable, unsigned long mask )
 {
    XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
    if (xmbuf)
@@ -2106,8 +2158,8 @@ Fake_glXSelectEvent( Display *dpy, GLXDrawable drawable, unsigned long mask )
 }
 
 
-static void
-Fake_glXGetSelectedEvent( Display *dpy, GLXDrawable drawable,
+void
+glXGetSelectedEvent( Display *dpy, GLXDrawable drawable,
                           unsigned long *mask )
 {
    XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
@@ -2121,8 +2173,8 @@ Fake_glXGetSelectedEvent( Display *dpy, GLXDrawable drawable,
 
 /*** GLX_SGI_swap_control ***/
 
-static int
-Fake_glXSwapIntervalSGI(int interval)
+int
+glXSwapIntervalSGI(int interval)
 {
    (void) interval;
    return 0;
@@ -2134,16 +2186,16 @@ Fake_glXSwapIntervalSGI(int interval)
 
 static unsigned int FrameCounter = 0;
 
-static int
-Fake_glXGetVideoSyncSGI(unsigned int *count)
+int
+glXGetVideoSyncSGI(unsigned int *count)
 {
    /* this is a bogus implementation */
    *count = FrameCounter++;
    return 0;
 }
 
-static int
-Fake_glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
+int
+glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
 {
    if (divisor <= 0 || remainder < 0)
       return GLX_BAD_VALUE;
@@ -2159,15 +2211,15 @@ Fake_glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
 
 /*** GLX_SGI_make_current_read ***/
 
-static Bool
-Fake_glXMakeCurrentReadSGI(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)
+Bool
+glXMakeCurrentReadSGI(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)
 {
-   return Fake_glXMakeContextCurrent( dpy, draw, read, ctx );
+   return glXMakeContextCurrent( dpy, draw, read, ctx );
 }
 
 /* not used
 static GLXDrawable
-Fake_glXGetCurrentReadDrawableSGI(void)
+glXGetCurrentReadDrawableSGI(void)
 {
    return 0;
 }
@@ -2177,8 +2229,8 @@ Fake_glXGetCurrentReadDrawableSGI(void)
 /*** GLX_SGIX_video_source ***/
 #if defined(_VL_H)
 
-static GLXVideoSourceSGIX
-Fake_glXCreateGLXVideoSourceSGIX(Display *dpy, int screen, VLServer server, VLPath path, int nodeClass, VLNode drainNode)
+GLXVideoSourceSGIX
+glXCreateGLXVideoSourceSGIX(Display *dpy, int screen, VLServer server, VLPath path, int nodeClass, VLNode drainNode)
 {
    (void) dpy;
    (void) screen;
@@ -2189,8 +2241,8 @@ Fake_glXCreateGLXVideoSourceSGIX(Display *dpy, int screen, VLServer server, VLPa
    return 0;
 }
 
-static void
-Fake_glXDestroyGLXVideoSourceSGIX(Display *dpy, GLXVideoSourceSGIX src)
+void
+glXDestroyGLXVideoSourceSGIX(Display *dpy, GLXVideoSourceSGIX src)
 {
    (void) dpy;
    (void) src;
@@ -2201,30 +2253,30 @@ Fake_glXDestroyGLXVideoSourceSGIX(Display *dpy, GLXVideoSourceSGIX src)
 
 /*** GLX_EXT_import_context ***/
 
-static void
-Fake_glXFreeContextEXT(Display *dpy, GLXContext context)
+void
+glXFreeContextEXT(Display *dpy, GLXContext context)
 {
    (void) dpy;
    (void) context;
 }
 
-static GLXContextID
-Fake_glXGetContextIDEXT(const GLXContext context)
+GLXContextID
+glXGetContextIDEXT(const GLXContext context)
 {
    (void) context;
    return 0;
 }
 
-static GLXContext
-Fake_glXImportContextEXT(Display *dpy, GLXContextID contextID)
+GLXContext
+glXImportContextEXT(Display *dpy, GLXContextID contextID)
 {
    (void) dpy;
    (void) contextID;
    return 0;
 }
 
-static int
-Fake_glXQueryContextInfoEXT(Display *dpy, GLXContext context, int attribute, int *value)
+int
+glXQueryContextInfoEXT(Display *dpy, GLXContext context, int attribute, int *value)
 {
    (void) dpy;
    (void) context;
@@ -2237,21 +2289,21 @@ Fake_glXQueryContextInfoEXT(Display *dpy, GLXContext context, int attribute, int
 
 /*** GLX_SGIX_fbconfig ***/
 
-static int
-Fake_glXGetFBConfigAttribSGIX(Display *dpy, GLXFBConfigSGIX config, int attribute, int *value)
+int
+glXGetFBConfigAttribSGIX(Display *dpy, GLXFBConfigSGIX config, int attribute, int *value)
 {
-   return Fake_glXGetFBConfigAttrib(dpy, config, attribute, value);
+   return glXGetFBConfigAttrib(dpy, config, attribute, value);
 }
 
-static GLXFBConfigSGIX *
-Fake_glXChooseFBConfigSGIX(Display *dpy, int screen, int *attrib_list, int *nelements)
+GLXFBConfigSGIX *
+glXChooseFBConfigSGIX(Display *dpy, int screen, int *attrib_list, int *nelements)
 {
-   return (GLXFBConfig *) Fake_glXChooseFBConfig(dpy, screen, attrib_list, nelements);
+   return (GLXFBConfig *) glXChooseFBConfig(dpy, screen, attrib_list, nelements);
 }
 
 
-static GLXPixmap
-Fake_glXCreateGLXPixmapWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, Pixmap pixmap)
+GLXPixmap
+glXCreateGLXPixmapWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, Pixmap pixmap)
 {
    XMesaVisual xmvis = (XMesaVisual) config;
    XMesaBuffer xmbuf = XMesaCreatePixmapBuffer(xmvis, pixmap, 0);
@@ -2259,14 +2311,14 @@ Fake_glXCreateGLXPixmapWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, Pixm
 }
 
 
-static GLXContext
-Fake_glXCreateContextWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct)
+GLXContext
+glXCreateContextWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct)
 {
    XMesaVisual xmvis = (XMesaVisual) config;
-   struct fake_glx_context *glxCtx;
-   struct fake_glx_context *shareCtx = (struct fake_glx_context *) share_list;
+   GLXContext glxCtx;
+   GLXContext shareCtx = share_list;
 
-   glxCtx = CALLOC_STRUCT(fake_glx_context);
+   glxCtx = CALLOC_STRUCT(__GLXcontextRec);
    if (!glxCtx)
       return 0;
 
@@ -2280,25 +2332,23 @@ Fake_glXCreateContextWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, int re
       return NULL;
    }
 
-   glxCtx->glxContext.isDirect = DEFAULT_DIRECT;
-   glxCtx->glxContext.currentDpy = dpy;
-   glxCtx->glxContext.xid = (XID) glxCtx;  /* self pointer */
-
-   assert((void *) glxCtx == (void *) &(glxCtx->glxContext));
+   glxCtx->isDirect = DEFAULT_DIRECT;
+   glxCtx->currentDpy = dpy;
+   glxCtx->xid = (XID) glxCtx;  /* self pointer */
 
-   return (GLXContext) glxCtx;
+   return glxCtx;
 }
 
 
-static XVisualInfo *
-Fake_glXGetVisualFromFBConfigSGIX(Display *dpy, GLXFBConfigSGIX config)
+XVisualInfo *
+glXGetVisualFromFBConfigSGIX(Display *dpy, GLXFBConfigSGIX config)
 {
-   return Fake_glXGetVisualFromFBConfig(dpy, config);
+   return glXGetVisualFromFBConfig(dpy, config);
 }
 
 
-static GLXFBConfigSGIX
-Fake_glXGetFBConfigFromVisualSGIX(Display *dpy, XVisualInfo *vis)
+GLXFBConfigSGIX
+glXGetFBConfigFromVisualSGIX(Display *dpy, XVisualInfo *vis)
 {
    XMesaVisual xmvis = find_glx_visual(dpy, vis);
    if (!xmvis) {
@@ -2313,8 +2363,8 @@ Fake_glXGetFBConfigFromVisualSGIX(Display *dpy, XVisualInfo *vis)
 
 /*** GLX_SGIX_pbuffer ***/
 
-static GLXPbufferSGIX
-Fake_glXCreateGLXPbufferSGIX(Display *dpy, GLXFBConfigSGIX config,
+GLXPbufferSGIX
+glXCreateGLXPbufferSGIX(Display *dpy, GLXFBConfigSGIX config,
                              unsigned int width, unsigned int height,
                              int *attribList)
 {
@@ -2352,8 +2402,8 @@ Fake_glXCreateGLXPbufferSGIX(Display *dpy, GLXFBConfigSGIX config,
 }
 
 
-static void
-Fake_glXDestroyGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf)
+void
+glXDestroyGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf)
 {
    XMesaBuffer xmbuf = XMesaFindBuffer(dpy, pbuf);
    if (xmbuf) {
@@ -2362,8 +2412,8 @@ Fake_glXDestroyGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf)
 }
 
 
-static int
-Fake_glXQueryGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int *value)
+int
+glXQueryGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int *value)
 {
    const XMesaBuffer xmbuf = XMesaFindBuffer(dpy, pbuf);
 
@@ -2395,8 +2445,8 @@ Fake_glXQueryGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf, int attribute, un
 }
 
 
-static void
-Fake_glXSelectEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long mask)
+void
+glXSelectEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long mask)
 {
    XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
    if (xmbuf) {
@@ -2406,8 +2456,8 @@ Fake_glXSelectEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long mask)
 }
 
 
-static void
-Fake_glXGetSelectedEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long *mask)
+void
+glXGetSelectedEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long *mask)
 {
    XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
    if (xmbuf) {
@@ -2422,8 +2472,8 @@ Fake_glXGetSelectedEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long *
 
 /*** GLX_SGI_cushion ***/
 
-static void
-Fake_glXCushionSGI(Display *dpy, Window win, float cushion)
+void
+glXCushionSGI(Display *dpy, Window win, float cushion)
 {
    (void) dpy;
    (void) win;
@@ -2434,8 +2484,8 @@ Fake_glXCushionSGI(Display *dpy, Window win, float cushion)
 
 /*** GLX_SGIX_video_resize ***/
 
-static int
-Fake_glXBindChannelToWindowSGIX(Display *dpy, int screen, int channel , Window window)
+int
+glXBindChannelToWindowSGIX(Display *dpy, int screen, int channel , Window window)
 {
    (void) dpy;
    (void) screen;
@@ -2444,8 +2494,8 @@ Fake_glXBindChannelToWindowSGIX(Display *dpy, int screen, int channel , Window w
    return 0;
 }
 
-static int
-Fake_glXChannelRectSGIX(Display *dpy, int screen, int channel, int x, int y, int w, int h)
+int
+glXChannelRectSGIX(Display *dpy, int screen, int channel, int x, int y, int w, int h)
 {
    (void) dpy;
    (void) screen;
@@ -2457,8 +2507,8 @@ Fake_glXChannelRectSGIX(Display *dpy, int screen, int channel, int x, int y, int
    return 0;
 }
 
-static int
-Fake_glXQueryChannelRectSGIX(Display *dpy, int screen, int channel, int *x, int *y, int *w, int *h)
+int
+glXQueryChannelRectSGIX(Display *dpy, int screen, int channel, int *x, int *y, int *w, int *h)
 {
    (void) dpy;
    (void) screen;
@@ -2470,8 +2520,8 @@ Fake_glXQueryChannelRectSGIX(Display *dpy, int screen, int channel, int *x, int
    return 0;
 }
 
-static int
-Fake_glXQueryChannelDeltasSGIX(Display *dpy, int screen, int channel, int *dx, int *dy, int *dw, int *dh)
+int
+glXQueryChannelDeltasSGIX(Display *dpy, int screen, int channel, int *dx, int *dy, int *dw, int *dh)
 {
    (void) dpy;
    (void) screen;
@@ -2483,8 +2533,8 @@ Fake_glXQueryChannelDeltasSGIX(Display *dpy, int screen, int channel, int *dx, i
    return 0;
 }
 
-static int
-Fake_glXChannelRectSyncSGIX(Display *dpy, int screen, int channel, GLenum synctype)
+int
+glXChannelRectSyncSGIX(Display *dpy, int screen, int channel, GLenum synctype)
 {
    (void) dpy;
    (void) screen;
@@ -2498,8 +2548,8 @@ Fake_glXChannelRectSyncSGIX(Display *dpy, int screen, int channel, GLenum syncty
 /*** GLX_SGIX_dmbuffer **/
 
 #if defined(_DM_BUFFER_H_)
-static Bool
-Fake_glXAssociateDMPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuffer, DMparams *params, DMbuffer dmbuffer)
+Bool
+glXAssociateDMPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuffer, DMparams *params, DMbuffer dmbuffer)
 {
    (void) dpy;
    (void) pbuffer;
@@ -2512,8 +2562,8 @@ Fake_glXAssociateDMPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuffer, DMparams *p
 
 /*** GLX_SGIX_swap_group ***/
 
-static void
-Fake_glXJoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable, GLXDrawable member)
+void
+glXJoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable, GLXDrawable member)
 {
    (void) dpy;
    (void) drawable;
@@ -2524,16 +2574,16 @@ Fake_glXJoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable, GLXDrawable member
 
 /*** GLX_SGIX_swap_barrier ***/
 
-static void
-Fake_glXBindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable, int barrier)
+void
+glXBindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable, int barrier)
 {
    (void) dpy;
    (void) drawable;
    (void) barrier;
 }
 
-static Bool
-Fake_glXQueryMaxSwapBarriersSGIX(Display *dpy, int screen, int *max)
+Bool
+glXQueryMaxSwapBarriersSGIX(Display *dpy, int screen, int *max)
 {
    (void) dpy;
    (void) screen;
@@ -2545,8 +2595,8 @@ Fake_glXQueryMaxSwapBarriersSGIX(Display *dpy, int screen, int *max)
 
 /*** GLX_SUN_get_transparent_index ***/
 
-static Status
-Fake_glXGetTransparentIndexSUN(Display *dpy, Window overlay, Window underlay, long *pTransparent)
+Status
+glXGetTransparentIndexSUN(Display *dpy, Window overlay, Window underlay, long *pTransparent)
 {
    (void) dpy;
    (void) overlay;
@@ -2563,8 +2613,8 @@ Fake_glXGetTransparentIndexSUN(Display *dpy, Window overlay, Window underlay, lo
  * Release the depth, stencil, accum buffers attached to a GLXDrawable
  * (a window or pixmap) prior to destroying the GLXDrawable.
  */
-static Bool
-Fake_glXReleaseBuffersMESA( Display *dpy, GLXDrawable d )
+Bool
+glXReleaseBuffersMESA( Display *dpy, GLXDrawable d )
 {
    XMesaBuffer b = XMesaFindBuffer(dpy, d);
    if (b) {
@@ -2576,8 +2626,8 @@ Fake_glXReleaseBuffersMESA( Display *dpy, GLXDrawable d )
 
 /*** GLX_EXT_texture_from_pixmap ***/
 
-static void
-Fake_glXBindTexImageEXT(Display *dpy, GLXDrawable drawable, int buffer,
+void
+glXBindTexImageEXT(Display *dpy, GLXDrawable drawable, int buffer,
                         const int *attrib_list)
 {
    XMesaBuffer b = XMesaFindBuffer(dpy, drawable);
@@ -2585,162 +2635,10 @@ Fake_glXBindTexImageEXT(Display *dpy, GLXDrawable drawable, int buffer,
       XMesaBindTexImage(dpy, b, buffer, attrib_list);
 }
 
-static void
-Fake_glXReleaseTexImageEXT(Display *dpy, GLXDrawable drawable, int buffer)
+void
+glXReleaseTexImageEXT(Display *dpy, GLXDrawable drawable, int buffer)
 {
    XMesaBuffer b = XMesaFindBuffer(dpy, drawable);
    if (b)
       XMesaReleaseTexImage(dpy, b, buffer);
 }
-
-
-
-/**
- * Create a new GLX API dispatch table with its function pointers
- * initialized to point to Mesa's "fake" GLX API functions.
- *
- * Note: there used to be a similar function
- * (_real_GetGLXDispatchTable) that returns a new dispatch table with
- * all pointers initalized to point to "real" GLX functions (which
- * understand GLX wire protocol, etc).
- */
-struct _glxapi_table *
-_mesa_GetGLXDispatchTable(void)
-{
-   static struct _glxapi_table glx;
-
-   /* be sure our dispatch table size <= libGL's table */
-   {
-      GLuint size = sizeof(struct _glxapi_table) / sizeof(void *);
-      (void) size;
-      assert(_glxapi_get_dispatch_table_size() >= size);
-   }
-
-   /* initialize the whole table to no-ops */
-   _glxapi_set_no_op_table(&glx);
-
-   /* now initialize the table with the functions I implement */
-   glx.ChooseVisual = Fake_glXChooseVisual;
-   glx.CopyContext = Fake_glXCopyContext;
-   glx.CreateContext = Fake_glXCreateContext;
-   glx.CreateGLXPixmap = Fake_glXCreateGLXPixmap;
-   glx.DestroyContext = Fake_glXDestroyContext;
-   glx.DestroyGLXPixmap = Fake_glXDestroyGLXPixmap;
-   glx.GetConfig = Fake_glXGetConfig;
-   /*glx.GetCurrentContext = Fake_glXGetCurrentContext;*/
-   /*glx.GetCurrentDrawable = Fake_glXGetCurrentDrawable;*/
-   glx.IsDirect = Fake_glXIsDirect;
-   glx.MakeCurrent = Fake_glXMakeCurrent;
-   glx.QueryExtension = Fake_glXQueryExtension;
-   glx.QueryVersion = Fake_glXQueryVersion;
-   glx.SwapBuffers = Fake_glXSwapBuffers;
-   glx.UseXFont = Fake_glXUseXFont;
-   glx.WaitGL = Fake_glXWaitGL;
-   glx.WaitX = Fake_glXWaitX;
-
-   /*** GLX_VERSION_1_1 ***/
-   glx.GetClientString = Fake_glXGetClientString;
-   glx.QueryExtensionsString = Fake_glXQueryExtensionsString;
-   glx.QueryServerString = Fake_glXQueryServerString;
-
-   /*** GLX_VERSION_1_2 ***/
-   /*glx.GetCurrentDisplay = Fake_glXGetCurrentDisplay;*/
-
-   /*** GLX_VERSION_1_3 ***/
-   glx.ChooseFBConfig = Fake_glXChooseFBConfig;
-   glx.CreateNewContext = Fake_glXCreateNewContext;
-   glx.CreatePbuffer = Fake_glXCreatePbuffer;
-   glx.CreatePixmap = Fake_glXCreatePixmap;
-   glx.CreateWindow = Fake_glXCreateWindow;
-   glx.DestroyPbuffer = Fake_glXDestroyPbuffer;
-   glx.DestroyPixmap = Fake_glXDestroyPixmap;
-   glx.DestroyWindow = Fake_glXDestroyWindow;
-   /*glx.GetCurrentReadDrawable = Fake_glXGetCurrentReadDrawable;*/
-   glx.GetFBConfigAttrib = Fake_glXGetFBConfigAttrib;
-   glx.GetFBConfigs = Fake_glXGetFBConfigs;
-   glx.GetSelectedEvent = Fake_glXGetSelectedEvent;
-   glx.GetVisualFromFBConfig = Fake_glXGetVisualFromFBConfig;
-   glx.MakeContextCurrent = Fake_glXMakeContextCurrent;
-   glx.QueryContext = Fake_glXQueryContext;
-   glx.QueryDrawable = Fake_glXQueryDrawable;
-   glx.SelectEvent = Fake_glXSelectEvent;
-
-   /*** GLX_SGI_swap_control ***/
-   glx.SwapIntervalSGI = Fake_glXSwapIntervalSGI;
-
-   /*** GLX_SGI_video_sync ***/
-   glx.GetVideoSyncSGI = Fake_glXGetVideoSyncSGI;
-   glx.WaitVideoSyncSGI = Fake_glXWaitVideoSyncSGI;
-
-   /*** GLX_SGI_make_current_read ***/
-   glx.MakeCurrentReadSGI = Fake_glXMakeCurrentReadSGI;
-   /*glx.GetCurrentReadDrawableSGI = Fake_glXGetCurrentReadDrawableSGI;*/
-
-/*** GLX_SGIX_video_source ***/
-#if defined(_VL_H)
-   glx.CreateGLXVideoSourceSGIX = Fake_glXCreateGLXVideoSourceSGIX;
-   glx.DestroyGLXVideoSourceSGIX = Fake_glXDestroyGLXVideoSourceSGIX;
-#endif
-
-   /*** GLX_EXT_import_context ***/
-   glx.FreeContextEXT = Fake_glXFreeContextEXT;
-   glx.GetContextIDEXT = Fake_glXGetContextIDEXT;
-   /*glx.GetCurrentDisplayEXT = Fake_glXGetCurrentDisplayEXT;*/
-   glx.ImportContextEXT = Fake_glXImportContextEXT;
-   glx.QueryContextInfoEXT = Fake_glXQueryContextInfoEXT;
-
-   /*** GLX_SGIX_fbconfig ***/
-   glx.GetFBConfigAttribSGIX = Fake_glXGetFBConfigAttribSGIX;
-   glx.ChooseFBConfigSGIX = Fake_glXChooseFBConfigSGIX;
-   glx.CreateGLXPixmapWithConfigSGIX = Fake_glXCreateGLXPixmapWithConfigSGIX;
-   glx.CreateContextWithConfigSGIX = Fake_glXCreateContextWithConfigSGIX;
-   glx.GetVisualFromFBConfigSGIX = Fake_glXGetVisualFromFBConfigSGIX;
-   glx.GetFBConfigFromVisualSGIX = Fake_glXGetFBConfigFromVisualSGIX;
-
-   /*** GLX_SGIX_pbuffer ***/
-   glx.CreateGLXPbufferSGIX = Fake_glXCreateGLXPbufferSGIX;
-   glx.DestroyGLXPbufferSGIX = Fake_glXDestroyGLXPbufferSGIX;
-   glx.QueryGLXPbufferSGIX = Fake_glXQueryGLXPbufferSGIX;
-   glx.SelectEventSGIX = Fake_glXSelectEventSGIX;
-   glx.GetSelectedEventSGIX = Fake_glXGetSelectedEventSGIX;
-
-   /*** GLX_SGI_cushion ***/
-   glx.CushionSGI = Fake_glXCushionSGI;
-
-   /*** GLX_SGIX_video_resize ***/
-   glx.BindChannelToWindowSGIX = Fake_glXBindChannelToWindowSGIX;
-   glx.ChannelRectSGIX = Fake_glXChannelRectSGIX;
-   glx.QueryChannelRectSGIX = Fake_glXQueryChannelRectSGIX;
-   glx.QueryChannelDeltasSGIX = Fake_glXQueryChannelDeltasSGIX;
-   glx.ChannelRectSyncSGIX = Fake_glXChannelRectSyncSGIX;
-
-   /*** GLX_SGIX_dmbuffer **/
-#if defined(_DM_BUFFER_H_)
-   glx.AssociateDMPbufferSGIX = NULL;
-#endif
-
-   /*** GLX_SGIX_swap_group ***/
-   glx.JoinSwapGroupSGIX = Fake_glXJoinSwapGroupSGIX;
-
-   /*** GLX_SGIX_swap_barrier ***/
-   glx.BindSwapBarrierSGIX = Fake_glXBindSwapBarrierSGIX;
-   glx.QueryMaxSwapBarriersSGIX = Fake_glXQueryMaxSwapBarriersSGIX;
-
-   /*** GLX_SUN_get_transparent_index ***/
-   glx.GetTransparentIndexSUN = Fake_glXGetTransparentIndexSUN;
-
-   /*** GLX_MESA_copy_sub_buffer ***/
-   glx.CopySubBufferMESA = Fake_glXCopySubBufferMESA;
-
-   /*** GLX_MESA_release_buffers ***/
-   glx.ReleaseBuffersMESA = Fake_glXReleaseBuffersMESA;
-
-   /*** GLX_MESA_pixmap_colormap ***/
-   glx.CreateGLXPixmapMESA = Fake_glXCreateGLXPixmapMESA;
-
-   /*** GLX_EXT_texture_from_pixmap ***/
-   glx.BindTexImageEXT = Fake_glXBindTexImageEXT;
-   glx.ReleaseTexImageEXT = Fake_glXReleaseTexImageEXT;
-
-   return &glx;
-}
diff --git a/src/gallium/state_trackers/glx/xlib/glx_getproc.c b/src/gallium/state_trackers/glx/xlib/glx_getproc.c
new file mode 100644 (file)
index 0000000..ca7d88c
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+ * Mesa 3-D graphics library
+ * Version:  7.6
+ * 
+ * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
+ * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+/**
+ * glXGetProcAddress()
+ */
+
+
+#define GLX_GLXEXT_PROTOTYPES
+
+#include <string.h>
+#include "GL/glx.h"
+#include "glapi/glapi.h"
+
+
+struct name_address_pair {
+   const char *Name;
+   __GLXextFuncPtr Address;
+};
+
+
+static struct name_address_pair GLX_functions[] = {
+   /*** GLX_VERSION_1_0 ***/
+   { "glXChooseVisual", (__GLXextFuncPtr) glXChooseVisual },
+   { "glXCopyContext", (__GLXextFuncPtr) glXCopyContext },
+   { "glXCreateContext", (__GLXextFuncPtr) glXCreateContext },
+   { "glXCreateGLXPixmap", (__GLXextFuncPtr) glXCreateGLXPixmap },
+   { "glXDestroyContext", (__GLXextFuncPtr) glXDestroyContext },
+   { "glXDestroyGLXPixmap", (__GLXextFuncPtr) glXDestroyGLXPixmap },
+   { "glXGetConfig", (__GLXextFuncPtr) glXGetConfig },
+   { "glXGetCurrentContext", (__GLXextFuncPtr) glXGetCurrentContext },
+   { "glXGetCurrentDrawable", (__GLXextFuncPtr) glXGetCurrentDrawable },
+   { "glXIsDirect", (__GLXextFuncPtr) glXIsDirect },
+   { "glXMakeCurrent", (__GLXextFuncPtr) glXMakeCurrent },
+   { "glXQueryExtension", (__GLXextFuncPtr) glXQueryExtension },
+   { "glXQueryVersion", (__GLXextFuncPtr) glXQueryVersion },
+   { "glXSwapBuffers", (__GLXextFuncPtr) glXSwapBuffers },
+   { "glXUseXFont", (__GLXextFuncPtr) glXUseXFont },
+   { "glXWaitGL", (__GLXextFuncPtr) glXWaitGL },
+   { "glXWaitX", (__GLXextFuncPtr) glXWaitX },
+
+   /*** GLX_VERSION_1_1 ***/
+   { "glXGetClientString", (__GLXextFuncPtr) glXGetClientString },
+   { "glXQueryExtensionsString", (__GLXextFuncPtr) glXQueryExtensionsString },
+   { "glXQueryServerString", (__GLXextFuncPtr) glXQueryServerString },
+
+   /*** GLX_VERSION_1_2 ***/
+   { "glXGetCurrentDisplay", (__GLXextFuncPtr) glXGetCurrentDisplay },
+
+   /*** GLX_VERSION_1_3 ***/
+   { "glXChooseFBConfig", (__GLXextFuncPtr) glXChooseFBConfig },
+   { "glXCreateNewContext", (__GLXextFuncPtr) glXCreateNewContext },
+   { "glXCreatePbuffer", (__GLXextFuncPtr) glXCreatePbuffer },
+   { "glXCreatePixmap", (__GLXextFuncPtr) glXCreatePixmap },
+   { "glXCreateWindow", (__GLXextFuncPtr) glXCreateWindow },
+   { "glXDestroyPbuffer", (__GLXextFuncPtr) glXDestroyPbuffer },
+   { "glXDestroyPixmap", (__GLXextFuncPtr) glXDestroyPixmap },
+   { "glXDestroyWindow", (__GLXextFuncPtr) glXDestroyWindow },
+   { "glXGetCurrentReadDrawable", (__GLXextFuncPtr) glXGetCurrentReadDrawable },
+   { "glXGetFBConfigAttrib", (__GLXextFuncPtr) glXGetFBConfigAttrib },
+   { "glXGetFBConfigs", (__GLXextFuncPtr) glXGetFBConfigs },
+   { "glXGetSelectedEvent", (__GLXextFuncPtr) glXGetSelectedEvent },
+   { "glXGetVisualFromFBConfig", (__GLXextFuncPtr) glXGetVisualFromFBConfig },
+   { "glXMakeContextCurrent", (__GLXextFuncPtr) glXMakeContextCurrent },
+   { "glXQueryContext", (__GLXextFuncPtr) glXQueryContext },
+   { "glXQueryDrawable", (__GLXextFuncPtr) glXQueryDrawable },
+   { "glXSelectEvent", (__GLXextFuncPtr) glXSelectEvent },
+
+   /*** GLX_VERSION_1_4 ***/
+   { "glXGetProcAddress", (__GLXextFuncPtr) glXGetProcAddress },
+
+   /*** GLX_SGI_swap_control ***/
+   { "glXSwapIntervalSGI", (__GLXextFuncPtr) glXSwapIntervalSGI },
+
+   /*** GLX_SGI_video_sync ***/
+   { "glXGetVideoSyncSGI", (__GLXextFuncPtr) glXGetVideoSyncSGI },
+   { "glXWaitVideoSyncSGI", (__GLXextFuncPtr) glXWaitVideoSyncSGI },
+
+   /*** GLX_SGI_make_current_read ***/
+   { "glXMakeCurrentReadSGI", (__GLXextFuncPtr) glXMakeCurrentReadSGI },
+   { "glXGetCurrentReadDrawableSGI", (__GLXextFuncPtr) glXGetCurrentReadDrawableSGI },
+
+   /*** GLX_SGIX_video_source ***/
+#if defined(_VL_H)
+   { "glXCreateGLXVideoSourceSGIX", (__GLXextFuncPtr) glXCreateGLXVideoSourceSGIX },
+   { "glXDestroyGLXVideoSourceSGIX", (__GLXextFuncPtr) glXDestroyGLXVideoSourceSGIX },
+#endif
+
+   /*** GLX_EXT_import_context ***/
+   { "glXFreeContextEXT", (__GLXextFuncPtr) glXFreeContextEXT },
+   { "glXGetContextIDEXT", (__GLXextFuncPtr) glXGetContextIDEXT },
+   { "glXGetCurrentDisplayEXT", (__GLXextFuncPtr) glXGetCurrentDisplayEXT },
+   { "glXImportContextEXT", (__GLXextFuncPtr) glXImportContextEXT },
+   { "glXQueryContextInfoEXT", (__GLXextFuncPtr) glXQueryContextInfoEXT },
+
+   /*** GLX_SGIX_fbconfig ***/
+   { "glXGetFBConfigAttribSGIX", (__GLXextFuncPtr) glXGetFBConfigAttribSGIX },
+   { "glXChooseFBConfigSGIX", (__GLXextFuncPtr) glXChooseFBConfigSGIX },
+   { "glXCreateGLXPixmapWithConfigSGIX", (__GLXextFuncPtr) glXCreateGLXPixmapWithConfigSGIX },
+   { "glXCreateContextWithConfigSGIX", (__GLXextFuncPtr) glXCreateContextWithConfigSGIX },
+   { "glXGetVisualFromFBConfigSGIX", (__GLXextFuncPtr) glXGetVisualFromFBConfigSGIX },
+   { "glXGetFBConfigFromVisualSGIX", (__GLXextFuncPtr) glXGetFBConfigFromVisualSGIX },
+
+   /*** GLX_SGIX_pbuffer ***/
+   { "glXCreateGLXPbufferSGIX", (__GLXextFuncPtr) glXCreateGLXPbufferSGIX },
+   { "glXDestroyGLXPbufferSGIX", (__GLXextFuncPtr) glXDestroyGLXPbufferSGIX },
+   { "glXQueryGLXPbufferSGIX", (__GLXextFuncPtr) glXQueryGLXPbufferSGIX },
+   { "glXSelectEventSGIX", (__GLXextFuncPtr) glXSelectEventSGIX },
+   { "glXGetSelectedEventSGIX", (__GLXextFuncPtr) glXGetSelectedEventSGIX },
+
+   /*** GLX_SGI_cushion ***/
+   { "glXCushionSGI", (__GLXextFuncPtr) glXCushionSGI },
+
+   /*** GLX_SGIX_video_resize ***/
+   { "glXBindChannelToWindowSGIX", (__GLXextFuncPtr) glXBindChannelToWindowSGIX },
+   { "glXChannelRectSGIX", (__GLXextFuncPtr) glXChannelRectSGIX },
+   { "glXQueryChannelRectSGIX", (__GLXextFuncPtr) glXQueryChannelRectSGIX },
+   { "glXQueryChannelDeltasSGIX", (__GLXextFuncPtr) glXQueryChannelDeltasSGIX },
+   { "glXChannelRectSyncSGIX", (__GLXextFuncPtr) glXChannelRectSyncSGIX },
+
+   /*** GLX_SGIX_dmbuffer **/
+#if defined(_DM_BUFFER_H_)
+   { "glXAssociateDMPbufferSGIX", (__GLXextFuncPtr) glXAssociateDMPbufferSGIX },
+#endif
+
+   /*** GLX_SGIX_swap_group ***/
+   { "glXJoinSwapGroupSGIX", (__GLXextFuncPtr) glXJoinSwapGroupSGIX },
+
+   /*** GLX_SGIX_swap_barrier ***/
+   { "glXBindSwapBarrierSGIX", (__GLXextFuncPtr) glXBindSwapBarrierSGIX },
+   { "glXQueryMaxSwapBarriersSGIX", (__GLXextFuncPtr) glXQueryMaxSwapBarriersSGIX },
+
+   /*** GLX_SUN_get_transparent_index ***/
+   { "glXGetTransparentIndexSUN", (__GLXextFuncPtr) glXGetTransparentIndexSUN },
+
+   /*** GLX_MESA_copy_sub_buffer ***/
+   { "glXCopySubBufferMESA", (__GLXextFuncPtr) glXCopySubBufferMESA },
+
+   /*** GLX_MESA_pixmap_colormap ***/
+   { "glXCreateGLXPixmapMESA", (__GLXextFuncPtr) glXCreateGLXPixmapMESA },
+
+   /*** GLX_MESA_release_buffers ***/
+   { "glXReleaseBuffersMESA", (__GLXextFuncPtr) glXReleaseBuffersMESA },
+
+   /*** GLX_ARB_get_proc_address ***/
+   { "glXGetProcAddressARB", (__GLXextFuncPtr) glXGetProcAddressARB },
+
+   /*** GLX_EXT_texture_from_pixmap ***/
+   { "glXBindTexImageEXT", (__GLXextFuncPtr) glXBindTexImageEXT },
+   { "glXReleaseTexImageEXT", (__GLXextFuncPtr) glXReleaseTexImageEXT },
+
+   { NULL, NULL }   /* end of list */
+};
+
+
+
+/**
+ * Return address of named glX function, or NULL if not found.
+ */
+static __GLXextFuncPtr
+_glxapi_get_proc_address(const char *funcName)
+{
+   GLuint i;
+   for (i = 0; GLX_functions[i].Name; i++) {
+      if (strcmp(GLX_functions[i].Name, funcName) == 0)
+         return GLX_functions[i].Address;
+   }
+   return NULL;
+}
+
+
+__GLXextFuncPtr
+glXGetProcAddressARB(const GLubyte *procName)
+{
+   __GLXextFuncPtr f;
+
+   f = _glxapi_get_proc_address((const char *) procName);
+   if (f) {
+      return f;
+   }
+
+   f = (__GLXextFuncPtr) _glapi_get_proc_address((const char *) procName);
+   return f;
+}
+
+
+/* GLX 1.4 */
+void (*glXGetProcAddress(const GLubyte *procName))()
+{
+   return glXGetProcAddressARB(procName);
+}
@@ -1,9 +1,10 @@
-
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  7.6
  *
- * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1995 Thorsten.Ohl @ Physik.TH-Darmstadt.de
+ * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
+ * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  */
 
 
-/* xfonts.c -- glXUseXFont() for Mesa written by
- * Copyright (C) 1995 Thorsten.Ohl @ Physik.TH-Darmstadt.de
+/**
+ * Fake implementation of glXUseXFont().
  */
 
-#include "context.h"
-#include "imports.h"
-#include "fakeglx.h"
+
+#include "main/context.h"
+#include "main/imports.h"
 #include <GL/glx.h>
 
 
@@ -210,7 +211,7 @@ isvalid(XFontStruct * fs, unsigned int which)
 
 
 void
-Fake_glXUseXFont(Font font, int first, int count, int listbase)
+glXUseXFont(Font font, int first, int count, int listbase)
 {
    Display *dpy;
    Window win;
@@ -228,7 +229,8 @@ Fake_glXUseXFont(Font font, int first, int count, int listbase)
    dpy = glXGetCurrentDisplay();
    if (!dpy)
       return;                  /* I guess glXMakeCurrent wasn't called */
-   win = RootWindow(dpy, DefaultScreen(dpy));
+   i = DefaultScreen(dpy);
+   win = RootWindow(dpy, i);
 
    fs = XQueryFont(dpy, font);
    if (!fs) {
diff --git a/src/gallium/state_trackers/glx/xlib/glxapi.c b/src/gallium/state_trackers/glx/xlib/glxapi.c
deleted file mode 100644 (file)
index c2cb34d..0000000
+++ /dev/null
@@ -1,1254 +0,0 @@
-/*
- * Mesa 3-D graphics library
- * Version:  7.1
- * 
- * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-/*
- * This is the GLX API dispatcher.  Calls to the glX* functions are
- * either routed to the real GLX encoders or to Mesa's pseudo-GLX functions.
- * See the glxapi.h file for more details.
- */
-
-
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include "glapi/glapi.h"
-#include "glxapi.h"
-#include "fakeglx.h"
-#include "pipe/p_thread.h"
-
-
-#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 303
-#  define PUBLIC __attribute__((visibility("default")))
-#  define USED __attribute__((used))
-#else
-#  define PUBLIC
-#  define USED
-#endif
-
-
-struct display_dispatch {
-   Display *Dpy;
-   struct _glxapi_table *Table;
-   struct display_dispatch *Next;
-};
-
-static struct display_dispatch *DispatchList = NULL;
-
-
-/* Display -> Dispatch caching */
-static Display *prevDisplay = NULL;
-static struct _glxapi_table *prevTable = NULL;
-
-
-static struct _glxapi_table *
-get_dispatch(Display *dpy)
-{
-   if (!dpy)
-      return NULL;
-
-   /* search list of display/dispatch pairs for this display */
-   {
-      const struct display_dispatch *d = DispatchList;
-      while (d) {
-         if (d->Dpy == dpy) {
-            prevDisplay = dpy;
-            prevTable = d->Table;
-            return d->Table;  /* done! */
-         }
-         d = d->Next;
-      }
-   }
-
-   /* A new display, determine if we should use real GLX
-    * or Mesa's pseudo-GLX.
-    */
-   {
-      struct _glxapi_table *t = _mesa_GetGLXDispatchTable();
-
-      if (t) {
-         struct display_dispatch *d;
-         d = (struct display_dispatch *) malloc(sizeof(struct display_dispatch));
-         if (d) {
-            d->Dpy = dpy;
-            d->Table = t;
-            /* insert at head of list */
-            d->Next = DispatchList;
-            DispatchList = d;
-            /* update cache */
-            prevDisplay = dpy;
-            prevTable = t;
-            return t;
-         }
-      }
-   }
-
-   /* If we get here that means we can't use real GLX on this display
-    * and the Mesa pseudo-GLX software renderer wasn't compiled in.
-    * Or, we ran out of memory!
-    */
-   return NULL;
-}
-
-
-/* Don't use the GET_DISPATCH defined in glthread.h */
-#undef GET_DISPATCH
-
-#define GET_DISPATCH(DPY, TABLE)       \
-   if (DPY == prevDisplay) {           \
-      TABLE = prevTable;               \
-   }                                   \
-   else if (!DPY) {                    \
-      TABLE = NULL;                    \
-   }                                   \
-   else {                              \
-      TABLE = get_dispatch(DPY);       \
-   }
-
-   
-
-
-/**
- * GLX API current context.
- */
-pipe_tsd ContextTSD;
-
-
-static void
-SetCurrentContext(GLXContext c)
-{
-   pipe_tsd_set(&ContextTSD, c);
-}
-
-
-/*
- * GLX API entrypoints
- */
-
-/*** GLX_VERSION_1_0 ***/
-
-XVisualInfo PUBLIC *
-glXChooseVisual(Display *dpy, int screen, int *list)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return NULL;
-   return (t->ChooseVisual)(dpy, screen, list);
-}
-
-
-void PUBLIC
-glXCopyContext(Display *dpy, GLXContext src, GLXContext dst, unsigned long mask)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->CopyContext)(dpy, src, dst, mask);
-}
-
-
-GLXContext PUBLIC
-glXCreateContext(Display *dpy, XVisualInfo *visinfo, GLXContext shareList, Bool direct)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->CreateContext)(dpy, visinfo, shareList, direct);
-}
-
-
-GLXPixmap PUBLIC
-glXCreateGLXPixmap(Display *dpy, XVisualInfo *visinfo, Pixmap pixmap)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->CreateGLXPixmap)(dpy, visinfo, pixmap);
-}
-
-
-void PUBLIC
-glXDestroyContext(Display *dpy, GLXContext ctx)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   if (glXGetCurrentContext() == ctx)
-      SetCurrentContext(NULL);
-   (t->DestroyContext)(dpy, ctx);
-}
-
-
-void PUBLIC
-glXDestroyGLXPixmap(Display *dpy, GLXPixmap pixmap)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->DestroyGLXPixmap)(dpy, pixmap);
-}
-
-
-int PUBLIC
-glXGetConfig(Display *dpy, XVisualInfo *visinfo, int attrib, int *value)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return GLX_NO_EXTENSION;
-   return (t->GetConfig)(dpy, visinfo, attrib, value);
-}
-
-
-GLXContext PUBLIC
-glXGetCurrentContext(void)
-{
-   return (GLXContext) pipe_tsd_get(&ContextTSD);
-}
-
-
-GLXDrawable PUBLIC
-glXGetCurrentDrawable(void)
-{
-   __GLXcontext *gc = (__GLXcontext *) glXGetCurrentContext();
-   return gc ? gc->currentDrawable : 0;
-}
-
-
-Bool PUBLIC
-glXIsDirect(Display *dpy, GLXContext ctx)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return False;
-   return (t->IsDirect)(dpy, ctx);
-}
-
-
-Bool PUBLIC
-glXMakeCurrent(Display *dpy, GLXDrawable drawable, GLXContext ctx)
-{
-   Bool b;
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t) {
-      return False;
-   }
-   b = (*t->MakeCurrent)(dpy, drawable, ctx);
-   if (b) {
-      SetCurrentContext(ctx);
-   }
-   return b;
-}
-
-
-Bool PUBLIC
-glXQueryExtension(Display *dpy, int *errorb, int *event)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return False;
-   return (t->QueryExtension)(dpy, errorb, event);
-}
-
-
-Bool PUBLIC
-glXQueryVersion(Display *dpy, int *maj, int *min)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return False;
-   return (t->QueryVersion)(dpy, maj, min);
-}
-
-
-void PUBLIC
-glXSwapBuffers(Display *dpy, GLXDrawable drawable)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->SwapBuffers)(dpy, drawable);
-}
-
-
-void PUBLIC
-glXUseXFont(Font font, int first, int count, int listBase)
-{
-   struct _glxapi_table *t;
-   Display *dpy = glXGetCurrentDisplay();
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->UseXFont)(font, first, count, listBase);
-}
-
-
-void PUBLIC
-glXWaitGL(void)
-{
-   struct _glxapi_table *t;
-   Display *dpy = glXGetCurrentDisplay();
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->WaitGL)();
-}
-
-
-void PUBLIC
-glXWaitX(void)
-{
-   struct _glxapi_table *t;
-   Display *dpy = glXGetCurrentDisplay();
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->WaitX)();
-}
-
-
-
-/*** GLX_VERSION_1_1 ***/
-
-const char PUBLIC *
-glXGetClientString(Display *dpy, int name)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return NULL;
-   return (t->GetClientString)(dpy, name);
-}
-
-
-const char PUBLIC *
-glXQueryExtensionsString(Display *dpy, int screen)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return NULL;
-   return (t->QueryExtensionsString)(dpy, screen);
-}
-
-
-const char PUBLIC *
-glXQueryServerString(Display *dpy, int screen, int name)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return NULL;
-   return (t->QueryServerString)(dpy, screen, name);
-}
-
-
-/*** GLX_VERSION_1_2 ***/
-
-Display PUBLIC *
-glXGetCurrentDisplay(void)
-{
-   /* Same code as in libGL's glxext.c */
-   __GLXcontext *gc = (__GLXcontext *) glXGetCurrentContext();
-   if (NULL == gc) return NULL;
-   return gc->currentDpy;
-}
-
-
-
-/*** GLX_VERSION_1_3 ***/
-
-GLXFBConfig PUBLIC *
-glXChooseFBConfig(Display *dpy, int screen, const int *attribList, int *nitems)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->ChooseFBConfig)(dpy, screen, attribList, nitems);
-}
-
-
-GLXContext PUBLIC
-glXCreateNewContext(Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool direct)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->CreateNewContext)(dpy, config, renderType, shareList, direct);
-}
-
-
-GLXPbuffer PUBLIC
-glXCreatePbuffer(Display *dpy, GLXFBConfig config, const int *attribList)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->CreatePbuffer)(dpy, config, attribList);
-}
-
-
-GLXPixmap PUBLIC
-glXCreatePixmap(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->CreatePixmap)(dpy, config, pixmap, attribList);
-}
-
-
-GLXWindow PUBLIC
-glXCreateWindow(Display *dpy, GLXFBConfig config, Window win, const int *attribList)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->CreateWindow)(dpy, config, win, attribList);
-}
-
-
-void PUBLIC
-glXDestroyPbuffer(Display *dpy, GLXPbuffer pbuf)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->DestroyPbuffer)(dpy, pbuf);
-}
-
-
-void PUBLIC
-glXDestroyPixmap(Display *dpy, GLXPixmap pixmap)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->DestroyPixmap)(dpy, pixmap);
-}
-
-
-void PUBLIC
-glXDestroyWindow(Display *dpy, GLXWindow window)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->DestroyWindow)(dpy, window);
-}
-
-
-GLXDrawable PUBLIC
-glXGetCurrentReadDrawable(void)
-{
-   __GLXcontext *gc = (__GLXcontext *) glXGetCurrentContext();
-   return gc ? gc->currentReadable : 0;
-}
-
-
-int PUBLIC
-glXGetFBConfigAttrib(Display *dpy, GLXFBConfig config, int attribute, int *value)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return GLX_NO_EXTENSION;
-   return (t->GetFBConfigAttrib)(dpy, config, attribute, value);
-}
-
-
-GLXFBConfig PUBLIC *
-glXGetFBConfigs(Display *dpy, int screen, int *nelements)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->GetFBConfigs)(dpy, screen, nelements);
-}
-
-void PUBLIC
-glXGetSelectedEvent(Display *dpy, GLXDrawable drawable, unsigned long *mask)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->GetSelectedEvent)(dpy, drawable, mask);
-}
-
-
-XVisualInfo PUBLIC *
-glXGetVisualFromFBConfig(Display *dpy, GLXFBConfig config)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return NULL;
-   return (t->GetVisualFromFBConfig)(dpy, config);
-}
-
-
-Bool PUBLIC
-glXMakeContextCurrent(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)
-{
-   Bool b;
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return False;
-   b = (t->MakeContextCurrent)(dpy, draw, read, ctx);
-   if (b) {
-      SetCurrentContext(ctx);
-   }
-   return b;
-}
-
-
-int PUBLIC
-glXQueryContext(Display *dpy, GLXContext ctx, int attribute, int *value)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   assert(t);
-   if (!t)
-      return 0; /* XXX correct? */
-   return (t->QueryContext)(dpy, ctx, attribute, value);
-}
-
-
-void PUBLIC
-glXQueryDrawable(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->QueryDrawable)(dpy, draw, attribute, value);
-}
-
-
-void PUBLIC
-glXSelectEvent(Display *dpy, GLXDrawable drawable, unsigned long mask)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->SelectEvent)(dpy, drawable, mask);
-}
-
-
-
-/*** GLX_SGI_swap_control ***/
-
-int PUBLIC
-glXSwapIntervalSGI(int interval)
-{
-   struct _glxapi_table *t;
-   Display *dpy = glXGetCurrentDisplay();
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->SwapIntervalSGI)(interval);
-}
-
-
-
-/*** GLX_SGI_video_sync ***/
-
-int PUBLIC
-glXGetVideoSyncSGI(unsigned int *count)
-{
-   struct _glxapi_table *t;
-   Display *dpy = glXGetCurrentDisplay();
-   GET_DISPATCH(dpy, t);
-   if (!t || !glXGetCurrentContext())
-      return GLX_BAD_CONTEXT;
-   return (t->GetVideoSyncSGI)(count);
-}
-
-int PUBLIC
-glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
-{
-   struct _glxapi_table *t;
-   Display *dpy = glXGetCurrentDisplay();
-   GET_DISPATCH(dpy, t);
-   if (!t || !glXGetCurrentContext())
-      return GLX_BAD_CONTEXT;
-   return (t->WaitVideoSyncSGI)(divisor, remainder, count);
-}
-
-
-
-/*** GLX_SGI_make_current_read ***/
-
-Bool PUBLIC
-glXMakeCurrentReadSGI(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return False;
-   return (t->MakeCurrentReadSGI)(dpy, draw, read, ctx);
-}
-
-GLXDrawable PUBLIC
-glXGetCurrentReadDrawableSGI(void)
-{
-   return glXGetCurrentReadDrawable();
-}
-
-
-#if defined(_VL_H)
-
-GLXVideoSourceSGIX PUBLIC
-glXCreateGLXVideoSourceSGIX(Display *dpy, int screen, VLServer server, VLPath path, int nodeClass, VLNode drainNode)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->CreateGLXVideoSourceSGIX)(dpy, screen, server, path, nodeClass, drainNode);
-}
-
-void PUBLIC
-glXDestroyGLXVideoSourceSGIX(Display *dpy, GLXVideoSourceSGIX src)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->DestroyGLXVideoSourceSGIX)(dpy, src);
-}
-
-#endif
-
-
-/*** GLX_EXT_import_context ***/
-
-void PUBLIC
-glXFreeContextEXT(Display *dpy, GLXContext context)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->FreeContextEXT)(dpy, context);
-}
-
-GLXContextID PUBLIC
-glXGetContextIDEXT(const GLXContext context)
-{
-   return ((__GLXcontext *) context)->xid;
-}
-
-Display PUBLIC *
-glXGetCurrentDisplayEXT(void)
-{
-   return glXGetCurrentDisplay();
-}
-
-GLXContext PUBLIC
-glXImportContextEXT(Display *dpy, GLXContextID contextID)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->ImportContextEXT)(dpy, contextID);
-}
-
-int PUBLIC
-glXQueryContextInfoEXT(Display *dpy, GLXContext context, int attribute,int *value)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;  /* XXX ok? */
-   return (t->QueryContextInfoEXT)(dpy, context, attribute, value);
-}
-
-
-
-/*** GLX_SGIX_fbconfig ***/
-
-int PUBLIC
-glXGetFBConfigAttribSGIX(Display *dpy, GLXFBConfigSGIX config, int attribute, int *value)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->GetFBConfigAttribSGIX)(dpy, config, attribute, value);
-}
-
-GLXFBConfigSGIX PUBLIC *
-glXChooseFBConfigSGIX(Display *dpy, int screen, int *attrib_list, int *nelements)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->ChooseFBConfigSGIX)(dpy, screen, attrib_list, nelements);
-}
-
-GLXPixmap PUBLIC
-glXCreateGLXPixmapWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, Pixmap pixmap)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->CreateGLXPixmapWithConfigSGIX)(dpy, config, pixmap);
-}
-
-GLXContext PUBLIC
-glXCreateContextWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->CreateContextWithConfigSGIX)(dpy, config, render_type, share_list, direct);
-}
-
-XVisualInfo PUBLIC *
-glXGetVisualFromFBConfigSGIX(Display *dpy, GLXFBConfigSGIX config)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->GetVisualFromFBConfigSGIX)(dpy, config);
-}
-
-GLXFBConfigSGIX PUBLIC
-glXGetFBConfigFromVisualSGIX(Display *dpy, XVisualInfo *vis)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->GetFBConfigFromVisualSGIX)(dpy, vis);
-}
-
-
-
-/*** GLX_SGIX_pbuffer ***/
-
-GLXPbufferSGIX PUBLIC
-glXCreateGLXPbufferSGIX(Display *dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int *attrib_list)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->CreateGLXPbufferSGIX)(dpy, config, width, height, attrib_list);
-}
-
-void PUBLIC
-glXDestroyGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->DestroyGLXPbufferSGIX)(dpy, pbuf);
-}
-
-int PUBLIC
-glXQueryGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int *value)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->QueryGLXPbufferSGIX)(dpy, pbuf, attribute, value);
-}
-
-void PUBLIC
-glXSelectEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long mask)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->SelectEventSGIX)(dpy, drawable, mask);
-}
-
-void PUBLIC
-glXGetSelectedEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long *mask)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->GetSelectedEventSGIX)(dpy, drawable, mask);
-}
-
-
-
-/*** GLX_SGI_cushion ***/
-
-void PUBLIC
-glXCushionSGI(Display *dpy, Window win, float cushion)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->CushionSGI)(dpy, win, cushion);
-}
-
-
-
-/*** GLX_SGIX_video_resize ***/
-
-int PUBLIC
-glXBindChannelToWindowSGIX(Display *dpy, int screen, int channel , Window window)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->BindChannelToWindowSGIX)(dpy, screen, channel, window);
-}
-
-int PUBLIC
-glXChannelRectSGIX(Display *dpy, int screen, int channel, int x, int y, int w, int h)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->ChannelRectSGIX)(dpy, screen, channel, x, y, w, h);
-}
-
-int PUBLIC
-glXQueryChannelRectSGIX(Display *dpy, int screen, int channel, int *x, int *y, int *w, int *h)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->QueryChannelRectSGIX)(dpy, screen, channel, x, y, w, h);
-}
-
-int PUBLIC
-glXQueryChannelDeltasSGIX(Display *dpy, int screen, int channel, int *dx, int *dy, int *dw, int *dh)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->QueryChannelDeltasSGIX)(dpy, screen, channel, dx, dy, dw, dh);
-}
-
-int PUBLIC
-glXChannelRectSyncSGIX(Display *dpy, int screen, int channel, GLenum synctype)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->ChannelRectSyncSGIX)(dpy, screen, channel, synctype);
-}
-
-
-
-#if defined(_DM_BUFFER_H_)
-
-Bool PUBLIC
-glXAssociateDMPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuffer, DMparams *params, DMbuffer dmbuffer)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return False;
-   return (t->AssociateDMPbufferSGIX)(dpy, pbuffer, params, dmbuffer);
-}
-
-#endif
-
-
-/*** GLX_SGIX_swap_group ***/
-
-void PUBLIC
-glXJoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable, GLXDrawable member)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (*t->JoinSwapGroupSGIX)(dpy, drawable, member);
-}
-
-
-/*** GLX_SGIX_swap_barrier ***/
-
-void PUBLIC
-glXBindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable, int barrier)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (*t->BindSwapBarrierSGIX)(dpy, drawable, barrier);
-}
-
-Bool PUBLIC
-glXQueryMaxSwapBarriersSGIX(Display *dpy, int screen, int *max)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return False;
-   return (*t->QueryMaxSwapBarriersSGIX)(dpy, screen, max);
-}
-
-
-
-/*** GLX_SUN_get_transparent_index ***/
-
-Status PUBLIC
-glXGetTransparentIndexSUN(Display *dpy, Window overlay, Window underlay, long *pTransparent)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return False;
-   return (*t->GetTransparentIndexSUN)(dpy, overlay, underlay, pTransparent);
-}
-
-
-
-/*** GLX_MESA_copy_sub_buffer ***/
-
-void PUBLIC
-glXCopySubBufferMESA(Display *dpy, GLXDrawable drawable, int x, int y, int width, int height)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return;
-   (t->CopySubBufferMESA)(dpy, drawable, x, y, width, height);
-}
-
-
-
-/*** GLX_MESA_release_buffers ***/
-
-Bool PUBLIC
-glXReleaseBuffersMESA(Display *dpy, Window w)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return False;
-   return (t->ReleaseBuffersMESA)(dpy, w);
-}
-
-
-
-/*** GLX_MESA_pixmap_colormap ***/
-
-GLXPixmap PUBLIC
-glXCreateGLXPixmapMESA(Display *dpy, XVisualInfo *visinfo, Pixmap pixmap, Colormap cmap)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (!t)
-      return 0;
-   return (t->CreateGLXPixmapMESA)(dpy, visinfo, pixmap, cmap);
-}
-
-/*** GLX_EXT_texture_from_pixmap */
-
-void
-glXBindTexImageEXT(Display *dpy, GLXDrawable drawable, int buffer,
-                   const int *attrib_list)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (t)
-      t->BindTexImageEXT(dpy, drawable, buffer, attrib_list);
-}
-
-void
-glXReleaseTexImageEXT(Display *dpy, GLXDrawable drawable, int buffer)
-{
-   struct _glxapi_table *t;
-   GET_DISPATCH(dpy, t);
-   if (t)
-      t->ReleaseTexImageEXT(dpy, drawable, buffer);
-}
-
-
-/**********************************************************************/
-/* GLX API management functions                                       */
-/**********************************************************************/
-
-
-const char *
-_glxapi_get_version(void)
-{
-   return "1.3";
-}
-
-
-
-/*
- * Return size of the GLX dispatch table, in entries, not bytes.
- */
-GLuint
-_glxapi_get_dispatch_table_size(void)
-{
-   return sizeof(struct _glxapi_table) / sizeof(void *);
-}
-
-
-static int
-generic_no_op_func(void)
-{
-   return 0;
-}
-
-
-/*
- * Initialize all functions in given dispatch table to be no-ops
- */
-void
-_glxapi_set_no_op_table(struct _glxapi_table *t)
-{
-   typedef int (*nop_func)(void);
-   nop_func *dispatch = (nop_func *) t;
-   GLuint n = _glxapi_get_dispatch_table_size();
-   GLuint i;
-   for (i = 0; i < n; i++) {
-      dispatch[i] = generic_no_op_func;
-   }
-}
-
-
-struct name_address_pair {
-   const char *Name;
-   __GLXextFuncPtr Address;
-};
-
-static struct name_address_pair GLX_functions[] = {
-   /*** GLX_VERSION_1_0 ***/
-   { "glXChooseVisual", (__GLXextFuncPtr) glXChooseVisual },
-   { "glXCopyContext", (__GLXextFuncPtr) glXCopyContext },
-   { "glXCreateContext", (__GLXextFuncPtr) glXCreateContext },
-   { "glXCreateGLXPixmap", (__GLXextFuncPtr) glXCreateGLXPixmap },
-   { "glXDestroyContext", (__GLXextFuncPtr) glXDestroyContext },
-   { "glXDestroyGLXPixmap", (__GLXextFuncPtr) glXDestroyGLXPixmap },
-   { "glXGetConfig", (__GLXextFuncPtr) glXGetConfig },
-   { "glXGetCurrentContext", (__GLXextFuncPtr) glXGetCurrentContext },
-   { "glXGetCurrentDrawable", (__GLXextFuncPtr) glXGetCurrentDrawable },
-   { "glXIsDirect", (__GLXextFuncPtr) glXIsDirect },
-   { "glXMakeCurrent", (__GLXextFuncPtr) glXMakeCurrent },
-   { "glXQueryExtension", (__GLXextFuncPtr) glXQueryExtension },
-   { "glXQueryVersion", (__GLXextFuncPtr) glXQueryVersion },
-   { "glXSwapBuffers", (__GLXextFuncPtr) glXSwapBuffers },
-   { "glXUseXFont", (__GLXextFuncPtr) glXUseXFont },
-   { "glXWaitGL", (__GLXextFuncPtr) glXWaitGL },
-   { "glXWaitX", (__GLXextFuncPtr) glXWaitX },
-
-   /*** GLX_VERSION_1_1 ***/
-   { "glXGetClientString", (__GLXextFuncPtr) glXGetClientString },
-   { "glXQueryExtensionsString", (__GLXextFuncPtr) glXQueryExtensionsString },
-   { "glXQueryServerString", (__GLXextFuncPtr) glXQueryServerString },
-
-   /*** GLX_VERSION_1_2 ***/
-   { "glXGetCurrentDisplay", (__GLXextFuncPtr) glXGetCurrentDisplay },
-
-   /*** GLX_VERSION_1_3 ***/
-   { "glXChooseFBConfig", (__GLXextFuncPtr) glXChooseFBConfig },
-   { "glXCreateNewContext", (__GLXextFuncPtr) glXCreateNewContext },
-   { "glXCreatePbuffer", (__GLXextFuncPtr) glXCreatePbuffer },
-   { "glXCreatePixmap", (__GLXextFuncPtr) glXCreatePixmap },
-   { "glXCreateWindow", (__GLXextFuncPtr) glXCreateWindow },
-   { "glXDestroyPbuffer", (__GLXextFuncPtr) glXDestroyPbuffer },
-   { "glXDestroyPixmap", (__GLXextFuncPtr) glXDestroyPixmap },
-   { "glXDestroyWindow", (__GLXextFuncPtr) glXDestroyWindow },
-   { "glXGetCurrentReadDrawable", (__GLXextFuncPtr) glXGetCurrentReadDrawable },
-   { "glXGetFBConfigAttrib", (__GLXextFuncPtr) glXGetFBConfigAttrib },
-   { "glXGetFBConfigs", (__GLXextFuncPtr) glXGetFBConfigs },
-   { "glXGetSelectedEvent", (__GLXextFuncPtr) glXGetSelectedEvent },
-   { "glXGetVisualFromFBConfig", (__GLXextFuncPtr) glXGetVisualFromFBConfig },
-   { "glXMakeContextCurrent", (__GLXextFuncPtr) glXMakeContextCurrent },
-   { "glXQueryContext", (__GLXextFuncPtr) glXQueryContext },
-   { "glXQueryDrawable", (__GLXextFuncPtr) glXQueryDrawable },
-   { "glXSelectEvent", (__GLXextFuncPtr) glXSelectEvent },
-
-   /*** GLX_VERSION_1_4 ***/
-   { "glXGetProcAddress", (__GLXextFuncPtr) glXGetProcAddress },
-
-   /*** GLX_SGI_swap_control ***/
-   { "glXSwapIntervalSGI", (__GLXextFuncPtr) glXSwapIntervalSGI },
-
-   /*** GLX_SGI_video_sync ***/
-   { "glXGetVideoSyncSGI", (__GLXextFuncPtr) glXGetVideoSyncSGI },
-   { "glXWaitVideoSyncSGI", (__GLXextFuncPtr) glXWaitVideoSyncSGI },
-
-   /*** GLX_SGI_make_current_read ***/
-   { "glXMakeCurrentReadSGI", (__GLXextFuncPtr) glXMakeCurrentReadSGI },
-   { "glXGetCurrentReadDrawableSGI", (__GLXextFuncPtr) glXGetCurrentReadDrawableSGI },
-
-   /*** GLX_SGIX_video_source ***/
-#if defined(_VL_H)
-   { "glXCreateGLXVideoSourceSGIX", (__GLXextFuncPtr) glXCreateGLXVideoSourceSGIX },
-   { "glXDestroyGLXVideoSourceSGIX", (__GLXextFuncPtr) glXDestroyGLXVideoSourceSGIX },
-#endif
-
-   /*** GLX_EXT_import_context ***/
-   { "glXFreeContextEXT", (__GLXextFuncPtr) glXFreeContextEXT },
-   { "glXGetContextIDEXT", (__GLXextFuncPtr) glXGetContextIDEXT },
-   { "glXGetCurrentDisplayEXT", (__GLXextFuncPtr) glXGetCurrentDisplayEXT },
-   { "glXImportContextEXT", (__GLXextFuncPtr) glXImportContextEXT },
-   { "glXQueryContextInfoEXT", (__GLXextFuncPtr) glXQueryContextInfoEXT },
-
-   /*** GLX_SGIX_fbconfig ***/
-   { "glXGetFBConfigAttribSGIX", (__GLXextFuncPtr) glXGetFBConfigAttribSGIX },
-   { "glXChooseFBConfigSGIX", (__GLXextFuncPtr) glXChooseFBConfigSGIX },
-   { "glXCreateGLXPixmapWithConfigSGIX", (__GLXextFuncPtr) glXCreateGLXPixmapWithConfigSGIX },
-   { "glXCreateContextWithConfigSGIX", (__GLXextFuncPtr) glXCreateContextWithConfigSGIX },
-   { "glXGetVisualFromFBConfigSGIX", (__GLXextFuncPtr) glXGetVisualFromFBConfigSGIX },
-   { "glXGetFBConfigFromVisualSGIX", (__GLXextFuncPtr) glXGetFBConfigFromVisualSGIX },
-
-   /*** GLX_SGIX_pbuffer ***/
-   { "glXCreateGLXPbufferSGIX", (__GLXextFuncPtr) glXCreateGLXPbufferSGIX },
-   { "glXDestroyGLXPbufferSGIX", (__GLXextFuncPtr) glXDestroyGLXPbufferSGIX },
-   { "glXQueryGLXPbufferSGIX", (__GLXextFuncPtr) glXQueryGLXPbufferSGIX },
-   { "glXSelectEventSGIX", (__GLXextFuncPtr) glXSelectEventSGIX },
-   { "glXGetSelectedEventSGIX", (__GLXextFuncPtr) glXGetSelectedEventSGIX },
-
-   /*** GLX_SGI_cushion ***/
-   { "glXCushionSGI", (__GLXextFuncPtr) glXCushionSGI },
-
-   /*** GLX_SGIX_video_resize ***/
-   { "glXBindChannelToWindowSGIX", (__GLXextFuncPtr) glXBindChannelToWindowSGIX },
-   { "glXChannelRectSGIX", (__GLXextFuncPtr) glXChannelRectSGIX },
-   { "glXQueryChannelRectSGIX", (__GLXextFuncPtr) glXQueryChannelRectSGIX },
-   { "glXQueryChannelDeltasSGIX", (__GLXextFuncPtr) glXQueryChannelDeltasSGIX },
-   { "glXChannelRectSyncSGIX", (__GLXextFuncPtr) glXChannelRectSyncSGIX },
-
-   /*** GLX_SGIX_dmbuffer **/
-#if defined(_DM_BUFFER_H_)
-   { "glXAssociateDMPbufferSGIX", (__GLXextFuncPtr) glXAssociateDMPbufferSGIX },
-#endif
-
-   /*** GLX_SGIX_swap_group ***/
-   { "glXJoinSwapGroupSGIX", (__GLXextFuncPtr) glXJoinSwapGroupSGIX },
-
-   /*** GLX_SGIX_swap_barrier ***/
-   { "glXBindSwapBarrierSGIX", (__GLXextFuncPtr) glXBindSwapBarrierSGIX },
-   { "glXQueryMaxSwapBarriersSGIX", (__GLXextFuncPtr) glXQueryMaxSwapBarriersSGIX },
-
-   /*** GLX_SUN_get_transparent_index ***/
-   { "glXGetTransparentIndexSUN", (__GLXextFuncPtr) glXGetTransparentIndexSUN },
-
-   /*** GLX_MESA_copy_sub_buffer ***/
-   { "glXCopySubBufferMESA", (__GLXextFuncPtr) glXCopySubBufferMESA },
-
-   /*** GLX_MESA_pixmap_colormap ***/
-   { "glXCreateGLXPixmapMESA", (__GLXextFuncPtr) glXCreateGLXPixmapMESA },
-
-   /*** GLX_MESA_release_buffers ***/
-   { "glXReleaseBuffersMESA", (__GLXextFuncPtr) glXReleaseBuffersMESA },
-
-   /*** GLX_ARB_get_proc_address ***/
-   { "glXGetProcAddressARB", (__GLXextFuncPtr) glXGetProcAddressARB },
-
-   /*** GLX_EXT_texture_from_pixmap ***/
-   { "glXBindTexImageEXT", (__GLXextFuncPtr) glXBindTexImageEXT },
-   { "glXReleaseTexImageEXT", (__GLXextFuncPtr) glXReleaseTexImageEXT },
-
-   { NULL, NULL }   /* end of list */
-};
-
-
-
-/*
- * Return address of named glX function, or NULL if not found.
- */
-__GLXextFuncPtr
-_glxapi_get_proc_address(const char *funcName)
-{
-   GLuint i;
-   for (i = 0; GLX_functions[i].Name; i++) {
-      if (strcmp(GLX_functions[i].Name, funcName) == 0)
-         return GLX_functions[i].Address;
-   }
-   return NULL;
-}
-
-
-
-/*
- * This function does not get dispatched through the dispatch table
- * since it's really a "meta" function.
- */
-__GLXextFuncPtr
-glXGetProcAddressARB(const GLubyte *procName)
-{
-   __GLXextFuncPtr f;
-
-   f = _glxapi_get_proc_address((const char *) procName);
-   if (f) {
-      return f;
-   }
-
-   f = (__GLXextFuncPtr) _glapi_get_proc_address((const char *) procName);
-   return f;
-}
-
-
-/* GLX 1.4 */
-void (*glXGetProcAddress(const GLubyte *procName))()
-{
-   return glXGetProcAddressARB(procName);
-}
diff --git a/src/gallium/state_trackers/glx/xlib/glxapi.h b/src/gallium/state_trackers/glx/xlib/glxapi.h
deleted file mode 100644 (file)
index b4e12b4..0000000
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Mesa 3-D graphics library
- * Version:  6.3
- * 
- * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-#ifndef _glxapi_h_
-#define _glxapi_h_
-
-
-#define GLX_GLXEXT_PROTOTYPES
-#include "GL/glx.h"
-
-
-/* The GLX API dispatcher (i.e. this code) is being built into stand-alone
- * Mesa.  We don't know anything about XFree86 or real GLX so we define a
- * minimal __GLXContextRec here so some of the functions in this file can
- * work properly.
- */
-typedef struct __GLXcontextRec {
-   Display *currentDpy;
-   GLboolean isDirect;
-   GLXDrawable currentDrawable;
-   GLXDrawable currentReadable;
-   XID xid;
-} __GLXcontext;
-
-
-/*
- * Almost all the GLX API functions get routed through this dispatch table.
- * The exceptions are the glXGetCurrentXXX() functions.
- *
- * This dispatch table allows multiple GLX client-side modules to coexist.
- * Specifically, a real GLX library (like SGI's or the Utah GLX) and Mesa's
- * pseudo-GLX can be present at the same time.  The former being used on
- * GLX-enabled X servers and the later on non-GLX X servers.
- *
- * Red Hat has been using this since Red Hat Linux 7.0 (I think).
- * This'll be a standard feature in XFree86 4.3.  It basically allows one
- * libGL to do both DRI-rendering and "fake GLX" rendering to X displays
- * that lack the GLX extension.
- */
-struct _glxapi_table {
-   /*** GLX_VERSION_1_0 ***/
-   XVisualInfo *(*ChooseVisual)(Display *dpy, int screen, int *list);
-   void (*CopyContext)(Display *dpy, GLXContext src, GLXContext dst, unsigned long mask);
-   GLXContext (*CreateContext)(Display *dpy, XVisualInfo *visinfo, GLXContext shareList, Bool direct);
-   GLXPixmap (*CreateGLXPixmap)(Display *dpy, XVisualInfo *visinfo, Pixmap pixmap);
-   void (*DestroyContext)(Display *dpy, GLXContext ctx);
-   void (*DestroyGLXPixmap)(Display *dpy, GLXPixmap pixmap);
-   int (*GetConfig)(Display *dpy, XVisualInfo *visinfo, int attrib, int *value);
-   /*GLXContext (*GetCurrentContext)(void);*/
-   /*GLXDrawable (*GetCurrentDrawable)(void);*/
-   Bool (*IsDirect)(Display *dpy, GLXContext ctx);
-   Bool (*MakeCurrent)(Display *dpy, GLXDrawable drawable, GLXContext ctx);
-   Bool (*QueryExtension)(Display *dpy, int *errorb, int *event);
-   Bool (*QueryVersion)(Display *dpy, int *maj, int *min);
-   void (*SwapBuffers)(Display *dpy, GLXDrawable drawable);
-   void (*UseXFont)(Font font, int first, int count, int listBase);
-   void (*WaitGL)(void);
-   void (*WaitX)(void);
-
-   /*** GLX_VERSION_1_1 ***/
-   const char *(*GetClientString)(Display *dpy, int name);
-   const char *(*QueryExtensionsString)(Display *dpy, int screen);
-   const char *(*QueryServerString)(Display *dpy, int screen, int name);
-
-   /*** GLX_VERSION_1_2 ***/
-   /*Display *(*GetCurrentDisplay)(void);*/
-
-   /*** GLX_VERSION_1_3 ***/
-   GLXFBConfig *(*ChooseFBConfig)(Display *dpy, int screen, const int *attribList, int *nitems);
-   GLXContext (*CreateNewContext)(Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool direct);
-   GLXPbuffer (*CreatePbuffer)(Display *dpy, GLXFBConfig config, const int *attribList);
-   GLXPixmap (*CreatePixmap)(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList);
-   GLXWindow (*CreateWindow)(Display *dpy, GLXFBConfig config, Window win, const int *attribList);
-   void (*DestroyPbuffer)(Display *dpy, GLXPbuffer pbuf);
-   void (*DestroyPixmap)(Display *dpy, GLXPixmap pixmap);
-   void (*DestroyWindow)(Display *dpy, GLXWindow window);
-   /*GLXDrawable (*GetCurrentReadDrawable)(void);*/
-   int (*GetFBConfigAttrib)(Display *dpy, GLXFBConfig config, int attribute, int *value);
-   GLXFBConfig *(*GetFBConfigs)(Display *dpy, int screen, int *nelements);
-   void (*GetSelectedEvent)(Display *dpy, GLXDrawable drawable, unsigned long *mask);
-   XVisualInfo *(*GetVisualFromFBConfig)(Display *dpy, GLXFBConfig config);
-   Bool (*MakeContextCurrent)(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
-   int (*QueryContext)(Display *dpy, GLXContext ctx, int attribute, int *value);
-   void (*QueryDrawable)(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
-   void (*SelectEvent)(Display *dpy, GLXDrawable drawable, unsigned long mask);
-
-   /*** GLX_SGI_swap_control ***/
-   int (*SwapIntervalSGI)(int);
-
-   /*** GLX_SGI_video_sync ***/
-   int (*GetVideoSyncSGI)(unsigned int *count);
-   int (*WaitVideoSyncSGI)(int divisor, int remainder, unsigned int *count);
-
-   /*** GLX_SGI_make_current_read ***/
-   Bool (*MakeCurrentReadSGI)(Display *, GLXDrawable, GLXDrawable, GLXContext);
-   /*GLXDrawable (*GetCurrentReadDrawableSGI)(void);*/
-
-   /*** GLX_SGIX_video_source (needs video library) ***/
-#if defined(_VL_H_)
-   GLXVideoSourceSGIX (*CreateGLXVideoSourceSGIX)(Display *, int, VLServer, VLPath, int, VLNode);
-   void (*DestroyGLXVideoSourceSGIX)(Display *, GLXVideoSourceSGIX);
-#else
-   void *CreateGLXVideoSourceSGIX;
-   void *DestroyGLXVideoSourceSGIX;
-#endif
-
-   /*** GLX_EXT_import_context ***/
-   void (*FreeContextEXT)(Display *dpy, GLXContext context);
-   GLXContextID (*GetContextIDEXT)(const GLXContext context);
-   /*Display *(*GetCurrentDisplayEXT)(void);*/
-   GLXContext (*ImportContextEXT)(Display *dpy, GLXContextID contextID);
-   int (*QueryContextInfoEXT)(Display *dpy, GLXContext context, int attribute,int *value);
-
-   /*** GLX_SGIX_fbconfig ***/
-   int (*GetFBConfigAttribSGIX)(Display *, GLXFBConfigSGIX, int, int *);
-   GLXFBConfigSGIX * (*ChooseFBConfigSGIX)(Display *, int, int *, int *);
-   GLXPixmap (*CreateGLXPixmapWithConfigSGIX)(Display *, GLXFBConfigSGIX, Pixmap);
-   GLXContext (*CreateContextWithConfigSGIX)(Display *, GLXFBConfigSGIX, int, GLXContext, Bool);
-   XVisualInfo * (*GetVisualFromFBConfigSGIX)(Display *, GLXFBConfigSGIX);
-   GLXFBConfigSGIX (*GetFBConfigFromVisualSGIX)(Display *, XVisualInfo *);
-
-   /*** GLX_SGIX_pbuffer ***/
-   GLXPbufferSGIX (*CreateGLXPbufferSGIX)(Display *, GLXFBConfigSGIX, unsigned int, unsigned int, int *);
-   void (*DestroyGLXPbufferSGIX)(Display *, GLXPbufferSGIX);
-   int (*QueryGLXPbufferSGIX)(Display *, GLXPbufferSGIX, int, unsigned int *);
-   void (*SelectEventSGIX)(Display *, GLXDrawable, unsigned long);
-   void (*GetSelectedEventSGIX)(Display *, GLXDrawable, unsigned long *);
-
-   /*** GLX_SGI_cushion ***/
-   void (*CushionSGI)(Display *, Window, float);
-
-   /*** GLX_SGIX_video_resize ***/
-   int (*BindChannelToWindowSGIX)(Display *, int, int, Window);
-   int (*ChannelRectSGIX)(Display *, int, int, int, int, int, int);
-   int (*QueryChannelRectSGIX)(Display *, int, int, int *, int *, int *, int *);
-   int (*QueryChannelDeltasSGIX)(Display *, int, int, int *, int *, int *, int *);
-   int (*ChannelRectSyncSGIX)(Display *, int, int, GLenum);
-
-   /*** GLX_SGIX_dmbuffer (needs dmedia library) ***/
-#if defined (_DM_BUFFER_H_)
-   Bool (*AssociateDMPbufferSGIX)(Display *, GLXPbufferSGIX, DMparams *, DMbuffer);
-#else
-   void *AssociciateDMPbufferSGIX;
-#endif
-
-   /*** GLX_SGIX_swap_group ***/
-   void (*JoinSwapGroupSGIX)(Display *, GLXDrawable, GLXDrawable);
-
-   /*** GLX_SGIX_swap_barrier ***/
-   void (*BindSwapBarrierSGIX)(Display *, GLXDrawable, int);
-   Bool (*QueryMaxSwapBarriersSGIX)(Display *, int, int *);
-
-   /*** GLX_SUN_get_transparent_index ***/
-   Status (*GetTransparentIndexSUN)(Display *, Window, Window, long *);
-
-   /*** GLX_MESA_copy_sub_buffer ***/
-   void (*CopySubBufferMESA)(Display *dpy, GLXDrawable drawable, int x, int y, int width, int height);
-
-   /*** GLX_MESA_release_buffers ***/
-   Bool (*ReleaseBuffersMESA)(Display *dpy, Window w);
-
-   /*** GLX_MESA_pixmap_colormap ***/
-   GLXPixmap (*CreateGLXPixmapMESA)(Display *dpy, XVisualInfo *visinfo, Pixmap pixmap, Colormap cmap);
-
-   /*** GLX_EXT_texture_from_pixmap ***/
-   void (*BindTexImageEXT)(Display *dpy, GLXDrawable drawable, int buffer,
-                           const int *attrib_list);
-   void (*ReleaseTexImageEXT)(Display *dpy, GLXDrawable drawable, int buffer);
-};
-
-
-
-extern const char *
-_glxapi_get_version(void);
-
-
-
-
-extern GLuint
-_glxapi_get_dispatch_table_size(void);
-
-
-extern void
-_glxapi_set_no_op_table(struct _glxapi_table *t);
-
-
-extern __GLXextFuncPtr
-_glxapi_get_proc_address(const char *funcName);
-
-
-#endif
index bdd434c..ce97a3e 100644 (file)
@@ -57,7 +57,7 @@ and create a window, you must do the following to use the X/Mesa interface:
 #define XMESA_H
 
 
-#include "mtypes.h"
+#include "main/mtypes.h"
 #include "state_tracker/st_context.h"
 #include "state_tracker/st_public.h"
 #include "pipe/p_thread.h"
index 49807b9..9a49f2e 100644 (file)
@@ -60,7 +60,7 @@ static const char convolution_asm[] =
    "DCL SAMP[0], CONSTANT\n"
    "0: MOV TEMP[0], CONST[0].xxxx\n"
    "1: MOV TEMP[1], CONST[0].xxxx\n"
-   "2: BGNLOOP2 :14\n"
+   "2: BGNLOOP :14\n"
    "3: SGE TEMP[0].z, TEMP[0].yyyy, CONST[1].xxxx\n"
    "4: IF TEMP[0].zzzz :7\n"
    "5: BRK\n"
@@ -72,7 +72,7 @@ static const char convolution_asm[] =
    "11: MOV TEMP[3], CONST[ADDR[0]+%d]\n"
    "12: MAD TEMP[1], TEMP[2], TEMP[3], TEMP[1]\n"
    "13: ADD TEMP[0].y, TEMP[0].yyyy, CONST[0].yyyy\n"
-   "14: ENDLOOP2 :2\n"
+   "14: ENDLOOP :2\n"
    "15: MAD OUT[0], TEMP[1], CONST[1].yyyy, CONST[1].zzzz\n"
    "16: END\n";
 
index c262ce0..56cc60a 100644 (file)
@@ -367,6 +367,11 @@ void st_make_current(struct vg_context *st,
    }
 }
 
+struct vg_context *st_get_current(void)
+{
+   return vg_current_context();
+}
+
 void st_flush(struct vg_context *st, uint pipeFlushFlags,
               struct pipe_fence_handle **fence)
 {
@@ -399,8 +404,13 @@ void st_notify_swapbuffers_complete(struct st_framebuffer *stfb)
 {
 }
 
-int
-st_set_teximage(struct pipe_texture *pt, int target)
+int st_bind_texture_surface(struct pipe_surface *ps, int target, int level,
+                            enum pipe_format format)
+{
+   return 0;
+}
+
+int st_unbind_texture_surface(struct pipe_surface *ps, int target, int level)
 {
    return 0;
 }
index 805c58c..5457631 100644 (file)
@@ -70,7 +70,10 @@ void st_set_framebuffer_surface(struct st_framebuffer *stfb,
 void st_get_framebuffer_dimensions( struct st_framebuffer *stfb,
                                    uint *width, uint *height);
 
-int st_set_teximage(struct pipe_texture *pt, int target);
+int st_bind_texture_surface(struct pipe_surface *ps, int target, int level,
+                            enum pipe_format format);
+
+int st_unbind_texture_surface(struct pipe_surface *ps, int target, int level);
 
 int st_get_framebuffer_surface(struct st_framebuffer *stfb,
                                uint surfIndex, struct pipe_surface **surf);
@@ -86,6 +89,8 @@ void st_make_current(struct vg_context *st,
                      struct st_framebuffer *draw,
                      struct st_framebuffer *read);
 
+struct vg_context *st_get_current(void);
+
 void st_flush(struct vg_context *st, uint pipeFlushFlags,
                struct pipe_fence_handle **fence);
 void st_finish(struct vg_context *st);
index ae3338f..3fbab4d 100644 (file)
 #include "pipe/p_state.h"
 #include "pipe/p_inlines.h"
 
+#include "util/u_rect.h"
+
 typedef struct {
     PixmapPtr pPixmap;
     struct pipe_texture *tex;
     struct pipe_buffer *buf;
+    struct pipe_fence_handle *fence;
 } *BufferPrivatePtr;
 
 static DRI2BufferPtr
@@ -83,7 +86,6 @@ driCreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count)
            pipe_texture_reference(&tex, depth);
        } else if (attachments[i] == DRI2BufferDepth) {
            struct pipe_texture template;
-
            memset(&template, 0, sizeof(template));
            template.target = PIPE_TEXTURE_2D;
            template.format = PIPE_FORMAT_S8Z24_UNORM;
@@ -92,22 +94,20 @@ driCreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count)
            template.height[0] = pDraw->height;
            template.depth[0] = 1;
            template.last_level = 0;
-           template.tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET;
+           template.tex_usage = PIPE_TEXTURE_USAGE_DEPTH_STENCIL;
            tex = ms->screen->texture_create(ms->screen, &template);
+           depth = tex;
        } else {
-           struct pipe_texture template;
-           memset(&template, 0, sizeof(template));
-           template.target = PIPE_TEXTURE_2D;
-           template.format = PIPE_FORMAT_A8R8G8B8_UNORM;
-           pf_get_block(template.format, &template.block);
-           template.width[0] = pDraw->width;
-           template.height[0] = pDraw->height;
-           template.depth[0] = 1;
-           template.last_level = 0;
-           template.tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET;
-           tex = ms->screen->texture_create(ms->screen, &template);
+           pPixmap = (*pScreen->CreatePixmap)(pScreen, pDraw->width,
+                                              pDraw->height,
+                                              pDraw->depth,
+                                              0);
+           tex = xorg_exa_get_texture(pPixmap);
        }
 
+       if (!tex)
+               FatalError("NO TEXTURE IN DRI2\n");
+
        ms->api->buffer_from_texture(ms->api, tex, &buf, &stride);
        ms->api->global_handle_from_buffer(ms->api, ms->screen, buf, &handle);
 
@@ -138,15 +138,17 @@ driDestroyBuffers(DrawablePtr pDraw, DRI2BufferPtr buffers, int count)
     modesettingPtr ms = modesettingPTR(pScrn);
     BufferPrivatePtr private;
     int i;
+    (void)ms;
 
     for (i = 0; i < count; i++) {
        private = buffers[i].driverPrivate;
 
-       if (private->pPixmap)
-           (*pScreen->DestroyPixmap)(private->pPixmap);
-
        pipe_texture_reference(&private->tex, NULL);
        pipe_buffer_reference(&private->buf, NULL);
+        ms->screen->fence_reference(ms->screen, &private->fence, NULL);
+
+       if (private->pPixmap)
+           (*pScreen->DestroyPixmap)(private->pPixmap);
     }
 
     if (buffers) {
@@ -164,19 +166,42 @@ driCopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
     modesettingPtr ms = modesettingPTR(pScrn);
     BufferPrivatePtr dst_priv = pDestBuffer->driverPrivate;
     BufferPrivatePtr src_priv = pSrcBuffer->driverPrivate;
+    PixmapPtr src_pixmap;
+    PixmapPtr dst_pixmap;
+    GCPtr gc;
+    RegionPtr copy_clip;
+
+    src_pixmap = src_priv->pPixmap;
+    dst_pixmap = dst_priv->pPixmap;
+    if (pSrcBuffer->attachment == DRI2BufferFrontLeft)
+       src_pixmap = (PixmapPtr)pDraw;
+    if (pDestBuffer->attachment == DRI2BufferFrontLeft)
+       dst_pixmap = (PixmapPtr)pDraw;
+    gc = GetScratchGC(pDraw->depth, pScreen);
+    copy_clip = REGION_CREATE(pScreen, NULL, 0);
+    REGION_COPY(pScreen, copy_clip, pRegion);
+    (*gc->funcs->ChangeClip) (gc, CT_REGION, copy_clip, 0);
+    ValidateGC(&dst_pixmap->drawable, gc);
+
+    /* If this is a full buffer swap, throttle on the previous one */
+    if (dst_priv->fence && REGION_NUM_RECTS(pRegion) == 1) {
+       BoxPtr extents = REGION_EXTENTS(pScreen, pRegion);
+
+       if (extents->x1 == 0 && extents->y1 == 0 &&
+           extents->x2 == pDraw->width && extents->y2 == pDraw->height) {
+           ms->screen->fence_finish(ms->screen, dst_priv->fence, 0);
+           ms->screen->fence_reference(ms->screen, &dst_priv->fence, NULL);
+       }
+    }
 
-    struct pipe_surface *dst_surf =
-       ms->screen->get_tex_surface(ms->screen, dst_priv->tex, 0, 0, 0,
-                                   PIPE_BUFFER_USAGE_GPU_WRITE);
-    struct pipe_surface *src_surf =
-       ms->screen->get_tex_surface(ms->screen, src_priv->tex, 0, 0, 0,
-                                   PIPE_BUFFER_USAGE_GPU_READ);
+    (*gc->ops->CopyArea)(&src_pixmap->drawable, &dst_pixmap->drawable, gc,
+                        0, 0, pDraw->width, pDraw->height, 0, 0);
 
-    ms->ctx->surface_copy(ms->ctx, dst_surf, 0, 0, src_surf,
-                         0, 0, pDraw->width, pDraw->height);
+    FreeScratchGC(gc);
 
-    pipe_surface_reference(&dst_surf, NULL);
-    pipe_surface_reference(&src_surf, NULL);
+    ms->ctx->flush(ms->ctx, PIPE_FLUSH_SWAPBUFFERS,
+                  pDestBuffer->attachment == DRI2BufferFrontLeft ?
+                  &dst_priv->fence : NULL);
 }
 
 Bool
index e01e529..53d1a33 100644 (file)
@@ -179,8 +179,10 @@ CreateFrontBuffer(ScrnInfoPtr pScrn)
     modesettingPtr ms = modesettingPTR(pScrn);
     ScreenPtr pScreen = pScrn->pScreen;
     PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen);
+    unsigned handle, stride;
 
     ms->noEvict = TRUE;
+    xorg_exa_set_displayed_usage(rootPixmap);
     pScreen->ModifyPixmapHeader(rootPixmap,
                                pScrn->virtualX, pScrn->virtualY,
                                pScrn->depth, pScrn->bitsPerPixel,
@@ -188,13 +190,16 @@ CreateFrontBuffer(ScrnInfoPtr pScrn)
                                NULL);
     ms->noEvict = FALSE;
 
+    handle = xorg_exa_get_pixmap_handle(rootPixmap, &stride);
+
     drmModeAddFB(ms->fd,
                 pScrn->virtualX,
                 pScrn->virtualY,
                 pScrn->depth,
                 pScrn->bitsPerPixel,
-                pScrn->displayWidth * pScrn->bitsPerPixel / 8,
-                xorg_exa_get_pixmap_handle(rootPixmap), &ms->fb_id);
+                stride,
+                handle,
+                &ms->fb_id);
 
     pScrn->frameX0 = 0;
     pScrn->frameY0 = 0;
@@ -426,6 +431,7 @@ CreateScreenResources(ScreenPtr pScreen)
     modesettingPtr ms = modesettingPTR(pScrn);
     PixmapPtr rootPixmap;
     Bool ret;
+    unsigned handle, stride;
 
     ms->noEvict = TRUE;
 
@@ -435,18 +441,22 @@ CreateScreenResources(ScreenPtr pScreen)
 
     rootPixmap = pScreen->GetScreenPixmap(pScreen);
 
+    xorg_exa_set_displayed_usage(rootPixmap);
     if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, NULL))
        FatalError("Couldn't adjust screen pixmap\n");
 
     ms->noEvict = FALSE;
 
+    handle = xorg_exa_get_pixmap_handle(rootPixmap, &stride);
+
     drmModeAddFB(ms->fd,
                 pScrn->virtualX,
                 pScrn->virtualY,
                 pScrn->depth,
                 pScrn->bitsPerPixel,
-                pScrn->displayWidth * pScrn->bitsPerPixel / 8,
-                xorg_exa_get_pixmap_handle(rootPixmap), &ms->fb_id);
+                stride,
+                handle,
+                 &ms->fb_id);
 
     AdjustFrame(pScrn->scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
 
@@ -623,6 +633,10 @@ LeaveVT(int scrnIndex, int flags)
 
     RestoreHWState(pScrn);
 
+    if (drmDropMaster(ms->fd))
+       xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                  "drmDropMaster failed: %s\n", strerror(errno));
+
     pScrn->vtSema = FALSE;
 }
 
@@ -635,6 +649,17 @@ EnterVT(int scrnIndex, int flags)
     ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
     modesettingPtr ms = modesettingPTR(pScrn);
 
+    if (drmSetMaster(ms->fd)) {
+       if (errno == EINVAL) {
+           xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                      "drmSetMaster failed: 2.6.29 or newer kernel required for "
+                      "multi-server DRI\n");
+       } else {
+           xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                      "drmSetMaster failed: %s\n", strerror(errno));
+       }
+    }
+
     /*
      * Only save state once per server generation since that's what most
      * drivers do.  Could change this to save state at each VT enter.
index 2c4291a..f2dac73 100644 (file)
@@ -359,8 +359,48 @@ ExaPixmapIsOffscreen(PixmapPtr pPixmap)
     return FALSE;
 }
 
+int
+xorg_exa_set_displayed_usage(PixmapPtr pPixmap)
+{
+    struct exa_pixmap_priv *priv;
+    priv = exaGetPixmapDriverPrivate(pPixmap);
+
+    if (!priv) {
+       FatalError("NO PIXMAP PRIVATE\n");
+       return 0;
+    }
+
+    if (priv->flags & ~PIPE_TEXTURE_USAGE_PRIMARY) {
+       FatalError("BAD FLAGS\n");
+       return 0;
+    }
+    priv->flags = PIPE_TEXTURE_USAGE_PRIMARY;
+
+    return 0;
+}
+
+int
+xorg_exa_set_shared_usage(PixmapPtr pPixmap)
+{
+    struct exa_pixmap_priv *priv;
+    priv = exaGetPixmapDriverPrivate(pPixmap);
+
+    if (!priv) {
+       FatalError("NO PIXMAP PRIVATE\n");
+       return 0;
+    }
+
+    if (priv->flags & ~PIPE_TEXTURE_USAGE_DISPLAY_TARGET) {
+       FatalError("BAD FLAGS\n");
+       return 0;
+    }
+    priv->flags = PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
+
+    return 0;
+}
+
 unsigned
-xorg_exa_get_pixmap_handle(PixmapPtr pPixmap)
+xorg_exa_get_pixmap_handle(PixmapPtr pPixmap, unsigned *stride_out)
 {
     ScreenPtr pScreen = pPixmap->drawable.pScreen;
     ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
@@ -385,6 +425,9 @@ xorg_exa_get_pixmap_handle(PixmapPtr pPixmap)
     ms->api->buffer_from_texture(ms->api, priv->tex, &buffer, &stride);
     ms->api->handle_from_buffer(ms->api, ms->screen, buffer, &handle);
     pipe_buffer_reference(&buffer, NULL);
+    if (stride_out)
+       *stride_out = stride;
+
     return handle;
 }
 
@@ -421,7 +464,9 @@ ExaModifyPixmapHeader(PixmapPtr pPixmap, int width, int height,
                             bitsPerPixel, devKind, NULL);
 
     /* Deal with screen resize */
-    if (priv->tex && (priv->tex->width[0] != width || priv->tex->height[0] != height)) {
+    if (priv->tex && (priv->tex->width[0] != width ||
+                     priv->tex->height[0] != height ||
+                     priv->tex_flags != priv->flags)) {
        pipe_texture_reference(&priv->tex, NULL);
     }
 
@@ -436,7 +481,8 @@ ExaModifyPixmapHeader(PixmapPtr pPixmap, int width, int height,
        template.height[0] = height;
        template.depth[0] = 1;
        template.last_level = 0;
-       template.tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET;
+       template.tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET | priv->flags;
+       priv->tex_flags = priv->flags;
        priv->tex = exa->scrn->texture_create(exa->scrn, &template);
     }
 
index 650997a..f0508eb 100644 (file)
@@ -14,6 +14,8 @@ struct exa_context
 struct exa_pixmap_priv
 {
     int flags;
+    int tex_flags;
+
     struct pipe_texture *tex;
     unsigned int color;
     struct pipe_surface *src_surf; /* for copies */
index b4742bd..910782d 100644 (file)
@@ -31,6 +31,7 @@
 #ifndef _XORG_TRACKER_H_
 #define _XORG_TRACKER_H_
 
+#include <stddef.h>
 #include <stdint.h>
 #include <errno.h>
 #include <drm.h>
@@ -98,7 +99,13 @@ struct pipe_texture *
 xorg_exa_get_texture(PixmapPtr pPixmap);
 
 unsigned
-xorg_exa_get_pixmap_handle(PixmapPtr pPixmap);
+xorg_exa_get_pixmap_handle(PixmapPtr pPixmap, unsigned *stride);
+
+int
+xorg_exa_set_displayed_usage(PixmapPtr pPixmap);
+
+int
+xorg_exa_set_shared_usage(PixmapPtr pPixmap);
 
 void *
 xorg_exa_init(ScrnInfoPtr pScrn);
index 985e5a8..9635c3c 100644 (file)
@@ -83,7 +83,9 @@ default: depend symlinks $(TOP)/$(LIB_DIR)/gallium/$(LIBNAME)
 
 $(LIBNAME): $(OBJECTS) $(MESA_MODULES) $(PIPE_DRIVERS) $(WINOBJ) Makefile $(TOP)/src/mesa/drivers/dri/Makefile.template
        $(MKLIB) -noprefix -o $@ \
-               $(OBJECTS) $(PIPE_DRIVERS) $(MESA_MODULES)  $(WINOBJ) $(DRI_LIB_DEPS) $(DRIVER_EXTRAS)
+               $(OBJECTS) $(PIPE_DRIVERS) \
+                -Wl,--start-group $(MESA_MODULES) -Wl,--end-group \
+                 $(WINOBJ) $(DRI_LIB_DEPS) $(DRIVER_EXTRAS)
 
 $(LIBNAME_EGL): $(WINSYS_OBJECTS) $(LIBS)
        $(MKLIB) -o $(LIBNAME_EGL) \
index e14e96e..6c00861 100644 (file)
@@ -2,11 +2,14 @@ Import('*')
 
 env = drienv.Clone()
 
+env.ParseConfig('pkg-config --cflags --libs libdrm_intel')
+
 drivers = [
+    st_dri,
+    inteldrm,
     softpipe,
     i915simple,
     trace,
-    inteldrm
 ]
 
 env.SharedLibrary(
index c5217ad..490bade 100644 (file)
@@ -8,6 +8,7 @@ PIPE_DRIVERS = \
        $(TOP)/src/gallium/state_trackers/egl/libegldrm.a \
        $(GALLIUMDIR)/winsys/drm/intel/gem/libinteldrm.a \
        $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
+       $(TOP)/src/gallium/drivers/trace/libtrace.a \
        $(TOP)/src/gallium/drivers/i915simple/libi915simple.a
 
 DRIVER_SOURCES =
index d5e63c3..c4a7958 100644 (file)
@@ -21,12 +21,10 @@ intel_be_batchbuffer_alloc(struct intel_be_context *intel)
        batch->base.size = 0;
        batch->base.actual_size = intel->device->max_batch_size;
        batch->base.relocs = 0;
-       batch->base.max_relocs = 500;/*INTEL_DEFAULT_RELOCS;*/
+       batch->base.max_relocs = 100;/*INTEL_DEFAULT_RELOCS;*/
 
-       batch->base.map = malloc(batch->base.actual_size);
-       memset(batch->base.map, 0, batch->base.actual_size);
-
-       batch->base.ptr = batch->base.map;
+       batch->intel = intel;
+       batch->device = intel->device;
 
        intel_be_batchbuffer_reset(batch);
 
@@ -41,16 +39,17 @@ intel_be_batchbuffer_reset(struct intel_be_batchbuffer *batch)
 
        if (batch->bo)
                drm_intel_bo_unreference(batch->bo);
+       batch->bo = drm_intel_bo_alloc(dev->pools.gem,
+                                      "gallium3d_batch_buffer",
+                                      batch->base.actual_size,
+                                      4096);
+       drm_intel_bo_map(batch->bo, TRUE);
+       batch->base.map = batch->bo->virtual;
 
        memset(batch->base.map, 0, batch->base.actual_size);
        batch->base.ptr = batch->base.map;
        batch->base.size = batch->base.actual_size - BATCH_RESERVED;
-
        batch->base.relocs = 0;
-
-       batch->bo = drm_intel_bo_alloc(dev->pools.gem,
-                                      "gallium3d_batch_buffer",
-                                      batch->base.actual_size, 0);
 }
 
 int
@@ -88,6 +87,7 @@ intel_be_batchbuffer_flush(struct intel_be_batchbuffer *batch,
        struct i915_batchbuffer *i915 = &batch->base;
        unsigned used = 0;
        int ret = 0;
+       int i;
 
        assert(i915_batchbuffer_space(i915) >= 0);
 
@@ -105,11 +105,29 @@ intel_be_batchbuffer_flush(struct intel_be_batchbuffer *batch,
 
        used = batch->base.ptr - batch->base.map;
 
-       drm_intel_bo_subdata(batch->bo, 0, used, batch->base.map);
-       ret = drm_intel_bo_exec(batch->bo, used, NULL, 0, 0);
+       drm_intel_bo_unmap(batch->bo);
 
+       /* Do the sending to HW */
+       ret = drm_intel_bo_exec(batch->bo, used, NULL, 0, 0);
        assert(ret == 0);
 
+       if (batch->device->dump_cmd) {
+               unsigned *ptr;
+               drm_intel_bo_map(batch->bo, FALSE);
+               ptr = (unsigned*)batch->bo->virtual;
+
+               debug_printf("%s:\n", __func__);
+               for (i = 0; i < used / 4; i++, ptr++) {
+                       debug_printf("\t%08x:    %08x\n", i*4, *ptr);
+               }
+
+               drm_intel_bo_unmap(batch->bo);
+       } else {
+               /* TODO figgure out why the gpu hangs if we don't run sync */
+               drm_intel_bo_map(batch->bo, FALSE);
+               drm_intel_bo_unmap(batch->bo);
+       }
+
        intel_be_batchbuffer_reset(batch);
 
        if (fence) {
@@ -134,6 +152,5 @@ intel_be_batchbuffer_free(struct intel_be_batchbuffer *batch)
        if (batch->bo)
                drm_intel_bo_unreference(batch->bo);
 
-       free(batch->base.map);
        free(batch);
 }
index db84f9a..629987c 100644 (file)
@@ -36,7 +36,7 @@ intel_be_batch_reloc(struct i915_winsys *sws,
        }
 
        if (access_flags & I915_BUFFER_ACCESS_READ) {
-               read |= I915_GEM_DOMAIN_VERTEX;
+               read |= I915_GEM_DOMAIN_SAMPLER;
        }
 
        ret = intel_be_offset_relocation(intel->batch,
index e3630f5..5312865 100644 (file)
@@ -7,6 +7,7 @@
 #include "pipe/p_inlines.h"
 #include "util/u_memory.h"
 #include "util/u_debug.h"
+#include "util/u_math.h"
 
 #include "intel_be_fence.h"
 
@@ -16,6 +17,8 @@
 #include "intel_be_api.h"
 #include <stdio.h>
 
+#define I915_TILING_X 1
+
 /*
  * Buffer
  */
@@ -25,9 +28,10 @@ intel_be_buffer_map(struct pipe_winsys *winsys,
                    struct pipe_buffer *buf,
                    unsigned flags)
 {
+       struct intel_be_buffer *buffer = intel_be_buffer(buf);
        drm_intel_bo *bo = intel_bo(buf);
        int write = 0;
-       int ret;
+       int ret = 0;
 
         if (flags & PIPE_BUFFER_USAGE_DONTBLOCK) {
            /* Remove this when drm_intel_bo_map supports DONTBLOCK 
@@ -38,19 +42,37 @@ intel_be_buffer_map(struct pipe_winsys *winsys,
        if (flags & PIPE_BUFFER_USAGE_CPU_WRITE)
                write = 1;
 
-       ret = drm_intel_bo_map(bo, write);
+       if (buffer->map_count)
+               goto out;
+
+       if (buffer->map_gtt)
+               ret = drm_intel_gem_bo_map_gtt(bo);
+       else
+               ret = drm_intel_bo_map(bo, write);
+
+       buffer->ptr = bo->virtual;
 
+out:
        if (ret)
                return NULL;
 
-       return bo->virtual;
+       buffer->map_count++;
+       return buffer->ptr;
 }
 
 static void
 intel_be_buffer_unmap(struct pipe_winsys *winsys,
                      struct pipe_buffer *buf)
 {
-       drm_intel_bo_unmap(intel_bo(buf));
+       struct intel_be_buffer *buffer = intel_be_buffer(buf);
+
+       if (--buffer->map_count)
+               return;
+
+       if (buffer->map_gtt)
+               drm_intel_gem_bo_unmap_gtt(intel_bo(buf));
+       else
+               drm_intel_bo_unmap(intel_bo(buf));
 }
 
 static void
@@ -80,8 +102,13 @@ intel_be_buffer_create(struct pipe_winsys *winsys,
        buffer->base.size = size;
        buffer->flinked = FALSE;
        buffer->flink = 0;
+       buffer->map_gtt = FALSE;
 
-       if (usage & (PIPE_BUFFER_USAGE_VERTEX | PIPE_BUFFER_USAGE_CONSTANT)) {
+       if (usage & I915_BUFFER_USAGE_SCANOUT) {
+               /* Scanout buffer */
+               name = "gallium3d_scanout";
+               pool = dev->pools.gem;
+       } else if (usage & (PIPE_BUFFER_USAGE_VERTEX | PIPE_BUFFER_USAGE_CONSTANT)) {
                /* Local buffer */
                name = "gallium3d_local";
                pool = dev->pools.gem;
@@ -96,6 +123,12 @@ intel_be_buffer_create(struct pipe_winsys *winsys,
        }
 
        buffer->bo = drm_intel_bo_alloc(pool, name, size, alignment);
+       if (usage & I915_BUFFER_USAGE_SCANOUT) {
+               unsigned tiling = I915_TILING_X;
+               unsigned stride = 2048 * 4; /* TODO do something smarter here */
+               drm_intel_bo_set_tiling(buffer->bo, &tiling, stride);
+               buffer->map_gtt = TRUE;
+       }
 
        if (!buffer->bo)
                goto err;
@@ -142,6 +175,40 @@ err:
        return NULL;
 }
 
+static struct pipe_buffer *
+intel_be_surface_buffer_create(struct pipe_winsys *winsys,
+                               unsigned width, unsigned height,
+                               enum pipe_format format,
+                               unsigned usage,
+                               unsigned tex_usage,
+                               unsigned *stride)
+{
+       struct pipe_format_block block;
+       unsigned buf_usage = 0;
+       unsigned buf_stride = 0;
+       unsigned buf_size = 0;
+
+       pf_get_block(format, &block);
+       buf_stride = pf_get_stride(&block, width);
+       buf_stride = align(buf_stride, 64);
+
+       if (tex_usage & PIPE_TEXTURE_USAGE_PRIMARY) {
+               /* TODO more checks */
+               assert(buf_stride <= 2048*4);
+               assert(height % 8 == 0);
+               buf_stride = 2048 * 4;
+               buf_usage |= I915_BUFFER_USAGE_SCANOUT;
+       }
+
+       buf_size = buf_stride * height;
+       *stride = buf_stride;
+
+       return intel_be_buffer_create(winsys,
+                                     0,
+                                     buf_usage,
+                                     buf_size);
+}
+
 boolean
 intel_be_get_texture_buffer(struct drm_api *api,
                             struct pipe_texture *texture,
@@ -225,6 +292,7 @@ intel_be_global_handle_from_buffer(struct drm_api *api,
        *handle = buf->flink;
        return TRUE;
 }
+
 /*
  * Fence
  */
@@ -296,8 +364,8 @@ intel_be_init_device(struct intel_be_device *dev, int fd, unsigned id)
        dev->base.buffer_unmap = intel_be_buffer_unmap;
        dev->base.buffer_destroy = intel_be_buffer_destroy;
 
-       /* Not used anymore */
-       dev->base.surface_buffer_create = NULL;
+       /* Used by softpipe */
+       dev->base.surface_buffer_create = intel_be_surface_buffer_create;
 
        dev->base.fence_reference = intel_be_fence_refunref;
        dev->base.fence_signalled = intel_be_fence_signalled;
@@ -308,6 +376,7 @@ intel_be_init_device(struct intel_be_device *dev, int fd, unsigned id)
        dev->pools.gem = drm_intel_bufmgr_gem_init(dev->fd, dev->max_batch_size);
 
        dev->softpipe = debug_get_bool_option("INTEL_SOFTPIPE", FALSE);
+       dev->dump_cmd = debug_get_bool_option("INTEL_DUMP_CMD", FALSE);
 
        return true;
 }
index 56d95bd..c397048 100644 (file)
@@ -19,6 +19,7 @@ struct intel_be_device
        struct pipe_winsys base;
 
        boolean softpipe;
+       boolean dump_cmd;
 
        int fd; /**< Drm file discriptor */
 
@@ -47,6 +48,10 @@ intel_be_init_device(struct intel_be_device *device, int fd, unsigned id);
 
 struct intel_be_buffer {
        struct pipe_buffer base;
+       void *ptr;
+       unsigned map_count;
+       boolean map_gtt;
+
        drm_intel_bo *bo;
        boolean flinked;
        unsigned flink;
index d51cca8..9e56853 100644 (file)
@@ -19,6 +19,7 @@ LIBS = \
        $(TOP)/src/gallium/state_trackers/xorg/libxorgtracker.a \
        $(TOP)/src/gallium/winsys/drm/intel/gem/libinteldrm.a \
        $(TOP)/src/gallium/drivers/i915simple/libi915simple.a \
+       $(TOP)/src/gallium/drivers/trace/libtrace.a \
        $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
        $(GALLIUM_AUXILIARIES)
 
index 684a487..775bda8 100644 (file)
@@ -72,6 +72,7 @@ static struct pipe_buffer *radeon_buffer_create(struct pipe_winsys *ws,
             alignment, domain, 0);
     if (radeon_buffer->bo == NULL) {
         FREE(radeon_buffer);
+        return NULL;
     }
     return &radeon_buffer->base;
 }
index 8c8b61f..f5153b0 100644 (file)
@@ -61,11 +61,6 @@ struct radeon_winsys_priv {
     /* Radeon BO manager. */
     struct radeon_bo_manager* bom;
 
-    /* Radeon BO space checker. */
-    struct radeon_cs_space_check sc[RADEON_MAX_BOS];
-    /* Current BO count. */
-    unsigned bo_count;
-
     /* Radeon CS manager. */
     struct radeon_cs_manager* csm;
 
index da20101..8d818cf 100644 (file)
@@ -29,7 +29,6 @@
  */
 
 #include "radeon_drm.h"
-#include "trace/tr_drm.h"
 
 /* Create a pipe_screen. */
 struct pipe_screen* radeon_create_screen(struct drm_api* api,
@@ -54,7 +53,8 @@ struct pipe_context* radeon_create_context(struct drm_api* api,
     if (getenv("RADEON_SOFTPIPE")) {
         return radeon_create_softpipe(screen->winsys);
     } else {
-        return r300_create_context(screen, screen->winsys);
+        return r300_create_context(screen,
+                                   (struct r300_winsys*)screen->winsys);
     }
 }
 
index 8560f71..88a5c82 100644 (file)
 #ifndef RADEON_DRM_H
 #define RADEON_DRM_H
 
+#include <sys/ioctl.h>
+
+#include "xf86drm.h"
+
 #include "pipe/p_screen.h"
 
+#include "trace/tr_drm.h"
 #include "util/u_memory.h"
 
 #include "state_tracker/drm_api.h"
@@ -40,6 +45,9 @@
 #include "radeon_r300.h"
 #include "radeon_winsys_softpipe.h"
 
+/* XXX */
+#include "r300_screen.h"
+
 struct pipe_screen* radeon_create_screen(struct drm_api* api,
                                          int drmFB,
                                         struct drm_create_screen_arg *arg);
index 8c5f756..4e9a2dd 100644 (file)
@@ -27,66 +27,25 @@ static boolean radeon_r300_add_buffer(struct r300_winsys* winsys,
                                       uint32_t rd,
                                       uint32_t wd)
 {
-    int i;
     struct radeon_winsys_priv* priv =
         (struct radeon_winsys_priv*)winsys->radeon_winsys;
-    struct radeon_cs_space_check* sc = priv->sc;
     struct radeon_bo* bo = ((struct radeon_pipe_buffer*)pbuffer)->bo;
 
-    /* Check to see if this BO is already in line for validation;
-     * find a slot for it otherwise. */
-    for (i = 0; i < priv->bo_count; i++) {
-        if (sc[i].bo == bo) {
-            sc[i].read_domains |= rd;
-            sc[i].write_domain |= wd;
-            return TRUE;
-        }
-    }
-
-    if (priv->bo_count >= RADEON_MAX_BOS) {
-        /* Dohoho. Not falling for that one again. Request a flush. */
-        return FALSE;
-    }
-
-    sc[priv->bo_count].bo = bo;
-    sc[priv->bo_count].read_domains = rd;
-    sc[priv->bo_count].write_domain = wd;
-    priv->bo_count++;
-
+    radeon_cs_space_add_persistent_bo(priv->cs, bo, rd, wd);
     return TRUE;
 }
 
 static boolean radeon_r300_validate(struct r300_winsys* winsys)
 {
-    int retval, i;
     struct radeon_winsys_priv* priv =
         (struct radeon_winsys_priv*)winsys->radeon_winsys;
-    struct radeon_cs_space_check* sc = priv->sc;
-
-    retval = radeon_cs_space_check(priv->cs, sc, priv->bo_count);
-
-    if (retval == RADEON_CS_SPACE_OP_TO_BIG) {
-        /* We might as well HCF, since this is not going to fit in the card,
-         * period. */
-        /* XXX just drop it on the floor instead */
-       exit(1);
-    } else if (retval == RADEON_CS_SPACE_FLUSH) {
-        /* We must flush before more rendering can commence. */
-        return TRUE;
-    }
 
-    /* XXX should probably be its own function */
-    for (i = 0; i < priv->bo_count; i++) {
-        if (sc[i].read_domains && sc[i].write_domain) {
-            /* Cute, cute. We need to flush first. */
-            debug_printf("radeon: BO %p can't be read and written; "
-                    "requesting flush.\n", sc[i].bo);
-            return TRUE;
-        }
+    if (radeon_cs_space_check(priv->cs) < 0) {
+        return FALSE;
     }
 
     /* Things are fine, we can proceed as normal. */
-    return FALSE;
+    return TRUE;
 }
 
 static boolean radeon_r300_check_cs(struct r300_winsys* winsys, int size)
@@ -151,8 +110,7 @@ static void radeon_r300_flush_cs(struct r300_winsys* winsys)
 {
     struct radeon_winsys_priv* priv =
         (struct radeon_winsys_priv*)winsys->radeon_winsys;
-    struct radeon_cs_space_check* sc = priv->sc;
-    int retval = 1;
+    int retval;
 
     /* Emit the CS. */
     retval = radeon_cs_emit(priv->cs);
@@ -160,40 +118,34 @@ static void radeon_r300_flush_cs(struct r300_winsys* winsys)
         debug_printf("radeon: Bad CS, dumping...\n");
         radeon_cs_print(priv->cs, stderr);
     }
-    radeon_cs_erase(priv->cs);
 
     /* Clean out BOs. */
-    memset(sc, 0, sizeof(struct radeon_cs_space_check) * RADEON_MAX_BOS);
-    priv->bo_count = 0;
+    radeon_cs_space_reset_bos(priv->cs);
+
+    /* Reset CS.
+     * Someday, when we care about performance, we should really find a way
+     * to rotate between two or three CS objects so that the GPU can be
+     * spinning through one CS while another one is being filled. */
+    radeon_cs_erase(priv->cs);
 }
 
 /* Helper function to do the ioctls needed for setup and init. */
 static void do_ioctls(struct r300_winsys* winsys, int fd)
 {
     struct drm_radeon_gem_info gem_info = {0};
-    drm_radeon_getparam_t gp = {0};
     struct drm_radeon_info info = {0};
     int target = 0;
     int retval;
 
     info.value = &target;
-    gp.value = &target;
 
     /* First, get PCI ID */
     info.request = RADEON_INFO_DEVICE_ID;
     retval = drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info));
     if (retval) {
-        fprintf(stderr, "%s: New ioctl for PCI ID failed "
-                "(error number %d), trying classic ioctl...\n",
-                __FUNCTION__, retval);
-        gp.param = RADEON_PARAM_DEVICE_ID;
-        retval = drmCommandWriteRead(fd, DRM_RADEON_GETPARAM, &gp,
-                sizeof(gp));
-        if (retval) {
-            fprintf(stderr, "%s: Failed to get PCI ID, "
-                    "error number %d\n", __FUNCTION__, retval);
-            exit(1);
-        }
+        fprintf(stderr, "%s: Failed to get PCI ID, "
+                "error number %d\n", __FUNCTION__, retval);
+        exit(1);
     }
     winsys->pci_id = target;
 
index a2e0e58..741c137 100644 (file)
@@ -20,6 +20,9 @@
  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  * USE OR OTHER DEALINGS IN THE SOFTWARE. */
 
+#ifndef RADEON_R300_H
+#define RADEON_R300_H
+
 /* XXX WTF is this! I shouldn't have to include those first three! FUCK! */
 #include <stdint.h>
 #include <stdlib.h>
 
 #include "radeon_buffer.h"
 
-/* protect us from bonghits */
-#ifndef RADEON_INFO_DEVICE_ID
-#define RADEON_INFO_DEVICE_ID 0
-#endif
-#ifndef DRM_RADEON_INFO
-#define DRM_RADEON_INFO 0x1
-struct drm_radeon_info {
-       uint32_t                request;
-       uint32_t                pad;
-       uint64_t                value;
-};
-#endif
+struct radeon_winsys;
 
 struct r300_winsys*
 radeon_create_r300_winsys(int fd, struct radeon_winsys* old_winsys);
+
+#endif /* RADEON_R300_H */
index e1ddcae..f409a3f 100644 (file)
@@ -82,6 +82,7 @@ struct xlib_egl_surface
 {
    _EGLSurface Base;   /**< base class */
 
+   /* These are set for window surface */
    Display *Dpy;  /**< The X Display of the window */
    Window Win;    /**< The user-created window ID */
    GC Gc;
@@ -101,7 +102,7 @@ xlib_egl_driver(_EGLDriver *drv)
 }
 
 
-static struct xlib_egl_surface *
+static INLINE struct xlib_egl_surface *
 lookup_surface(EGLSurface surf)
 {
    _EGLSurface *surface = _eglLookupSurface(surf);
@@ -109,10 +110,10 @@ lookup_surface(EGLSurface surf)
 }
 
 
-static struct xlib_egl_context *
-lookup_context(EGLContext surf)
+static INLINE struct xlib_egl_context *
+lookup_context(EGLContext ctx)
 {
-   _EGLContext *context = _eglLookupContext(surf);
+   _EGLContext *context = _eglLookupContext(ctx);
    return (struct xlib_egl_context *) context;
 }
 
@@ -180,7 +181,9 @@ create_configs(_EGLDriver *drv, EGLDisplay dpy)
       SET_CONFIG_ATTRIB(config, EGL_NATIVE_RENDERABLE, EGL_FALSE);
       SET_CONFIG_ATTRIB(config, EGL_CONFORMANT, all_apis);
       SET_CONFIG_ATTRIB(config, EGL_RENDERABLE_TYPE, all_apis);
-      SET_CONFIG_ATTRIB(config, EGL_SURFACE_TYPE, EGL_WINDOW_BIT);
+      SET_CONFIG_ATTRIB(config, EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT);
+      SET_CONFIG_ATTRIB(config, EGL_BIND_TO_TEXTURE_RGBA, EGL_TRUE);
+      SET_CONFIG_ATTRIB(config, EGL_BIND_TO_TEXTURE_RGB, EGL_TRUE);
 
       _eglAddConfig(disp, config);
    }
@@ -264,7 +267,13 @@ static void
 check_and_update_buffer_size(struct xlib_egl_surface *surface)
 {
    uint width, height;
-   get_drawable_size(surface->Dpy, surface->Win, &width, &height);
+   if (surface->Base.Type == EGL_PBUFFER_BIT) {
+      width = surface->Base.Width;
+      height = surface->Base.Height;
+   }
+   else {
+      get_drawable_size(surface->Dpy, surface->Win, &width, &height);
+   }
    st_resize_framebuffer(surface->Framebuffer, width, height);
    surface->Base.Width = width;
    surface->Base.Height = height;
@@ -281,6 +290,9 @@ display_surface(struct pipe_winsys *pws,
    XImage *ximage;
    void *data;
 
+   if (xsurf->Base.Type == EGL_PBUFFER_BIT)
+      return;
+
    ximage = XCreateImage(xsurf->Dpy,
                          xsurf->VisInfo.visual,
                          xsurf->VisInfo.depth,
@@ -382,7 +394,7 @@ xlib_eglDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext ctx)
    struct xlib_egl_context *context = lookup_context(ctx);
    if (context) {
       _eglUnlinkContext(&context->Base);
-      if (!context->Base.IsBound) {
+      if (!_eglIsContextBound(&context->Base)) {
          /* API-dependent clean-up */
          switch (context->Base.ClientAPI) {
          case EGL_OPENGL_ES_API:
@@ -415,10 +427,14 @@ xlib_eglMakeCurrent(_EGLDriver *drv, EGLDisplay dpy,
    struct xlib_egl_context *context = lookup_context(ctx);
    struct xlib_egl_surface *draw_surf = lookup_surface(draw);
    struct xlib_egl_surface *read_surf = lookup_surface(read);
+   struct st_context *oldctx = st_get_current();
 
    if (!_eglMakeCurrent(drv, dpy, draw, read, context))
       return EGL_FALSE;
 
+   /* Flush before switching context.  Check client API? */
+   if (oldctx)
+      st_flush(oldctx, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, NULL);
    st_make_current((context ? context->Context : NULL),
                    (draw_surf ? draw_surf->Framebuffer : NULL),
                    (read_surf ? read_surf->Framebuffer : NULL));
@@ -527,14 +543,92 @@ xlib_eglCreateWindowSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,
 }
 
 
+static EGLSurface
+xlib_eglCreatePbufferSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,
+                             const EGLint *attrib_list)
+{
+   struct xlib_egl_driver *xdrv = xlib_egl_driver(drv);
+   _EGLDisplay *disp = _eglLookupDisplay(dpy);
+   _EGLConfig *conf = _eglLookupConfig(drv, dpy, config);
+   struct xlib_egl_surface *surf;
+   __GLcontextModes visual;
+   uint width, height;
+   EGLBoolean bind_texture;
+
+   if (!disp) {
+      _eglError(EGL_BAD_DISPLAY, "eglCreatePbufferSurface");
+      return EGL_NO_SURFACE;
+   }
+   if (!conf) {
+      _eglError(EGL_BAD_CONFIG, "eglCreatePbufferSurface");
+      return EGL_NO_SURFACE;
+   }
+
+   surf = CALLOC_STRUCT(xlib_egl_surface);
+   if (!surf) {
+      _eglError(EGL_BAD_ALLOC, "eglCreatePbufferSurface");
+      return EGL_NO_SURFACE;
+   }
+
+   if (!_eglInitSurface(drv, &surf->Base, EGL_PBUFFER_BIT,
+                        conf, attrib_list)) {
+      free(surf);
+      return EGL_NO_SURFACE;
+   }
+   if (surf->Base.Width < 0 || surf->Base.Height < 0) {
+      _eglError(EGL_BAD_PARAMETER, "eglCreatePbufferSurface");
+      free(surf);
+      return EGL_NO_SURFACE;
+   }
+
+   bind_texture = (surf->Base.TextureFormat != EGL_NO_TEXTURE);
+   width = (uint) surf->Base.Width;
+   height = (uint) surf->Base.Height;
+   if ((surf->Base.TextureTarget == EGL_NO_TEXTURE && bind_texture) ||
+       (surf->Base.TextureTarget != EGL_NO_TEXTURE && !bind_texture)) {
+      _eglError(EGL_BAD_MATCH, "eglCreatePbufferSurface");
+      free(surf);
+      return EGL_NO_SURFACE;
+   }
+   /* a framebuffer of zero width or height confuses st */
+   if (width == 0 || height == 0) {
+      _eglError(EGL_BAD_MATCH, "eglCreatePbufferSurface");
+      free(surf);
+      return EGL_NO_SURFACE;
+   }
+   /* no mipmap generation */
+   if (surf->Base.MipmapTexture) {
+      _eglError(EGL_BAD_MATCH, "eglCreatePbufferSurface");
+      free(surf);
+      return EGL_NO_SURFACE;
+   }
+
+   surf->winsys = xdrv->winsys;
+
+   _eglConfigToContextModesRec(conf, &visual);
+
+   /* Create GL statetracker framebuffer */
+   surf->Framebuffer = st_create_framebuffer(&visual,
+                                             choose_color_format(&visual),
+                                             choose_depth_format(&visual),
+                                             choose_stencil_format(&visual),
+                                             width, height,
+                                             (void *) surf);
+   st_resize_framebuffer(surf->Framebuffer, width, height);
+
+   return _eglLinkSurface(&surf->Base, disp);
+}
+
+
 static EGLBoolean
 xlib_eglDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
 {
    struct xlib_egl_surface *surf = lookup_surface(surface);
    if (surf) {
       _eglUnlinkSurface(&surf->Base);
-      if (!surf->Base.IsBound) {
-         XFreeGC(surf->Dpy, surf->Gc);
+      if (!_eglIsSurfaceBound(&surf->Base)) {
+         if (surf->Base.Type != EGL_PBUFFER_BIT)
+            XFreeGC(surf->Dpy, surf->Gc);
          st_unreference_framebuffer(surf->Framebuffer);
          free(surf);
       }
@@ -548,6 +642,86 @@ xlib_eglDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
 
 
 static EGLBoolean
+xlib_eglBindTexImage(_EGLDriver *drv, EGLDisplay dpy,
+                     EGLSurface surface, EGLint buffer)
+{
+   struct xlib_egl_surface *xsurf = lookup_surface(surface);
+   struct xlib_egl_context *xctx;
+   struct pipe_surface *psurf;
+   enum pipe_format format;
+   int target;
+
+   if (!xsurf || xsurf->Base.Type != EGL_PBUFFER_BIT)
+      return _eglError(EGL_BAD_SURFACE, "eglBindTexImage");
+   if (buffer != EGL_BACK_BUFFER)
+      return _eglError(EGL_BAD_PARAMETER, "eglBindTexImage");
+   if (xsurf->Base.BoundToTexture)
+      return _eglError(EGL_BAD_ACCESS, "eglBindTexImage");
+
+   /* this should be updated when choose_color_format is */
+   switch (xsurf->Base.TextureFormat) {
+   case EGL_TEXTURE_RGB:
+      format = PIPE_FORMAT_R8G8B8_UNORM;
+      break;
+   case EGL_TEXTURE_RGBA:
+      format = PIPE_FORMAT_A8R8G8B8_UNORM;
+      break;
+   default:
+      return _eglError(EGL_BAD_MATCH, "eglBindTexImage");
+   }
+
+   switch (xsurf->Base.TextureTarget) {
+   case EGL_TEXTURE_2D:
+      target = ST_TEXTURE_2D;
+      break;
+   default:
+      return _eglError(EGL_BAD_MATCH, "eglBindTexImage");
+   }
+
+   /* flush properly */
+   if (eglGetCurrentSurface(EGL_DRAW) == surface) {
+      xctx = lookup_context(eglGetCurrentContext());
+      st_flush(xctx->Context, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME,
+               NULL);
+   }
+   else if (_eglIsSurfaceBound(&xsurf->Base)) {
+      xctx = lookup_context(_eglGetContextHandle(xsurf->Base.Binding));
+      if (xctx)
+         st_finish(xctx->Context);
+   }
+
+   st_get_framebuffer_surface(xsurf->Framebuffer, ST_SURFACE_BACK_LEFT,
+                              &psurf);
+   st_bind_texture_surface(psurf, target, xsurf->Base.MipmapLevel, format);
+   xsurf->Base.BoundToTexture = EGL_TRUE;
+
+   return EGL_TRUE;
+}
+
+
+static EGLBoolean
+xlib_eglReleaseTexImage(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface,
+                        EGLint buffer)
+{
+   struct xlib_egl_surface *xsurf = lookup_surface(surface);
+   struct pipe_surface *psurf;
+
+   if (!xsurf || xsurf->Base.Type != EGL_PBUFFER_BIT ||
+       !xsurf->Base.BoundToTexture)
+      return _eglError(EGL_BAD_SURFACE, "eglReleaseTexImage");
+   if (buffer != EGL_BACK_BUFFER)
+      return _eglError(EGL_BAD_PARAMETER, "eglReleaseTexImage");
+
+   st_get_framebuffer_surface(xsurf->Framebuffer, ST_SURFACE_BACK_LEFT,
+                              &psurf);
+   st_unbind_texture_surface(psurf, ST_TEXTURE_2D, xsurf->Base.MipmapLevel);
+   xsurf->Base.BoundToTexture = EGL_FALSE;
+
+   return EGL_TRUE;
+}
+
+
+static EGLBoolean
 xlib_eglSwapBuffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw)
 {
    /* error checking step: */
@@ -631,7 +805,10 @@ _eglMain(_EGLDisplay *dpy, const char *args)
    xdrv->Base.API.CreateContext = xlib_eglCreateContext;
    xdrv->Base.API.DestroyContext = xlib_eglDestroyContext;
    xdrv->Base.API.CreateWindowSurface = xlib_eglCreateWindowSurface;
+   xdrv->Base.API.CreatePbufferSurface = xlib_eglCreatePbufferSurface;
    xdrv->Base.API.DestroySurface = xlib_eglDestroySurface;
+   xdrv->Base.API.BindTexImage = xlib_eglBindTexImage;
+   xdrv->Base.API.ReleaseTexImage = xlib_eglReleaseTexImage;
    xdrv->Base.API.MakeCurrent = xlib_eglMakeCurrent;
    xdrv->Base.API.SwapBuffers = xlib_eglSwapBuffers;
 
index aa1bfa8..79ff2cc 100644 (file)
@@ -166,6 +166,7 @@ surface_buffer_create(struct pipe_winsys *winsys,
                       unsigned width, unsigned height,
                       enum pipe_format format, 
                       unsigned usage,
+                      unsigned tex_usage,
                       unsigned *stride)
 {
    const unsigned alignment = 64;
index fe8dfff..6f3861e 100644 (file)
@@ -249,6 +249,7 @@ aub_i915_surface_buffer_create(struct pipe_winsys *winsys,
                                unsigned width, unsigned height,
                                enum pipe_format format,
                                unsigned usage,
+                               unsigned tex_usage,
                                unsigned *stride)
 {
    const unsigned alignment = 64;
index 44b8464..277e724 100644 (file)
@@ -375,6 +375,7 @@ xm_surface_buffer_create(struct pipe_winsys *winsys,
                          unsigned width, unsigned height,
                          enum pipe_format format,
                          unsigned usage,
+                         unsigned tex_usage,
                          unsigned *stride)
 {
    const unsigned alignment = 64;
index 4a9dc37..1b3a297 100644 (file)
@@ -548,8 +548,13 @@ __glutWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
        window to be bigger than the screen, and smaller than 100x100
        (although it doesn't seem to help the y minimum). */
     minmax = (LPMINMAXINFO)lParam;
+#if 0
+    /* These two lines are disabled to fix incorrect handling of
+     * window maximization on Vista.  See bug 23182.
+     */
     minmax->ptMaxSize.x = __glutScreenWidth;
     minmax->ptMaxSize.y = __glutScreenHeight;
+#endif
     minmax->ptMinTrackSize.x = 0;
     minmax->ptMinTrackSize.y = 0;
     minmax->ptMaxTrackSize.x = __glutScreenWidth + 
index ebb2985..e144ed3 100644 (file)
 static char dri2ExtensionName[] = DRI2_NAME;
 static XExtensionInfo *dri2Info;
 static XEXT_GENERATE_CLOSE_DISPLAY (DRI2CloseDisplay, dri2Info)
+
 static /* const */ XExtensionHooks dri2ExtensionHooks = {
-    NULL,                              /* create_gc */
-    NULL,                              /* copy_gc */
-    NULL,                              /* flush_gc */
-    NULL,                              /* free_gc */
-    NULL,                              /* create_font */
-    NULL,                              /* free_font */
-    DRI2CloseDisplay,                  /* close_display */
-    NULL,                              /* wire_to_event */
-    NULL,                              /* event_to_wire */
-    NULL,                              /* error */
-    NULL,                              /* error_string */
+  NULL,                   /* create_gc */
+  NULL,                   /* copy_gc */
+  NULL,                   /* flush_gc */
+  NULL,                   /* free_gc */
+  NULL,                   /* create_font */
+  NULL,                   /* free_font */
+  DRI2CloseDisplay,       /* close_display */
+  NULL,                   /* wire_to_event */
+  NULL,                   /* event_to_wire */
+  NULL,                   /* error */
+  NULL,                   /* error_string */
 };
 
-static XEXT_GENERATE_FIND_DISPLAY (DRI2FindDisplay, dri2Info, 
-                                  dri2ExtensionName, 
-                                  &dri2ExtensionHooks, 
-                                  0, NULL)
+static XEXT_GENERATE_FIND_DISPLAY (DRI2FindDisplay,
+                                   dri2Info,
+                                   dri2ExtensionName,
+                                   &dri2ExtensionHooks,
+                                   0, NULL)
 
-Bool DRI2QueryExtension(Display *dpy, int *eventBase, int *errorBase)
+Bool
+DRI2QueryExtension(Display * dpy, int *eventBase, int *errorBase)
 {
-    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
 
-    if (XextHasExtension(info)) {
-       *eventBase = info->codes->first_event;
-       *errorBase = info->codes->first_error;
-       return True;
-    }
+   if (XextHasExtension(info)) {
+      *eventBase = info->codes->first_event;
+      *errorBase = info->codes->first_error;
+      return True;
+   }
 
-    return False;
+   return False;
 }
 
-Bool DRI2QueryVersion(Display *dpy, int *major, int *minor)
+Bool
+DRI2QueryVersion(Display * dpy, int *major, int *minor)
 {
-    XExtDisplayInfo *info = DRI2FindDisplay (dpy);
-    xDRI2QueryVersionReply rep;
-    xDRI2QueryVersionReq *req;
-
-    XextCheckExtension (dpy, info, dri2ExtensionName, False);
-
-    LockDisplay(dpy);
-    GetReq(DRI2QueryVersion, req);
-    req->reqType = info->codes->major_opcode;
-    req->dri2ReqType = X_DRI2QueryVersion;
-    req->majorVersion = DRI2_MAJOR;
-    req->minorVersion = DRI2_MINOR;
-    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
-       UnlockDisplay(dpy);
-       SyncHandle();
-       return False;
-    }
-    *major = rep.majorVersion;
-    *minor = rep.minorVersion;
-    UnlockDisplay(dpy);
-    SyncHandle();
-
-    return True;
+   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+   xDRI2QueryVersionReply rep;
+   xDRI2QueryVersionReq *req;
+
+   XextCheckExtension(dpy, info, dri2ExtensionName, False);
+
+   LockDisplay(dpy);
+   GetReq(DRI2QueryVersion, req);
+   req->reqType = info->codes->major_opcode;
+   req->dri2ReqType = X_DRI2QueryVersion;
+   req->majorVersion = DRI2_MAJOR;
+   req->minorVersion = DRI2_MINOR;
+   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
+      UnlockDisplay(dpy);
+      SyncHandle();
+      return False;
+   }
+   *major = rep.majorVersion;
+   *minor = rep.minorVersion;
+   UnlockDisplay(dpy);
+   SyncHandle();
+
+   return True;
 }
 
-Bool DRI2Connect(Display *dpy, XID window,
-                char **driverName, char **deviceName)
+Bool
+DRI2Connect(Display * dpy, XID window, char **driverName, char **deviceName)
 {
-    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-    xDRI2ConnectReply rep;
-    xDRI2ConnectReq *req;
-
-    XextCheckExtension (dpy, info, dri2ExtensionName, False);
-
-    LockDisplay(dpy);
-    GetReq(DRI2Connect, req);
-    req->reqType = info->codes->major_opcode;
-    req->dri2ReqType = X_DRI2Connect;
-    req->window = window;
-    req->driverType = DRI2DriverDRI;
-    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
-       UnlockDisplay(dpy);
-       SyncHandle();
-       return False;
-    }
-
-    if (rep.driverNameLength == 0 && rep.deviceNameLength == 0) {
-       UnlockDisplay(dpy);
-       SyncHandle();
-       return False;
-    }
-
-    *driverName = Xmalloc(rep.driverNameLength + 1);
-    if (*driverName == NULL) {
-       _XEatData(dpy, 
-                 ((rep.driverNameLength + 3) & ~3) +
-                 ((rep.deviceNameLength + 3) & ~3));
-       UnlockDisplay(dpy);
-       SyncHandle();
-       return False;
-    }
-    _XReadPad(dpy, *driverName, rep.driverNameLength);
-    (*driverName)[rep.driverNameLength] = '\0';
-
-    *deviceName = Xmalloc(rep.deviceNameLength + 1);
-    if (*deviceName == NULL) {
-       Xfree(*driverName);
-       _XEatData(dpy, ((rep.deviceNameLength + 3) & ~3));
-       UnlockDisplay(dpy);
-       SyncHandle();
-       return False;
-    }
-    _XReadPad(dpy, *deviceName, rep.deviceNameLength);
-    (*deviceName)[rep.deviceNameLength] = '\0';
-
-    UnlockDisplay(dpy);
-    SyncHandle();
-
-    return True;
+   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+   xDRI2ConnectReply rep;
+   xDRI2ConnectReq *req;
+
+   XextCheckExtension(dpy, info, dri2ExtensionName, False);
+
+   LockDisplay(dpy);
+   GetReq(DRI2Connect, req);
+   req->reqType = info->codes->major_opcode;
+   req->dri2ReqType = X_DRI2Connect;
+   req->window = window;
+   req->driverType = DRI2DriverDRI;
+   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
+      UnlockDisplay(dpy);
+      SyncHandle();
+      return False;
+   }
+
+   if (rep.driverNameLength == 0 && rep.deviceNameLength == 0) {
+      UnlockDisplay(dpy);
+      SyncHandle();
+      return False;
+   }
+
+   *driverName = Xmalloc(rep.driverNameLength + 1);
+   if (*driverName == NULL) {
+      _XEatData(dpy,
+                ((rep.driverNameLength + 3) & ~3) +
+                ((rep.deviceNameLength + 3) & ~3));
+      UnlockDisplay(dpy);
+      SyncHandle();
+      return False;
+   }
+   _XReadPad(dpy, *driverName, rep.driverNameLength);
+   (*driverName)[rep.driverNameLength] = '\0';
+
+   *deviceName = Xmalloc(rep.deviceNameLength + 1);
+   if (*deviceName == NULL) {
+      Xfree(*driverName);
+      _XEatData(dpy, ((rep.deviceNameLength + 3) & ~3));
+      UnlockDisplay(dpy);
+      SyncHandle();
+      return False;
+   }
+   _XReadPad(dpy, *deviceName, rep.deviceNameLength);
+   (*deviceName)[rep.deviceNameLength] = '\0';
+
+   UnlockDisplay(dpy);
+   SyncHandle();
+
+   return True;
 }
 
-Bool DRI2Authenticate(Display *dpy, XID window, drm_magic_t magic)
+Bool
+DRI2Authenticate(Display * dpy, XID window, drm_magic_t magic)
 {
-    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-    xDRI2AuthenticateReq *req;
-    xDRI2AuthenticateReply rep;
+   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+   xDRI2AuthenticateReq *req;
+   xDRI2AuthenticateReply rep;
 
-    XextCheckExtension (dpy, info, dri2ExtensionName, False);
+   XextCheckExtension(dpy, info, dri2ExtensionName, False);
 
-    LockDisplay(dpy);
-    GetReq(DRI2Authenticate, req);
-    req->reqType = info->codes->major_opcode;
-    req->dri2ReqType = X_DRI2Authenticate;
-    req->window = window;
-    req->magic = magic;
+   LockDisplay(dpy);
+   GetReq(DRI2Authenticate, req);
+   req->reqType = info->codes->major_opcode;
+   req->dri2ReqType = X_DRI2Authenticate;
+   req->window = window;
+   req->magic = magic;
 
-    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
-       UnlockDisplay(dpy);
-       SyncHandle();
-       return False;
-    }
+   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
+      UnlockDisplay(dpy);
+      SyncHandle();
+      return False;
+   }
 
-    UnlockDisplay(dpy);
-    SyncHandle();
+   UnlockDisplay(dpy);
+   SyncHandle();
 
-    return rep.authenticated;
+   return rep.authenticated;
 }
 
-void DRI2CreateDrawable(Display *dpy, XID drawable)
+void
+DRI2CreateDrawable(Display * dpy, XID drawable)
 {
-    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-    xDRI2CreateDrawableReq *req;
-
-    XextSimpleCheckExtension (dpy, info, dri2ExtensionName);
-
-    LockDisplay(dpy);
-    GetReq(DRI2CreateDrawable, req);
-    req->reqType = info->codes->major_opcode;
-    req->dri2ReqType = X_DRI2CreateDrawable;
-    req->drawable = drawable;
-    UnlockDisplay(dpy);
-    SyncHandle();
+   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+   xDRI2CreateDrawableReq *req;
+
+   XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
+
+   LockDisplay(dpy);
+   GetReq(DRI2CreateDrawable, req);
+   req->reqType = info->codes->major_opcode;
+   req->dri2ReqType = X_DRI2CreateDrawable;
+   req->drawable = drawable;
+   UnlockDisplay(dpy);
+   SyncHandle();
 }
 
-void DRI2DestroyDrawable(Display *dpy, XID drawable)
+void
+DRI2DestroyDrawable(Display * dpy, XID drawable)
 {
-    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-    xDRI2DestroyDrawableReq *req;
+   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+   xDRI2DestroyDrawableReq *req;
 
-    XextSimpleCheckExtension (dpy, info, dri2ExtensionName);
+   XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
 
-    XSync(dpy, False);
+   XSync(dpy, False);
 
-    LockDisplay(dpy);
-    GetReq(DRI2DestroyDrawable, req);
-    req->reqType = info->codes->major_opcode;
-    req->dri2ReqType = X_DRI2DestroyDrawable;
-    req->drawable = drawable;
-    UnlockDisplay(dpy);
-    SyncHandle();
+   LockDisplay(dpy);
+   GetReq(DRI2DestroyDrawable, req);
+   req->reqType = info->codes->major_opcode;
+   req->dri2ReqType = X_DRI2DestroyDrawable;
+   req->drawable = drawable;
+   UnlockDisplay(dpy);
+   SyncHandle();
 }
 
-DRI2Buffer *DRI2GetBuffers(Display *dpy, XID drawable,
-                          int *width, int *height,
-                          unsigned int *attachments, int count,
-                          int *outCount)
+DRI2Buffer *
+DRI2GetBuffers(Display * dpy, XID drawable,
+               int *width, int *height,
+               unsigned int *attachments, int count, int *outCount)
 {
-    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-    xDRI2GetBuffersReply rep;
-    xDRI2GetBuffersReq *req;
-    DRI2Buffer *buffers;
-    xDRI2Buffer repBuffer;
-    CARD32 *p;
-    int i;
-
-    XextCheckExtension (dpy, info, dri2ExtensionName, False);
-
-    LockDisplay(dpy);
-    GetReqExtra(DRI2GetBuffers, count * 4, req);
-    req->reqType = info->codes->major_opcode;
-    req->dri2ReqType = X_DRI2GetBuffers;
-    req->drawable = drawable;
-    req->count = count;
-    p = (CARD32 *) &req[1];
-    for (i = 0; i < count; i++)
-       p[i] = attachments[i];
-
-    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
-       UnlockDisplay(dpy);
-       SyncHandle();
-       return NULL;
-    }
-
-    *width = rep.width;
-    *height = rep.height;
-    *outCount = rep.count;
-
-    buffers = Xmalloc(rep.count * sizeof buffers[0]);
-    if (buffers == NULL) {
-       _XEatData(dpy, rep.count * sizeof repBuffer);
-       UnlockDisplay(dpy);
-       SyncHandle();
-       return NULL;
-    }
-
-    for (i = 0; i < rep.count; i++) {
-       _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
-       buffers[i].attachment = repBuffer.attachment;
-       buffers[i].name = repBuffer.name;
-       buffers[i].pitch = repBuffer.pitch;
-       buffers[i].cpp = repBuffer.cpp;
-       buffers[i].flags = repBuffer.flags;
-    }
-
-    UnlockDisplay(dpy);
-    SyncHandle();
-
-    return buffers;
+   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+   xDRI2GetBuffersReply rep;
+   xDRI2GetBuffersReq *req;
+   DRI2Buffer *buffers;
+   xDRI2Buffer repBuffer;
+   CARD32 *p;
+   int i;
+
+   XextCheckExtension(dpy, info, dri2ExtensionName, False);
+
+   LockDisplay(dpy);
+   GetReqExtra(DRI2GetBuffers, count * 4, req);
+   req->reqType = info->codes->major_opcode;
+   req->dri2ReqType = X_DRI2GetBuffers;
+   req->drawable = drawable;
+   req->count = count;
+   p = (CARD32 *) & req[1];
+   for (i = 0; i < count; i++)
+      p[i] = attachments[i];
+
+   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
+      UnlockDisplay(dpy);
+      SyncHandle();
+      return NULL;
+   }
+
+   *width = rep.width;
+   *height = rep.height;
+   *outCount = rep.count;
+
+   buffers = Xmalloc(rep.count * sizeof buffers[0]);
+   if (buffers == NULL) {
+      _XEatData(dpy, rep.count * sizeof repBuffer);
+      UnlockDisplay(dpy);
+      SyncHandle();
+      return NULL;
+   }
+
+   for (i = 0; i < rep.count; i++) {
+      _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
+      buffers[i].attachment = repBuffer.attachment;
+      buffers[i].name = repBuffer.name;
+      buffers[i].pitch = repBuffer.pitch;
+      buffers[i].cpp = repBuffer.cpp;
+      buffers[i].flags = repBuffer.flags;
+   }
+
+   UnlockDisplay(dpy);
+   SyncHandle();
+
+   return buffers;
 }
 
 
-DRI2Buffer *DRI2GetBuffersWithFormat(Display *dpy, XID drawable,
-                                    int *width, int *height,
-                                    unsigned int *attachments, int count,
-                                    int *outCount)
+DRI2Buffer *
+DRI2GetBuffersWithFormat(Display * dpy, XID drawable,
+                         int *width, int *height,
+                         unsigned int *attachments, int count, int *outCount)
 {
-    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-    xDRI2GetBuffersReply rep;
-    xDRI2GetBuffersReq *req;
-    DRI2Buffer *buffers;
-    xDRI2Buffer repBuffer;
-    CARD32 *p;
-    int i;
-
-    XextCheckExtension (dpy, info, dri2ExtensionName, False);
-
-    LockDisplay(dpy);
-    GetReqExtra(DRI2GetBuffers, count * (4 * 2), req);
-    req->reqType = info->codes->major_opcode;
-    req->dri2ReqType = X_DRI2GetBuffersWithFormat;
-    req->drawable = drawable;
-    req->count = count;
-    p = (CARD32 *) &req[1];
-    for (i = 0; i < (count * 2); i++)
-       p[i] = attachments[i];
-
-    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
-       UnlockDisplay(dpy);
-       SyncHandle();
-       return NULL;
-    }
-
-    *width = rep.width;
-    *height = rep.height;
-    *outCount = rep.count;
-
-    buffers = Xmalloc(rep.count * sizeof buffers[0]);
-    if (buffers == NULL) {
-       _XEatData(dpy, rep.count * sizeof repBuffer);
-       UnlockDisplay(dpy);
-       SyncHandle();
-       return NULL;
-    }
-
-    for (i = 0; i < rep.count; i++) {
-       _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
-       buffers[i].attachment = repBuffer.attachment;
-       buffers[i].name = repBuffer.name;
-       buffers[i].pitch = repBuffer.pitch;
-       buffers[i].cpp = repBuffer.cpp;
-       buffers[i].flags = repBuffer.flags;
-    }
-
-    UnlockDisplay(dpy);
-    SyncHandle();
-
-    return buffers;
+   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+   xDRI2GetBuffersReply rep;
+   xDRI2GetBuffersReq *req;
+   DRI2Buffer *buffers;
+   xDRI2Buffer repBuffer;
+   CARD32 *p;
+   int i;
+
+   XextCheckExtension(dpy, info, dri2ExtensionName, False);
+
+   LockDisplay(dpy);
+   GetReqExtra(DRI2GetBuffers, count * (4 * 2), req);
+   req->reqType = info->codes->major_opcode;
+   req->dri2ReqType = X_DRI2GetBuffersWithFormat;
+   req->drawable = drawable;
+   req->count = count;
+   p = (CARD32 *) & req[1];
+   for (i = 0; i < (count * 2); i++)
+      p[i] = attachments[i];
+
+   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
+      UnlockDisplay(dpy);
+      SyncHandle();
+      return NULL;
+   }
+
+   *width = rep.width;
+   *height = rep.height;
+   *outCount = rep.count;
+
+   buffers = Xmalloc(rep.count * sizeof buffers[0]);
+   if (buffers == NULL) {
+      _XEatData(dpy, rep.count * sizeof repBuffer);
+      UnlockDisplay(dpy);
+      SyncHandle();
+      return NULL;
+   }
+
+   for (i = 0; i < rep.count; i++) {
+      _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
+      buffers[i].attachment = repBuffer.attachment;
+      buffers[i].name = repBuffer.name;
+      buffers[i].pitch = repBuffer.pitch;
+      buffers[i].cpp = repBuffer.cpp;
+      buffers[i].flags = repBuffer.flags;
+   }
+
+   UnlockDisplay(dpy);
+   SyncHandle();
+
+   return buffers;
 }
 
 
-void DRI2CopyRegion(Display *dpy, XID drawable, XserverRegion region,
-                   CARD32 dest, CARD32 src)
+void
+DRI2CopyRegion(Display * dpy, XID drawable, XserverRegion region,
+               CARD32 dest, CARD32 src)
 {
-    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
-    xDRI2CopyRegionReq *req;
-    xDRI2CopyRegionReply rep;
+   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+   xDRI2CopyRegionReq *req;
+   xDRI2CopyRegionReply rep;
 
-    XextSimpleCheckExtension (dpy, info, dri2ExtensionName);
+   XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
 
-    LockDisplay(dpy);
-    GetReq(DRI2CopyRegion, req);
-    req->reqType = info->codes->major_opcode;
-    req->dri2ReqType = X_DRI2CopyRegion;
-    req->drawable = drawable;
-    req->region = region;
-    req->dest = dest;
-    req->src = src;
+   LockDisplay(dpy);
+   GetReq(DRI2CopyRegion, req);
+   req->reqType = info->codes->major_opcode;
+   req->dri2ReqType = X_DRI2CopyRegion;
+   req->drawable = drawable;
+   req->region = region;
+   req->dest = dest;
+   req->src = src;
 
-    _XReply(dpy, (xReply *)&rep, 0, xFalse);
+   _XReply(dpy, (xReply *) & rep, 0, xFalse);
 
-    UnlockDisplay(dpy);
-    SyncHandle();
+   UnlockDisplay(dpy);
+   SyncHandle();
 }
index b0e61f8..a6fe66e 100644 (file)
 #include <X11/extensions/Xfixes.h>
 #include <X11/extensions/dri2tokens.h>
 
-typedef struct {
-    unsigned int attachment;
-    unsigned int name;
-    unsigned int pitch;
-    unsigned int cpp;
-    unsigned int flags;
+typedef struct
+{
+   unsigned int attachment;
+   unsigned int name;
+   unsigned int pitch;
+   unsigned int cpp;
+   unsigned int flags;
 } DRI2Buffer;
 
 extern Bool
-DRI2QueryExtension(Display *display, int *eventBase, int *errorBase);
+DRI2QueryExtension(Display * display, int *eventBase, int *errorBase);
+
 extern Bool
-DRI2QueryVersion(Display *display, int *major, int *minor);
+DRI2QueryVersion(Display * display, int *major, int *minor);
+
 extern Bool
-DRI2Connect(Display *display, XID window,
-           char **driverName, char **deviceName);
+DRI2Connect(Display * display, XID window,
+            char **driverName, char **deviceName);
+
 extern Bool
-DRI2Authenticate(Display *display, XID window, drm_magic_t magic);
+DRI2Authenticate(Display * display, XID window, drm_magic_t magic);
+
 extern void
-DRI2CreateDrawable(Display *display, XID drawable);
+DRI2CreateDrawable(Display * display, XID drawable);
+
 extern void
-DRI2DestroyDrawable(Display *display, XID handle);
-extern DRI2Buffer *
-DRI2GetBuffers(Display *dpy, XID drawable,
-              int *width, int *height,
-              unsigned int *attachments, int count,
-              int *outCount);
+DRI2DestroyDrawable(Display * display, XID handle);
+
+extern DRI2Buffer*
+DRI2GetBuffers(Display * dpy, XID drawable,
+               int *width, int *height,
+               unsigned int *attachments, int count,
+               int *outCount);
 
 /**
  * \note
  * This function is only supported with DRI2 version 1.1 or later.
  */
-extern DRI2Buffer *
-DRI2GetBuffersWithFormat(Display *dpy, XID drawable,
-                        int *width, int *height,
-                        unsigned int *attachments, int count,
-                        int *outCount);
+extern DRI2Buffer*
+DRI2GetBuffersWithFormat(Display * dpy, XID drawable,
+                         int *width, int *height,
+                         unsigned int *attachments,
+                         int count, int *outCount);
 
 extern void
-DRI2CopyRegion(Display *dpy, XID drawable, XserverRegion region,
-              CARD32 dest, CARD32 src);
+DRI2CopyRegion(Display * dpy, XID drawable,
+               XserverRegion region,
+               CARD32 dest, CARD32 src);
 
 #endif
index f4865ae..d5d5a07 100644 (file)
@@ -54,249 +54,260 @@ typedef struct __GLXDRIdisplayPrivateRec __GLXDRIdisplayPrivate;
 typedef struct __GLXDRIcontextPrivateRec __GLXDRIcontextPrivate;
 typedef struct __GLXDRIdrawablePrivateRec __GLXDRIdrawablePrivate;
 
-struct __GLXDRIdisplayPrivateRec {
-    __GLXDRIdisplay base;
+struct __GLXDRIdisplayPrivateRec
+{
+   __GLXDRIdisplay base;
 
-    /*
+   /*
     ** XFree86-DRI version information
     */
-    int driMajor;
-    int driMinor;
-    int driPatch;
+   int driMajor;
+   int driMinor;
+   int driPatch;
 };
 
-struct __GLXDRIcontextPrivateRec {
-    __GLXDRIcontext base;
-    __DRIcontext *driContext;
-    __GLXscreenConfigs *psc;
+struct __GLXDRIcontextPrivateRec
+{
+   __GLXDRIcontext base;
+   __DRIcontext *driContext;
+   __GLXscreenConfigs *psc;
 };
 
-struct __GLXDRIdrawablePrivateRec {
-    __GLXDRIdrawable base;
-    __DRIbuffer buffers[5];
-    int bufferCount;
-    int width, height;
-    int have_back;
-    int have_fake_front;
+struct __GLXDRIdrawablePrivateRec
+{
+   __GLXDRIdrawable base;
+   __DRIbuffer buffers[5];
+   int bufferCount;
+   int width, height;
+   int have_back;
+   int have_fake_front;
 };
 
-static void dri2WaitX(__GLXDRIdrawable *pdraw);
+static void dri2WaitX(__GLXDRIdrawable * pdraw);
 
-static void dri2DestroyContext(__GLXDRIcontext *context,
-                             __GLXscreenConfigs *psc, Display *dpy)
+static void
+dri2DestroyContext(__GLXDRIcontext * context,
+                   __GLXscreenConfigs * psc, Display * dpy)
 {
-    __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
-    const __DRIcoreExtension *core = pcp->psc->core;
+   __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
+   const __DRIcoreExtension *core = pcp->psc->core;
 
-    (*core->destroyContext)(pcp->driContext);
+   (*core->destroyContext) (pcp->driContext);
 
-    Xfree(pcp);
+   Xfree(pcp);
 }
 
-static Bool dri2BindContext(__GLXDRIcontext *context,
-                          __GLXDRIdrawable *draw, __GLXDRIdrawable *read)
+static Bool
+dri2BindContext(__GLXDRIcontext * context,
+                __GLXDRIdrawable * draw, __GLXDRIdrawable * read)
 {
-    __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
-    const __DRIcoreExtension *core = pcp->psc->core;
+   __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
+   const __DRIcoreExtension *core = pcp->psc->core;
 
-    return (*core->bindContext)(pcp->driContext,
-                               draw->driDrawable,
-                               read->driDrawable);
+   return (*core->bindContext) (pcp->driContext,
+                                draw->driDrawable, read->driDrawable);
 }
 
-static void dri2UnbindContext(__GLXDRIcontext *context)
+static void
+dri2UnbindContext(__GLXDRIcontext * context)
 {
-    __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
-    const __DRIcoreExtension *core = pcp->psc->core;
+   __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
+   const __DRIcoreExtension *core = pcp->psc->core;
 
-    (*core->unbindContext)(pcp->driContext);
+   (*core->unbindContext) (pcp->driContext);
 }
 
-static __GLXDRIcontext *dri2CreateContext(__GLXscreenConfigs *psc,
-                                        const __GLcontextModes *mode,
-                                        GLXContext gc,
-                                        GLXContext shareList, int renderType)
+static __GLXDRIcontext *
+dri2CreateContext(__GLXscreenConfigs * psc,
+                  const __GLcontextModes * mode,
+                  GLXContext gc, GLXContext shareList, int renderType)
 {
-    __GLXDRIcontextPrivate *pcp, *pcp_shared;
-    __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) mode;
-    __DRIcontext *shared = NULL;
-
-    if (shareList) {
-       pcp_shared = (__GLXDRIcontextPrivate *) shareList->driContext;
-       shared = pcp_shared->driContext;
-    }
-
-    pcp = Xmalloc(sizeof *pcp);
-    if (pcp == NULL)
-       return NULL;
-
-    pcp->psc = psc;
-    pcp->driContext = 
-       (*psc->dri2->createNewContext)(psc->__driScreen,
-                                      config->driConfig, shared, pcp);
-    gc->__driContext = pcp->driContext;
-
-    if (pcp->driContext == NULL) {
-       Xfree(pcp);
-       return NULL;
-    }
-
-    pcp->base.destroyContext = dri2DestroyContext;
-    pcp->base.bindContext = dri2BindContext;
-    pcp->base.unbindContext = dri2UnbindContext;
-
-    return &pcp->base;
+   __GLXDRIcontextPrivate *pcp, *pcp_shared;
+   __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) mode;
+   __DRIcontext *shared = NULL;
+
+   if (shareList) {
+      pcp_shared = (__GLXDRIcontextPrivate *) shareList->driContext;
+      shared = pcp_shared->driContext;
+   }
+
+   pcp = Xmalloc(sizeof *pcp);
+   if (pcp == NULL)
+      return NULL;
+
+   pcp->psc = psc;
+   pcp->driContext =
+      (*psc->dri2->createNewContext) (psc->__driScreen,
+                                      config->driConfig, shared, pcp);
+   gc->__driContext = pcp->driContext;
+
+   if (pcp->driContext == NULL) {
+      Xfree(pcp);
+      return NULL;
+   }
+
+   pcp->base.destroyContext = dri2DestroyContext;
+   pcp->base.bindContext = dri2BindContext;
+   pcp->base.unbindContext = dri2UnbindContext;
+
+   return &pcp->base;
 }
 
-static void dri2DestroyDrawable(__GLXDRIdrawable *pdraw)
+static void
+dri2DestroyDrawable(__GLXDRIdrawable * pdraw)
 {
-    const __DRIcoreExtension *core = pdraw->psc->core;
+   const __DRIcoreExtension *core = pdraw->psc->core;
 
-    (*core->destroyDrawable)(pdraw->driDrawable);
-    DRI2DestroyDrawable(pdraw->psc->dpy, pdraw->drawable);
-    Xfree(pdraw);
+   (*core->destroyDrawable) (pdraw->driDrawable);
+   DRI2DestroyDrawable(pdraw->psc->dpy, pdraw->drawable);
+   Xfree(pdraw);
 }
 
-static __GLXDRIdrawable *dri2CreateDrawable(__GLXscreenConfigs *psc,
-                                           XID xDrawable,
-                                           GLXDrawable drawable,
-                                           const __GLcontextModes *modes)
+static __GLXDRIdrawable *
+dri2CreateDrawable(__GLXscreenConfigs * psc,
+                   XID xDrawable,
+                   GLXDrawable drawable, const __GLcontextModes * modes)
 {
-    __GLXDRIdrawablePrivate *pdraw;
-    __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes;
+   __GLXDRIdrawablePrivate *pdraw;
+   __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes;
 
-    pdraw = Xmalloc(sizeof(*pdraw));
-    if (!pdraw)
-       return NULL;
+   pdraw = Xmalloc(sizeof(*pdraw));
+   if (!pdraw)
+      return NULL;
 
-    pdraw->base.destroyDrawable = dri2DestroyDrawable;
-    pdraw->base.xDrawable = xDrawable;
-    pdraw->base.drawable = drawable;
-    pdraw->base.psc = psc;
-    pdraw->bufferCount = 0;
+   pdraw->base.destroyDrawable = dri2DestroyDrawable;
+   pdraw->base.xDrawable = xDrawable;
+   pdraw->base.drawable = drawable;
+   pdraw->base.psc = psc;
+   pdraw->bufferCount = 0;
 
-    DRI2CreateDrawable(psc->dpy, xDrawable);
+   DRI2CreateDrawable(psc->dpy, xDrawable);
 
-    /* Create a new drawable */
-    pdraw->base.driDrawable =
-       (*psc->dri2->createNewDrawable)(psc->__driScreen,
-                                       config->driConfig, pdraw);
+   /* Create a new drawable */
+   pdraw->base.driDrawable =
+      (*psc->dri2->createNewDrawable) (psc->__driScreen,
+                                       config->driConfig, pdraw);
 
-    if (!pdraw->base.driDrawable) {
-       DRI2DestroyDrawable(psc->dpy, drawable);
-       Xfree(pdraw);
-       return NULL;
-    }
+   if (!pdraw->base.driDrawable) {
+      DRI2DestroyDrawable(psc->dpy, drawable);
+      Xfree(pdraw);
+      return NULL;
+   }
 
-    return &pdraw->base;
+   return &pdraw->base;
 }
 
-static void dri2CopySubBuffer(__GLXDRIdrawable *pdraw,
-                             int x, int y, int width, int height)
+static void
+dri2CopySubBuffer(__GLXDRIdrawable * pdraw,
+                  int x, int y, int width, int height)
 {
-    __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw;
-    XRectangle xrect;
-    XserverRegion region;
+   __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw;
+   XRectangle xrect;
+   XserverRegion region;
 
-    /* Check we have the right attachments */
-    if (!priv->have_back)
-       return;
+   /* Check we have the right attachments */
+   if (!priv->have_back)
+      return;
 
-    xrect.x = x;
-    xrect.y = priv->height - y - height;
-    xrect.width = width;
-    xrect.height = height;
+   xrect.x = x;
+   xrect.y = priv->height - y - height;
+   xrect.width = width;
+   xrect.height = height;
 
 #ifdef __DRI2_FLUSH
-    if (pdraw->psc->f)
-       (*pdraw->psc->f->flush)(pdraw->driDrawable);
+   if (pdraw->psc->f)
+      (*pdraw->psc->f->flush) (pdraw->driDrawable);
 #endif
 
-    region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1);
-    /* should get a fence ID back from here at some point */
-    DRI2CopyRegion(pdraw->psc->dpy, pdraw->drawable, region,
-                  DRI2BufferFrontLeft, DRI2BufferBackLeft);
-    XFixesDestroyRegion(pdraw->psc->dpy, region);
+   region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1);
+   /* should get a fence ID back from here at some point */
+   DRI2CopyRegion(pdraw->psc->dpy, pdraw->drawable, region,
+                  DRI2BufferFrontLeft, DRI2BufferBackLeft);
+   XFixesDestroyRegion(pdraw->psc->dpy, region);
 
-    /* Refresh the fake front (if present) after we just damaged the real
-     * front.
-     */
-    dri2WaitX(pdraw);
+   /* Refresh the fake front (if present) after we just damaged the real
+    * front.
+    */
+   dri2WaitX(pdraw);
 }
 
-static void dri2SwapBuffers(__GLXDRIdrawable *pdraw)
+static void
+dri2SwapBuffers(__GLXDRIdrawable * pdraw)
 {
-    __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw;
+   __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw;
 
-    dri2CopySubBuffer(pdraw, 0, 0, priv->width, priv->height);
+   dri2CopySubBuffer(pdraw, 0, 0, priv->width, priv->height);
 }
 
-static void dri2WaitX(__GLXDRIdrawable *pdraw)
+static void
+dri2WaitX(__GLXDRIdrawable * pdraw)
 {
-    __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw;
-    XRectangle xrect;
-    XserverRegion region;
+   __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw;
+   XRectangle xrect;
+   XserverRegion region;
 
-    /* Check we have the right attachments */
-    if (!priv->have_fake_front)
-       return;
+   /* Check we have the right attachments */
+   if (!priv->have_fake_front)
+      return;
 
-    xrect.x = 0;
-    xrect.y = 0;
-    xrect.width = priv->width;
-    xrect.height = priv->height;
+   xrect.x = 0;
+   xrect.y = 0;
+   xrect.width = priv->width;
+   xrect.height = priv->height;
 
 #ifdef __DRI2_FLUSH
-    if (pdraw->psc->f)
-       (*pdraw->psc->f->flush)(pdraw->driDrawable);
+   if (pdraw->psc->f)
+      (*pdraw->psc->f->flush) (pdraw->driDrawable);
 #endif
 
-    region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1);
-    DRI2CopyRegion(pdraw->psc->dpy, pdraw->drawable, region,
-                  DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft);
-    XFixesDestroyRegion(pdraw->psc->dpy, region);
+   region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1);
+   DRI2CopyRegion(pdraw->psc->dpy, pdraw->drawable, region,
+                  DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft);
+   XFixesDestroyRegion(pdraw->psc->dpy, region);
 }
 
-static void dri2WaitGL(__GLXDRIdrawable *pdraw)
+static void
+dri2WaitGL(__GLXDRIdrawable * pdraw)
 {
-    __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw;
-    XRectangle xrect;
-    XserverRegion region;
+   __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw;
+   XRectangle xrect;
+   XserverRegion region;
 
-    if (!priv->have_fake_front)
-       return;
+   if (!priv->have_fake_front)
+      return;
 
-    xrect.x = 0;
-    xrect.y = 0;
-    xrect.width = priv->width;
-    xrect.height = priv->height;
+   xrect.x = 0;
+   xrect.y = 0;
+   xrect.width = priv->width;
+   xrect.height = priv->height;
 
 #ifdef __DRI2_FLUSH
-    if (pdraw->psc->f)
-       (*pdraw->psc->f->flush)(pdraw->driDrawable);
+   if (pdraw->psc->f)
+      (*pdraw->psc->f->flush) (pdraw->driDrawable);
 #endif
 
-    region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1);
-    DRI2CopyRegion(pdraw->psc->dpy, pdraw->drawable, region,
-                  DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
-    XFixesDestroyRegion(pdraw->psc->dpy, region);
+   region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1);
+   DRI2CopyRegion(pdraw->psc->dpy, pdraw->drawable, region,
+                  DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
+   XFixesDestroyRegion(pdraw->psc->dpy, region);
 }
 
 
-static void dri2FlushFrontBuffer(__DRIdrawable *driDrawable,
-                                void *loaderPrivate)
+static void
+dri2FlushFrontBuffer(__DRIdrawable * driDrawable, void *loaderPrivate)
 {
-    (void) driDrawable;
-    dri2WaitGL((__GLXDRIdrawable *) loaderPrivate);
+   (void) driDrawable;
+   dri2WaitGL((__GLXDRIdrawable *) loaderPrivate);
 }
 
 
-static void dri2DestroyScreen(__GLXscreenConfigs *psc)
+static void
+dri2DestroyScreen(__GLXscreenConfigs * psc)
 {
-    /* Free the direct rendering per screen data */
-    (*psc->core->destroyScreen)(psc->__driScreen);
-    close(psc->fd);
-    psc->__driScreen = NULL;
+   /* Free the direct rendering per screen data */
+   (*psc->core->destroyScreen) (psc->__driScreen);
+   close(psc->fd);
+   psc->__driScreen = NULL;
 }
 
 /**
@@ -306,219 +317,222 @@ static void dri2DestroyScreen(__GLXscreenConfigs *psc)
  * \c DRI2GetBuffers or \c DRI2GetBuffersWithFormat.
  */
 static void
-process_buffers(__GLXDRIdrawablePrivate *pdraw, DRI2Buffer *buffers,
-               unsigned count)
+process_buffers(__GLXDRIdrawablePrivate * pdraw, DRI2Buffer * buffers,
+                unsigned count)
 {
-    int i;
-
-    pdraw->bufferCount = count;
-    pdraw->have_fake_front = 0;
-    pdraw->have_back = 0;
-
-    /* This assumes the DRI2 buffer attachment tokens matches the
-     * __DRIbuffer tokens. */
-    for (i = 0; i < count; i++) {
-       pdraw->buffers[i].attachment = buffers[i].attachment;
-       pdraw->buffers[i].name = buffers[i].name;
-       pdraw->buffers[i].pitch = buffers[i].pitch;
-       pdraw->buffers[i].cpp = buffers[i].cpp;
-       pdraw->buffers[i].flags = buffers[i].flags;
-       if (pdraw->buffers[i].attachment == __DRI_BUFFER_FAKE_FRONT_LEFT)
-           pdraw->have_fake_front = 1;
-       if (pdraw->buffers[i].attachment == __DRI_BUFFER_BACK_LEFT)
-           pdraw->have_back = 1;
-    }
+   int i;
+
+   pdraw->bufferCount = count;
+   pdraw->have_fake_front = 0;
+   pdraw->have_back = 0;
+
+   /* This assumes the DRI2 buffer attachment tokens matches the
+    * __DRIbuffer tokens. */
+   for (i = 0; i < count; i++) {
+      pdraw->buffers[i].attachment = buffers[i].attachment;
+      pdraw->buffers[i].name = buffers[i].name;
+      pdraw->buffers[i].pitch = buffers[i].pitch;
+      pdraw->buffers[i].cpp = buffers[i].cpp;
+      pdraw->buffers[i].flags = buffers[i].flags;
+      if (pdraw->buffers[i].attachment == __DRI_BUFFER_FAKE_FRONT_LEFT)
+         pdraw->have_fake_front = 1;
+      if (pdraw->buffers[i].attachment == __DRI_BUFFER_BACK_LEFT)
+         pdraw->have_back = 1;
+   }
 
 }
 
 static __DRIbuffer *
-dri2GetBuffers(__DRIdrawable *driDrawable,
-              int *width, int *height,
-              unsigned int *attachments, int count,
-              int *out_count, void *loaderPrivate)
+dri2GetBuffers(__DRIdrawable * driDrawable,
+               int *width, int *height,
+               unsigned int *attachments, int count,
+               int *out_count, void *loaderPrivate)
 {
-    __GLXDRIdrawablePrivate *pdraw = loaderPrivate;
-    DRI2Buffer *buffers;
+   __GLXDRIdrawablePrivate *pdraw = loaderPrivate;
+   DRI2Buffer *buffers;
 
-    buffers = DRI2GetBuffers(pdraw->base.psc->dpy, pdraw->base.xDrawable,
-                            width, height, attachments, count, out_count);
-    if (buffers == NULL)
-       return NULL;
+   buffers = DRI2GetBuffers(pdraw->base.psc->dpy, pdraw->base.xDrawable,
+                            width, height, attachments, count, out_count);
+   if (buffers == NULL)
+      return NULL;
 
-    pdraw->width = *width;
-    pdraw->height = *height;
-    process_buffers(pdraw, buffers, *out_count);
+   pdraw->width = *width;
+   pdraw->height = *height;
+   process_buffers(pdraw, buffers, *out_count);
 
-    Xfree(buffers);
+   Xfree(buffers);
 
-    return pdraw->buffers;
+   return pdraw->buffers;
 }
 
 static __DRIbuffer *
-dri2GetBuffersWithFormat(__DRIdrawable *driDrawable,
-                        int *width, int *height,
-                        unsigned int *attachments, int count,
-                        int *out_count, void *loaderPrivate)
+dri2GetBuffersWithFormat(__DRIdrawable * driDrawable,
+                         int *width, int *height,
+                         unsigned int *attachments, int count,
+                         int *out_count, void *loaderPrivate)
 {
-    __GLXDRIdrawablePrivate *pdraw = loaderPrivate;
-    DRI2Buffer *buffers;
+   __GLXDRIdrawablePrivate *pdraw = loaderPrivate;
+   DRI2Buffer *buffers;
 
-    buffers = DRI2GetBuffersWithFormat(pdraw->base.psc->dpy,
-                                      pdraw->base.xDrawable,
-                                      width, height, attachments,
-                                      count, out_count);
-    if (buffers == NULL)
-       return NULL;
+   buffers = DRI2GetBuffersWithFormat(pdraw->base.psc->dpy,
+                                      pdraw->base.xDrawable,
+                                      width, height, attachments,
+                                      count, out_count);
+   if (buffers == NULL)
+      return NULL;
 
-    pdraw->width = *width;
-    pdraw->height = *height;
-    process_buffers(pdraw, buffers, *out_count);
+   pdraw->width = *width;
+   pdraw->height = *height;
+   process_buffers(pdraw, buffers, *out_count);
 
-    Xfree(buffers);
+   Xfree(buffers);
 
-    return pdraw->buffers;
+   return pdraw->buffers;
 }
 
 static const __DRIdri2LoaderExtension dri2LoaderExtension = {
-    { __DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION },
-    dri2GetBuffers,
-    dri2FlushFrontBuffer,
-    dri2GetBuffersWithFormat,
+   {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION},
+   dri2GetBuffers,
+   dri2FlushFrontBuffer,
+   dri2GetBuffersWithFormat,
 };
 
 static const __DRIdri2LoaderExtension dri2LoaderExtension_old = {
-    { __DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION },
-    dri2GetBuffers,
-    dri2FlushFrontBuffer,
-    NULL,
+   {__DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION},
+   dri2GetBuffers,
+   dri2FlushFrontBuffer,
+   NULL,
 };
 
 static const __DRIextension *loader_extensions[] = {
-    &dri2LoaderExtension.base,
-    &systemTimeExtension.base,
-    NULL
+   &dri2LoaderExtension.base,
+   &systemTimeExtension.base,
+   NULL
 };
 
 static const __DRIextension *loader_extensions_old[] = {
-    &dri2LoaderExtension_old.base,
-    &systemTimeExtension.base,
-    NULL
+   &dri2LoaderExtension_old.base,
+   &systemTimeExtension.base,
+   NULL
 };
 
-static __GLXDRIscreen *dri2CreateScreen(__GLXscreenConfigs *psc, int screen,
-                                       __GLXdisplayPrivate *priv)
+static __GLXDRIscreen *
+dri2CreateScreen(__GLXscreenConfigs * psc, int screen,
+                 __GLXdisplayPrivate * priv)
 {
-    const __DRIconfig **driver_configs;
-    const __DRIextension **extensions;
-    const __GLXDRIdisplayPrivate *const pdp = (__GLXDRIdisplayPrivate *)
+   const __DRIconfig **driver_configs;
+   const __DRIextension **extensions;
+   const __GLXDRIdisplayPrivate *const pdp = (__GLXDRIdisplayPrivate *)
       priv->dri2Display;
-    __GLXDRIscreen *psp;
-    char *driverName, *deviceName;
-    drm_magic_t magic;
-    int i;
-
-    psp = Xmalloc(sizeof *psp);
-    if (psp == NULL)
-       return NULL;
-
-    /* Initialize per screen dynamic client GLX extensions */
-    psc->ext_list_first_time = GL_TRUE;
-
-    if (!DRI2Connect(psc->dpy, RootWindow(psc->dpy, screen),
-                    &driverName, &deviceName))
-       return NULL;
-
-    psc->driver = driOpenDriver(driverName);
-    if (psc->driver == NULL) {
-       ErrorMessageF("driver pointer missing\n");
-       goto handle_error;
-    }
-
-    extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS);
-    if (extensions == NULL) {
-       ErrorMessageF("driver exports no extensions (%s)\n", dlerror());
-       goto handle_error;
-    }
-    
-    for (i = 0; extensions[i]; i++) {
-       if (strcmp(extensions[i]->name, __DRI_CORE) == 0)
-           psc->core = (__DRIcoreExtension *) extensions[i];
-       if (strcmp(extensions[i]->name, __DRI_DRI2) == 0)
-           psc->dri2 = (__DRIdri2Extension *) extensions[i];
-    }
-
-    if (psc->core == NULL || psc->dri2 == NULL) {
-       ErrorMessageF("core dri or dri2 extension not found\n");
-       goto handle_error;
-    }
-
-    psc->fd = open(deviceName, O_RDWR);
-    if (psc->fd < 0) {
-       ErrorMessageF("failed to open drm device: %s\n", strerror(errno));
-       return NULL;
-    }
-
-    if (drmGetMagic(psc->fd, &magic)) {
-       ErrorMessageF("failed to get magic\n");
-       return NULL;
-    }
-
-    if (!DRI2Authenticate(psc->dpy, RootWindow(psc->dpy, screen), magic)) {
-       ErrorMessageF("failed to authenticate magic %d\n", magic);
-       return NULL;
-    }
-
-    /* If the server does not support the protocol for
-     * DRI2GetBuffersWithFormat, don't supply that interface to the driver.
-     */
-    psc->__driScreen = 
-      psc->dri2->createNewScreen(screen, psc->fd,
-                                ((pdp->driMinor < 1)
-                                 ? loader_extensions_old
-                                 : loader_extensions),
-                                &driver_configs, psc);
-
-    if (psc->__driScreen == NULL) {
-       ErrorMessageF("failed to create dri screen\n");
-       return NULL;
-    }
-
-    driBindExtensions(psc, 1);
-
-    psc->configs = driConvertConfigs(psc->core, psc->configs, driver_configs);
-    psc->visuals = driConvertConfigs(psc->core, psc->visuals, driver_configs);
-
-    psp->destroyScreen = dri2DestroyScreen;
-    psp->createContext = dri2CreateContext;
-    psp->createDrawable = dri2CreateDrawable;
-    psp->swapBuffers = dri2SwapBuffers;
-    psp->waitGL = dri2WaitGL;
-    psp->waitX = dri2WaitX;
-
-    /* DRI2 suports SubBuffer through DRI2CopyRegion, so it's always
-     * available.*/
-    psp->copySubBuffer = dri2CopySubBuffer;
-    __glXEnableDirectExtension(psc, "GLX_MESA_copy_sub_buffer");
-
-    Xfree(driverName);
-    Xfree(deviceName);
-
-    return psp;
+   __GLXDRIscreen *psp;
+   char *driverName, *deviceName;
+   drm_magic_t magic;
+   int i;
+
+   psp = Xmalloc(sizeof *psp);
+   if (psp == NULL)
+      return NULL;
+
+   /* Initialize per screen dynamic client GLX extensions */
+   psc->ext_list_first_time = GL_TRUE;
+
+   if (!DRI2Connect(psc->dpy, RootWindow(psc->dpy, screen),
+                    &driverName, &deviceName))
+      return NULL;
+
+   psc->driver = driOpenDriver(driverName);
+   if (psc->driver == NULL) {
+      ErrorMessageF("driver pointer missing\n");
+      goto handle_error;
+   }
+
+   extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS);
+   if (extensions == NULL) {
+      ErrorMessageF("driver exports no extensions (%s)\n", dlerror());
+      goto handle_error;
+   }
+
+   for (i = 0; extensions[i]; i++) {
+      if (strcmp(extensions[i]->name, __DRI_CORE) == 0)
+         psc->core = (__DRIcoreExtension *) extensions[i];
+      if (strcmp(extensions[i]->name, __DRI_DRI2) == 0)
+         psc->dri2 = (__DRIdri2Extension *) extensions[i];
+   }
+
+   if (psc->core == NULL || psc->dri2 == NULL) {
+      ErrorMessageF("core dri or dri2 extension not found\n");
+      goto handle_error;
+   }
+
+   psc->fd = open(deviceName, O_RDWR);
+   if (psc->fd < 0) {
+      ErrorMessageF("failed to open drm device: %s\n", strerror(errno));
+      return NULL;
+   }
+
+   if (drmGetMagic(psc->fd, &magic)) {
+      ErrorMessageF("failed to get magic\n");
+      return NULL;
+   }
+
+   if (!DRI2Authenticate(psc->dpy, RootWindow(psc->dpy, screen), magic)) {
+      ErrorMessageF("failed to authenticate magic %d\n", magic);
+      return NULL;
+   }
+
+   /* If the server does not support the protocol for
+    * DRI2GetBuffersWithFormat, don't supply that interface to the driver.
+    */
+   psc->__driScreen =
+      psc->dri2->createNewScreen(screen, psc->fd, ((pdp->driMinor < 1)
+                                                   ? loader_extensions_old
+                                                   : loader_extensions),
+                                 &driver_configs, psc);
+
+   if (psc->__driScreen == NULL) {
+      ErrorMessageF("failed to create dri screen\n");
+      return NULL;
+   }
+
+   driBindExtensions(psc, 1);
+
+   psc->configs = driConvertConfigs(psc->core, psc->configs, driver_configs);
+   psc->visuals = driConvertConfigs(psc->core, psc->visuals, driver_configs);
+
+   psc->driver_configs = driver_configs;
+
+   psp->destroyScreen = dri2DestroyScreen;
+   psp->createContext = dri2CreateContext;
+   psp->createDrawable = dri2CreateDrawable;
+   psp->swapBuffers = dri2SwapBuffers;
+   psp->waitGL = dri2WaitGL;
+   psp->waitX = dri2WaitX;
+
+   /* DRI2 suports SubBuffer through DRI2CopyRegion, so it's always
+    * available.*/
+   psp->copySubBuffer = dri2CopySubBuffer;
+   __glXEnableDirectExtension(psc, "GLX_MESA_copy_sub_buffer");
+
+   Xfree(driverName);
+   Xfree(deviceName);
+
+   return psp;
 
  handle_error:
-    Xfree(driverName);
-    Xfree(deviceName);
+   Xfree(driverName);
+   Xfree(deviceName);
 
-    /* FIXME: clean up here */
+   /* FIXME: clean up here */
 
-    return NULL;
+   return NULL;
 }
 
 /* Called from __glXFreeDisplayPrivate.
  */
-static void dri2DestroyDisplay(__GLXDRIdisplay *dpy)
+static void
+dri2DestroyDisplay(__GLXDRIdisplay * dpy)
 {
-    Xfree(dpy);
+   Xfree(dpy);
 }
 
 /*
@@ -526,29 +540,30 @@ static void dri2DestroyDisplay(__GLXDRIdisplay *dpy)
  * This is called from __glXInitialize() when we are given a new
  * display pointer.
  */
-_X_HIDDEN __GLXDRIdisplay *dri2CreateDisplay(Display *dpy)
+_X_HIDDEN __GLXDRIdisplay *
+dri2CreateDisplay(Display * dpy)
 {
-    __GLXDRIdisplayPrivate *pdp;
-    int eventBase, errorBase;
+   __GLXDRIdisplayPrivate *pdp;
+   int eventBase, errorBase;
 
-    if (!DRI2QueryExtension(dpy, &eventBase, &errorBase))
-       return NULL;
+   if (!DRI2QueryExtension(dpy, &eventBase, &errorBase))
+      return NULL;
 
-    pdp = Xmalloc(sizeof *pdp);
-    if (pdp == NULL)
-       return NULL;
+   pdp = Xmalloc(sizeof *pdp);
+   if (pdp == NULL)
+      return NULL;
 
-    if (!DRI2QueryVersion(dpy, &pdp->driMajor, &pdp->driMinor)) {
-       Xfree(pdp);
-       return NULL;
-    }
+   if (!DRI2QueryVersion(dpy, &pdp->driMajor, &pdp->driMinor)) {
+      Xfree(pdp);
+      return NULL;
+   }
 
-    pdp->driPatch = 0;
+   pdp->driPatch = 0;
 
-    pdp->base.destroyDisplay = dri2DestroyDisplay;
-    pdp->base.createScreen = dri2CreateScreen;
+   pdp->base.destroyDisplay = dri2DestroyDisplay;
+   pdp->base.createScreen = dri2CreateScreen;
 
-    return &pdp->base;
+   return &pdp->base;
 }
 
 #endif /* GLX_DIRECT_RENDERING */
index 6de4111..9c825ad 100644 (file)
 #define RTLD_GLOBAL 0
 #endif
 
-_X_HIDDEN void InfoMessageF(const char *f, ...)
+_X_HIDDEN void
+InfoMessageF(const char *f, ...)
 {
-    va_list args;
-    const char *env;
-
-    if ((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose")) {
-       fprintf(stderr, "libGL: ");
-       va_start(args, f);
-       vfprintf(stderr, f, args);
-       va_end(args);
-    }
+   va_list args;
+   const char *env;
+
+   if ((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose")) {
+      fprintf(stderr, "libGL: ");
+      va_start(args, f);
+      vfprintf(stderr, f, args);
+      va_end(args);
+   }
 }
 
 /**
  * Print error to stderr, unless LIBGL_DEBUG=="quiet".
  */
-_X_HIDDEN void ErrorMessageF(const char *f, ...)
+_X_HIDDEN void
+ErrorMessageF(const char *f, ...)
 {
-    va_list args;
-    const char *env;
-
-    if ((env = getenv("LIBGL_DEBUG")) && !strstr(env, "quiet")) {
-       fprintf(stderr, "libGL error: ");
-       va_start(args, f);
-       vfprintf(stderr, f, args);
-       va_end(args);
-    }
+   va_list args;
+   const char *env;
+
+   if ((env = getenv("LIBGL_DEBUG")) && !strstr(env, "quiet")) {
+      fprintf(stderr, "libGL error: ");
+      va_start(args, f);
+      vfprintf(stderr, f, args);
+      va_end(args);
+   }
 }
 
 #ifndef DEFAULT_DRIVER_DIR
@@ -95,7 +97,8 @@ _X_HIDDEN void ErrorMessageF(const char *f, ...)
  * \returns
  * A handle from \c dlopen, or \c NULL if driver file not found.
  */
-_X_HIDDEN void *driOpenDriver(const char *driverName)
+_X_HIDDEN void *
+driOpenDriver(const char *driverName)
 {
    void *glhandle, *handle;
    const char *libPaths, *p, *next;
@@ -110,40 +113,41 @@ _X_HIDDEN void *driOpenDriver(const char *driverName)
       /* don't allow setuid apps to use LIBGL_DRIVERS_PATH */
       libPaths = getenv("LIBGL_DRIVERS_PATH");
       if (!libPaths)
-         libPaths = getenv("LIBGL_DRIVERS_DIR"); /* deprecated */
+         libPaths = getenv("LIBGL_DRIVERS_DIR");        /* deprecated */
    }
    if (libPaths == NULL)
-       libPaths = DEFAULT_DRIVER_DIR;
+      libPaths = DEFAULT_DRIVER_DIR;
 
    handle = NULL;
    for (p = libPaths; *p; p = next) {
-       next = strchr(p, ':');
-       if (next == NULL) {
-          len = strlen(p);
-          next = p + len;
-       } else {
-          len = next - p;
-          next++;
-       }
+      next = strchr(p, ':');
+      if (next == NULL) {
+         len = strlen(p);
+         next = p + len;
+      }
+      else {
+         len = next - p;
+         next++;
+      }
 
 #ifdef GLX_USE_TLS
       snprintf(realDriverName, sizeof realDriverName,
-              "%.*s/tls/%s_dri.so", len, p, driverName);
+               "%.*s/tls/%s_dri.so", len, p, driverName);
       InfoMessageF("OpenDriver: trying %s\n", realDriverName);
       handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL);
 #endif
 
-      if ( handle == NULL ) {
-        snprintf(realDriverName, sizeof realDriverName,
-                 "%.*s/%s_dri.so", len, p, driverName);
-        InfoMessageF("OpenDriver: trying %s\n", realDriverName);
-        handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL);
+      if (handle == NULL) {
+         snprintf(realDriverName, sizeof realDriverName,
+                  "%.*s/%s_dri.so", len, p, driverName);
+         InfoMessageF("OpenDriver: trying %s\n", realDriverName);
+         handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL);
       }
 
-      if ( handle != NULL )
-         break;
+      if (handle != NULL)
+         break;
       else
-        ErrorMessageF("dlopen %s failed (%s)\n", realDriverName, dlerror());
+         ErrorMessageF("dlopen %s failed (%s)\n", realDriverName, dlerror());
    }
 
    if (!handle)
@@ -156,253 +160,258 @@ _X_HIDDEN void *driOpenDriver(const char *driverName)
 }
 
 _X_HIDDEN const __DRIsystemTimeExtension systemTimeExtension = {
-    { __DRI_SYSTEM_TIME, __DRI_SYSTEM_TIME_VERSION },
-    __glXGetUST,
-    __driGetMscRateOML
+   {__DRI_SYSTEM_TIME, __DRI_SYSTEM_TIME_VERSION},
+   __glXGetUST,
+   __driGetMscRateOML
 };
 
 #define __ATTRIB(attrib, field) \
     { attrib, offsetof(__GLcontextModes, field) }
 
-static const struct { unsigned int attrib, offset; } attribMap[] = {
-    __ATTRIB(__DRI_ATTRIB_BUFFER_SIZE,                 rgbBits),
-    __ATTRIB(__DRI_ATTRIB_LEVEL,                       level),
-    __ATTRIB(__DRI_ATTRIB_RED_SIZE,                    redBits),
-    __ATTRIB(__DRI_ATTRIB_GREEN_SIZE,                  greenBits),
-    __ATTRIB(__DRI_ATTRIB_BLUE_SIZE,                   blueBits),
-    __ATTRIB(__DRI_ATTRIB_ALPHA_SIZE,                  alphaBits),
-    __ATTRIB(__DRI_ATTRIB_DEPTH_SIZE,                  depthBits),
-    __ATTRIB(__DRI_ATTRIB_STENCIL_SIZE,                        stencilBits),
-    __ATTRIB(__DRI_ATTRIB_ACCUM_RED_SIZE,              accumRedBits),
-    __ATTRIB(__DRI_ATTRIB_ACCUM_GREEN_SIZE,            accumGreenBits),
-    __ATTRIB(__DRI_ATTRIB_ACCUM_BLUE_SIZE,             accumBlueBits),
-    __ATTRIB(__DRI_ATTRIB_ACCUM_ALPHA_SIZE,            accumAlphaBits),
-    __ATTRIB(__DRI_ATTRIB_SAMPLE_BUFFERS,              sampleBuffers),
-    __ATTRIB(__DRI_ATTRIB_SAMPLES,                     samples),
-    __ATTRIB(__DRI_ATTRIB_DOUBLE_BUFFER,               doubleBufferMode),
-    __ATTRIB(__DRI_ATTRIB_STEREO,                      stereoMode),
-    __ATTRIB(__DRI_ATTRIB_AUX_BUFFERS,                 numAuxBuffers),
+static const struct
+{
+   unsigned int attrib, offset;
+} attribMap[] = {
+   __ATTRIB(__DRI_ATTRIB_BUFFER_SIZE, rgbBits),
+      __ATTRIB(__DRI_ATTRIB_LEVEL, level),
+      __ATTRIB(__DRI_ATTRIB_RED_SIZE, redBits),
+      __ATTRIB(__DRI_ATTRIB_GREEN_SIZE, greenBits),
+      __ATTRIB(__DRI_ATTRIB_BLUE_SIZE, blueBits),
+      __ATTRIB(__DRI_ATTRIB_ALPHA_SIZE, alphaBits),
+      __ATTRIB(__DRI_ATTRIB_DEPTH_SIZE, depthBits),
+      __ATTRIB(__DRI_ATTRIB_STENCIL_SIZE, stencilBits),
+      __ATTRIB(__DRI_ATTRIB_ACCUM_RED_SIZE, accumRedBits),
+      __ATTRIB(__DRI_ATTRIB_ACCUM_GREEN_SIZE, accumGreenBits),
+      __ATTRIB(__DRI_ATTRIB_ACCUM_BLUE_SIZE, accumBlueBits),
+      __ATTRIB(__DRI_ATTRIB_ACCUM_ALPHA_SIZE, accumAlphaBits),
+      __ATTRIB(__DRI_ATTRIB_SAMPLE_BUFFERS, sampleBuffers),
+      __ATTRIB(__DRI_ATTRIB_SAMPLES, samples),
+      __ATTRIB(__DRI_ATTRIB_DOUBLE_BUFFER, doubleBufferMode),
+      __ATTRIB(__DRI_ATTRIB_STEREO, stereoMode),
+      __ATTRIB(__DRI_ATTRIB_AUX_BUFFERS, numAuxBuffers),
 #if 0
-    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_TYPE,            transparentPixel),
-    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_INDEX_VALUE,     transparentIndex),
-    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_RED_VALUE,       transparentRed),
-    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_GREEN_VALUE,     transparentGreen),
-    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_BLUE_VALUE,      transparentBlue),
-    __ATTRIB(__DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE,     transparentAlpha),
-    __ATTRIB(__DRI_ATTRIB_RED_MASK,                    redMask),
-    __ATTRIB(__DRI_ATTRIB_GREEN_MASK,                  greenMask),
-    __ATTRIB(__DRI_ATTRIB_BLUE_MASK,                   blueMask),
-    __ATTRIB(__DRI_ATTRIB_ALPHA_MASK,                  alphaMask),
+      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_TYPE, transparentPixel),
+      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_INDEX_VALUE, transparentIndex),
+      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_RED_VALUE, transparentRed),
+      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_GREEN_VALUE, transparentGreen),
+      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_BLUE_VALUE, transparentBlue),
+      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE, transparentAlpha),
+      __ATTRIB(__DRI_ATTRIB_RED_MASK, redMask),
+      __ATTRIB(__DRI_ATTRIB_GREEN_MASK, greenMask),
+      __ATTRIB(__DRI_ATTRIB_BLUE_MASK, blueMask),
+      __ATTRIB(__DRI_ATTRIB_ALPHA_MASK, alphaMask),
 #endif
-    __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_WIDTH,           maxPbufferWidth),
-    __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_HEIGHT,          maxPbufferHeight),
-    __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_PIXELS,          maxPbufferPixels),
-    __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_WIDTH,       optimalPbufferWidth),
-    __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_HEIGHT,      optimalPbufferHeight),
+      __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_WIDTH, maxPbufferWidth),
+      __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_HEIGHT, maxPbufferHeight),
+      __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_PIXELS, maxPbufferPixels),
+      __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_WIDTH, optimalPbufferWidth),
+      __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_HEIGHT, optimalPbufferHeight),
 #if 0
-    __ATTRIB(__DRI_ATTRIB_SWAP_METHOD,                 swapMethod),
+      __ATTRIB(__DRI_ATTRIB_SWAP_METHOD, swapMethod),
 #endif
-    __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGB,         bindToTextureRgb),
-    __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGBA,                bindToTextureRgba),
-    __ATTRIB(__DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE,      bindToMipmapTexture),
-    __ATTRIB(__DRI_ATTRIB_YINVERTED,                   yInverted),
-};
+__ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGB, bindToTextureRgb),
+      __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGBA, bindToTextureRgba),
+      __ATTRIB(__DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE,
+                     bindToMipmapTexture),
+      __ATTRIB(__DRI_ATTRIB_YINVERTED, yInverted),};
 
 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
 
 static int
-scalarEqual(__GLcontextModes *mode, unsigned int attrib, unsigned int value)
+scalarEqual(__GLcontextModes * mode, unsigned int attrib, unsigned int value)
 {
-    unsigned int glxValue;
-    int i;
+   unsigned int glxValue;
+   int i;
 
-    for (i = 0; i < ARRAY_SIZE(attribMap); i++)
-       if (attribMap[i].attrib == attrib) {
-           glxValue = *(unsigned int *) ((char *) mode + attribMap[i].offset);
-           return glxValue == GLX_DONT_CARE || glxValue == value;
-       }
+   for (i = 0; i < ARRAY_SIZE(attribMap); i++)
+      if (attribMap[i].attrib == attrib) {
+         glxValue = *(unsigned int *) ((char *) mode + attribMap[i].offset);
+         return glxValue == GLX_DONT_CARE || glxValue == value;
+      }
 
-    return GL_TRUE; /* Is a non-existing attribute equal to value? */
+   return GL_TRUE;              /* Is a non-existing attribute equal to value? */
 }
 
 static int
-driConfigEqual(const __DRIcoreExtension *core,
-              __GLcontextModes *modes, const __DRIconfig *driConfig)
+driConfigEqual(const __DRIcoreExtension * core,
+               __GLcontextModes * modes, const __DRIconfig * driConfig)
 {
-    unsigned int attrib, value, glxValue;
-    int i;
-
-    i = 0;
-    while (core->indexConfigAttrib(driConfig, i++, &attrib, &value)) {
-       switch (attrib) {
-       case __DRI_ATTRIB_RENDER_TYPE:
-           glxValue = 0;
-           if (value & __DRI_ATTRIB_RGBA_BIT) {
-               glxValue |= GLX_RGBA_BIT;
-           } else if (value & __DRI_ATTRIB_COLOR_INDEX_BIT) {
-               glxValue |= GLX_COLOR_INDEX_BIT;
-           }
-           if (glxValue != modes->renderType)
-               return GL_FALSE;
-           break;
-
-       case __DRI_ATTRIB_CONFIG_CAVEAT:
-           if (value & __DRI_ATTRIB_NON_CONFORMANT_CONFIG)
-               glxValue = GLX_NON_CONFORMANT_CONFIG;
-           else if (value & __DRI_ATTRIB_SLOW_BIT)
-               glxValue = GLX_SLOW_CONFIG;
-           else
-               glxValue = GLX_NONE;
-           if (glxValue != modes->visualRating)
-               return GL_FALSE;
-           break;
-
-       case __DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS:
-           glxValue = 0;
-           if (value & __DRI_ATTRIB_TEXTURE_1D_BIT)
-               glxValue |= GLX_TEXTURE_1D_BIT_EXT;
-           if (value & __DRI_ATTRIB_TEXTURE_2D_BIT)
-               glxValue |= GLX_TEXTURE_2D_BIT_EXT;
-           if (value & __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT)
-               glxValue |= GLX_TEXTURE_RECTANGLE_BIT_EXT;
-           if (modes->bindToTextureTargets != GLX_DONT_CARE &&
-               glxValue != modes->bindToTextureTargets)
-               return GL_FALSE;
-           break;      
-
-       default:
-           if (!scalarEqual(modes, attrib, value))
-               return GL_FALSE;
-       }
-    }
-
-    return GL_TRUE;
+   unsigned int attrib, value, glxValue;
+   int i;
+
+   i = 0;
+   while (core->indexConfigAttrib(driConfig, i++, &attrib, &value)) {
+      switch (attrib) {
+      case __DRI_ATTRIB_RENDER_TYPE:
+         glxValue = 0;
+         if (value & __DRI_ATTRIB_RGBA_BIT) {
+            glxValue |= GLX_RGBA_BIT;
+         }
+         else if (value & __DRI_ATTRIB_COLOR_INDEX_BIT) {
+            glxValue |= GLX_COLOR_INDEX_BIT;
+         }
+         if (glxValue != modes->renderType)
+            return GL_FALSE;
+         break;
+
+      case __DRI_ATTRIB_CONFIG_CAVEAT:
+         if (value & __DRI_ATTRIB_NON_CONFORMANT_CONFIG)
+            glxValue = GLX_NON_CONFORMANT_CONFIG;
+         else if (value & __DRI_ATTRIB_SLOW_BIT)
+            glxValue = GLX_SLOW_CONFIG;
+         else
+            glxValue = GLX_NONE;
+         if (glxValue != modes->visualRating)
+            return GL_FALSE;
+         break;
+
+      case __DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS:
+         glxValue = 0;
+         if (value & __DRI_ATTRIB_TEXTURE_1D_BIT)
+            glxValue |= GLX_TEXTURE_1D_BIT_EXT;
+         if (value & __DRI_ATTRIB_TEXTURE_2D_BIT)
+            glxValue |= GLX_TEXTURE_2D_BIT_EXT;
+         if (value & __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT)
+            glxValue |= GLX_TEXTURE_RECTANGLE_BIT_EXT;
+         if (modes->bindToTextureTargets != GLX_DONT_CARE &&
+             glxValue != modes->bindToTextureTargets)
+            return GL_FALSE;
+         break;
+
+      default:
+         if (!scalarEqual(modes, attrib, value))
+            return GL_FALSE;
+      }
+   }
+
+   return GL_TRUE;
 }
 
 static __GLcontextModes *
-createDriMode(const __DRIcoreExtension *core,
-             __GLcontextModes *modes, const __DRIconfig **driConfigs)
+createDriMode(const __DRIcoreExtension * core,
+              __GLcontextModes * modes, const __DRIconfig ** driConfigs)
 {
-    __GLXDRIconfigPrivate *config;
-    int i;
+   __GLXDRIconfigPrivate *config;
+   int i;
 
-    for (i = 0; driConfigs[i]; i++) {
-       if (driConfigEqual(core, modes, driConfigs[i]))
-           break;
-    }
+   for (i = 0; driConfigs[i]; i++) {
+      if (driConfigEqual(core, modes, driConfigs[i]))
+         break;
+   }
 
-    if (driConfigs[i] == NULL)
-       return NULL;
+   if (driConfigs[i] == NULL)
+      return NULL;
 
-    config = Xmalloc(sizeof *config);
-    if (config == NULL)
-       return NULL;
+   config = Xmalloc(sizeof *config);
+   if (config == NULL)
+      return NULL;
 
-    config->modes = *modes;
-    config->driConfig = driConfigs[i];
+   config->modes = *modes;
+   config->driConfig = driConfigs[i];
 
-    return &config->modes;
+   return &config->modes;
 }
 
 _X_HIDDEN __GLcontextModes *
-driConvertConfigs(const __DRIcoreExtension *core,
-                 __GLcontextModes *modes, const __DRIconfig **configs)
+driConvertConfigs(const __DRIcoreExtension * core,
+                  __GLcontextModes * modes, const __DRIconfig ** configs)
 {
-    __GLcontextModes head, *tail, *m;
-
-    tail = &head;
-    head.next = NULL;
-    for (m = modes; m; m = m->next) {
-       tail->next = createDriMode(core, m, configs);
-       if (tail->next == NULL) {
-           /* no matching dri config for m */
-           continue;
-       }
+   __GLcontextModes head, *tail, *m;
+
+   tail = &head;
+   head.next = NULL;
+   for (m = modes; m; m = m->next) {
+      tail->next = createDriMode(core, m, configs);
+      if (tail->next == NULL) {
+         /* no matching dri config for m */
+         continue;
+      }
 
 
-       tail = tail->next;
-    }
+      tail = tail->next;
+   }
 
-    _gl_context_modes_destroy(modes);
+   _gl_context_modes_destroy(modes);
 
-    return head.next;
+   return head.next;
 }
 
 _X_HIDDEN void
-driBindExtensions(__GLXscreenConfigs *psc, int dri2)
+driBindExtensions(__GLXscreenConfigs * psc, int dri2)
 {
-    const __DRIextension **extensions;
-    int i;
+   const __DRIextension **extensions;
+   int i;
 
-    extensions = psc->core->getExtensions(psc->__driScreen);
+   extensions = psc->core->getExtensions(psc->__driScreen);
 
-    for (i = 0; extensions[i]; i++) {
+   for (i = 0; extensions[i]; i++) {
 #ifdef __DRI_COPY_SUB_BUFFER
-       if (strcmp(extensions[i]->name, __DRI_COPY_SUB_BUFFER) == 0) {
-           psc->driCopySubBuffer = (__DRIcopySubBufferExtension *) extensions[i];
-           __glXEnableDirectExtension(psc, "GLX_MESA_copy_sub_buffer");
-       }
+      if (strcmp(extensions[i]->name, __DRI_COPY_SUB_BUFFER) == 0) {
+         psc->driCopySubBuffer =
+            (__DRIcopySubBufferExtension *) extensions[i];
+         __glXEnableDirectExtension(psc, "GLX_MESA_copy_sub_buffer");
+      }
 #endif
 
 #ifdef __DRI_SWAP_CONTROL
-       /* No DRI2 support for swap_control at the moment, since SwapBuffers
-        * is done by the X server */
-       if (strcmp(extensions[i]->name, __DRI_SWAP_CONTROL) == 0 && !dri2) {
-           psc->swapControl = (__DRIswapControlExtension *) extensions[i];
-           __glXEnableDirectExtension(psc, "GLX_SGI_swap_control");
-           __glXEnableDirectExtension(psc, "GLX_MESA_swap_control");
-       }
+      /* No DRI2 support for swap_control at the moment, since SwapBuffers
+       * is done by the X server */
+      if (strcmp(extensions[i]->name, __DRI_SWAP_CONTROL) == 0 && !dri2) {
+         psc->swapControl = (__DRIswapControlExtension *) extensions[i];
+         __glXEnableDirectExtension(psc, "GLX_SGI_swap_control");
+         __glXEnableDirectExtension(psc, "GLX_MESA_swap_control");
+      }
 #endif
 
 #ifdef __DRI_ALLOCATE
-       if (strcmp(extensions[i]->name, __DRI_ALLOCATE) == 0) {
-           psc->allocate = (__DRIallocateExtension *) extensions[i];
-           __glXEnableDirectExtension(psc, "GLX_MESA_allocate_memory");
-       }
+      if (strcmp(extensions[i]->name, __DRI_ALLOCATE) == 0) {
+         psc->allocate = (__DRIallocateExtension *) extensions[i];
+         __glXEnableDirectExtension(psc, "GLX_MESA_allocate_memory");
+      }
 #endif
 
 #ifdef __DRI_FRAME_TRACKING
-       if (strcmp(extensions[i]->name, __DRI_FRAME_TRACKING) == 0) {
-           psc->frameTracking = (__DRIframeTrackingExtension *) extensions[i];
-           __glXEnableDirectExtension(psc, "GLX_MESA_swap_frame_usage");
-       }
+      if (strcmp(extensions[i]->name, __DRI_FRAME_TRACKING) == 0) {
+         psc->frameTracking = (__DRIframeTrackingExtension *) extensions[i];
+         __glXEnableDirectExtension(psc, "GLX_MESA_swap_frame_usage");
+      }
 #endif
 
 #ifdef __DRI_MEDIA_STREAM_COUNTER
-       if (strcmp(extensions[i]->name, __DRI_MEDIA_STREAM_COUNTER) == 0) {
-           psc->msc = (__DRImediaStreamCounterExtension *) extensions[i];
-           __glXEnableDirectExtension(psc, "GLX_SGI_video_sync");
-       }
+      if (strcmp(extensions[i]->name, __DRI_MEDIA_STREAM_COUNTER) == 0) {
+         psc->msc = (__DRImediaStreamCounterExtension *) extensions[i];
+         __glXEnableDirectExtension(psc, "GLX_SGI_video_sync");
+      }
 #endif
 
 #ifdef __DRI_SWAP_BUFFER_COUNTER
-       /* No driver supports this at this time and the extension is
-        * not defined in dri_interface.h.  Will enable
-        * GLX_OML_sync_control if implemented. */
+      /* No driver supports this at this time and the extension is
+       * not defined in dri_interface.h.  Will enable
+       * GLX_OML_sync_control if implemented. */
 #endif
 
 #ifdef __DRI_READ_DRAWABLE
-       if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
-           __glXEnableDirectExtension(psc, "GLX_SGI_make_current_read");
-       }
+      if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
+         __glXEnableDirectExtension(psc, "GLX_SGI_make_current_read");
+      }
 #endif
 
 #ifdef __DRI_TEX_BUFFER
-       if ((strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) && dri2) {
-           psc->texBuffer = (__DRItexBufferExtension *) extensions[i];
-           __glXEnableDirectExtension(psc, "GLX_EXT_texture_from_pixmap");
-       }
+      if ((strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) && dri2) {
+         psc->texBuffer = (__DRItexBufferExtension *) extensions[i];
+         __glXEnableDirectExtension(psc, "GLX_EXT_texture_from_pixmap");
+      }
 #endif
 
 #ifdef __DRI2_FLUSH
-       if ((strcmp(extensions[i]->name, __DRI2_FLUSH) == 0) && dri2) {
-           psc->f = (__DRI2flushExtension *) extensions[i];
-           /* internal driver extension, no GL extension exposed */
-       }
+      if ((strcmp(extensions[i]->name, __DRI2_FLUSH) == 0) && dri2) {
+         psc->f = (__DRI2flushExtension *) extensions[i];
+         /* internal driver extension, no GL extension exposed */
+      }
 #endif
 
-       /* Ignore unknown extensions */
-    }
+      /* Ignore unknown extensions */
+   }
 }
 
 #endif /* GLX_DIRECT_RENDERING */
index ac2eb05..ab24bd8 100644 (file)
@@ -51,22 +51,24 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 typedef struct __GLXDRIdisplayPrivateRec __GLXDRIdisplayPrivate;
 typedef struct __GLXDRIcontextPrivateRec __GLXDRIcontextPrivate;
 
-struct __GLXDRIdisplayPrivateRec {
-    __GLXDRIdisplay base;
+struct __GLXDRIdisplayPrivateRec
+{
+   __GLXDRIdisplay base;
 
-    /*
+   /*
     ** XFree86-DRI version information
     */
-    int driMajor;
-    int driMinor;
-    int driPatch;
+   int driMajor;
+   int driMinor;
+   int driPatch;
 };
 
-struct __GLXDRIcontextPrivateRec {
-    __GLXDRIcontext base;
-    __DRIcontext *driContext;
-    XID hwContextID;
-    __GLXscreenConfigs *psc;
+struct __GLXDRIcontextPrivateRec
+{
+   __GLXDRIcontext base;
+   __DRIcontext *driContext;
+   XID hwContextID;
+   __GLXscreenConfigs *psc;
 };
 
 /*
@@ -74,47 +76,51 @@ struct __GLXDRIcontextPrivateRec {
  * the DRI driver for the screen. (I.e. "r128", "tdfx", etc).
  * Return True for success, False for failure.
  */
-static Bool driGetDriverName(Display *dpy, int scrNum, char **driverName)
+static Bool
+driGetDriverName(Display * dpy, int scrNum, char **driverName)
 {
-    int directCapable;
-    Bool b;
-    int event, error;
-    int driverMajor, driverMinor, driverPatch;
-
-    *driverName = NULL;
-
-    if (XF86DRIQueryExtension(dpy, &event, &error)) { /* DRI1 */
-       if (!XF86DRIQueryDirectRenderingCapable(dpy, scrNum, &directCapable)) {
-           ErrorMessageF("XF86DRIQueryDirectRenderingCapable failed\n");
-           return False;
-       }
-       if (!directCapable) {
-           ErrorMessageF("XF86DRIQueryDirectRenderingCapable returned false\n");
-           return False;
-       }
-
-       b = XF86DRIGetClientDriverName(dpy, scrNum, &driverMajor, &driverMinor,
-               &driverPatch, driverName);
-       if (!b) {
-           ErrorMessageF("Cannot determine driver name for screen %d\n", scrNum);
-           return False;
-       }
-
-       InfoMessageF("XF86DRIGetClientDriverName: %d.%d.%d %s (screen %d)\n",
-               driverMajor, driverMinor, driverPatch, *driverName, scrNum);
-
-       return True;
-    } else if (DRI2QueryExtension(dpy, &event, &error)) { /* DRI2 */
-       char *dev;
-       Bool ret = DRI2Connect(dpy, RootWindow(dpy, scrNum), driverName, &dev);
-
-       if (ret)
-           Xfree(dev);
-
-       return ret;
-    }
-
-    return False;
+   int directCapable;
+   Bool b;
+   int event, error;
+   int driverMajor, driverMinor, driverPatch;
+
+   *driverName = NULL;
+
+   if (XF86DRIQueryExtension(dpy, &event, &error)) {    /* DRI1 */
+      if (!XF86DRIQueryDirectRenderingCapable(dpy, scrNum, &directCapable)) {
+         ErrorMessageF("XF86DRIQueryDirectRenderingCapable failed\n");
+         return False;
+      }
+      if (!directCapable) {
+         ErrorMessageF("XF86DRIQueryDirectRenderingCapable returned false\n");
+         return False;
+      }
+
+      b = XF86DRIGetClientDriverName(dpy, scrNum, &driverMajor, &driverMinor,
+                                     &driverPatch, driverName);
+      if (!b) {
+         ErrorMessageF("Cannot determine driver name for screen %d\n",
+                       scrNum);
+         return False;
+      }
+
+      InfoMessageF("XF86DRIGetClientDriverName: %d.%d.%d %s (screen %d)\n",
+                   driverMajor, driverMinor, driverPatch, *driverName,
+                   scrNum);
+
+      return True;
+   }
+   else if (DRI2QueryExtension(dpy, &event, &error)) {  /* DRI2 */
+      char *dev;
+      Bool ret = DRI2Connect(dpy, RootWindow(dpy, scrNum), driverName, &dev);
+
+      if (ret)
+         Xfree(dev);
+
+      return ret;
+   }
+
+   return False;
 }
 
 /*
@@ -123,17 +129,19 @@ static Bool driGetDriverName(Display *dpy, int scrNum, char **driverName)
  * The returned char pointer points to a static array that will be
  * overwritten by subsequent calls.
  */
-PUBLIC const char *glXGetScreenDriver (Display *dpy, int scrNum) {
+PUBLIC const char *
+glXGetScreenDriver(Display * dpy, int scrNum)
+{
    static char ret[32];
    char *driverName;
    if (driGetDriverName(dpy, scrNum, &driverName)) {
       int len;
       if (!driverName)
-        return NULL;
-      len = strlen (driverName);
+         return NULL;
+      len = strlen(driverName);
       if (len >= 31)
-        return NULL;
-      memcpy (ret, driverName, len+1);
+         return NULL;
+      memcpy(ret, driverName, len + 1);
       Xfree(driverName);
       return ret;
    }
@@ -151,121 +159,125 @@ PUBLIC const char *glXGetScreenDriver (Display *dpy, int scrNum) {
  *
  * Note: The driver remains opened after this function returns.
  */
-PUBLIC const char *glXGetDriverConfig (const char *driverName)
+PUBLIC const char *
+glXGetDriverConfig(const char *driverName)
 {
-   void *handle = driOpenDriver (driverName);
+   void *handle = driOpenDriver(driverName);
    if (handle)
-      return dlsym (handle, "__driConfigOptions");
+      return dlsym(handle, "__driConfigOptions");
    else
       return NULL;
 }
 
 #ifdef XDAMAGE_1_1_INTERFACE
 
-static GLboolean has_damage_post(Display *dpy)
+static GLboolean
+has_damage_post(Display * dpy)
 {
-    static GLboolean inited = GL_FALSE;
-    static GLboolean has_damage;
-
-    if (!inited) {
-       int major, minor;
-
-       if (XDamageQueryVersion(dpy, &major, &minor) &&
-           major == 1 && minor >= 1)
-       {
-           has_damage = GL_TRUE;
-       } else {
-           has_damage = GL_FALSE;
-       }
-       inited = GL_TRUE;
-    }
-
-    return has_damage;
+   static GLboolean inited = GL_FALSE;
+   static GLboolean has_damage;
+
+   if (!inited) {
+      int major, minor;
+
+      if (XDamageQueryVersion(dpy, &major, &minor) &&
+          major == 1 && minor >= 1) {
+         has_damage = GL_TRUE;
+      }
+      else {
+         has_damage = GL_FALSE;
+      }
+      inited = GL_TRUE;
+   }
+
+   return has_damage;
 }
 
-static void __glXReportDamage(__DRIdrawable *driDraw,
-                             int x, int y,
-                             drm_clip_rect_t *rects, int num_rects,
-                             GLboolean front_buffer,
-                             void *loaderPrivate)
+static void
+__glXReportDamage(__DRIdrawable * driDraw,
+                  int x, int y,
+                  drm_clip_rect_t * rects, int num_rects,
+                  GLboolean front_buffer, void *loaderPrivate)
 {
-    XRectangle *xrects;
-    XserverRegion region;
-    int i;
-    int x_off, y_off;
-    __GLXDRIdrawable *glxDraw = loaderPrivate;
-    __GLXscreenConfigs *psc = glxDraw->psc;
-    Display *dpy = psc->dpy;
-    Drawable drawable;
-
-    if (!has_damage_post(dpy))
-       return;
-
-    if (front_buffer) {
-       x_off = x;
-       y_off = y;
-       drawable = RootWindow(dpy, psc->scr);
-    } else{
-       x_off = 0;
-       y_off = 0;
-       drawable = glxDraw->xDrawable;
-    }
-
-    xrects = malloc(sizeof(XRectangle) * num_rects);
-    if (xrects == NULL)
-       return;
-
-    for (i = 0; i < num_rects; i++) {
-       xrects[i].x = rects[i].x1 + x_off;
-       xrects[i].y = rects[i].y1 + y_off;
-       xrects[i].width = rects[i].x2 - rects[i].x1;
-       xrects[i].height = rects[i].y2 - rects[i].y1;
-    }
-    region = XFixesCreateRegion(dpy, xrects, num_rects);
-    free(xrects);
-    XDamageAdd(dpy, drawable, region);
-    XFixesDestroyRegion(dpy, region);
+   XRectangle *xrects;
+   XserverRegion region;
+   int i;
+   int x_off, y_off;
+   __GLXDRIdrawable *glxDraw = loaderPrivate;
+   __GLXscreenConfigs *psc = glxDraw->psc;
+   Display *dpy = psc->dpy;
+   Drawable drawable;
+
+   if (!has_damage_post(dpy))
+      return;
+
+   if (front_buffer) {
+      x_off = x;
+      y_off = y;
+      drawable = RootWindow(dpy, psc->scr);
+   }
+   else {
+      x_off = 0;
+      y_off = 0;
+      drawable = glxDraw->xDrawable;
+   }
+
+   xrects = malloc(sizeof(XRectangle) * num_rects);
+   if (xrects == NULL)
+      return;
+
+   for (i = 0; i < num_rects; i++) {
+      xrects[i].x = rects[i].x1 + x_off;
+      xrects[i].y = rects[i].y1 + y_off;
+      xrects[i].width = rects[i].x2 - rects[i].x1;
+      xrects[i].height = rects[i].y2 - rects[i].y1;
+   }
+   region = XFixesCreateRegion(dpy, xrects, num_rects);
+   free(xrects);
+   XDamageAdd(dpy, drawable, region);
+   XFixesDestroyRegion(dpy, region);
 }
 
 static const __DRIdamageExtension damageExtension = {
-    { __DRI_DAMAGE, __DRI_DAMAGE_VERSION },
-    __glXReportDamage,
+   {__DRI_DAMAGE, __DRI_DAMAGE_VERSION},
+   __glXReportDamage,
 };
 
 #endif
 
 static GLboolean
-__glXDRIGetDrawableInfo(__DRIdrawable *drawable,
-                       unsigned int *index, unsigned int *stamp, 
-                       int *X, int *Y, int *W, int *H,
-                       int *numClipRects, drm_clip_rect_t ** pClipRects,
-                       int *backX, int *backY,
-                       int *numBackClipRects, drm_clip_rect_t **pBackClipRects,
-                       void *loaderPrivate)
+__glXDRIGetDrawableInfo(__DRIdrawable * drawable,
+                        unsigned int *index, unsigned int *stamp,
+                        int *X, int *Y, int *W, int *H,
+                        int *numClipRects, drm_clip_rect_t ** pClipRects,
+                        int *backX, int *backY,
+                        int *numBackClipRects,
+                        drm_clip_rect_t ** pBackClipRects,
+                        void *loaderPrivate)
 {
-    __GLXDRIdrawable *glxDraw = loaderPrivate;
-    __GLXscreenConfigs *psc = glxDraw->psc;
-    Display *dpy = psc->dpy;
-
-    return XF86DRIGetDrawableInfo(dpy, psc->scr, glxDraw->drawable,
-                                 index, stamp, X, Y, W, H,
-                                 numClipRects, pClipRects,
-                                 backX, backY,
-                                 numBackClipRects, pBackClipRects);
+   __GLXDRIdrawable *glxDraw = loaderPrivate;
+   __GLXscreenConfigs *psc = glxDraw->psc;
+   Display *dpy = psc->dpy;
+
+   return XF86DRIGetDrawableInfo(dpy, psc->scr, glxDraw->drawable,
+                                 index, stamp, X, Y, W, H,
+                                 numClipRects, pClipRects,
+                                 backX, backY,
+                                 numBackClipRects, pBackClipRects);
 }
 
 static const __DRIgetDrawableInfoExtension getDrawableInfoExtension = {
-    { __DRI_GET_DRAWABLE_INFO, __DRI_GET_DRAWABLE_INFO_VERSION },
-    __glXDRIGetDrawableInfo
+   {__DRI_GET_DRAWABLE_INFO, __DRI_GET_DRAWABLE_INFO_VERSION},
+   __glXDRIGetDrawableInfo
 };
 
 static const __DRIextension *loader_extensions[] = {
-    &systemTimeExtension.base,
-    &getDrawableInfoExtension.base,
+   &systemTimeExtension.base,
+   &getDrawableInfoExtension.base,
 #ifdef XDAMAGE_1_1_INTERFACE
-    &damageExtension.base,
+   &damageExtension.base,
 #endif
-    NULL
+   NULL
 };
 
 #ifndef GLX_USE_APPLEGL
@@ -284,425 +296,429 @@ static const __DRIextension *loader_extensions[] = {
  *          the client-side driver on success, or \c NULL on failure.
  */
 static void *
-CallCreateNewScreen(Display *dpy, int scrn, __GLXscreenConfigs *psc,
-                   __GLXDRIdisplayPrivate * driDpy)
+CallCreateNewScreen(Display * dpy, int scrn, __GLXscreenConfigs * psc,
+                    __GLXDRIdisplayPrivate * driDpy)
 {
-    void *psp = NULL;
-    drm_handle_t hSAREA;
-    drmAddress pSAREA = MAP_FAILED;
-    char *BusID;
-    __DRIversion   ddx_version;
-    __DRIversion   dri_version;
-    __DRIversion   drm_version;
-    __DRIframebuffer  framebuffer;
-    int   fd = -1;
-    int   status;
-
-    drm_magic_t magic;
-    drmVersionPtr version;
-    int newlyopened;
-    char *driverName;
-    drm_handle_t  hFB;
-    int        junk;
-    const __DRIconfig **driver_configs;
-    __GLcontextModes *visual;
-
-    /* DRI protocol version. */
-    dri_version.major = driDpy->driMajor;
-    dri_version.minor = driDpy->driMinor;
-    dri_version.patch = driDpy->driPatch;
-
-    framebuffer.base = MAP_FAILED;
-    framebuffer.dev_priv = NULL;
-
-    if (!XF86DRIOpenConnection(dpy, scrn, &hSAREA, &BusID)) {
-       ErrorMessageF("XF86DRIOpenConnection failed\n");
-       goto handle_error;
-    }
-
-    fd = drmOpenOnce(NULL, BusID, &newlyopened);
-
-    Xfree(BusID); /* No longer needed */
-
-    if (fd < 0) {
-       ErrorMessageF("drmOpenOnce failed (%s)\n", strerror(-fd));
-       goto handle_error;
-    }
-
-    if (drmGetMagic(fd, &magic)) {
-       ErrorMessageF("drmGetMagic failed\n");
-       goto handle_error;
-    }
-
-    version = drmGetVersion(fd);
-    if (version) {
-       drm_version.major = version->version_major;
-       drm_version.minor = version->version_minor;
-       drm_version.patch = version->version_patchlevel;
-       drmFreeVersion(version);
-    }
-    else {
-       drm_version.major = -1;
-       drm_version.minor = -1;
-       drm_version.patch = -1;
-    }
-
-    if (newlyopened && !XF86DRIAuthConnection(dpy, scrn, magic)) {
-       ErrorMessageF("XF86DRIAuthConnection failed\n");
-       goto handle_error;
-    }
-
-    /* Get device name (like "tdfx") and the ddx version numbers.
-     * We'll check the version in each DRI driver's "createNewScreen"
-     * function. */
-    if (!XF86DRIGetClientDriverName(dpy, scrn,
-                                   &ddx_version.major,
-                                   &ddx_version.minor,
-                                   &ddx_version.patch,
-                                   &driverName)) {
-       ErrorMessageF("XF86DRIGetClientDriverName failed\n");
-       goto handle_error;
-    }
-
-    Xfree(driverName); /* No longer needed. */
-
-    /*
-     * Get device-specific info.  pDevPriv will point to a struct
-     * (such as DRIRADEONRec in xfree86/driver/ati/radeon_dri.h) that
-     * has information about the screen size, depth, pitch, ancilliary
-     * buffers, DRM mmap handles, etc.
-     */
-    if (!XF86DRIGetDeviceInfo(dpy, scrn, &hFB, &junk,
-                             &framebuffer.size, &framebuffer.stride,
-                             &framebuffer.dev_priv_size, &framebuffer.dev_priv)) {
-       ErrorMessageF("XF86DRIGetDeviceInfo failed");
-       goto handle_error;
-    }
-
-    framebuffer.width = DisplayWidth(dpy, scrn);
-    framebuffer.height = DisplayHeight(dpy, scrn);
-
-    /* Map the framebuffer region. */
-    status = drmMap(fd, hFB, framebuffer.size, 
-                   (drmAddressPtr)&framebuffer.base);
-    if (status != 0) {
-       ErrorMessageF("drmMap of framebuffer failed (%s)", strerror(-status));
-       goto handle_error;
-    }
-
-    /* Map the SAREA region.  Further mmap regions may be setup in
-     * each DRI driver's "createNewScreen" function.
-     */
-    status = drmMap(fd, hSAREA, SAREA_MAX, &pSAREA);
-    if (status != 0) {
-       ErrorMessageF("drmMap of SAREA failed (%s)", strerror(-status));
-       goto handle_error;
-    }
-
-    psp = (*psc->legacy->createNewScreen)(scrn,
-                                         &ddx_version,
-                                         &dri_version,
-                                         &drm_version,
-                                         &framebuffer,
-                                         pSAREA,
-                                         fd,
-                                         loader_extensions,
-                                         &driver_configs,
-                                         psc);
-
-    if (psp == NULL) {
-       ErrorMessageF("Calling driver entry point failed");
-       goto handle_error;
-    }
-
-    psc->configs = driConvertConfigs(psc->core, psc->configs, driver_configs);
-    psc->visuals = driConvertConfigs(psc->core, psc->visuals, driver_configs);
-
-    /* Visuals with depth != screen depth are subject to automatic compositing
-     * in the X server, so DRI1 can't render to them properly. Mark them as
-     * non-conformant to prevent apps from picking them up accidentally.
-     */
-    for (visual = psc->visuals; visual; visual = visual->next) {
-       XVisualInfo template;
-       XVisualInfo *visuals;
-       int num_visuals;
-       long mask;
-
-       template.visualid = visual->visualID;
-       mask = VisualIDMask;
-       visuals = XGetVisualInfo(dpy, mask, &template, &num_visuals);
-
-       if (visuals) {
-           if (num_visuals > 0 && visuals->depth != DefaultDepth(dpy, scrn))
-               visual->visualRating = GLX_NON_CONFORMANT_CONFIG;
-
-           XFree(visuals);
-       }
-    }
-
-    return psp;
+   void *psp = NULL;
+   drm_handle_t hSAREA;
+   drmAddress pSAREA = MAP_FAILED;
+   char *BusID;
+   __DRIversion ddx_version;
+   __DRIversion dri_version;
+   __DRIversion drm_version;
+   __DRIframebuffer framebuffer;
+   int fd = -1;
+   int status;
+
+   drm_magic_t magic;
+   drmVersionPtr version;
+   int newlyopened;
+   char *driverName;
+   drm_handle_t hFB;
+   int junk;
+   const __DRIconfig **driver_configs;
+   __GLcontextModes *visual;
+
+   /* DRI protocol version. */
+   dri_version.major = driDpy->driMajor;
+   dri_version.minor = driDpy->driMinor;
+   dri_version.patch = driDpy->driPatch;
+
+   framebuffer.base = MAP_FAILED;
+   framebuffer.dev_priv = NULL;
+
+   if (!XF86DRIOpenConnection(dpy, scrn, &hSAREA, &BusID)) {
+      ErrorMessageF("XF86DRIOpenConnection failed\n");
+      goto handle_error;
+   }
+
+   fd = drmOpenOnce(NULL, BusID, &newlyopened);
+
+   Xfree(BusID);                /* No longer needed */
+
+   if (fd < 0) {
+      ErrorMessageF("drmOpenOnce failed (%s)\n", strerror(-fd));
+      goto handle_error;
+   }
+
+   if (drmGetMagic(fd, &magic)) {
+      ErrorMessageF("drmGetMagic failed\n");
+      goto handle_error;
+   }
+
+   version = drmGetVersion(fd);
+   if (version) {
+      drm_version.major = version->version_major;
+      drm_version.minor = version->version_minor;
+      drm_version.patch = version->version_patchlevel;
+      drmFreeVersion(version);
+   }
+   else {
+      drm_version.major = -1;
+      drm_version.minor = -1;
+      drm_version.patch = -1;
+   }
+
+   if (newlyopened && !XF86DRIAuthConnection(dpy, scrn, magic)) {
+      ErrorMessageF("XF86DRIAuthConnection failed\n");
+      goto handle_error;
+   }
+
+   /* Get device name (like "tdfx") and the ddx version numbers.
+    * We'll check the version in each DRI driver's "createNewScreen"
+    * function. */
+   if (!XF86DRIGetClientDriverName(dpy, scrn,
+                                   &ddx_version.major,
+                                   &ddx_version.minor,
+                                   &ddx_version.patch, &driverName)) {
+      ErrorMessageF("XF86DRIGetClientDriverName failed\n");
+      goto handle_error;
+   }
+
+   Xfree(driverName);           /* No longer needed. */
+
+   /*
+    * Get device-specific info.  pDevPriv will point to a struct
+    * (such as DRIRADEONRec in xfree86/driver/ati/radeon_dri.h) that
+    * has information about the screen size, depth, pitch, ancilliary
+    * buffers, DRM mmap handles, etc.
+    */
+   if (!XF86DRIGetDeviceInfo(dpy, scrn, &hFB, &junk,
+                             &framebuffer.size, &framebuffer.stride,
+                             &framebuffer.dev_priv_size,
+                             &framebuffer.dev_priv)) {
+      ErrorMessageF("XF86DRIGetDeviceInfo failed");
+      goto handle_error;
+   }
+
+   framebuffer.width = DisplayWidth(dpy, scrn);
+   framebuffer.height = DisplayHeight(dpy, scrn);
+
+   /* Map the framebuffer region. */
+   status = drmMap(fd, hFB, framebuffer.size,
+                   (drmAddressPtr) & framebuffer.base);
+   if (status != 0) {
+      ErrorMessageF("drmMap of framebuffer failed (%s)", strerror(-status));
+      goto handle_error;
+   }
+
+   /* Map the SAREA region.  Further mmap regions may be setup in
+    * each DRI driver's "createNewScreen" function.
+    */
+   status = drmMap(fd, hSAREA, SAREA_MAX, &pSAREA);
+   if (status != 0) {
+      ErrorMessageF("drmMap of SAREA failed (%s)", strerror(-status));
+      goto handle_error;
+   }
+
+   psp = (*psc->legacy->createNewScreen) (scrn,
+                                          &ddx_version,
+                                          &dri_version,
+                                          &drm_version,
+                                          &framebuffer,
+                                          pSAREA,
+                                          fd,
+                                          loader_extensions,
+                                          &driver_configs, psc);
+
+   if (psp == NULL) {
+      ErrorMessageF("Calling driver entry point failed");
+      goto handle_error;
+   }
+
+   psc->configs = driConvertConfigs(psc->core, psc->configs, driver_configs);
+   psc->visuals = driConvertConfigs(psc->core, psc->visuals, driver_configs);
+
+   psc->driver_configs = driver_configs;
+
+   /* Visuals with depth != screen depth are subject to automatic compositing
+    * in the X server, so DRI1 can't render to them properly. Mark them as
+    * non-conformant to prevent apps from picking them up accidentally.
+    */
+   for (visual = psc->visuals; visual; visual = visual->next) {
+      XVisualInfo template;
+      XVisualInfo *visuals;
+      int num_visuals;
+      long mask;
+
+      template.visualid = visual->visualID;
+      mask = VisualIDMask;
+      visuals = XGetVisualInfo(dpy, mask, &template, &num_visuals);
+
+      if (visuals) {
+         if (num_visuals > 0 && visuals->depth != DefaultDepth(dpy, scrn))
+            visual->visualRating = GLX_NON_CONFORMANT_CONFIG;
+
+         XFree(visuals);
+      }
+   }
+
+   return psp;
 
  handle_error:
-    if (pSAREA != MAP_FAILED)
-       drmUnmap(pSAREA, SAREA_MAX);
+   if (pSAREA != MAP_FAILED)
+      drmUnmap(pSAREA, SAREA_MAX);
 
-    if (framebuffer.base != MAP_FAILED)
-       drmUnmap((drmAddress)framebuffer.base, framebuffer.size);
+   if (framebuffer.base != MAP_FAILED)
+      drmUnmap((drmAddress) framebuffer.base, framebuffer.size);
 
-    if (framebuffer.dev_priv != NULL)
-       Xfree(framebuffer.dev_priv);
+   if (framebuffer.dev_priv != NULL)
+      Xfree(framebuffer.dev_priv);
 
-    if (fd >= 0)
-       drmCloseOnce(fd);
+   if (fd >= 0)
+      drmCloseOnce(fd);
 
-    XF86DRICloseConnection(dpy, scrn);
+   XF86DRICloseConnection(dpy, scrn);
 
-    ErrorMessageF("reverting to software direct rendering\n");
+   ErrorMessageF("reverting to software direct rendering\n");
 
-    return NULL;
+   return NULL;
 }
 
 #else /* !GLX_USE_APPLEGL */
 
 static void *
-CallCreateNewScreen(Display *dpy, int scrn, __GLXscreenConfigs *psc,
-                   __GLXDRIdisplayPrivate * driDpy)
+CallCreateNewScreen(Display * dpy, int scrn, __GLXscreenConfigs * psc,
+                    __GLXDRIdisplayPrivate * driDpy)
 {
-    return NULL;
+   return NULL;
 }
 
 #endif /* !GLX_USE_APPLEGL */
 
-static void driDestroyContext(__GLXDRIcontext *context,
-                             __GLXscreenConfigs *psc, Display *dpy)
+static void
+driDestroyContext(__GLXDRIcontext * context,
+                  __GLXscreenConfigs * psc, Display * dpy)
 {
-    __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
-                       
-    (*psc->core->destroyContext)(pcp->driContext);
+   __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
 
-    XF86DRIDestroyContext(psc->dpy, psc->scr, pcp->hwContextID);
-    Xfree(pcp);
+   (*psc->core->destroyContext) (pcp->driContext);
+
+   XF86DRIDestroyContext(psc->dpy, psc->scr, pcp->hwContextID);
+   Xfree(pcp);
 }
 
-static Bool driBindContext(__GLXDRIcontext *context,
-                          __GLXDRIdrawable *draw, __GLXDRIdrawable *read)
+static Bool
+driBindContext(__GLXDRIcontext * context,
+               __GLXDRIdrawable * draw, __GLXDRIdrawable * read)
 {
-    __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
-    const __DRIcoreExtension *core = pcp->psc->core;
+   __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
+   const __DRIcoreExtension *core = pcp->psc->core;
 
-    return (*core->bindContext)(pcp->driContext,
-                               draw->driDrawable,
-                               read->driDrawable);
+   return (*core->bindContext) (pcp->driContext,
+                                draw->driDrawable, read->driDrawable);
 }
 
-static void driUnbindContext(__GLXDRIcontext *context)
+static void
+driUnbindContext(__GLXDRIcontext * context)
 {
-    __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
-    const __DRIcoreExtension *core = pcp->psc->core;
+   __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
+   const __DRIcoreExtension *core = pcp->psc->core;
 
-    (*core->unbindContext)(pcp->driContext);
+   (*core->unbindContext) (pcp->driContext);
 }
 
-static __GLXDRIcontext *driCreateContext(__GLXscreenConfigs *psc,
-                                        const __GLcontextModes *mode,
-                                        GLXContext gc,
-                                        GLXContext shareList, int renderType)
+static __GLXDRIcontext *
+driCreateContext(__GLXscreenConfigs * psc,
+                 const __GLcontextModes * mode,
+                 GLXContext gc, GLXContext shareList, int renderType)
 {
-    __GLXDRIcontextPrivate *pcp, *pcp_shared;
-    drm_context_t hwContext;
-    __DRIcontext *shared = NULL;
-    __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) mode;
-
-    if (!psc || !psc->driScreen)
-       return NULL;
-
-    if (shareList) {
-       pcp_shared = (__GLXDRIcontextPrivate *) shareList->driContext;
-       shared = pcp_shared->driContext;
-    }
-
-    pcp = Xmalloc(sizeof *pcp);
-    if (pcp == NULL)
-       return NULL;
-
-    pcp->psc = psc;
-    if (!XF86DRICreateContextWithConfig(psc->dpy, psc->scr,
-                                       mode->visualID,
-                                       &pcp->hwContextID, &hwContext)) {
-       Xfree(pcp);
-       return NULL;
-    }
-
-    pcp->driContext =
-        (*psc->legacy->createNewContext)(psc->__driScreen,
-                                        config->driConfig,
-                                        renderType,
-                                        shared,
-                                        hwContext,
-                                        pcp);
-    if (pcp->driContext == NULL) {
-       XF86DRIDestroyContext(psc->dpy, psc->scr, pcp->hwContextID);
-       Xfree(pcp);
-       return NULL;
-    }
-
-    pcp->base.destroyContext = driDestroyContext;
-    pcp->base.bindContext = driBindContext;
-    pcp->base.unbindContext = driUnbindContext;
-
-    return &pcp->base;
+   __GLXDRIcontextPrivate *pcp, *pcp_shared;
+   drm_context_t hwContext;
+   __DRIcontext *shared = NULL;
+   __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) mode;
+
+   if (!psc || !psc->driScreen)
+      return NULL;
+
+   if (shareList) {
+      pcp_shared = (__GLXDRIcontextPrivate *) shareList->driContext;
+      shared = pcp_shared->driContext;
+   }
+
+   pcp = Xmalloc(sizeof *pcp);
+   if (pcp == NULL)
+      return NULL;
+
+   pcp->psc = psc;
+   if (!XF86DRICreateContextWithConfig(psc->dpy, psc->scr,
+                                       mode->visualID,
+                                       &pcp->hwContextID, &hwContext)) {
+      Xfree(pcp);
+      return NULL;
+   }
+
+   pcp->driContext =
+      (*psc->legacy->createNewContext) (psc->__driScreen,
+                                        config->driConfig,
+                                        renderType, shared, hwContext, pcp);
+   if (pcp->driContext == NULL) {
+      XF86DRIDestroyContext(psc->dpy, psc->scr, pcp->hwContextID);
+      Xfree(pcp);
+      return NULL;
+   }
+
+   pcp->base.destroyContext = driDestroyContext;
+   pcp->base.bindContext = driBindContext;
+   pcp->base.unbindContext = driUnbindContext;
+
+   return &pcp->base;
 }
 
-static void driDestroyDrawable(__GLXDRIdrawable *pdraw)
+static void
+driDestroyDrawable(__GLXDRIdrawable * pdraw)
 {
-    __GLXscreenConfigs *psc = pdraw->psc;
+   __GLXscreenConfigs *psc = pdraw->psc;
 
-    (*psc->core->destroyDrawable)(pdraw->driDrawable);
-    XF86DRIDestroyDrawable(psc->dpy, psc->scr, pdraw->drawable);
-    Xfree(pdraw);
+   (*psc->core->destroyDrawable) (pdraw->driDrawable);
+   XF86DRIDestroyDrawable(psc->dpy, psc->scr, pdraw->drawable);
+   Xfree(pdraw);
 }
 
-static __GLXDRIdrawable *driCreateDrawable(__GLXscreenConfigs *psc,
-                                          XID xDrawable,
-                                          GLXDrawable drawable,
-                                          const __GLcontextModes *modes)
+static __GLXDRIdrawable *
+driCreateDrawable(__GLXscreenConfigs * psc,
+                  XID xDrawable,
+                  GLXDrawable drawable, const __GLcontextModes * modes)
 {
-    __GLXDRIdrawable *pdraw;
-    drm_drawable_t hwDrawable;
-    void *empty_attribute_list = NULL;
-    __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes;
-
-    /* Old dri can't handle GLX 1.3+ drawable constructors. */
-    if (xDrawable != drawable)
-       return NULL;
-
-    pdraw = Xmalloc(sizeof(*pdraw));
-    if (!pdraw)
-       return NULL;
-
-    pdraw->drawable = drawable;
-    pdraw->psc = psc;
-
-    if (!XF86DRICreateDrawable(psc->dpy, psc->scr, drawable, &hwDrawable))
-       return NULL;
-
-    /* Create a new drawable */
-    pdraw->driDrawable =
-       (*psc->legacy->createNewDrawable)(psc->__driScreen,
-                                         config->driConfig,
-                                         hwDrawable,
-                                         GLX_WINDOW_BIT,
-                                         empty_attribute_list,
-                                         pdraw);
-
-    if (!pdraw->driDrawable) {
-       XF86DRIDestroyDrawable(psc->dpy, psc->scr, drawable);
-       Xfree(pdraw);
-       return NULL;
-    }
-
-    pdraw->destroyDrawable = driDestroyDrawable;
-
-    return pdraw;
+   __GLXDRIdrawable *pdraw;
+   drm_drawable_t hwDrawable;
+   void *empty_attribute_list = NULL;
+   __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes;
+
+   /* Old dri can't handle GLX 1.3+ drawable constructors. */
+   if (xDrawable != drawable)
+      return NULL;
+
+   pdraw = Xmalloc(sizeof(*pdraw));
+   if (!pdraw)
+      return NULL;
+
+   pdraw->drawable = drawable;
+   pdraw->psc = psc;
+
+   if (!XF86DRICreateDrawable(psc->dpy, psc->scr, drawable, &hwDrawable))
+      return NULL;
+
+   /* Create a new drawable */
+   pdraw->driDrawable =
+      (*psc->legacy->createNewDrawable) (psc->__driScreen,
+                                         config->driConfig,
+                                         hwDrawable,
+                                         GLX_WINDOW_BIT,
+                                         empty_attribute_list, pdraw);
+
+   if (!pdraw->driDrawable) {
+      XF86DRIDestroyDrawable(psc->dpy, psc->scr, drawable);
+      Xfree(pdraw);
+      return NULL;
+   }
+
+   pdraw->destroyDrawable = driDestroyDrawable;
+
+   return pdraw;
 }
 
-static void driSwapBuffers(__GLXDRIdrawable *pdraw)
+static void
+driSwapBuffers(__GLXDRIdrawable * pdraw)
 {
-   (*pdraw->psc->core->swapBuffers)(pdraw->driDrawable);
+   (*pdraw->psc->core->swapBuffers) (pdraw->driDrawable);
 }
 
-static void driCopySubBuffer(__GLXDRIdrawable *pdraw,
-                            int x, int y, int width, int height)
+static void
+driCopySubBuffer(__GLXDRIdrawable * pdraw,
+                 int x, int y, int width, int height)
 {
-    (*pdraw->psc->driCopySubBuffer->copySubBuffer)(pdraw->driDrawable,
-                                                  x, y, width, height);
+   (*pdraw->psc->driCopySubBuffer->copySubBuffer) (pdraw->driDrawable,
+                                                   x, y, width, height);
 }
 
-static void driDestroyScreen(__GLXscreenConfigs *psc)
+static void
+driDestroyScreen(__GLXscreenConfigs * psc)
 {
-    /* Free the direct rendering per screen data */
-    if (psc->__driScreen)
-       (*psc->core->destroyScreen)(psc->__driScreen);
-    psc->__driScreen = NULL;
-    if (psc->driver)
-       dlclose(psc->driver);
+   /* Free the direct rendering per screen data */
+   if (psc->__driScreen)
+      (*psc->core->destroyScreen) (psc->__driScreen);
+   psc->__driScreen = NULL;
+   if (psc->driver)
+      dlclose(psc->driver);
 }
 
-static __GLXDRIscreen *driCreateScreen(__GLXscreenConfigs *psc, int screen,
-                                      __GLXdisplayPrivate *priv)
+static __GLXDRIscreen *
+driCreateScreen(__GLXscreenConfigs * psc, int screen,
+                __GLXdisplayPrivate * priv)
 {
-    __GLXDRIdisplayPrivate *pdp;
-    __GLXDRIscreen *psp;
-    const __DRIextension **extensions;
-    char *driverName;
-    int i;
-
-    psp = Xcalloc(1, sizeof *psp);
-    if (psp == NULL)
-       return NULL;
-
-    /* Initialize per screen dynamic client GLX extensions */
-    psc->ext_list_first_time = GL_TRUE;
-
-    if (!driGetDriverName(priv->dpy, screen, &driverName)) {
-       Xfree(psp);
-       return NULL;
-    }
-
-    psc->driver = driOpenDriver(driverName);
-    Xfree(driverName);
-    if (psc->driver == NULL) {
-       Xfree(psp);
-       return NULL;
-    }
-
-    extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS);
-    if (extensions == NULL) {
-       ErrorMessageF("driver exports no extensions (%s)\n", dlerror());
-       Xfree(psp);
-       return NULL;
-    }
-
-    for (i = 0; extensions[i]; i++) {
-       if (strcmp(extensions[i]->name, __DRI_CORE) == 0)
-           psc->core = (__DRIcoreExtension *) extensions[i];
-       if (strcmp(extensions[i]->name, __DRI_LEGACY) == 0)
-           psc->legacy = (__DRIlegacyExtension *) extensions[i];
-    }
-
-    if (psc->core == NULL || psc->legacy == NULL) {
-       Xfree(psp);
-       return NULL;
-    }
-  
-    pdp = (__GLXDRIdisplayPrivate *) priv->driDisplay;
-    psc->__driScreen =
-       CallCreateNewScreen(psc->dpy, screen, psc, pdp);
-    if (psc->__driScreen == NULL) {
-       dlclose(psc->driver);
-       Xfree(psp);
-       return NULL;
-    }
-
-    driBindExtensions(psc, 0);
-    if (psc->driCopySubBuffer)
-       psp->copySubBuffer = driCopySubBuffer;
-
-    psp->destroyScreen = driDestroyScreen;
-    psp->createContext = driCreateContext;
-    psp->createDrawable = driCreateDrawable;
-    psp->swapBuffers = driSwapBuffers;
-    psp->waitX = NULL;
-    psp->waitGL = NULL;
-
-    return psp;
+   __GLXDRIdisplayPrivate *pdp;
+   __GLXDRIscreen *psp;
+   const __DRIextension **extensions;
+   char *driverName;
+   int i;
+
+   psp = Xcalloc(1, sizeof *psp);
+   if (psp == NULL)
+      return NULL;
+
+   /* Initialize per screen dynamic client GLX extensions */
+   psc->ext_list_first_time = GL_TRUE;
+
+   if (!driGetDriverName(priv->dpy, screen, &driverName)) {
+      Xfree(psp);
+      return NULL;
+   }
+
+   psc->driver = driOpenDriver(driverName);
+   Xfree(driverName);
+   if (psc->driver == NULL) {
+      Xfree(psp);
+      return NULL;
+   }
+
+   extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS);
+   if (extensions == NULL) {
+      ErrorMessageF("driver exports no extensions (%s)\n", dlerror());
+      Xfree(psp);
+      return NULL;
+   }
+
+   for (i = 0; extensions[i]; i++) {
+      if (strcmp(extensions[i]->name, __DRI_CORE) == 0)
+         psc->core = (__DRIcoreExtension *) extensions[i];
+      if (strcmp(extensions[i]->name, __DRI_LEGACY) == 0)
+         psc->legacy = (__DRIlegacyExtension *) extensions[i];
+   }
+
+   if (psc->core == NULL || psc->legacy == NULL) {
+      Xfree(psp);
+      return NULL;
+   }
+
+   pdp = (__GLXDRIdisplayPrivate *) priv->driDisplay;
+   psc->__driScreen = CallCreateNewScreen(psc->dpy, screen, psc, pdp);
+   if (psc->__driScreen == NULL) {
+      dlclose(psc->driver);
+      Xfree(psp);
+      return NULL;
+   }
+
+   driBindExtensions(psc, 0);
+   if (psc->driCopySubBuffer)
+      psp->copySubBuffer = driCopySubBuffer;
+
+   psp->destroyScreen = driDestroyScreen;
+   psp->createContext = driCreateContext;
+   psp->createDrawable = driCreateDrawable;
+   psp->swapBuffers = driSwapBuffers;
+   psp->waitX = NULL;
+   psp->waitGL = NULL;
+
+   return psp;
 }
 
 /* Called from __glXFreeDisplayPrivate.
  */
-static void driDestroyDisplay(__GLXDRIdisplay *dpy)
+static void
+driDestroyDisplay(__GLXDRIdisplay * dpy)
 {
-    Xfree(dpy);
+   Xfree(dpy);
 }
 
 /*
@@ -710,33 +726,34 @@ static void driDestroyDisplay(__GLXDRIdisplay *dpy)
  * This is called from __glXInitialize() when we are given a new
  * display pointer.
  */
-_X_HIDDEN __GLXDRIdisplay *driCreateDisplay(Display *dpy)
+_X_HIDDEN __GLXDRIdisplay *
+driCreateDisplay(Display * dpy)
 {
-    __GLXDRIdisplayPrivate *pdpyp;
-    int eventBase, errorBase;
-    int major, minor, patch;
+   __GLXDRIdisplayPrivate *pdpyp;
+   int eventBase, errorBase;
+   int major, minor, patch;
 
-    if (!XF86DRIQueryExtension(dpy, &eventBase, &errorBase)) {
-       return NULL;
-    }
+   if (!XF86DRIQueryExtension(dpy, &eventBase, &errorBase)) {
+      return NULL;
+   }
 
-    if (!XF86DRIQueryVersion(dpy, &major, &minor, &patch)) {
-       return NULL;
-    }
+   if (!XF86DRIQueryVersion(dpy, &major, &minor, &patch)) {
+      return NULL;
+   }
 
-    pdpyp = Xmalloc(sizeof *pdpyp);
-    if (!pdpyp) {
-       return NULL;
-    }
+   pdpyp = Xmalloc(sizeof *pdpyp);
+   if (!pdpyp) {
+      return NULL;
+   }
 
-    pdpyp->driMajor = major;
-    pdpyp->driMinor = minor;
-    pdpyp->driPatch = patch;
+   pdpyp->driMajor = major;
+   pdpyp->driMinor = minor;
+   pdpyp->driPatch = patch;
 
-    pdpyp->base.destroyDisplay = driDestroyDisplay;
-    pdpyp->base.createScreen = driCreateScreen;
+   pdpyp->base.destroyDisplay = driDestroyDisplay;
+   pdpyp->base.createScreen = driCreateScreen;
 
-    return &pdpyp->base;
+   return &pdpyp->base;
 }
 
 #endif /* GLX_DIRECT_RENDERING */
index 1c229dd..15e1586 100644 (file)
@@ -401,7 +401,7 @@ driCreateScreen(__GLXscreenConfigs * psc, int screen,
    psc->configs = driConvertConfigs(psc->core, psc->configs, driver_configs);
    psc->visuals = driConvertConfigs(psc->core, psc->visuals, driver_configs);
 
-   free(driver_configs);
+   psc->driver_configs = driver_configs;
 
    psp->destroyScreen = driDestroyScreen;
    psp->createContext = driCreateContext;
index a06331f..88a17df 100644 (file)
@@ -25,7 +25,7 @@
 /**
  * \file glx_pbuffer.c
  * Implementation of pbuffer related functions.
- * 
+ *
  * \author Ian Romanick <idr@us.ibm.com>
  */
 
@@ -114,7 +114,7 @@ ChangeDrawableAttribute(Display * dpy, GLXDrawable drawable,
  * \note
  * This function dynamically determines whether to use the SGIX_pbuffer
  * version of the protocol or the GLX 1.3 version of the protocol.
- * 
+ *
  * \todo
  * This function needs to be modified to work with direct-rendering drivers.
  */
@@ -198,7 +198,7 @@ determineTextureFormat(const int *attribs, int numAttribs)
 
    for (i = 0; i < numAttribs; i++) {
       if (attribs[2 * i] == GLX_TEXTURE_FORMAT_EXT)
-        return attribs[2 * i + 1];
+         return attribs[2 * i + 1];
    }
 
    return 0;
@@ -681,8 +681,7 @@ GLX_ALIAS_VOID(glXDestroyGLXPbufferSGIX,
 PUBLIC
 GLX_ALIAS_VOID(glXSelectEventSGIX,
                (Display * dpy, GLXDrawable drawable,
-                unsigned long mask), (dpy, drawable, mask),
-               glXSelectEvent)
+                unsigned long mask), (dpy, drawable, mask), glXSelectEvent)
 
 PUBLIC
 GLX_ALIAS_VOID(glXGetSelectedEventSGIX,
index 2789b84..efad13d 100644 (file)
@@ -25,7 +25,7 @@
 /**
  * \file glx_query.c
  * Generic utility functions to query internal data from the server.
- * 
+ *
  * \author Ian Romanick <idr@us.ibm.com>
  */
 
  * Exchange a protocol request for glXQueryServerString.
  */
 char *
-__glXQueryServerString(Display* dpy,
-                       int opcode,
-                       CARD32 screen,
-                       CARD32 name)
+__glXQueryServerString(Display * dpy, int opcode, CARD32 screen, CARD32 name)
 {
    xcb_connection_t *c = XGetXCBConnection(dpy);
-   xcb_glx_query_server_string_reply_treply =
+   xcb_glx_query_server_string_reply_t *reply =
       xcb_glx_query_server_string_reply(c,
                                         xcb_glx_query_server_string(c,
                                                                     screen,
@@ -59,7 +56,7 @@ __glXQueryServerString(Display* dpy,
    /* The spec doesn't mention this, but the Xorg server replies with
     * a string already terminated with '\0'. */
    uint32_t len = xcb_glx_query_server_string_string_length(reply);
-   charbuf = Xmalloc(len);
+   char *buf = Xmalloc(len);
    memcpy(buf, xcb_glx_query_server_string_string(reply), len);
    free(reply);
 
@@ -70,23 +67,20 @@ __glXQueryServerString(Display* dpy,
  * Exchange a protocol request for glGetString.
  */
 char *
-__glXGetString(Display* dpy,
-               int opcode,
-               CARD32 contextTag,
-               CARD32 name)
+__glXGetString(Display * dpy, int opcode, CARD32 contextTag, CARD32 name)
 {
    xcb_connection_t *c = XGetXCBConnection(dpy);
-   xcb_glx_get_string_reply_t* reply =
-      xcb_glx_get_string_reply(c,
-                               xcb_glx_get_string(c,
-                                                  contextTag,
-                                                  name),
-                               NULL);
+   xcb_glx_get_string_reply_t *reply = xcb_glx_get_string_reply(c,
+                                                                xcb_glx_get_string
+                                                                (c,
+                                                                 contextTag,
+                                                                 name),
+                                                                NULL);
 
    /* The spec doesn't mention this, but the Xorg server replies with
     * a string already terminated with '\0'. */
    uint32_t len = xcb_glx_get_string_string_length(reply);
-   charbuf = Xmalloc(len);
+   char *buf = Xmalloc(len);
    memcpy(buf, xcb_glx_get_string_string(reply), len);
    free(reply);
 
@@ -97,7 +91,7 @@ __glXGetString(Display* dpy,
 
 /**
  * GLX protocol structure for the ficticious "GXLGenericGetString" request.
- * 
+ *
  * This is a non-existant protocol packet.  It just so happens that all of
  * the real protocol packets used to request a string from the server have
  * an identical binary layout.  The only difference between them is the
@@ -167,25 +161,17 @@ __glXGetStringFromServer(Display * dpy, int opcode, CARD32 glxCode,
 }
 
 char *
-__glXQueryServerString(Display* dpy,
-                       int opcode,
-                       CARD32 screen,
-                       CARD32 name)
+__glXQueryServerString(Display * dpy, int opcode, CARD32 screen, CARD32 name)
 {
    return __glXGetStringFromServer(dpy, opcode,
-                                   X_GLXQueryServerString,
-                                   screen, name);
+                                   X_GLXQueryServerString, screen, name);
 }
 
 char *
-__glXGetString(Display* dpy,
-               int opcode,
-               CARD32 contextTag,
-               CARD32 name)
+__glXGetString(Display * dpy, int opcode, CARD32 contextTag, CARD32 name)
 {
    return __glXGetStringFromServer(dpy, opcode, X_GLsop_GetString,
                                    contextTag, name);
 }
 
 #endif /* USE_XCB */
-
index bf68d0f..00ee14f 100644 (file)
@@ -55,9 +55,7 @@
 #include "GL/internal/glcore.h"
 #include "glapi/glapitable.h"
 #include "glxhash.h"
-#if defined( USE_XTHREADS )
-# include <X11/Xthreads.h>
-#elif defined( PTHREADS )
+#if defined( PTHREADS )
 # include <pthread.h>
 #endif
 
@@ -67,7 +65,7 @@
 /* If we build the library with gcc's -fvisibility=hidden flag, we'll
  * use the PUBLIC macro to mark functions that are to be exported.
  *
- * We also need to define a USED attribute, so the optimizer doesn't 
+ * We also need to define a USED attribute, so the optimizer doesn't
  * inline a static function that we later use in an alias. - ajax
  */
 #if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 303
@@ -80,8 +78,8 @@
 
 
 
-#define GLX_MAJOR_VERSION      1       /* current version numbers */
-#define GLX_MINOR_VERSION      4
+#define GLX_MAJOR_VERSION 1       /* current version numbers */
+#define GLX_MINOR_VERSION 4
 
 #define __GLX_MAX_TEXTURE_UNITS 32
 
@@ -95,7 +93,7 @@ typedef struct _glapi_table __GLapi;
 
 #ifdef GLX_DIRECT_RENDERING
 
-#define containerOf(ptr, type, member)                 \
+#define containerOf(ptr, type, member)              \
     (type *)( (char *)ptr - offsetof(type,member) )
 
 #include <GL/internal/dri_interface.h>
@@ -112,75 +110,78 @@ typedef struct __GLXDRIcontextRec __GLXDRIcontext;
 
 #include "glxextensions.h"
 
-struct __GLXDRIdisplayRec {
+struct __GLXDRIdisplayRec
+{
     /**
      * Method to destroy the private DRI display data.
      */
-    void (*destroyDisplay)(__GLXDRIdisplay *display);
+   void (*destroyDisplay) (__GLXDRIdisplay * display);
 
-    __GLXDRIscreen *(*createScreen)(__GLXscreenConfigs *psc, int screen,
-                                   __GLXdisplayPrivate *priv);
+   __GLXDRIscreen *(*createScreen) (__GLXscreenConfigs * psc, int screen,
+                                    __GLXdisplayPrivate * priv);
 };
 
-struct __GLXDRIscreenRec {
-
-    void (*destroyScreen)(__GLXscreenConfigs *psc);
-
-    __GLXDRIcontext *(*createContext)(__GLXscreenConfigs *psc,
-                                     const __GLcontextModes *mode,
-                                     GLXContext gc,
-                                     GLXContext shareList, int renderType);
-       
-    __GLXDRIdrawable *(*createDrawable)(__GLXscreenConfigs *psc,
-                                       XID drawable,
-                                       GLXDrawable glxDrawable,
-                                       const __GLcontextModes *modes);
-
-    void (*swapBuffers)(__GLXDRIdrawable *pdraw);
-    void (*copySubBuffer)(__GLXDRIdrawable *pdraw,
-                         int x, int y, int width, int height);
-    void (*waitX)(__GLXDRIdrawable *pdraw);
-    void (*waitGL)(__GLXDRIdrawable *pdraw);
+struct __GLXDRIscreenRec
+{
+
+   void (*destroyScreen) (__GLXscreenConfigs * psc);
+
+   __GLXDRIcontext *(*createContext) (__GLXscreenConfigs * psc,
+                                      const __GLcontextModes * mode,
+                                      GLXContext gc,
+                                      GLXContext shareList, int renderType);
+
+   __GLXDRIdrawable *(*createDrawable) (__GLXscreenConfigs * psc,
+                                        XID drawable,
+                                        GLXDrawable glxDrawable,
+                                        const __GLcontextModes * modes);
+
+   void (*swapBuffers) (__GLXDRIdrawable * pdraw);
+   void (*copySubBuffer) (__GLXDRIdrawable * pdraw,
+                          int x, int y, int width, int height);
+   void (*waitX) (__GLXDRIdrawable * pdraw);
+   void (*waitGL) (__GLXDRIdrawable * pdraw);
 };
 
-struct __GLXDRIcontextRec {
-    void (*destroyContext)(__GLXDRIcontext *context, __GLXscreenConfigs *psc,
-                          Display *dpy);
-    Bool (*bindContext)(__GLXDRIcontext *context,
-                       __GLXDRIdrawable *pdraw,
-                       __GLXDRIdrawable *pread);
-    
-    void (*unbindContext)(__GLXDRIcontext *context);
+struct __GLXDRIcontextRec
+{
+   void (*destroyContext) (__GLXDRIcontext * context,
+                           __GLXscreenConfigs * psc, Display * dpy);
+     Bool(*bindContext) (__GLXDRIcontext * context, __GLXDRIdrawable * pdraw,
+                         __GLXDRIdrawable * pread);
+
+   void (*unbindContext) (__GLXDRIcontext * context);
 };
 
-struct __GLXDRIdrawableRec {
-    void (*destroyDrawable)(__GLXDRIdrawable *drawable);
+struct __GLXDRIdrawableRec
+{
+   void (*destroyDrawable) (__GLXDRIdrawable * drawable);
 
-    XID xDrawable;
-    XID drawable;
-    __GLXscreenConfigs *psc;
-    GLenum textureTarget;
-    __DRIdrawable *driDrawable;
-    GLenum textureFormat; /* EXT_texture_from_pixmap support */
+   XID xDrawable;
+   XID drawable;
+   __GLXscreenConfigs *psc;
+   GLenum textureTarget;
+   __DRIdrawable *driDrawable;
+   GLenum textureFormat;        /* EXT_texture_from_pixmap support */
 };
 
 /*
 ** Function to create and DRI display data and initialize the display
 ** dependent methods.
 */
-extern __GLXDRIdisplay *driswCreateDisplay(Display *dpy);
-extern __GLXDRIdisplay *driCreateDisplay(Display *dpy);
-extern __GLXDRIdisplay *dri2CreateDisplay(Display *dpy);
+extern __GLXDRIdisplay *driswCreateDisplay(Display * dpy);
+extern __GLXDRIdisplay *driCreateDisplay(Display * dpy);
+extern __GLXDRIdisplay *dri2CreateDisplay(Display * dpy);
 
-extern void DRI_glXUseXFont( Font font, int first, int count, int listbase );
+extern void DRI_glXUseXFont(Font font, int first, int count, int listbase);
 
 /*
 ** Functions to obtain driver configuration information from a direct
 ** rendering client application
 */
-extern const char *glXGetScreenDriver (Display *dpy, int scrNum);
+extern const char *glXGetScreenDriver(Display * dpy, int scrNum);
 
-extern const char *glXGetDriverConfig (const char *driverName);
+extern const char *glXGetDriverConfig(const char *driverName);
 
 #endif
 
@@ -188,53 +189,57 @@ extern const char *glXGetDriverConfig (const char *driverName);
 
 #define __GL_CLIENT_ATTRIB_STACK_DEPTH 16
 
-typedef struct __GLXpixelStoreModeRec {
-    GLboolean swapEndian;
-    GLboolean lsbFirst;
-    GLuint rowLength;
-    GLuint imageHeight;
-    GLuint imageDepth;
-    GLuint skipRows;
-    GLuint skipPixels;
-    GLuint skipImages;
-    GLuint alignment;
+typedef struct __GLXpixelStoreModeRec
+{
+   GLboolean swapEndian;
+   GLboolean lsbFirst;
+   GLuint rowLength;
+   GLuint imageHeight;
+   GLuint imageDepth;
+   GLuint skipRows;
+   GLuint skipPixels;
+   GLuint skipImages;
+   GLuint alignment;
 } __GLXpixelStoreMode;
 
 
-typedef struct __GLXattributeRec {
-    GLuint mask;
+typedef struct __GLXattributeRec
+{
+   GLuint mask;
 
     /**
      * Pixel storage state.  Most of the pixel store mode state is kept
      * here and used by the client code to manage the packing and
      * unpacking of data sent to/received from the server.
      */
-    __GLXpixelStoreMode storePack, storeUnpack;
+   __GLXpixelStoreMode storePack, storeUnpack;
 
     /**
      * Is EXT_vertex_array / GL 1.1 DrawArrays protocol specifically
      * disabled?
      */
-    GLboolean NoDrawArraysProtocol;
-    
+   GLboolean NoDrawArraysProtocol;
+
     /**
      * Vertex Array storage state.  The vertex array component
      * state is stored here and is used to manage the packing of
      * DrawArrays data sent to the server.
      */
-    struct array_state_vector * array_state;
+   struct array_state_vector *array_state;
 } __GLXattribute;
 
-typedef struct __GLXattributeMachineRec {
-       __GLXattribute *stack[__GL_CLIENT_ATTRIB_STACK_DEPTH];
-       __GLXattribute **stackPointer;
+typedef struct __GLXattributeMachineRec
+{
+   __GLXattribute *stack[__GL_CLIENT_ATTRIB_STACK_DEPTH];
+   __GLXattribute **stackPointer;
 } __GLXattributeMachine;
 
 /**
  * GLX state that needs to be kept on the client.  One of these records
  * exist for each context that has been made current by this client.
  */
-struct __GLXcontextRec {
+struct __GLXcontextRec
+{
     /**
      * \name Drawing command buffer.
      *
@@ -251,13 +256,13 @@ struct __GLXcontextRec {
      * These must be the first 6 fields since they are static initialized
      * in the dummy context in glxext.c
      */
-    /*@{*/
-    GLubyte *buf;
-    GLubyte *pc;
-    GLubyte *limit;
-    GLubyte *bufEnd;
-    GLint bufSize;
-    /*@}*/
+   /*@{ */
+   GLubyte *buf;
+   GLubyte *pc;
+   GLubyte *limit;
+   GLubyte *bufEnd;
+   GLint bufSize;
+   /*@} */
 
     /**
      * The XID of this rendering context.  When the context is created a
@@ -265,24 +270,24 @@ struct __GLXcontextRec {
      * destroyed but is still current to some thread. In this case the
      * context will be freed on next MakeCurrent.
      */
-    XID xid;
+   XID xid;
 
     /**
      * The XID of the \c shareList context.
      */
-    XID share_xid;
+   XID share_xid;
 
     /**
      * Screen number.
      */
-    GLint screen;
-    __GLXscreenConfigs *psc;
+   GLint screen;
+   __GLXscreenConfigs *psc;
 
     /**
      * \c GL_TRUE if the context was created with ImportContext, which
      * means the server-side context was created by another X client.
      */
-    GLboolean imported;
+   GLboolean imported;
 
     /**
      * The context tag returned by MakeCurrent when this context is made
@@ -292,7 +297,7 @@ struct __GLXcontextRec {
      * \c WaitX, \c WaitGL, \c UseXFont, and \c MakeCurrent (for the old
      * context)).
      */
-    GLXContextTag currentContextTag;
+   GLXContextTag currentContextTag;
 
     /**
      * \name Rendering mode
@@ -301,11 +306,11 @@ struct __GLXcontextRec {
      * When \c glRenderMode is called, the buffer associated with the
      * previous rendering mode (feedback or select) is filled.
      */
-    /*@{*/
-    GLenum renderMode;
-    GLfloat *feedbackBuf;
-    GLuint *selectBuf;
-    /*@}*/
+   /*@{ */
+   GLenum renderMode;
+   GLfloat *feedbackBuf;
+   GLuint *selectBuf;
+   /*@} */
 
     /**
      * This is \c GL_TRUE if the pixel unpack modes are such that an image
@@ -313,43 +318,43 @@ struct __GLXcontextRec {
      * still be true that the server will have to do some work.  This
      * just promises that a straight copy will fetch the correct bytes.
      */
-    GLboolean fastImageUnpack;
+   GLboolean fastImageUnpack;
 
     /**
      * Fill newImage with the unpacked form of \c oldImage getting it
      * ready for transport to the server.
      */
-    void (*fillImage)(__GLXcontext*, GLint, GLint, GLint, GLint, GLenum,
-                     GLenum, const GLvoid*, GLubyte*, GLubyte*);
+   void (*fillImage) (__GLXcontext *, GLint, GLint, GLint, GLint, GLenum,
+                      GLenum, const GLvoid *, GLubyte *, GLubyte *);
 
     /**
      * Client side attribs.
      */
-    __GLXattributeMachine attributes;
+   __GLXattributeMachine attributes;
 
     /**
      * Client side error code.  This is set when client side gl API
      * routines need to set an error because of a bad enumerant or
      * running out of memory, etc.
      */
-    GLenum error;
+   GLenum error;
 
     /**
      * Whether this context does direct rendering.
      */
-    Bool isDirect;
+   Bool isDirect;
 
     /**
      * \c dpy of current display for this context.  Will be \c NULL if not
      * current to any display, or if this is the "dummy context".
      */
-    Display *currentDpy;
+   Display *currentDpy;
 
     /**
      * The current drawable for this context.  Will be None if this
      * context is not current to any drawable.  currentReadable is below.
      */
-    GLXDrawable currentDrawable;
+   GLXDrawable currentDrawable;
 
     /**
      * \name GL Constant Strings
@@ -358,38 +363,38 @@ struct __GLXcontextRec {
      * These pertain to GL attributes, not to be confused with
      * GLX versioning attributes.
      */
-    /*@{*/
-    GLubyte *vendor;
-    GLubyte *renderer;
-    GLubyte *version;
-    GLubyte *extensions;
-    /*@}*/
+   /*@{ */
+   GLubyte *vendor;
+   GLubyte *renderer;
+   GLubyte *version;
+   GLubyte *extensions;
+   /*@} */
 
     /**
      * Record the dpy this context was created on for later freeing
      */
-    Display *createDpy;
+   Display *createDpy;
 
     /**
      * Maximum small render command size.  This is the smaller of 64k and
      * the size of the above buffer.
      */
-    GLint maxSmallRenderCommandSize;
+   GLint maxSmallRenderCommandSize;
 
     /**
      * Major opcode for the extension.  Copied here so a lookup isn't
      * needed.
      */
-    GLint majorOpcode;
+   GLint majorOpcode;
 
     /**
      * Pointer to the mode used to create this context.
      */
-    const __GLcontextModes * mode;
+   const __GLcontextModes *mode;
 
 #ifdef GLX_DIRECT_RENDERING
-    __GLXDRIcontext *driContext;
-    __DRIcontext *__driContext;
+   __GLXDRIcontext *driContext;
+   __DRIcontext *__driContext;
 #endif
 
     /**
@@ -398,22 +403,22 @@ struct __GLXcontextRec {
      *
      * \since Internal API version 20030606.
      */
-    GLXDrawable currentReadable;
+   GLXDrawable currentReadable;
 
-   /** 
+   /**
     * Pointer to client-state data that is private to libGL.  This is only
     * used for indirect rendering contexts.
     *
     * No internal API version change was made for this change.  Client-side
     * drivers should NEVER use this data or even care that it exists.
     */
-   void * client_state_private;
+   void *client_state_private;
 
    /**
     * Stored value for \c glXQueryContext attribute \c GLX_RENDER_TYPE.
     */
    int renderType;
-    
+
    /**
     * \name Raw server GL version
     *
@@ -421,23 +426,23 @@ struct __GLXcontextRec {
     * returned by the server, and it may not reflect what is actually
     * supported (or reported) by the client-side library.
     */
-    /*@{*/
+   /*@{ */
    int server_major;        /**< Major version number. */
    int server_minor;        /**< Minor version number. */
-    /*@}*/
+   /*@} */
 
    /**
     * Thread ID we're currently current in. Zero if none.
     */
    unsigned long thread_id;
 
-    char gl_extension_bits[ __GL_EXT_BYTES ];
+   char gl_extension_bits[__GL_EXT_BYTES];
 };
 
-#define __glXSetError(gc,code) \
-    if (!(gc)->error) {               \
-       (gc)->error = code;    \
-    }
+#define __glXSetError(gc,code)  \
+   if (!(gc)->error) {          \
+      (gc)->error = code;       \
+   }
 
 extern void __glFreeAttributeState(__GLXcontext *);
 
@@ -448,7 +453,7 @@ extern void __glFreeAttributeState(__GLXcontext *);
  * that will use the GLXRender GLX command.  In this case it is
  * \c glPolygonStipple.
  */
-#define __GLX_MAX_SMALL_RENDER_CMD_SIZE        156
+#define __GLX_MAX_SMALL_RENDER_CMD_SIZE 156
 
 /**
  * To keep the implementation fast, the code uses a "limit" pointer
@@ -460,73 +465,76 @@ extern void __glFreeAttributeState(__GLXcontext *);
  * efficacy of the buffer.  The "+32" is just to keep the code working
  * in case somebody counts wrong.
  */
-#define __GLX_BUFFER_LIMIT_SIZE        (__GLX_MAX_SMALL_RENDER_CMD_SIZE + 32)
+#define __GLX_BUFFER_LIMIT_SIZE (__GLX_MAX_SMALL_RENDER_CMD_SIZE + 32)
 
 /**
  * This implementation uses a smaller threshold for switching
  * to the RenderLarge protocol than the protcol requires so that
  * large copies don't occur.
  */
-#define __GLX_RENDER_CMD_SIZE_LIMIT    4096
+#define __GLX_RENDER_CMD_SIZE_LIMIT 4096
 
 /**
  * One of these records exists per screen of the display.  It contains
  * a pointer to the config data for that screen (if the screen supports GL).
  */
-struct __GLXscreenConfigsRec {
+struct __GLXscreenConfigsRec
+{
     /**
      * GLX extension string reported by the X-server.
      */
-    const char *serverGLXexts;
+   const char *serverGLXexts;
 
     /**
      * GLX extension string to be reported to applications.  This is the
      * set of extensions that the application can actually use.
      */
-    char *effectiveGLXexts;
+   char *effectiveGLXexts;
 
 #ifdef GLX_DIRECT_RENDERING
     /**
      * Per screen direct rendering interface functions and data.
      */
-    __DRIscreen *__driScreen;
-    const __DRIcoreExtension *core;
-    const __DRIlegacyExtension *legacy;
-    const __DRIswrastExtension *swrast;
-    const __DRIdri2Extension *dri2;
-    __glxHashTable *drawHash;
-    Display *dpy;
-    int scr, fd;
-    void *driver;
+   __DRIscreen *__driScreen;
+   const __DRIcoreExtension *core;
+   const __DRIlegacyExtension *legacy;
+   const __DRIswrastExtension *swrast;
+   const __DRIdri2Extension *dri2;
+   __glxHashTable *drawHash;
+   Display *dpy;
+   int scr, fd;
+   void *driver;
 
-    __GLXDRIscreen *driScreen;
+   __GLXDRIscreen *driScreen;
+
+   const __DRIconfig **driver_configs;
 
 #ifdef __DRI_COPY_SUB_BUFFER
-    const __DRIcopySubBufferExtension *driCopySubBuffer;
+   const __DRIcopySubBufferExtension *driCopySubBuffer;
 #endif
 
 #ifdef __DRI_SWAP_CONTROL
-    const __DRIswapControlExtension *swapControl;
+   const __DRIswapControlExtension *swapControl;
 #endif
 
 #ifdef __DRI_ALLOCATE
-    const __DRIallocateExtension *allocate;
+   const __DRIallocateExtension *allocate;
 #endif
 
 #ifdef __DRI_FRAME_TRACKING
-    const __DRIframeTrackingExtension *frameTracking;
+   const __DRIframeTrackingExtension *frameTracking;
 #endif
 
 #ifdef __DRI_MEDIA_STREAM_COUNTER
-    const __DRImediaStreamCounterExtension *msc;
+   const __DRImediaStreamCounterExtension *msc;
 #endif
 
 #ifdef __DRI_TEX_BUFFER
-    const __DRItexBufferExtension *texBuffer;
+   const __DRItexBufferExtension *texBuffer;
 #endif
 
 #ifdef __DRI2_FLUSH
-    const __DRI2flushExtension *f;
+   const __DRI2flushExtension *f;
 #endif
 
 #endif
@@ -534,7 +542,7 @@ struct __GLXscreenConfigsRec {
     /**
      * Linked list of glx visuals and  fbconfigs for this screen.
      */
-    __GLcontextModes *visuals, *configs;
+   __GLcontextModes *visuals, *configs;
 
     /**
      * Per-screen dynamic GLX extension tracking.  The \c direct_support
@@ -543,10 +551,10 @@ struct __GLXscreenConfigsRec {
      * this field.  The \c __GLXscreenConfigs structure is not used outside
      * libGL.
      */
-    /*@{*/
-    unsigned char direct_support[8];
-    GLboolean ext_list_first_time;
-    /*@}*/
+   /*@{ */
+   unsigned char direct_support[8];
+   GLboolean ext_list_first_time;
+   /*@} */
 
 };
 
@@ -554,67 +562,68 @@ struct __GLXscreenConfigsRec {
  * Per display private data.  One of these records exists for each display
  * that is using the OpenGL (GLX) extension.
  */
-struct __GLXdisplayPrivateRec {
+struct __GLXdisplayPrivateRec
+{
     /**
      * Back pointer to the display
      */
-    Display *dpy;
+   Display *dpy;
 
     /**
      * The \c majorOpcode is common to all connections to the same server.
      * It is also copied into the context structure.
      */
-    int majorOpcode;
+   int majorOpcode;
 
     /**
      * \name Server Version
      *
      * Major and minor version returned by the server during initialization.
      */
-    /*@{*/
-    int majorVersion, minorVersion;
-    /*@}*/
+   /*@{ */
+   int majorVersion, minorVersion;
+   /*@} */
 
     /**
      * \name Storage for the servers GLX vendor and versions strings.
-     * 
+     *
      * These are the same for all screens on this display. These fields will
      * be filled in on demand.
      */
-    /*@{*/
-    const char *serverGLXvendor;
-    const char *serverGLXversion;
-    /*@}*/
+   /*@{ */
+   const char *serverGLXvendor;
+   const char *serverGLXversion;
+   /*@} */
 
     /**
      * Configurations of visuals for all screens on this display.
      * Also, per screen data which now includes the server \c GLX_EXTENSION
      * string.
      */
-    __GLXscreenConfigs *screenConfigs;
+   __GLXscreenConfigs *screenConfigs;
 
 #ifdef GLX_DIRECT_RENDERING
     /**
      * Per display direct rendering interface functions and data.
      */
-    __GLXDRIdisplay *driswDisplay;
-    __GLXDRIdisplay *driDisplay;
-    __GLXDRIdisplay *dri2Display;
+   __GLXDRIdisplay *driswDisplay;
+   __GLXDRIdisplay *driDisplay;
+   __GLXDRIdisplay *dri2Display;
 #endif
 };
 
 
-extern GLubyte *__glXFlushRenderBuffer(__GLXcontext*, GLubyte*);
+extern GLubyte *__glXFlushRenderBuffer(__GLXcontext *, GLubyte *);
 
-extern void __glXSendLargeChunk(__GLXcontext *gc, GLint requestNumber, 
-                               GLint totalRequests,
-                               const GLvoid * data, GLint dataLen);
+extern void __glXSendLargeChunk(__GLXcontext * gc, GLint requestNumber,
+                                GLint totalRequests,
+                                const GLvoid * data, GLint dataLen);
 
 extern void __glXSendLargeCommand(__GLXcontext *, const GLvoid *, GLint,
-                                 const GLvoid *, GLint);
+                                  const GLvoid *, GLint);
 
 /* Initialize the GLX extension for dpy */
-extern __GLXdisplayPrivate *__glXInitialize(Display*);
+extern __GLXdisplayPrivate *__glXInitialize(Display *);
 
 extern void __glXPreferEGL(int state);
 
@@ -623,16 +632,16 @@ extern void __glXPreferEGL(int state);
 extern int __glXDebug;
 
 /* This is per-thread storage in an MT environment */
-#if defined( USE_XTHREADS ) || defined( PTHREADS )
+#if defined( PTHREADS )
 
-extern void __glXSetCurrentContext(__GLXcontext *c);
+extern void __glXSetCurrentContext(__GLXcontext * c);
 
 # if defined( GLX_USE_TLS )
 
-extern __thread void * __glX_tls_Context
-    __attribute__((tls_model("initial-exec")));
+extern __thread void *__glX_tls_Context
+   __attribute__ ((tls_model("initial-exec")));
 
-#  define __glXGetCurrentContext()     __glX_tls_Context
+#  define __glXGetCurrentContext() __glX_tls_Context
 
 # else
 
@@ -643,25 +652,21 @@ extern __GLXcontext *__glXGetCurrentContext(void);
 #else
 
 extern __GLXcontext *__glXcurrentContext;
-#define __glXGetCurrentContext()       __glXcurrentContext
-#define __glXSetCurrentContext(gc)     __glXcurrentContext = gc
+#define __glXGetCurrentContext() __glXcurrentContext
+#define __glXSetCurrentContext(gc) __glXcurrentContext = gc
 
-#endif /* defined( USE_XTHREADS ) || defined( PTHREADS ) */
+#endif /* defined( PTHREADS ) */
 
 extern void __glXSetCurrentContextNull(void);
 
-extern void __glXFreeContext(__GLXcontext*);
+extern void __glXFreeContext(__GLXcontext *);
 
 
 /*
 ** Global lock for all threads in this address space using the GLX
 ** extension
 */
-#if defined( USE_XTHREADS )
-extern xmutex_rec __glXmutex;
-#define __glXLock()    xmutex_lock(&__glXmutex)
-#define __glXUnlock()  xmutex_unlock(&__glXmutex)
-#elif defined( PTHREADS )
+#if defined( PTHREADS )
 extern pthread_mutex_t __glXmutex;
 #define __glXLock()    pthread_mutex_lock(&__glXmutex)
 #define __glXUnlock()  pthread_mutex_unlock(&__glXmutex)
@@ -673,7 +678,7 @@ extern pthread_mutex_t __glXmutex;
 /*
 ** Setup for a command.  Initialize the extension for dpy if necessary.
 */
-extern CARD8 __glXSetupForCommand(Display *dpy);
+extern CARD8 __glXSetupForCommand(Display * dpy);
 
 /************************************************************************/
 
@@ -684,9 +689,11 @@ extern CARD8 __glXSetupForCommand(Display *dpy);
 extern const GLuint __glXDefaultPixelStore[9];
 
 /* Send an image to the server using RenderLarge. */
-extern void __glXSendLargeImage(__GLXcontext *gc, GLint compsize, GLint dim,
-    GLint width, GLint height, GLint depth, GLenum format, GLenum type,
-    const GLvoid *src, GLubyte *pc, GLubyte *modes);
+extern void __glXSendLargeImage(__GLXcontext * gc, GLint compsize, GLint dim,
+                                GLint width, GLint height, GLint depth,
+                                GLenum format, GLenum type,
+                                const GLvoid * src, GLubyte * pc,
+                                GLubyte * modes);
 
 /* Return the size, in bytes, of some pixel data */
 extern GLint __glImageSize(GLint, GLint, GLint, GLenum, GLenum, GLenum);
@@ -706,23 +713,23 @@ extern GLint __glBytesPerElement(GLenum type);
 ** updated to contain the modes needed by the server to decode the
 ** sent data.
 */
-extern void __glFillImage(__GLXcontext*, GLint, GLint, GLint, GLint, GLenum,
-                         GLenum, const GLvoid*, GLubyte*, GLubyte*);
+extern void __glFillImage(__GLXcontext *, GLint, GLint, GLint, GLint, GLenum,
+                          GLenum, const GLvoid *, GLubyte *, GLubyte *);
 
 /* Copy map data with a stride into a packed buffer */
 extern void __glFillMap1f(GLint, GLint, GLint, const GLfloat *, GLubyte *);
 extern void __glFillMap1d(GLint, GLint, GLint, const GLdouble *, GLubyte *);
 extern void __glFillMap2f(GLint, GLint, GLint, GLint, GLint,
-                         const GLfloat *, GLfloat *);
+                          const GLfloat *, GLfloat *);
 extern void __glFillMap2d(GLint, GLint, GLint, GLint, GLint,
-                         const GLdouble *, GLdouble *);
+                          const GLdouble *, GLdouble *);
 
 /*
 ** Empty an image out of the reply buffer into the clients memory applying
 ** the pack modes to pack back into the clients requested format.
 */
-extern void __glEmptyImage(__GLXcontext*, GLint, GLint, GLint, GLint, GLenum,
-                          GLenum, const GLubyte *, GLvoid *);
+extern void __glEmptyImage(__GLXcontext *, GLint, GLint, GLint, GLint, GLenum,
+                           GLenum, const GLubyte *, GLvoid *);
 
 
 /*
@@ -735,7 +742,7 @@ extern void __glXFreeVertexArrayState(__GLXcontext *);
 ** Inform the Server of the major and minor numbers and of the client
 ** libraries extension string.
 */
-extern void __glXClientInfo (  Display *dpy, int opcode );
+extern void __glXClientInfo(Display * dpy, int opcode);
 
 /************************************************************************/
 
@@ -743,20 +750,22 @@ extern void __glXClientInfo (  Display *dpy, int opcode );
 ** Declarations that should be in Xlib
 */
 #ifdef __GL_USE_OUR_PROTOTYPES
-extern void _XFlush(Display*);
-extern Status _XReply(Display*, xReply*, int, Bool);
-extern void _XRead(Display*, void*, long);
-extern void _XSend(Display*, const void*, long);
+extern void _XFlush(Display *);
+extern Status _XReply(Display *, xReply *, int, Bool);
+extern void _XRead(Display *, void *, long);
+extern void _XSend(Display *, const void *, long);
 #endif
 
 
-extern void __glXInitializeVisualConfigFromTags( __GLcontextModes *config,
-    int count, const INT32 *bp, Bool tagged_only, Bool fbconfig_style_tags );
+extern void __glXInitializeVisualConfigFromTags(__GLcontextModes * config,
+                                                int count, const INT32 * bp,
+                                                Bool tagged_only,
+                                                Bool fbconfig_style_tags);
 
-extern char * __glXQueryServerString(Display* dpy, int opcode,
-                                     CARD32 screen, CARD32 name);
-extern char * __glXGetString(Display* dpy, int opcode,
-                             CARD32 screen, CARD32 name);
+extern char *__glXQueryServerString(Display * dpy, int opcode,
+                                    CARD32 screen, CARD32 name);
+extern char *__glXGetString(Display * dpy, int opcode,
+                            CARD32 screen, CARD32 name);
 
 extern char *__glXstrdup(const char *str);
 
@@ -765,15 +774,16 @@ extern const char __glXGLClientVersion[];
 extern const char __glXGLClientExtensions[];
 
 /* Get the unadjusted system time */
-extern int __glXGetUST( int64_t * ust );
+extern int __glXGetUST(int64_t * ust);
 
 extern GLboolean __glXGetMscRateOML(Display * dpy, GLXDrawable drawable,
-                                   int32_t * numerator, int32_t * denominator);
+                                    int32_t * numerator,
+                                    int32_t * denominator);
 
 #ifdef GLX_DIRECT_RENDERING
 GLboolean
-__driGetMscRateOML(__DRIdrawable *draw,
-                  int32_t *numerator, int32_t *denominator, void *private);
+__driGetMscRateOML(__DRIdrawable * draw,
+                   int32_t * numerator, int32_t * denominator, void *private);
 #endif
 
 #endif /* !__GLX_client_h__ */
index 820d8b9..7eb23db 100644 (file)
@@ -59,56 +59,59 @@ static const char __glXGLXClientVersion[] = "1.4";
 #ifdef GLX_DIRECT_RENDERING
 
 static Bool windowExistsFlag;
-static int windowExistsErrorHandler(Display *dpy, XErrorEvent *xerr)
+static int
+windowExistsErrorHandler(Display * dpy, XErrorEvent * xerr)
 {
-    if (xerr->error_code == BadWindow) {
-       windowExistsFlag = GL_FALSE;
-    }
-    return 0;
+   if (xerr->error_code == BadWindow) {
+      windowExistsFlag = GL_FALSE;
+   }
+   return 0;
 }
 
 /**
  * Find drawables in the local hash that have been destroyed on the
  * server.
- * 
+ *
  * \param dpy    Display to destroy drawables for
  * \param screen Screen number to destroy drawables for
  */
-static void GarbageCollectDRIDrawables(Display *dpy, __GLXscreenConfigs *sc)
-{
-    XID draw;
-    __GLXDRIdrawable *pdraw;
-    XWindowAttributes xwa;
-    int (*oldXErrorHandler)(Display *, XErrorEvent *);
-
-    /* Set no-op error handler so Xlib doesn't bail out if the windows
-     * has alreay been destroyed on the server. */
-    XSync(dpy, GL_FALSE);
-    oldXErrorHandler = XSetErrorHandler(windowExistsErrorHandler);
-
-    if (__glxHashFirst(sc->drawHash, &draw, (void *)&pdraw) == 1) {
-       do {
-           windowExistsFlag = GL_TRUE;
-           XGetWindowAttributes(dpy, draw, &xwa); /* dummy request */
-           if (!windowExistsFlag) {
-               /* Destroy the local drawable data, if the drawable no
-                  longer exists in the Xserver */
-               (*pdraw->destroyDrawable)(pdraw);
-                __glxHashDelete(sc->drawHash, draw);
-           }
-       } while (__glxHashNext(sc->drawHash, &draw, (void *)&pdraw) == 1);
-    }
-
-    XSync(dpy, GL_FALSE);
-    XSetErrorHandler(oldXErrorHandler);
-}
-
-extern __GLXDRIdrawable *
-GetGLXDRIDrawable(Display *dpy, GLXDrawable drawable, int * const scrn_num);
+static void
+GarbageCollectDRIDrawables(Display * dpy, __GLXscreenConfigs * sc)
+{
+   XID draw;
+   __GLXDRIdrawable *pdraw;
+   XWindowAttributes xwa;
+   int (*oldXErrorHandler) (Display *, XErrorEvent *);
+
+   /* Set no-op error handler so Xlib doesn't bail out if the windows
+    * has alreay been destroyed on the server. */
+   XSync(dpy, GL_FALSE);
+   oldXErrorHandler = XSetErrorHandler(windowExistsErrorHandler);
+
+   if (__glxHashFirst(sc->drawHash, &draw, (void *) &pdraw) == 1) {
+      do {
+         windowExistsFlag = GL_TRUE;
+         XGetWindowAttributes(dpy, draw, &xwa); /* dummy request */
+         if (!windowExistsFlag) {
+            /* Destroy the local drawable data, if the drawable no
+               longer exists in the Xserver */
+            (*pdraw->destroyDrawable) (pdraw);
+            __glxHashDelete(sc->drawHash, draw);
+         }
+      } while (__glxHashNext(sc->drawHash, &draw, (void *) &pdraw) == 1);
+   }
+
+   XSync(dpy, GL_FALSE);
+   XSetErrorHandler(oldXErrorHandler);
+}
+
+extern __GLXDRIdrawable *GetGLXDRIDrawable(Display * dpy,
+                                           GLXDrawable drawable,
+                                           int *const scrn_num);
 
 /**
  * Get the __DRIdrawable for the drawable associated with a GLXContext
- * 
+ *
  * \param dpy       The display associated with \c drawable.
  * \param drawable  GLXDrawable whose __DRIdrawable part is to be retrieved.
  * \param scrn_num  If non-NULL, the drawables screen is stored there
@@ -116,30 +119,30 @@ GetGLXDRIDrawable(Display *dpy, GLXDrawable drawable, int * const scrn_num);
  *           the drawable is not associated with a direct-rendering context.
  */
 _X_HIDDEN __GLXDRIdrawable *
-GetGLXDRIDrawable(Display *dpy, GLXDrawable drawable, int * const scrn_num)
+GetGLXDRIDrawable(Display * dpy, GLXDrawable drawable, int *const scrn_num)
 {
-    __GLXdisplayPrivate *priv = __glXInitialize(dpy);
-    __GLXDRIdrawable *pdraw;
-    const unsigned  screen_count = ScreenCount(dpy);
-    unsigned   i;
-    __GLXscreenConfigs *psc;
+   __GLXdisplayPrivate *priv = __glXInitialize(dpy);
+   __GLXDRIdrawable *pdraw;
+   const unsigned screen_count = ScreenCount(dpy);
+   unsigned i;
+   __GLXscreenConfigs *psc;
 
-    if (priv == NULL)
-       return NULL;
-    
-    for (i = 0; i < screen_count; i++) {
-       psc = &priv->screenConfigs[i];
-       if (psc->drawHash == NULL)
-           continue;
+   if (priv == NULL)
+      return NULL;
 
-       if (__glxHashLookup(psc->drawHash, drawable, (void *) &pdraw) == 0) {
-           if (scrn_num != NULL)
-               *scrn_num = i;
-           return pdraw;
-       }
-    }
+   for (i = 0; i < screen_count; i++) {
+      psc = &priv->screenConfigs[i];
+      if (psc->drawHash == NULL)
+         continue;
+
+      if (__glxHashLookup(psc->drawHash, drawable, (void *) &pdraw) == 0) {
+         if (scrn_num != NULL)
+            *scrn_num = i;
+         return pdraw;
+      }
+   }
 
-    return NULL;
+   return NULL;
 }
 
 #endif
@@ -147,57 +150,59 @@ GetGLXDRIDrawable(Display *dpy, GLXDrawable drawable, int * const scrn_num)
 
 /**
  * Get the GLX per-screen data structure associated with a GLX context.
- * 
+ *
  * \param dpy   Display for which the GLX per-screen information is to be
  *              retrieved.
  * \param scrn  Screen on \c dpy for which the GLX per-screen information is
  *              to be retrieved.
  * \returns A pointer to the GLX per-screen data if \c dpy and \c scrn
  *          specify a valid GLX screen, or NULL otherwise.
- * 
+ *
  * \todo Should this function validate that \c scrn is within the screen
  *       number range for \c dpy?
  */
 
 static __GLXscreenConfigs *
-GetGLXScreenConfigs(Display *dpy, int scrn)
+GetGLXScreenConfigs(Display * dpy, int scrn)
 {
-    __GLXdisplayPrivate * const priv = __glXInitialize(dpy);
+   __GLXdisplayPrivate *const priv = __glXInitialize(dpy);
 
-    return (priv && priv->screenConfigs != NULL) ? &priv->screenConfigs[scrn] : NULL;
+   return (priv
+           && priv->screenConfigs !=
+           NULL) ? &priv->screenConfigs[scrn] : NULL;
 }
 
 
 static int
-GetGLXPrivScreenConfig( Display *dpy, int scrn, __GLXdisplayPrivate ** ppriv,
-                       __GLXscreenConfigs ** ppsc )
+GetGLXPrivScreenConfig(Display * dpy, int scrn, __GLXdisplayPrivate ** ppriv,
+                       __GLXscreenConfigs ** ppsc)
 {
-    /* Initialize the extension, if needed .  This has the added value
-     * of initializing/allocating the display private 
-     */
-    
-    if ( dpy == NULL ) {
-       return GLX_NO_EXTENSION;
-    }
+   /* Initialize the extension, if needed .  This has the added value
+    * of initializing/allocating the display private
+    */
 
-    *ppriv = __glXInitialize(dpy);
-    if ( *ppriv == NULL ) {
-       return GLX_NO_EXTENSION;
-    }
+   if (dpy == NULL) {
+      return GLX_NO_EXTENSION;
+   }
 
-    /* Check screen number to see if its valid */
-    if ((scrn < 0) || (scrn >= ScreenCount(dpy))) {
-       return GLX_BAD_SCREEN;
-    }
+   *ppriv = __glXInitialize(dpy);
+   if (*ppriv == NULL) {
+      return GLX_NO_EXTENSION;
+   }
 
-    /* Check to see if the GL is supported on this screen */
-    *ppsc = &((*ppriv)->screenConfigs[scrn]);
-    if ( (*ppsc)->configs == NULL ) {
-       /* No support for GL on this screen regardless of visual */
-       return GLX_BAD_VISUAL;
-    }
+   /* Check screen number to see if its valid */
+   if ((scrn < 0) || (scrn >= ScreenCount(dpy))) {
+      return GLX_BAD_SCREEN;
+   }
 
-    return Success;
+   /* Check to see if the GL is supported on this screen */
+   *ppsc = &((*ppriv)->screenConfigs[scrn]);
+   if ((*ppsc)->configs == NULL) {
+      /* No support for GL on this screen regardless of visual */
+      return GLX_BAD_VISUAL;
+   }
+
+   return Success;
 }
 
 
@@ -212,27 +217,26 @@ GetGLXPrivScreenConfig( Display *dpy, int scrn, __GLXdisplayPrivate ** ppriv,
  *          is returned.
  */
 static __GLcontextModes *
-ValidateGLXFBConfig( Display * dpy, GLXFBConfig config )
-{
-    __GLXdisplayPrivate * const priv = __glXInitialize(dpy);
-    const unsigned num_screens = ScreenCount(dpy);
-    unsigned   i;
-    const __GLcontextModes * modes;
-
-
-    if ( priv != NULL ) {
-       for ( i = 0 ; i < num_screens ; i++ ) {
-           for ( modes = priv->screenConfigs[i].configs
-                 ; modes != NULL
-                 ; modes = modes->next ) {
-               if ( modes == (__GLcontextModes *) config ) {
-                   return (__GLcontextModes *) config;
-               }
-           }
-       }
-    }
+ValidateGLXFBConfig(Display * dpy, GLXFBConfig config)
+{
+   __GLXdisplayPrivate *const priv = __glXInitialize(dpy);
+   const unsigned num_screens = ScreenCount(dpy);
+   unsigned i;
+   const __GLcontextModes *modes;
+
+
+   if (priv != NULL) {
+      for (i = 0; i < num_screens; i++) {
+         for (modes = priv->screenConfigs[i].configs; modes != NULL;
+              modes = modes->next) {
+            if (modes == (__GLcontextModes *) config) {
+               return (__GLcontextModes *) config;
+            }
+         }
+      }
+   }
 
-    return NULL;
+   return NULL;
 }
 
 
@@ -241,471 +245,497 @@ ValidateGLXFBConfig( Display * dpy, GLXFBConfig config )
  * later in the function for direct-rendering contexts.  Direct-rendering
  * contexts don't need to track client state, so they don't need that memory
  * at all.
- * 
+ *
  * \todo Eliminate \c __glXInitVertexArrayState.  Replace it with a new
  * function called \c __glXAllocateClientState that allocates the memory and
  * does all the initialization (including the pixel pack / unpack).
  */
-static
-GLXContext AllocateGLXContext( Display *dpy )
-{
-     GLXContext gc;
-     int bufSize;
-     CARD8 opcode;
-    __GLXattribute *state;
-
-    if (!dpy)
-        return NULL;
-
-    opcode = __glXSetupForCommand(dpy);
-    if (!opcode) {
-       return NULL;
-    }
-
-    /* Allocate our context record */
-    gc = (GLXContext) Xmalloc(sizeof(struct __GLXcontextRec));
-    if (!gc) {
-       /* Out of memory */
-       return NULL;
-    }
-    memset(gc, 0, sizeof(struct __GLXcontextRec));
-
-    state = Xmalloc(sizeof(struct __GLXattributeRec));
-    if (state == NULL) {
-       /* Out of memory */
-       Xfree(gc);
-       return NULL;
-    }
-    gc->client_state_private = state;
-    memset(gc->client_state_private, 0, sizeof(struct __GLXattributeRec));
-    state->NoDrawArraysProtocol = (getenv("LIBGL_NO_DRAWARRAYS") != NULL);
-
-    /*
+static GLXContext
+AllocateGLXContext(Display * dpy)
+{
+   GLXContext gc;
+   int bufSize;
+   CARD8 opcode;
+   __GLXattribute *state;
+
+   if (!dpy)
+      return NULL;
+
+   opcode = __glXSetupForCommand(dpy);
+   if (!opcode) {
+      return NULL;
+   }
+
+   /* Allocate our context record */
+   gc = (GLXContext) Xmalloc(sizeof(struct __GLXcontextRec));
+   if (!gc) {
+      /* Out of memory */
+      return NULL;
+   }
+   memset(gc, 0, sizeof(struct __GLXcontextRec));
+
+   state = Xmalloc(sizeof(struct __GLXattributeRec));
+   if (state == NULL) {
+      /* Out of memory */
+      Xfree(gc);
+      return NULL;
+   }
+   gc->client_state_private = state;
+   memset(gc->client_state_private, 0, sizeof(struct __GLXattributeRec));
+   state->NoDrawArraysProtocol = (getenv("LIBGL_NO_DRAWARRAYS") != NULL);
+
+   /*
     ** Create a temporary buffer to hold GLX rendering commands.  The size
     ** of the buffer is selected so that the maximum number of GLX rendering
     ** commands can fit in a single X packet and still have room in the X
     ** packet for the GLXRenderReq header.
     */
 
-    bufSize = (XMaxRequestSize(dpy) * 4) - sz_xGLXRenderReq;
-    gc->buf = (GLubyte *) Xmalloc(bufSize);
-    if (!gc->buf) {
-       Xfree(gc->client_state_private);
-       Xfree(gc);
-       return NULL;
-    }
-    gc->bufSize = bufSize;
+   bufSize = (XMaxRequestSize(dpy) * 4) - sz_xGLXRenderReq;
+   gc->buf = (GLubyte *) Xmalloc(bufSize);
+   if (!gc->buf) {
+      Xfree(gc->client_state_private);
+      Xfree(gc);
+      return NULL;
+   }
+   gc->bufSize = bufSize;
 
-    /* Fill in the new context */
-    gc->renderMode = GL_RENDER;
+   /* Fill in the new context */
+   gc->renderMode = GL_RENDER;
 
-    state->storePack.alignment = 4;
-    state->storeUnpack.alignment = 4;
+   state->storePack.alignment = 4;
+   state->storeUnpack.alignment = 4;
 
-    gc->attributes.stackPointer = &gc->attributes.stack[0];
+   gc->attributes.stackPointer = &gc->attributes.stack[0];
 
-    /*
+   /*
     ** PERFORMANCE NOTE: A mode dependent fill image can speed things up.
     ** Other code uses the fastImageUnpack bit, but it is never set
     ** to GL_TRUE.
     */
-    gc->fastImageUnpack = GL_FALSE;
-    gc->fillImage = __glFillImage;
-    gc->pc = gc->buf;
-    gc->bufEnd = gc->buf + bufSize;
-    gc->isDirect = GL_FALSE;
-    if (__glXDebug) {
-       /*
-       ** Set limit register so that there will be one command per packet
-       */
-       gc->limit = gc->buf;
-    } else {
-       gc->limit = gc->buf + bufSize - __GLX_BUFFER_LIMIT_SIZE;
-    }
-    gc->createDpy = dpy;
-    gc->majorOpcode = opcode;
-
-    /*
+   gc->fastImageUnpack = GL_FALSE;
+   gc->fillImage = __glFillImage;
+   gc->pc = gc->buf;
+   gc->bufEnd = gc->buf + bufSize;
+   gc->isDirect = GL_FALSE;
+   if (__glXDebug) {
+      /*
+       ** Set limit register so that there will be one command per packet
+       */
+      gc->limit = gc->buf;
+   }
+   else {
+      gc->limit = gc->buf + bufSize - __GLX_BUFFER_LIMIT_SIZE;
+   }
+   gc->createDpy = dpy;
+   gc->majorOpcode = opcode;
+
+   /*
     ** Constrain the maximum drawing command size allowed to be
     ** transfered using the X_GLXRender protocol request.  First
     ** constrain by a software limit, then constrain by the protocl
     ** limit.
     */
-    if (bufSize > __GLX_RENDER_CMD_SIZE_LIMIT) {
-        bufSize = __GLX_RENDER_CMD_SIZE_LIMIT;
-    }
-    if (bufSize > __GLX_MAX_RENDER_CMD_SIZE) {
-        bufSize = __GLX_MAX_RENDER_CMD_SIZE;
-    }
-    gc->maxSmallRenderCommandSize = bufSize;
-    return gc;
+   if (bufSize > __GLX_RENDER_CMD_SIZE_LIMIT) {
+      bufSize = __GLX_RENDER_CMD_SIZE_LIMIT;
+   }
+   if (bufSize > __GLX_MAX_RENDER_CMD_SIZE) {
+      bufSize = __GLX_MAX_RENDER_CMD_SIZE;
+   }
+   gc->maxSmallRenderCommandSize = bufSize;
+   return gc;
 }
 
 
 /**
  * Create a new context.  Exactly one of \c vis and \c fbconfig should be
  * non-NULL.
- * 
+ *
  * \param use_glx_1_3  For FBConfigs, should GLX 1.3 protocol or
  *                     SGIX_fbconfig protocol be used?
  * \param renderType   For FBConfigs, what is the rendering type?
  */
 
 static GLXContext
-CreateContext(Display *dpy, XVisualInfo *vis,
-             const __GLcontextModes * const fbconfig,
-             GLXContext shareList,
-             Bool allowDirect, GLXContextID contextID,
-             Bool use_glx_1_3, int renderType)
+CreateContext(Display * dpy, XVisualInfo * vis,
+              const __GLcontextModes * const fbconfig,
+              GLXContext shareList,
+              Bool allowDirect, GLXContextID contextID,
+              Bool use_glx_1_3, int renderType)
 {
-    GLXContext gc;
+   GLXContext gc;
 #ifdef GLX_DIRECT_RENDERING
-    int screen = (fbconfig == NULL) ? vis->screen : fbconfig->screen;
-    __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen);
+   int screen = (fbconfig == NULL) ? vis->screen : fbconfig->screen;
+   __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, screen);
 #endif
 
-    if ( dpy == NULL )
-       return NULL;
+   if (dpy == NULL)
+      return NULL;
 
-    gc = AllocateGLXContext(dpy);
-    if (!gc)
-       return NULL;
+   gc = AllocateGLXContext(dpy);
+   if (!gc)
+      return NULL;
 
-    if (None == contextID) {
-       if ( (vis == NULL) && (fbconfig == NULL) )
-           return NULL;
+   if (None == contextID) {
+      if ((vis == NULL) && (fbconfig == NULL))
+         return NULL;
 
 #ifdef GLX_DIRECT_RENDERING
-       if (allowDirect && psc->driScreen) {
-           const __GLcontextModes * mode;
-
-           if (fbconfig == NULL) {
-               mode = _gl_context_modes_find_visual(psc->visuals, vis->visualid);
-               if (mode == NULL) {
-                  xError error;
-
-                  error.errorCode = BadValue;
-                  error.resourceID = vis->visualid;
-                  error.sequenceNumber = dpy->request;
-                  error.type = X_Error;
-                  error.majorCode = gc->majorOpcode;
-                  error.minorCode = X_GLXCreateContext;
-                  _XError(dpy, &error);
-                  return None;
-               }
-           }
-           else {
-               mode = fbconfig;
-           }
-
-           gc->driContext = psc->driScreen->createContext(psc, mode, gc,
-                                                          shareList,
-                                                          renderType);
-           if (gc->driContext != NULL) {
-               gc->screen = mode->screen;
-               gc->psc = psc;
-               gc->mode = mode;
-               gc->isDirect = GL_TRUE;
-           }
-       }
+      if (allowDirect && psc->driScreen) {
+         const __GLcontextModes *mode;
+
+         if (fbconfig == NULL) {
+            mode = _gl_context_modes_find_visual(psc->visuals, vis->visualid);
+            if (mode == NULL) {
+               xError error;
+
+               error.errorCode = BadValue;
+               error.resourceID = vis->visualid;
+               error.sequenceNumber = dpy->request;
+               error.type = X_Error;
+               error.majorCode = gc->majorOpcode;
+               error.minorCode = X_GLXCreateContext;
+               _XError(dpy, &error);
+               return None;
+            }
+         }
+         else {
+            mode = fbconfig;
+         }
+
+         gc->driContext = psc->driScreen->createContext(psc, mode, gc,
+                                                        shareList,
+                                                        renderType);
+         if (gc->driContext != NULL) {
+            gc->screen = mode->screen;
+            gc->psc = psc;
+            gc->mode = mode;
+            gc->isDirect = GL_TRUE;
+         }
+      }
 #endif
 
-       LockDisplay(dpy);
-       if ( fbconfig == NULL ) {
-           xGLXCreateContextReq *req;
-
-           /* Send the glXCreateContext request */
-           GetReq(GLXCreateContext,req);
-           req->reqType = gc->majorOpcode;
-           req->glxCode = X_GLXCreateContext;
-           req->context = gc->xid = XAllocID(dpy);
-           req->visual = vis->visualid;
-           req->screen = vis->screen;
-           req->shareList = shareList ? shareList->xid : None;
+      LockDisplay(dpy);
+      if (fbconfig == NULL) {
+         xGLXCreateContextReq *req;
+
+         /* Send the glXCreateContext request */
+         GetReq(GLXCreateContext, req);
+         req->reqType = gc->majorOpcode;
+         req->glxCode = X_GLXCreateContext;
+         req->context = gc->xid = XAllocID(dpy);
+         req->visual = vis->visualid;
+         req->screen = vis->screen;
+         req->shareList = shareList ? shareList->xid : None;
 #ifdef GLX_DIRECT_RENDERING
-           req->isDirect = gc->driContext != NULL;
+         req->isDirect = gc->driContext != NULL;
 #else
-           req->isDirect = 0;
+         req->isDirect = 0;
 #endif
-       }
-       else if ( use_glx_1_3 ) {
-           xGLXCreateNewContextReq *req;
-
-           /* Send the glXCreateNewContext request */
-           GetReq(GLXCreateNewContext,req);
-           req->reqType = gc->majorOpcode;
-           req->glxCode = X_GLXCreateNewContext;
-           req->context = gc->xid = XAllocID(dpy);
-           req->fbconfig = fbconfig->fbconfigID;
-           req->screen = fbconfig->screen;
-           req->renderType = renderType;
-           req->shareList = shareList ? shareList->xid : None;
+      }
+      else if (use_glx_1_3) {
+         xGLXCreateNewContextReq *req;
+
+         /* Send the glXCreateNewContext request */
+         GetReq(GLXCreateNewContext, req);
+         req->reqType = gc->majorOpcode;
+         req->glxCode = X_GLXCreateNewContext;
+         req->context = gc->xid = XAllocID(dpy);
+         req->fbconfig = fbconfig->fbconfigID;
+         req->screen = fbconfig->screen;
+         req->renderType = renderType;
+         req->shareList = shareList ? shareList->xid : None;
 #ifdef GLX_DIRECT_RENDERING
-           req->isDirect = gc->driContext != NULL;
+         req->isDirect = gc->driContext != NULL;
 #else
-           req->isDirect = 0;
+         req->isDirect = 0;
 #endif
-       }
-       else {
-           xGLXVendorPrivateWithReplyReq *vpreq;
-           xGLXCreateContextWithConfigSGIXReq *req;
-
-           /* Send the glXCreateNewContext request */
-           GetReqExtra(GLXVendorPrivateWithReply,
-                       sz_xGLXCreateContextWithConfigSGIXReq-sz_xGLXVendorPrivateWithReplyReq,vpreq);
-           req = (xGLXCreateContextWithConfigSGIXReq *)vpreq;
-           req->reqType = gc->majorOpcode;
-           req->glxCode = X_GLXVendorPrivateWithReply;
-           req->vendorCode = X_GLXvop_CreateContextWithConfigSGIX;
-           req->context = gc->xid = XAllocID(dpy);
-           req->fbconfig = fbconfig->fbconfigID;
-           req->screen = fbconfig->screen;
-           req->renderType = renderType;
-           req->shareList = shareList ? shareList->xid : None;
+      }
+      else {
+         xGLXVendorPrivateWithReplyReq *vpreq;
+         xGLXCreateContextWithConfigSGIXReq *req;
+
+         /* Send the glXCreateNewContext request */
+         GetReqExtra(GLXVendorPrivateWithReply,
+                     sz_xGLXCreateContextWithConfigSGIXReq -
+                     sz_xGLXVendorPrivateWithReplyReq, vpreq);
+         req = (xGLXCreateContextWithConfigSGIXReq *) vpreq;
+         req->reqType = gc->majorOpcode;
+         req->glxCode = X_GLXVendorPrivateWithReply;
+         req->vendorCode = X_GLXvop_CreateContextWithConfigSGIX;
+         req->context = gc->xid = XAllocID(dpy);
+         req->fbconfig = fbconfig->fbconfigID;
+         req->screen = fbconfig->screen;
+         req->renderType = renderType;
+         req->shareList = shareList ? shareList->xid : None;
 #ifdef GLX_DIRECT_RENDERING
-           req->isDirect = gc->driContext != NULL;
+         req->isDirect = gc->driContext != NULL;
 #else
-           req->isDirect = 0;
+         req->isDirect = 0;
 #endif
-       }
+      }
 
-       UnlockDisplay(dpy);
-       SyncHandle();
-       gc->imported = GL_FALSE;
-    }
-    else {
-       gc->xid = contextID;
-       gc->imported = GL_TRUE;
-    }
+      UnlockDisplay(dpy);
+      SyncHandle();
+      gc->imported = GL_FALSE;
+   }
+   else {
+      gc->xid = contextID;
+      gc->imported = GL_TRUE;
+   }
 
-    return gc;
+   return gc;
 }
 
-PUBLIC GLXContext glXCreateContext(Display *dpy, XVisualInfo *vis,
-                                  GLXContext shareList, Bool allowDirect)
+PUBLIC GLXContext
+glXCreateContext(Display * dpy, XVisualInfo * vis,
+                 GLXContext shareList, Bool allowDirect)
 {
    return CreateContext(dpy, vis, NULL, shareList, allowDirect, None,
-                       False, 0);
+                        False, 0);
 }
 
-_X_HIDDEN void __glXFreeContext(__GLXcontext *gc)
+_X_HIDDEN void
+__glXFreeContext(__GLXcontext * gc)
 {
-    if (gc->vendor) XFree((char *) gc->vendor);
-    if (gc->renderer) XFree((char *) gc->renderer);
-    if (gc->version) XFree((char *) gc->version);
-    if (gc->extensions) XFree((char *) gc->extensions);
-    __glFreeAttributeState(gc);
-    XFree((char *) gc->buf);
-    Xfree((char *) gc->client_state_private);
-    XFree((char *) gc);
-    
+   if (gc->vendor)
+      XFree((char *) gc->vendor);
+   if (gc->renderer)
+      XFree((char *) gc->renderer);
+   if (gc->version)
+      XFree((char *) gc->version);
+   if (gc->extensions)
+      XFree((char *) gc->extensions);
+   __glFreeAttributeState(gc);
+   XFree((char *) gc->buf);
+   Xfree((char *) gc->client_state_private);
+   XFree((char *) gc);
+
 }
 
 /*
 ** Destroy the named context
 */
-static void 
-DestroyContext(Display *dpy, GLXContext gc)
+static void
+DestroyContext(Display * dpy, GLXContext gc)
 {
-    xGLXDestroyContextReq *req;
-    GLXContextID xid;
-    CARD8 opcode;
-    GLboolean imported;
+   xGLXDestroyContextReq *req;
+   GLXContextID xid;
+   CARD8 opcode;
+   GLboolean imported;
 
-    opcode = __glXSetupForCommand(dpy);
-    if (!opcode || !gc) {
-       return;
-    }
+   opcode = __glXSetupForCommand(dpy);
+   if (!opcode || !gc) {
+      return;
+   }
 
-    __glXLock();
-    xid = gc->xid;
-    imported = gc->imported;
-    gc->xid = None;
+   __glXLock();
+   xid = gc->xid;
+   imported = gc->imported;
+   gc->xid = None;
 
 #ifdef GLX_DIRECT_RENDERING
-    /* Destroy the direct rendering context */
-    if (gc->driContext) {
-       (*gc->driContext->destroyContext)(gc->driContext, gc->psc, dpy);
-       gc->driContext = NULL;
-       GarbageCollectDRIDrawables(dpy, gc->psc);
-    }
+   /* Destroy the direct rendering context */
+   if (gc->driContext) {
+      (*gc->driContext->destroyContext) (gc->driContext, gc->psc, dpy);
+      gc->driContext = NULL;
+      GarbageCollectDRIDrawables(dpy, gc->psc);
+   }
 #endif
 
-    __glXFreeVertexArrayState(gc);
+   __glXFreeVertexArrayState(gc);
 
-    if (gc->currentDpy) {
-       /* Have to free later cuz it's in use now */
-       __glXUnlock();
-    } else {
-       /* Destroy the handle if not current to anybody */
-       __glXUnlock();
-       __glXFreeContext(gc);
-    }
+   if (gc->currentDpy) {
+      /* Have to free later cuz it's in use now */
+      __glXUnlock();
+   }
+   else {
+      /* Destroy the handle if not current to anybody */
+      __glXUnlock();
+      __glXFreeContext(gc);
+   }
 
-    if (!imported) {
-       /* 
-       ** This dpy also created the server side part of the context.
-       ** Send the glXDestroyContext request.
-       */
-       LockDisplay(dpy);
-       GetReq(GLXDestroyContext,req);
-       req->reqType = opcode;
-       req->glxCode = X_GLXDestroyContext;
-       req->context = xid;
-       UnlockDisplay(dpy);
-       SyncHandle();
-    }
+   if (!imported) {
+      /*
+       ** This dpy also created the server side part of the context.
+       ** Send the glXDestroyContext request.
+       */
+      LockDisplay(dpy);
+      GetReq(GLXDestroyContext, req);
+      req->reqType = opcode;
+      req->glxCode = X_GLXDestroyContext;
+      req->context = xid;
+      UnlockDisplay(dpy);
+      SyncHandle();
+   }
 }
 
-PUBLIC void glXDestroyContext(Display *dpy, GLXContext gc)
+PUBLIC void
+glXDestroyContext(Display * dpy, GLXContext gc)
 {
-    DestroyContext(dpy, gc);
+   DestroyContext(dpy, gc);
 }
 
 /*
 ** Return the major and minor version #s for the GLX extension
 */
-PUBLIC Bool glXQueryVersion(Display *dpy, int *major, int *minor)
+PUBLIC Bool
+glXQueryVersion(Display * dpy, int *major, int *minor)
 {
-    __GLXdisplayPrivate *priv;
+   __GLXdisplayPrivate *priv;
 
-    /* Init the extension.  This fetches the major and minor version. */
-    priv = __glXInitialize(dpy);
-    if (!priv) return GL_FALSE;
+   /* Init the extension.  This fetches the major and minor version. */
+   priv = __glXInitialize(dpy);
+   if (!priv)
+      return GL_FALSE;
 
-    if (major) *major = priv->majorVersion;
-    if (minor) *minor = priv->minorVersion;
-    return GL_TRUE;
+   if (major)
+      *major = priv->majorVersion;
+   if (minor)
+      *minor = priv->minorVersion;
+   return GL_TRUE;
 }
 
 /*
 ** Query the existance of the GLX extension
 */
-PUBLIC Bool glXQueryExtension(Display *dpy, int *errorBase, int *eventBase)
-{
-    int major_op, erb, evb;
-    Bool rv;
-
-    rv = XQueryExtension(dpy, GLX_EXTENSION_NAME, &major_op, &evb, &erb);
-    if (rv) {
-       if (errorBase) *errorBase = erb;
-       if (eventBase) *eventBase = evb;
-    }
-    return rv;
+PUBLIC Bool
+glXQueryExtension(Display * dpy, int *errorBase, int *eventBase)
+{
+   int major_op, erb, evb;
+   Bool rv;
+
+   rv = XQueryExtension(dpy, GLX_EXTENSION_NAME, &major_op, &evb, &erb);
+   if (rv) {
+      if (errorBase)
+         *errorBase = erb;
+      if (eventBase)
+         *eventBase = evb;
+   }
+   return rv;
 }
 
 /*
 ** Put a barrier in the token stream that forces the GL to finish its
 ** work before X can proceed.
 */
-PUBLIC void glXWaitGL(void)
+PUBLIC void
+glXWaitGL(void)
 {
-    xGLXWaitGLReq *req;
-    GLXContext gc = __glXGetCurrentContext();
-    Display *dpy = gc->currentDpy;
+   xGLXWaitGLReq *req;
+   GLXContext gc = __glXGetCurrentContext();
+   Display *dpy = gc->currentDpy;
 
-    if (!dpy) return;
+   if (!dpy)
+      return;
 
-    /* Flush any pending commands out */
-    __glXFlushRenderBuffer(gc, gc->pc);
+   /* Flush any pending commands out */
+   __glXFlushRenderBuffer(gc, gc->pc);
 
 #ifdef GLX_DIRECT_RENDERING
-    if (gc->driContext) {
-       int screen;
-       __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, gc->currentDrawable, &screen);
-
-       if ( pdraw != NULL ) {
-           __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen);
-           glFlush();
-           if (psc->driScreen->waitGL != NULL)
-               (*psc->driScreen->waitGL)(pdraw);
-       }
-       return;
-    }
+   if (gc->driContext) {
+      int screen;
+      __GLXDRIdrawable *pdraw =
+         GetGLXDRIDrawable(dpy, gc->currentDrawable, &screen);
+
+      if (pdraw != NULL) {
+         __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, screen);
+         glFlush();
+         if (psc->driScreen->waitGL != NULL)
+            (*psc->driScreen->waitGL) (pdraw);
+      }
+      return;
+   }
 #endif
 
-    /* Send the glXWaitGL request */
-    LockDisplay(dpy);
-    GetReq(GLXWaitGL,req);
-    req->reqType = gc->majorOpcode;
-    req->glxCode = X_GLXWaitGL;
-    req->contextTag = gc->currentContextTag;
-    UnlockDisplay(dpy);
-    SyncHandle();
+   /* Send the glXWaitGL request */
+   LockDisplay(dpy);
+   GetReq(GLXWaitGL, req);
+   req->reqType = gc->majorOpcode;
+   req->glxCode = X_GLXWaitGL;
+   req->contextTag = gc->currentContextTag;
+   UnlockDisplay(dpy);
+   SyncHandle();
 }
 
 /*
 ** Put a barrier in the token stream that forces X to finish its
 ** work before GL can proceed.
 */
-PUBLIC void glXWaitX(void)
+PUBLIC void
+glXWaitX(void)
 {
-    xGLXWaitXReq *req;
-    GLXContext gc = __glXGetCurrentContext();
-    Display *dpy = gc->currentDpy;
+   xGLXWaitXReq *req;
+   GLXContext gc = __glXGetCurrentContext();
+   Display *dpy = gc->currentDpy;
 
-    if (!dpy) return;
+   if (!dpy)
+      return;
 
-    /* Flush any pending commands out */
-    __glXFlushRenderBuffer(gc, gc->pc);
+   /* Flush any pending commands out */
+   __glXFlushRenderBuffer(gc, gc->pc);
 
 #ifdef GLX_DIRECT_RENDERING
-    if (gc->driContext) {
-       int screen;
-       __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, gc->currentDrawable, &screen);
-
-       if ( pdraw != NULL ) {
-           __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen);
-           if (psc->driScreen->waitX != NULL)
-               (*psc->driScreen->waitX)(pdraw);
-       } else
-           XSync(dpy, False);
-       return;
-    }
+   if (gc->driContext) {
+      int screen;
+      __GLXDRIdrawable *pdraw =
+         GetGLXDRIDrawable(dpy, gc->currentDrawable, &screen);
+
+      if (pdraw != NULL) {
+         __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, screen);
+         if (psc->driScreen->waitX != NULL)
+            (*psc->driScreen->waitX) (pdraw);
+      }
+      else
+         XSync(dpy, False);
+      return;
+   }
 #endif
 
-    /*
+   /*
     ** Send the glXWaitX request.
     */
-    LockDisplay(dpy);
-    GetReq(GLXWaitX,req);
-    req->reqType = gc->majorOpcode;
-    req->glxCode = X_GLXWaitX;
-    req->contextTag = gc->currentContextTag;
-    UnlockDisplay(dpy);
-    SyncHandle();
+   LockDisplay(dpy);
+   GetReq(GLXWaitX, req);
+   req->reqType = gc->majorOpcode;
+   req->glxCode = X_GLXWaitX;
+   req->contextTag = gc->currentContextTag;
+   UnlockDisplay(dpy);
+   SyncHandle();
 }
 
-PUBLIC void glXUseXFont(Font font, int first, int count, int listBase)
+PUBLIC void
+glXUseXFont(Font font, int first, int count, int listBase)
 {
-    xGLXUseXFontReq *req;
-    GLXContext gc = __glXGetCurrentContext();
-    Display *dpy = gc->currentDpy;
+   xGLXUseXFontReq *req;
+   GLXContext gc = __glXGetCurrentContext();
+   Display *dpy = gc->currentDpy;
 
-    if (!dpy) return;
+   if (!dpy)
+      return;
 
-    /* Flush any pending commands out */
-    (void) __glXFlushRenderBuffer(gc, gc->pc);
+   /* Flush any pending commands out */
+   (void) __glXFlushRenderBuffer(gc, gc->pc);
 
 #ifdef GLX_DIRECT_RENDERING
-    if (gc->driContext) {
+   if (gc->driContext) {
       DRI_glXUseXFont(font, first, count, listBase);
       return;
-    }
+   }
 #endif
 
-    /* Send the glXUseFont request */
-    LockDisplay(dpy);
-    GetReq(GLXUseXFont,req);
-    req->reqType = gc->majorOpcode;
-    req->glxCode = X_GLXUseXFont;
-    req->contextTag = gc->currentContextTag;
-    req->font = font;
-    req->first = first;
-    req->count = count;
-    req->listBase = listBase;
-    UnlockDisplay(dpy);
-    SyncHandle();
+   /* Send the glXUseFont request */
+   LockDisplay(dpy);
+   GetReq(GLXUseXFont, req);
+   req->reqType = gc->majorOpcode;
+   req->glxCode = X_GLXUseXFont;
+   req->contextTag = gc->currentContextTag;
+   req->font = font;
+   req->first = first;
+   req->count = count;
+   req->listBase = listBase;
+   UnlockDisplay(dpy);
+   SyncHandle();
 }
 
 /************************************************************************/
@@ -714,46 +744,48 @@ PUBLIC void glXUseXFont(Font font, int first, int count, int listBase)
 ** Copy the source context to the destination context using the
 ** attribute "mask".
 */
-PUBLIC void glXCopyContext(Display *dpy, GLXContext source,
-                          GLXContext dest, unsigned long mask)
+PUBLIC void
+glXCopyContext(Display * dpy, GLXContext source,
+               GLXContext dest, unsigned long mask)
 {
-    xGLXCopyContextReq *req;
-    GLXContext gc = __glXGetCurrentContext();
-    GLXContextTag tag;
-    CARD8 opcode;
+   xGLXCopyContextReq *req;
+   GLXContext gc = __glXGetCurrentContext();
+   GLXContextTag tag;
+   CARD8 opcode;
 
-    opcode = __glXSetupForCommand(dpy);
-    if (!opcode) {
-       return;
-    }
+   opcode = __glXSetupForCommand(dpy);
+   if (!opcode) {
+      return;
+   }
 
 #ifdef GLX_DIRECT_RENDERING
-    if (gc->driContext) {
-       /* NOT_DONE: This does not work yet */
-    }
+   if (gc->driContext) {
+      /* NOT_DONE: This does not work yet */
+   }
 #endif
 
-    /*
+   /*
     ** If the source is the current context, send its tag so that the context
     ** can be flushed before the copy.
     */
-    if (source == gc && dpy == gc->currentDpy) {
-       tag = gc->currentContextTag;
-    } else {
-       tag = 0;
-    }
-
-    /* Send the glXCopyContext request */
-    LockDisplay(dpy);
-    GetReq(GLXCopyContext,req);
-    req->reqType = opcode;
-    req->glxCode = X_GLXCopyContext;
-    req->source = source ? source->xid : None;
-    req->dest = dest ? dest->xid : None;
-    req->mask = mask;
-    req->contextTag = tag;
-    UnlockDisplay(dpy);
-    SyncHandle();
+   if (source == gc && dpy == gc->currentDpy) {
+      tag = gc->currentContextTag;
+   }
+   else {
+      tag = 0;
+   }
+
+   /* Send the glXCopyContext request */
+   LockDisplay(dpy);
+   GetReq(GLXCopyContext, req);
+   req->reqType = opcode;
+   req->glxCode = X_GLXCopyContext;
+   req->source = source ? source->xid : None;
+   req->dest = dest ? dest->xid : None;
+   req->mask = mask;
+   req->contextTag = tag;
+   UnlockDisplay(dpy);
+   SyncHandle();
 }
 
 
@@ -765,42 +797,43 @@ PUBLIC void glXCopyContext(Display *dpy, GLXContext source,
  *
  * \returns \c GL_TRUE if the context is direct rendering or not.
  */
-static Bool __glXIsDirect(Display *dpy, GLXContextID contextID)
+static Bool
+__glXIsDirect(Display * dpy, GLXContextID contextID)
 {
 #if !defined(USE_XCB)
-    xGLXIsDirectReq *req;
-    xGLXIsDirectReply reply;
+   xGLXIsDirectReq *req;
+   xGLXIsDirectReply reply;
 #endif
-    CARD8 opcode;
+   CARD8 opcode;
 
-    opcode = __glXSetupForCommand(dpy);
-    if (!opcode) {
-       return GL_FALSE;
-    }
+   opcode = __glXSetupForCommand(dpy);
+   if (!opcode) {
+      return GL_FALSE;
+   }
 
 #ifdef USE_XCB
-   xcb_connection_tc = XGetXCBConnection(dpy);
-   xcb_glx_is_direct_reply_t* reply =
-      xcb_glx_is_direct_reply(c,
-                              xcb_glx_is_direct(c, contextID),
-                              NULL);
+   xcb_connection_t *c = XGetXCBConnection(dpy);
+   xcb_glx_is_direct_reply_t *reply = xcb_glx_is_direct_reply(c,
+                                                              xcb_glx_is_direct
+                                                              (c, contextID),
+                                                              NULL);
 
    const Bool is_direct = reply->is_direct ? True : False;
    free(reply);
 
    return is_direct;
 #else
-    /* Send the glXIsDirect request */
-    LockDisplay(dpy);
-    GetReq(GLXIsDirect,req);
-    req->reqType = opcode;
-    req->glxCode = X_GLXIsDirect;
-    req->context = contextID;
-    _XReply(dpy, (xReply*) &reply, 0, False);
-    UnlockDisplay(dpy);
-    SyncHandle();
-
-    return reply.isDirect;
+   /* Send the glXIsDirect request */
+   LockDisplay(dpy);
+   GetReq(GLXIsDirect, req);
+   req->reqType = opcode;
+   req->glxCode = X_GLXIsDirect;
+   req->context = contextID;
+   _XReply(dpy, (xReply *) & reply, 0, False);
+   UnlockDisplay(dpy);
+   SyncHandle();
+
+   return reply.isDirect;
 #endif /* USE_XCB */
 }
 
@@ -810,134 +843,140 @@ static Bool __glXIsDirect(Display *dpy, GLXContextID contextID)
  * \c GLX_DIRECT_RENDERING is not defined?  Do we really need to bother with
  * the GLX protocol here at all?
  */
-PUBLIC Bool glXIsDirect(Display *dpy, GLXContext gc)
+PUBLIC Bool
+glXIsDirect(Display * dpy, GLXContext gc)
 {
-    if (!gc) {
-       return GL_FALSE;
+   if (!gc) {
+      return GL_FALSE;
 #ifdef GLX_DIRECT_RENDERING
-    } else if (gc->driContext) {
-       return GL_TRUE;
+   }
+   else if (gc->driContext) {
+      return GL_TRUE;
 #endif
-    }
-    return __glXIsDirect(dpy, gc->xid);
+   }
+   return __glXIsDirect(dpy, gc->xid);
 }
 
-PUBLIC GLXPixmap glXCreateGLXPixmap(Display *dpy, XVisualInfo *vis, 
-                                   Pixmap pixmap)
+PUBLIC GLXPixmap
+glXCreateGLXPixmap(Display * dpy, XVisualInfo * vis, Pixmap pixmap)
 {
-    xGLXCreateGLXPixmapReq *req;
-    GLXPixmap xid;
-    CARD8 opcode;
+   xGLXCreateGLXPixmapReq *req;
+   GLXPixmap xid;
+   CARD8 opcode;
 
-    opcode = __glXSetupForCommand(dpy);
-    if (!opcode) {
-       return None;
-    }
+   opcode = __glXSetupForCommand(dpy);
+   if (!opcode) {
+      return None;
+   }
 
-    /* Send the glXCreateGLXPixmap request */
-    LockDisplay(dpy);
-    GetReq(GLXCreateGLXPixmap,req);
-    req->reqType = opcode;
-    req->glxCode = X_GLXCreateGLXPixmap;
-    req->screen = vis->screen;
-    req->visual = vis->visualid;
-    req->pixmap = pixmap;
-    req->glxpixmap = xid = XAllocID(dpy);
-    UnlockDisplay(dpy);
-    SyncHandle();
-    return xid;
+   /* Send the glXCreateGLXPixmap request */
+   LockDisplay(dpy);
+   GetReq(GLXCreateGLXPixmap, req);
+   req->reqType = opcode;
+   req->glxCode = X_GLXCreateGLXPixmap;
+   req->screen = vis->screen;
+   req->visual = vis->visualid;
+   req->pixmap = pixmap;
+   req->glxpixmap = xid = XAllocID(dpy);
+   UnlockDisplay(dpy);
+   SyncHandle();
+   return xid;
 }
 
 /*
 ** Destroy the named pixmap
 */
-PUBLIC void glXDestroyGLXPixmap(Display *dpy, GLXPixmap glxpixmap)
-{
-    xGLXDestroyGLXPixmapReq *req;
-    CARD8 opcode;
-
-    opcode = __glXSetupForCommand(dpy);
-    if (!opcode) {
-       return;
-    }
-    
-    /* Send the glXDestroyGLXPixmap request */
-    LockDisplay(dpy);
-    GetReq(GLXDestroyGLXPixmap,req);
-    req->reqType = opcode;
-    req->glxCode = X_GLXDestroyGLXPixmap;
-    req->glxpixmap = glxpixmap;
-    UnlockDisplay(dpy);
-    SyncHandle();
+PUBLIC void
+glXDestroyGLXPixmap(Display * dpy, GLXPixmap glxpixmap)
+{
+   xGLXDestroyGLXPixmapReq *req;
+   CARD8 opcode;
+
+   opcode = __glXSetupForCommand(dpy);
+   if (!opcode) {
+      return;
+   }
+
+   /* Send the glXDestroyGLXPixmap request */
+   LockDisplay(dpy);
+   GetReq(GLXDestroyGLXPixmap, req);
+   req->reqType = opcode;
+   req->glxCode = X_GLXDestroyGLXPixmap;
+   req->glxpixmap = glxpixmap;
+   UnlockDisplay(dpy);
+   SyncHandle();
 
 #ifdef GLX_DIRECT_RENDERING
-    {
-       int screen;
-       __GLXdisplayPrivate *const priv = __glXInitialize(dpy);
-       __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, glxpixmap, &screen);
-       __GLXscreenConfigs *psc = &priv->screenConfigs[screen];
-
-       if (pdraw != NULL) {
-           (*pdraw->destroyDrawable) (pdraw);
-           __glxHashDelete(psc->drawHash, glxpixmap);
-       }
-    }
+   {
+      int screen;
+      __GLXdisplayPrivate *const priv = __glXInitialize(dpy);
+      __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, glxpixmap, &screen);
+      __GLXscreenConfigs *psc = &priv->screenConfigs[screen];
+
+      if (pdraw != NULL) {
+         (*pdraw->destroyDrawable) (pdraw);
+         __glxHashDelete(psc->drawHash, glxpixmap);
+      }
+   }
 #endif
 }
 
-PUBLIC void glXSwapBuffers(Display *dpy, GLXDrawable drawable)
+PUBLIC void
+glXSwapBuffers(Display * dpy, GLXDrawable drawable)
 {
-    GLXContext gc;
-    GLXContextTag tag;
-    CARD8 opcode;
+   GLXContext gc;
+   GLXContextTag tag;
+   CARD8 opcode;
 #ifdef USE_XCB
-    xcb_connection_t *c;
+   xcb_connection_t *c;
 #else
-    xGLXSwapBuffersReq *req;
+   xGLXSwapBuffersReq *req;
 #endif
 
 #ifdef GLX_DIRECT_RENDERING
-    __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, NULL);
+   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, NULL);
 
-    if (pdraw != NULL) {
-       glFlush();          
-       (*pdraw->psc->driScreen->swapBuffers)(pdraw);
-       return;
-    }
+   if (pdraw != NULL) {
+      glFlush();
+      (*pdraw->psc->driScreen->swapBuffers) (pdraw);
+      return;
+   }
 #endif
 
-    opcode = __glXSetupForCommand(dpy);
-    if (!opcode) {
-       return;
-    }
+   opcode = __glXSetupForCommand(dpy);
+   if (!opcode) {
+      return;
+   }
 
-    /*
+   /*
     ** The calling thread may or may not have a current context.  If it
     ** does, send the context tag so the server can do a flush.
     */
-    gc = __glXGetCurrentContext();
-    if ((gc != NULL) && (dpy == gc->currentDpy) && 
-       ((drawable == gc->currentDrawable) || (drawable == gc->currentReadable)) ) {
-       tag = gc->currentContextTag;
-    } else {
-       tag = 0;
-    }
+   gc = __glXGetCurrentContext();
+   if ((gc != NULL) && (dpy == gc->currentDpy) &&
+       ((drawable == gc->currentDrawable)
+        || (drawable == gc->currentReadable))) {
+      tag = gc->currentContextTag;
+   }
+   else {
+      tag = 0;
+   }
 
 #ifdef USE_XCB
-    c = XGetXCBConnection(dpy);
-    xcb_glx_swap_buffers(c, tag, drawable);
-    xcb_flush(c);
+   c = XGetXCBConnection(dpy);
+   xcb_glx_swap_buffers(c, tag, drawable);
+   xcb_flush(c);
 #else
-    /* Send the glXSwapBuffers request */
-    LockDisplay(dpy);
-    GetReq(GLXSwapBuffers,req);
-    req->reqType = opcode;
-    req->glxCode = X_GLXSwapBuffers;
-    req->drawable = drawable;
-    req->contextTag = tag;
-    UnlockDisplay(dpy);
-    SyncHandle();
-    XFlush(dpy);
+   /* Send the glXSwapBuffers request */
+   LockDisplay(dpy);
+   GetReq(GLXSwapBuffers, req);
+   req->reqType = opcode;
+   req->glxCode = X_GLXSwapBuffers;
+   req->drawable = drawable;
+   req->contextTag = tag;
+   UnlockDisplay(dpy);
+   SyncHandle();
+   XFlush(dpy);
 #endif /* USE_XCB */
 }
 
@@ -946,94 +985,96 @@ PUBLIC void glXSwapBuffers(Display *dpy, GLXDrawable drawable)
 ** Return configuration information for the given display, screen and
 ** visual combination.
 */
-PUBLIC int glXGetConfig(Display *dpy, XVisualInfo *vis, int attribute,
-                       int *value_return)
-{
-    __GLXdisplayPrivate *priv;
-    __GLXscreenConfigs *psc;
-    __GLcontextModes *modes;
-    int   status;
-
-    status = GetGLXPrivScreenConfig( dpy, vis->screen, & priv, & psc );
-    if ( status == Success ) {
-       modes = _gl_context_modes_find_visual(psc->visuals, vis->visualid);
-
-       /* Lookup attribute after first finding a match on the visual */
-       if ( modes != NULL ) {
-           return _gl_get_context_mode_data( modes, attribute, value_return );
-       }
-       
-       status = GLX_BAD_VISUAL;
-    }
-
-    /*
+PUBLIC int
+glXGetConfig(Display * dpy, XVisualInfo * vis, int attribute,
+             int *value_return)
+{
+   __GLXdisplayPrivate *priv;
+   __GLXscreenConfigs *psc;
+   __GLcontextModes *modes;
+   int status;
+
+   status = GetGLXPrivScreenConfig(dpy, vis->screen, &priv, &psc);
+   if (status == Success) {
+      modes = _gl_context_modes_find_visual(psc->visuals, vis->visualid);
+
+      /* Lookup attribute after first finding a match on the visual */
+      if (modes != NULL) {
+         return _gl_get_context_mode_data(modes, attribute, value_return);
+      }
+
+      status = GLX_BAD_VISUAL;
+   }
+
+   /*
     ** If we can't find the config for this visual, this visual is not
     ** supported by the OpenGL implementation on the server.
     */
-    if ( (status == GLX_BAD_VISUAL) && (attribute == GLX_USE_GL) ) {
-       *value_return = GL_FALSE;
-       status = Success;
-    }
+   if ((status == GLX_BAD_VISUAL) && (attribute == GLX_USE_GL)) {
+      *value_return = GL_FALSE;
+      status = Success;
+   }
 
-    return status;
+   return status;
 }
 
 /************************************************************************/
 
 static void
-init_fbconfig_for_chooser( __GLcontextModes * config,
-                          GLboolean fbconfig_style_tags )
-{
-    memset( config, 0, sizeof( __GLcontextModes ) );
-    config->visualID = (XID) GLX_DONT_CARE;
-    config->visualType = GLX_DONT_CARE;
-
-    /* glXChooseFBConfig specifies different defaults for these two than
-     * glXChooseVisual.
-     */
-    if ( fbconfig_style_tags ) {
-       config->rgbMode = GL_TRUE;
-       config->doubleBufferMode = GLX_DONT_CARE;
-    }
-
-    config->visualRating = GLX_DONT_CARE;
-    config->transparentPixel = GLX_NONE;
-    config->transparentRed = GLX_DONT_CARE;
-    config->transparentGreen = GLX_DONT_CARE;
-    config->transparentBlue = GLX_DONT_CARE;
-    config->transparentAlpha = GLX_DONT_CARE;
-    config->transparentIndex = GLX_DONT_CARE;
-
-    config->drawableType = GLX_WINDOW_BIT;
-    config->renderType = (config->rgbMode) ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT;
-    config->xRenderable = GLX_DONT_CARE;
-    config->fbconfigID = (GLXFBConfigID)(GLX_DONT_CARE);
-
-    config->swapMethod = GLX_DONT_CARE;
-}
-
-#define MATCH_DONT_CARE( param ) \
-       do { \
-           if ( (a-> param != GLX_DONT_CARE) \
-                && (a-> param != b-> param) ) { \
-               return False; \
-           } \
-       } while ( 0 )
-
-#define MATCH_MINIMUM( param ) \
-       do { \
-           if ( (a-> param != GLX_DONT_CARE) \
-                && (a-> param > b-> param) ) { \
-               return False; \
-           } \
-       } while ( 0 )
-
-#define MATCH_EXACT( param ) \
-       do { \
-           if ( a-> param != b-> param) { \
-               return False; \
-           } \
-       } while ( 0 )
+init_fbconfig_for_chooser(__GLcontextModes * config,
+                          GLboolean fbconfig_style_tags)
+{
+   memset(config, 0, sizeof(__GLcontextModes));
+   config->visualID = (XID) GLX_DONT_CARE;
+   config->visualType = GLX_DONT_CARE;
+
+   /* glXChooseFBConfig specifies different defaults for these two than
+    * glXChooseVisual.
+    */
+   if (fbconfig_style_tags) {
+      config->rgbMode = GL_TRUE;
+      config->doubleBufferMode = GLX_DONT_CARE;
+   }
+
+   config->visualRating = GLX_DONT_CARE;
+   config->transparentPixel = GLX_NONE;
+   config->transparentRed = GLX_DONT_CARE;
+   config->transparentGreen = GLX_DONT_CARE;
+   config->transparentBlue = GLX_DONT_CARE;
+   config->transparentAlpha = GLX_DONT_CARE;
+   config->transparentIndex = GLX_DONT_CARE;
+
+   config->drawableType = GLX_WINDOW_BIT;
+   config->renderType =
+      (config->rgbMode) ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT;
+   config->xRenderable = GLX_DONT_CARE;
+   config->fbconfigID = (GLXFBConfigID) (GLX_DONT_CARE);
+
+   config->swapMethod = GLX_DONT_CARE;
+}
+
+#define MATCH_DONT_CARE( param )        \
+  do {                                  \
+    if ( (a-> param != GLX_DONT_CARE)   \
+         && (a-> param != b-> param) ) {        \
+      return False;                             \
+    }                                           \
+  } while ( 0 )
+
+#define MATCH_MINIMUM( param )                  \
+  do {                                          \
+    if ( (a-> param != GLX_DONT_CARE)           \
+         && (a-> param > b-> param) ) {         \
+      return False;                             \
+    }                                           \
+  } while ( 0 )
+
+#define MATCH_EXACT( param )                    \
+  do {                                          \
+    if ( a-> param != b-> param) {              \
+      return False;                             \
+    }                                           \
+  } while ( 0 )
 
 /**
  * Determine if two GLXFBConfigs are compatible.
@@ -1042,80 +1083,80 @@ init_fbconfig_for_chooser( __GLcontextModes * config,
  * \param b  Server specified config to test against \c a.
  */
 static Bool
-fbconfigs_compatible( const __GLcontextModes * const a,
-                     const __GLcontextModes * const b )
-{
-    MATCH_DONT_CARE( doubleBufferMode );
-    MATCH_DONT_CARE( visualType );
-    MATCH_DONT_CARE( visualRating );
-    MATCH_DONT_CARE( xRenderable );
-    MATCH_DONT_CARE( fbconfigID );
-    MATCH_DONT_CARE( swapMethod );
-
-    MATCH_MINIMUM( rgbBits );
-    MATCH_MINIMUM( numAuxBuffers );
-    MATCH_MINIMUM( redBits );
-    MATCH_MINIMUM( greenBits );
-    MATCH_MINIMUM( blueBits );
-    MATCH_MINIMUM( alphaBits );
-    MATCH_MINIMUM( depthBits );
-    MATCH_MINIMUM( stencilBits );
-    MATCH_MINIMUM( accumRedBits );
-    MATCH_MINIMUM( accumGreenBits );
-    MATCH_MINIMUM( accumBlueBits );
-    MATCH_MINIMUM( accumAlphaBits );
-    MATCH_MINIMUM( sampleBuffers );
-    MATCH_MINIMUM( maxPbufferWidth );
-    MATCH_MINIMUM( maxPbufferHeight );
-    MATCH_MINIMUM( maxPbufferPixels );
-    MATCH_MINIMUM( samples );
-
-    MATCH_DONT_CARE( stereoMode );
-    MATCH_EXACT( level );
-
-    if ( ((a->drawableType & b->drawableType) == 0)
-        || ((a->renderType & b->renderType) == 0) ) {
-       return False;
-    }
-
-
-    /* There is a bug in a few of the XFree86 DDX drivers.  They contain
-     * visuals with a "transparent type" of 0 when they really mean GLX_NONE.
-     * Technically speaking, it is a bug in the DDX driver, but there is
-     * enough of an installed base to work around the problem here.  In any
-     * case, 0 is not a valid value of the transparent type, so we'll treat 0 
-     * from the app as GLX_DONT_CARE. We'll consider GLX_NONE from the app and
-     * 0 from the server to be a match to maintain backward compatibility with
-     * the (broken) drivers.
-     */
-
-    if ( a->transparentPixel != GLX_DONT_CARE
-         && a->transparentPixel != 0 ) {
-        if ( a->transparentPixel == GLX_NONE ) {
-            if ( b->transparentPixel != GLX_NONE && b->transparentPixel != 0 )
-                return False;
-        } else {
-            MATCH_EXACT( transparentPixel );
-        }
-
-       switch ( a->transparentPixel ) {
-         case GLX_TRANSPARENT_RGB:
-           MATCH_DONT_CARE( transparentRed );
-           MATCH_DONT_CARE( transparentGreen );
-           MATCH_DONT_CARE( transparentBlue );
-           MATCH_DONT_CARE( transparentAlpha );
-           break;
-
-         case GLX_TRANSPARENT_INDEX:
-           MATCH_DONT_CARE( transparentIndex );
-           break;
-
-         default:
-           break;
-       }
-    }
-
-    return True;
+fbconfigs_compatible(const __GLcontextModes * const a,
+                     const __GLcontextModes * const b)
+{
+   MATCH_DONT_CARE(doubleBufferMode);
+   MATCH_DONT_CARE(visualType);
+   MATCH_DONT_CARE(visualRating);
+   MATCH_DONT_CARE(xRenderable);
+   MATCH_DONT_CARE(fbconfigID);
+   MATCH_DONT_CARE(swapMethod);
+
+   MATCH_MINIMUM(rgbBits);
+   MATCH_MINIMUM(numAuxBuffers);
+   MATCH_MINIMUM(redBits);
+   MATCH_MINIMUM(greenBits);
+   MATCH_MINIMUM(blueBits);
+   MATCH_MINIMUM(alphaBits);
+   MATCH_MINIMUM(depthBits);
+   MATCH_MINIMUM(stencilBits);
+   MATCH_MINIMUM(accumRedBits);
+   MATCH_MINIMUM(accumGreenBits);
+   MATCH_MINIMUM(accumBlueBits);
+   MATCH_MINIMUM(accumAlphaBits);
+   MATCH_MINIMUM(sampleBuffers);
+   MATCH_MINIMUM(maxPbufferWidth);
+   MATCH_MINIMUM(maxPbufferHeight);
+   MATCH_MINIMUM(maxPbufferPixels);
+   MATCH_MINIMUM(samples);
+
+   MATCH_DONT_CARE(stereoMode);
+   MATCH_EXACT(level);
+
+   if (((a->drawableType & b->drawableType) == 0)
+       || ((a->renderType & b->renderType) == 0)) {
+      return False;
+   }
+
+
+   /* There is a bug in a few of the XFree86 DDX drivers.  They contain
+    * visuals with a "transparent type" of 0 when they really mean GLX_NONE.
+    * Technically speaking, it is a bug in the DDX driver, but there is
+    * enough of an installed base to work around the problem here.  In any
+    * case, 0 is not a valid value of the transparent type, so we'll treat 0
+    * from the app as GLX_DONT_CARE. We'll consider GLX_NONE from the app and
+    * 0 from the server to be a match to maintain backward compatibility with
+    * the (broken) drivers.
+    */
+
+   if (a->transparentPixel != GLX_DONT_CARE && a->transparentPixel != 0) {
+      if (a->transparentPixel == GLX_NONE) {
+         if (b->transparentPixel != GLX_NONE && b->transparentPixel != 0)
+            return False;
+      }
+      else {
+         MATCH_EXACT(transparentPixel);
+      }
+
+      switch (a->transparentPixel) {
+      case GLX_TRANSPARENT_RGB:
+         MATCH_DONT_CARE(transparentRed);
+         MATCH_DONT_CARE(transparentGreen);
+         MATCH_DONT_CARE(transparentBlue);
+         MATCH_DONT_CARE(transparentAlpha);
+         break;
+
+      case GLX_TRANSPARENT_INDEX:
+         MATCH_DONT_CARE(transparentIndex);
+         break;
+
+      default:
+         break;
+      }
+   }
+
+   return True;
 }
 
 
@@ -1125,39 +1166,39 @@ fbconfigs_compatible( const __GLcontextModes * const a,
  * Well, that's really hard to do with the code as-is.  This behavior is
  * closer to correct, but still not technically right.
  */
-#define PREFER_LARGER_OR_ZERO(comp) \
-    do { \
-       if ( ((*a)-> comp) != ((*b)-> comp) ) { \
-           if ( ((*a)-> comp) == 0 ) { \
-               return -1; \
-           } \
-           else if ( ((*b)-> comp) == 0 ) { \
-               return 1; \
-           } \
-           else { \
-               return ((*b)-> comp) - ((*a)-> comp) ; \
-           } \
-       } \
-    } while( 0 )
-
-#define PREFER_LARGER(comp) \
-    do { \
-       if ( ((*a)-> comp) != ((*b)-> comp) ) { \
-           return ((*b)-> comp) - ((*a)-> comp) ; \
-       } \
-    } while( 0 )
-
-#define PREFER_SMALLER(comp) \
-    do { \
-       if ( ((*a)-> comp) != ((*b)-> comp) ) { \
-           return ((*a)-> comp) - ((*b)-> comp) ; \
-       } \
-    } while( 0 )
+#define PREFER_LARGER_OR_ZERO(comp)             \
+  do {                                          \
+    if ( ((*a)-> comp) != ((*b)-> comp) ) {     \
+      if ( ((*a)-> comp) == 0 ) {               \
+        return -1;                              \
+      }                                         \
+      else if ( ((*b)-> comp) == 0 ) {          \
+        return 1;                               \
+      }                                         \
+      else {                                    \
+        return ((*b)-> comp) - ((*a)-> comp) ;  \
+      }                                         \
+    }                                           \
+  } while( 0 )
+
+#define PREFER_LARGER(comp)                     \
+  do {                                          \
+    if ( ((*a)-> comp) != ((*b)-> comp) ) {     \
+      return ((*b)-> comp) - ((*a)-> comp) ;    \
+    }                                           \
+  } while( 0 )
+
+#define PREFER_SMALLER(comp)                    \
+  do {                                          \
+    if ( ((*a)-> comp) != ((*b)-> comp) ) {     \
+      return ((*a)-> comp) - ((*b)-> comp) ;    \
+    }                                           \
+  } while( 0 )
 
 /**
  * Compare two GLXFBConfigs.  This function is intended to be used as the
  * compare function passed in to qsort.
- * 
+ *
  * \returns If \c a is a "better" config, according to the specification of
  *          SGIX_fbconfig, a number less than zero is returned.  If \c b is
  *          better, then a number greater than zero is return.  If both are
@@ -1165,66 +1206,66 @@ fbconfigs_compatible( const __GLcontextModes * const a,
  * \sa qsort, glXChooseVisual, glXChooseFBConfig, glXChooseFBConfigSGIX
  */
 static int
-fbconfig_compare( const __GLcontextModes * const * const a,
-                 const __GLcontextModes * const * const b )
+fbconfig_compare(const __GLcontextModes * const *const a,
+                 const __GLcontextModes * const *const b)
 {
-    /* The order of these comparisons must NOT change.  It is defined by
-     * the GLX 1.3 spec and ARB_multisample.
-     */
+   /* The order of these comparisons must NOT change.  It is defined by
+    * the GLX 1.3 spec and ARB_multisample.
+    */
 
-    PREFER_SMALLER( visualSelectGroup );
+   PREFER_SMALLER(visualSelectGroup);
 
-    /* The sort order for the visualRating is GLX_NONE, GLX_SLOW, and
-     * GLX_NON_CONFORMANT_CONFIG.  It just so happens that this is the
-     * numerical sort order of the enums (0x8000, 0x8001, and 0x800D).
-     */
-    PREFER_SMALLER( visualRating );
+   /* The sort order for the visualRating is GLX_NONE, GLX_SLOW, and
+    * GLX_NON_CONFORMANT_CONFIG.  It just so happens that this is the
+    * numerical sort order of the enums (0x8000, 0x8001, and 0x800D).
+    */
+   PREFER_SMALLER(visualRating);
 
-    /* This isn't quite right.  It is supposed to compare the sum of the
-     * components the user specifically set minimums for.
-     */
-    PREFER_LARGER_OR_ZERO( redBits );
-    PREFER_LARGER_OR_ZERO( greenBits );
-    PREFER_LARGER_OR_ZERO( blueBits );
-    PREFER_LARGER_OR_ZERO( alphaBits );
+   /* This isn't quite right.  It is supposed to compare the sum of the
+    * components the user specifically set minimums for.
+    */
+   PREFER_LARGER_OR_ZERO(redBits);
+   PREFER_LARGER_OR_ZERO(greenBits);
+   PREFER_LARGER_OR_ZERO(blueBits);
+   PREFER_LARGER_OR_ZERO(alphaBits);
 
-    PREFER_SMALLER( rgbBits );
+   PREFER_SMALLER(rgbBits);
 
-    if ( ((*a)->doubleBufferMode != (*b)->doubleBufferMode) ) {
-       /* Prefer single-buffer.
-        */
-       return ( !(*a)->doubleBufferMode ) ? -1 : 1;
-    }
+   if (((*a)->doubleBufferMode != (*b)->doubleBufferMode)) {
+      /* Prefer single-buffer.
+       */
+      return (!(*a)->doubleBufferMode) ? -1 : 1;
+   }
 
-    PREFER_SMALLER( numAuxBuffers );
+   PREFER_SMALLER(numAuxBuffers);
 
-    PREFER_LARGER_OR_ZERO( depthBits );
-    PREFER_SMALLER( stencilBits );
+   PREFER_LARGER_OR_ZERO(depthBits);
+   PREFER_SMALLER(stencilBits);
 
-    /* This isn't quite right.  It is supposed to compare the sum of the
-     * components the user specifically set minimums for.
-     */
-    PREFER_LARGER_OR_ZERO( accumRedBits );
-    PREFER_LARGER_OR_ZERO( accumGreenBits );
-    PREFER_LARGER_OR_ZERO( accumBlueBits );
-    PREFER_LARGER_OR_ZERO( accumAlphaBits );
+   /* This isn't quite right.  It is supposed to compare the sum of the
+    * components the user specifically set minimums for.
+    */
+   PREFER_LARGER_OR_ZERO(accumRedBits);
+   PREFER_LARGER_OR_ZERO(accumGreenBits);
+   PREFER_LARGER_OR_ZERO(accumBlueBits);
+   PREFER_LARGER_OR_ZERO(accumAlphaBits);
 
-    PREFER_SMALLER( visualType );
+   PREFER_SMALLER(visualType);
 
-    /* None of the multisample specs say where this comparison should happen,
-     * so I put it near the end.
-     */
-    PREFER_SMALLER( sampleBuffers );
-    PREFER_SMALLER( samples );
+   /* None of the multisample specs say where this comparison should happen,
+    * so I put it near the end.
+    */
+   PREFER_SMALLER(sampleBuffers);
+   PREFER_SMALLER(samples);
 
-    /* None of the pbuffer or fbconfig specs say that this comparison needs
-     * to happen at all, but it seems like it should.
-     */
-    PREFER_LARGER( maxPbufferWidth );
-    PREFER_LARGER( maxPbufferHeight );
-    PREFER_LARGER( maxPbufferPixels );
+   /* None of the pbuffer or fbconfig specs say that this comparison needs
+    * to happen at all, but it seems like it should.
+    */
+   PREFER_LARGER(maxPbufferWidth);
+   PREFER_LARGER(maxPbufferHeight);
+   PREFER_LARGER(maxPbufferPixels);
 
-    return 0;
+   return 0;
 }
 
 
@@ -1232,7 +1273,7 @@ fbconfig_compare( const __GLcontextModes * const * const a,
  * Selects and sorts a subset of the supplied configs based on the attributes.
  * This function forms to basis of \c glXChooseVisual, \c glXChooseFBConfig,
  * and \c glXChooseFBConfigSGIX.
- * 
+ *
  * \param configs   Array of pointers to possible configs.  The elements of
  *                  this array that do not meet the criteria will be set to
  *                  NULL.  The remaining elements will be sorted according to
@@ -1247,53 +1288,52 @@ fbconfig_compare( const __GLcontextModes * const * const a,
  *                             \c glXChooseVisual style or
  *                             \c glXChooseFBConfig style.
  * \returns The number of valid elements left in \c configs.
- * 
+ *
  * \sa glXChooseVisual, glXChooseFBConfig, glXChooseFBConfigSGIX
  */
 static int
-choose_visual( __GLcontextModes ** configs, int num_configs,
-              const int *attribList, GLboolean fbconfig_style_tags )
-{
-    __GLcontextModes    test_config;
-    int   base;
-    int   i;
-
-    /* This is a fairly direct implementation of the selection method
-     * described by GLX_SGIX_fbconfig.  Start by culling out all the
-     * configs that are not compatible with the selected parameter
-     * list.
-     */
-
-    init_fbconfig_for_chooser( & test_config, fbconfig_style_tags );
-    __glXInitializeVisualConfigFromTags( & test_config, 512,
-                                        (const INT32 *) attribList,
-                                        GL_TRUE, fbconfig_style_tags );
-
-    base = 0;
-    for ( i = 0 ; i < num_configs ; i++ ) {
-       if ( fbconfigs_compatible( & test_config, configs[i] ) ) {
-           configs[ base ] = configs[ i ];
-           base++;
-       }
-    }
-
-    if ( base == 0 ) {
-       return 0;
-    }
-    if ( base < num_configs ) {
-       (void) memset( & configs[ base ], 0, 
-                      sizeof( void * ) * (num_configs - base) );
-    }
-
-    /* After the incompatible configs are removed, the resulting
-     * list is sorted according to the rules set out in the various
-     * specifications.
-     */
-    
-    qsort( configs, base, sizeof( __GLcontextModes * ),
-          (int (*)(const void*, const void*)) fbconfig_compare );
-    return base;
+choose_visual(__GLcontextModes ** configs, int num_configs,
+              const int *attribList, GLboolean fbconfig_style_tags)
+{
+   __GLcontextModes test_config;
+   int base;
+   int i;
+
+   /* This is a fairly direct implementation of the selection method
+    * described by GLX_SGIX_fbconfig.  Start by culling out all the
+    * configs that are not compatible with the selected parameter
+    * list.
+    */
+
+   init_fbconfig_for_chooser(&test_config, fbconfig_style_tags);
+   __glXInitializeVisualConfigFromTags(&test_config, 512,
+                                       (const INT32 *) attribList,
+                                       GL_TRUE, fbconfig_style_tags);
+
+   base = 0;
+   for (i = 0; i < num_configs; i++) {
+      if (fbconfigs_compatible(&test_config, configs[i])) {
+         configs[base] = configs[i];
+         base++;
+      }
+   }
+
+   if (base == 0) {
+      return 0;
+   }
+
+   if (base < num_configs) {
+      (void) memset(&configs[base], 0, sizeof(void *) * (num_configs - base));
+   }
+
+   /* After the incompatible configs are removed, the resulting
+    * list is sorted according to the rules set out in the various
+    * specifications.
+    */
+
+   qsort(configs, base, sizeof(__GLcontextModes *),
+         (int (*)(const void *, const void *)) fbconfig_compare);
+   return base;
 }
 
 
@@ -1303,33 +1343,34 @@ choose_visual( __GLcontextModes ** configs, int num_configs,
 ** Return the visual that best matches the template.  Return None if no
 ** visual matches the template.
 */
-PUBLIC XVisualInfo *glXChooseVisual(Display *dpy, int screen, int *attribList)
+PUBLIC XVisualInfo *
+glXChooseVisual(Display * dpy, int screen, int *attribList)
 {
-    XVisualInfo *visualList = NULL;
-    __GLXdisplayPrivate *priv;
-    __GLXscreenConfigs *psc;
-    __GLcontextModes  test_config;
-    __GLcontextModes *modes;
-    const __GLcontextModes *best_config = NULL;
+   XVisualInfo *visualList = NULL;
+   __GLXdisplayPrivate *priv;
+   __GLXscreenConfigs *psc;
+   __GLcontextModes test_config;
+   __GLcontextModes *modes;
+   const __GLcontextModes *best_config = NULL;
 
-    /*
+   /*
     ** Get a list of all visuals, return if list is empty
     */
-    if ( GetGLXPrivScreenConfig( dpy, screen, & priv, & psc ) != Success ) {
-       return None;
-    }
-   
+   if (GetGLXPrivScreenConfig(dpy, screen, &priv, &psc) != Success) {
+      return None;
+   }
 
-    /*
+
+   /*
     ** Build a template from the defaults and the attribute list
     ** Free visual list and return if an unexpected token is encountered
     */
-    init_fbconfig_for_chooser( & test_config, GL_FALSE );
-    __glXInitializeVisualConfigFromTags( & test_config, 512, 
-                                        (const INT32 *) attribList,
-                                        GL_TRUE, GL_FALSE );
+   init_fbconfig_for_chooser(&test_config, GL_FALSE);
+   __glXInitializeVisualConfigFromTags(&test_config, 512,
+                                       (const INT32 *) attribList,
+                                       GL_TRUE, GL_FALSE);
 
-    /*
+   /*
     ** Eliminate visuals that don't meet minimum requirements
     ** Compute a score for those that do
     ** Remember which visual, if any, got the highest score
@@ -1337,136 +1378,141 @@ PUBLIC XVisualInfo *glXChooseVisual(Display *dpy, int screen, int *attribList)
     ** Otherwise, create an XVisualInfo list with just the selected X visual
     ** and return this.
     */
-    for ( modes = psc->visuals ; modes != NULL ; modes = modes->next ) {
-       if ( fbconfigs_compatible( & test_config, modes )
-            && ((best_config == NULL)
-                || (fbconfig_compare( (const __GLcontextModes * const * const)&modes, &best_config ) < 0)) ) {
-           XVisualInfo visualTemplate;
-           XVisualInfo *newList;
-           int  i;
-
-           visualTemplate.screen = screen;
-           visualTemplate.visualid = modes->visualID;
-           newList = XGetVisualInfo( dpy, VisualScreenMask|VisualIDMask,
-                                     &visualTemplate, &i );
-
-           if (newList) {
-               Xfree(visualList);
-               visualList = newList;
-               best_config = modes;
-           }
-       }
-    }
+   for (modes = psc->visuals; modes != NULL; modes = modes->next) {
+      if (fbconfigs_compatible(&test_config, modes)
+          && ((best_config == NULL)
+              ||
+              (fbconfig_compare
+               ((const __GLcontextModes * const *const) &modes,
+                &best_config) < 0))) {
+         XVisualInfo visualTemplate;
+         XVisualInfo *newList;
+         int i;
+
+         visualTemplate.screen = screen;
+         visualTemplate.visualid = modes->visualID;
+         newList = XGetVisualInfo(dpy, VisualScreenMask | VisualIDMask,
+                                  &visualTemplate, &i);
+
+         if (newList) {
+            Xfree(visualList);
+            visualList = newList;
+            best_config = modes;
+         }
+      }
+   }
 
-    return visualList;
+   return visualList;
 }
 
 
-PUBLIC const char *glXQueryExtensionsString( Display *dpy, int screen )
+PUBLIC const char *
+glXQueryExtensionsString(Display * dpy, int screen)
 {
-    __GLXscreenConfigs *psc;
-    __GLXdisplayPrivate *priv;
+   __GLXscreenConfigs *psc;
+   __GLXdisplayPrivate *priv;
 
-    if ( GetGLXPrivScreenConfig( dpy, screen, & priv, & psc ) != Success ) {
-       return NULL;
-    }
+   if (GetGLXPrivScreenConfig(dpy, screen, &priv, &psc) != Success) {
+      return NULL;
+   }
 
-    if (!psc->effectiveGLXexts) {
-        if (!psc->serverGLXexts) {
-           psc->serverGLXexts =
-              __glXQueryServerString(dpy, priv->majorOpcode, screen, GLX_EXTENSIONS);
-       }
+   if (!psc->effectiveGLXexts) {
+      if (!psc->serverGLXexts) {
+         psc->serverGLXexts =
+            __glXQueryServerString(dpy, priv->majorOpcode, screen,
+                                   GLX_EXTENSIONS);
+      }
 
-       __glXCalculateUsableExtensions(psc,
+      __glXCalculateUsableExtensions(psc,
 #ifdef GLX_DIRECT_RENDERING
-                                      (psc->driScreen != NULL),
+                                     (psc->driScreen != NULL),
 #else
-                                      GL_FALSE,
+                                     GL_FALSE,
 #endif
-                                      priv->minorVersion);
-    }
+                                     priv->minorVersion);
+   }
 
-    return psc->effectiveGLXexts;
+   return psc->effectiveGLXexts;
 }
 
-PUBLIC const char *glXGetClientString( Display *dpy, int name )
+PUBLIC const char *
+glXGetClientString(Display * dpy, int name)
 {
-    switch(name) {
-       case GLX_VENDOR:
-           return (__glXGLXClientVendorName);
-       case GLX_VERSION:
-           return (__glXGLXClientVersion);
-       case GLX_EXTENSIONS:
-           return (__glXGetClientExtensions());
-       default:
-           return NULL;
-    }
+   switch (name) {
+   case GLX_VENDOR:
+      return (__glXGLXClientVendorName);
+   case GLX_VERSION:
+      return (__glXGLXClientVersion);
+   case GLX_EXTENSIONS:
+      return (__glXGetClientExtensions());
+   default:
+      return NULL;
+   }
 }
 
-PUBLIC const char *glXQueryServerString( Display *dpy, int screen, int name )
+PUBLIC const char *
+glXQueryServerString(Display * dpy, int screen, int name)
 {
-    __GLXscreenConfigs *psc;
-    __GLXdisplayPrivate *priv;
-    const char ** str;
+   __GLXscreenConfigs *psc;
+   __GLXdisplayPrivate *priv;
+   const char **str;
 
 
-    if ( GetGLXPrivScreenConfig( dpy, screen, & priv, & psc ) != Success ) {
-       return NULL;
-    }
+   if (GetGLXPrivScreenConfig(dpy, screen, &priv, &psc) != Success) {
+      return NULL;
+   }
 
-    switch(name) {
-       case GLX_VENDOR:
-           str = & priv->serverGLXvendor;
-           break;
-       case GLX_VERSION:
-           str = & priv->serverGLXversion;
-           break;
-       case GLX_EXTENSIONS:
-           str = & psc->serverGLXexts;
-           break;
-       default:
-           return NULL;
-    }
+   switch (name) {
+   case GLX_VENDOR:
+      str = &priv->serverGLXvendor;
+      break;
+   case GLX_VERSION:
+      str = &priv->serverGLXversion;
+      break;
+   case GLX_EXTENSIONS:
+      str = &psc->serverGLXexts;
+      break;
+   default:
+      return NULL;
+   }
 
-    if ( *str == NULL ) {
-       *str = __glXQueryServerString(dpy, priv->majorOpcode, screen, name);
-    }
-    
-    return *str;
+   if (*str == NULL) {
+      *str = __glXQueryServerString(dpy, priv->majorOpcode, screen, name);
+   }
+
+   return *str;
 }
 
-void __glXClientInfo (  Display *dpy, int opcode  )
+void
+__glXClientInfo(Display * dpy, int opcode)
 {
-    char * ext_str = __glXGetClientGLExtensionString();
-    int size = strlen( ext_str ) + 1;
+   char *ext_str = __glXGetClientGLExtensionString();
+   int size = strlen(ext_str) + 1;
 
 #ifdef USE_XCB
    xcb_connection_t *c = XGetXCBConnection(dpy);
    xcb_glx_client_info(c,
-                       GLX_MAJOR_VERSION,
-                       GLX_MINOR_VERSION,
-                       size,
-                       (const uint8_t *)ext_str);
+                       GLX_MAJOR_VERSION, GLX_MINOR_VERSION, size, ext_str);
 #else
-    xGLXClientInfoReq *req;
-
-    /* Send the glXClientInfo request */
-    LockDisplay(dpy);
-    GetReq(GLXClientInfo,req);
-    req->reqType = opcode;
-    req->glxCode = X_GLXClientInfo;
-    req->major = GLX_MAJOR_VERSION;
-    req->minor = GLX_MINOR_VERSION;
-
-    req->length += (size + 3) >> 2;
-    req->numbytes = size;
-    Data(dpy, ext_str, size);
-
-    UnlockDisplay(dpy);
-    SyncHandle();
+   xGLXClientInfoReq *req;
+
+   /* Send the glXClientInfo request */
+   LockDisplay(dpy);
+   GetReq(GLXClientInfo, req);
+   req->reqType = opcode;
+   req->glxCode = X_GLXClientInfo;
+   req->major = GLX_MAJOR_VERSION;
+   req->minor = GLX_MINOR_VERSION;
+
+   req->length += (size + 3) >> 2;
+   req->numbytes = size;
+   Data(dpy, ext_str, size);
+
+   UnlockDisplay(dpy);
+   SyncHandle();
 #endif /* USE_XCB */
 
-    Xfree( ext_str );
+   Xfree(ext_str);
 }
 
 
@@ -1474,194 +1520,201 @@ void __glXClientInfo (  Display *dpy, int opcode  )
 ** EXT_import_context
 */
 
-PUBLIC Display *glXGetCurrentDisplay(void)
+PUBLIC Display *
+glXGetCurrentDisplay(void)
 {
-    GLXContext gc = __glXGetCurrentContext();
-    if (NULL == gc) return NULL;
-    return gc->currentDpy;
+   GLXContext gc = __glXGetCurrentContext();
+   if (NULL == gc)
+      return NULL;
+   return gc->currentDpy;
 }
 
-PUBLIC GLX_ALIAS(Display *, glXGetCurrentDisplayEXT, (void), (),
-         glXGetCurrentDisplay)
+PUBLIC
+GLX_ALIAS(Display *, glXGetCurrentDisplayEXT, (void), (),
+          glXGetCurrentDisplay)
 
 /**
  * Used internally by libGL to send \c xGLXQueryContextinfoExtReq requests
  * to the X-server.
- * 
+ *
  * \param dpy  Display where \c ctx was created.
  * \param ctx  Context to query.
  * \returns  \c Success on success.  \c GLX_BAD_CONTEXT if \c ctx is invalid,
  *           or zero if the request failed due to internal problems (i.e.,
  *           unable to allocate temporary memory, etc.)
- * 
+ *
  * \note
  * This function dynamically determines whether to use the EXT_import_context
  * version of the protocol or the GLX 1.3 version of the protocol.
  */
-static int __glXQueryContextInfo(Display *dpy, GLXContext ctx)
-{
-    __GLXdisplayPrivate *priv = __glXInitialize(dpy);
-    xGLXQueryContextReply reply;
-    CARD8 opcode;
-    GLuint numValues;
-    int retval;
-
-    if (ctx == NULL) {
-       return GLX_BAD_CONTEXT;
-    }
-    opcode = __glXSetupForCommand(dpy);
-    if (!opcode) {
-       return 0;
-    }
-
-    /* Send the glXQueryContextInfoEXT request */
-    LockDisplay(dpy);
-
-    if ( (priv->majorVersion > 1) || (priv->minorVersion >= 3) ) {
-       xGLXQueryContextReq *req;
-
-       GetReq(GLXQueryContext, req);
-
-       req->reqType = opcode;
-       req->glxCode = X_GLXQueryContext;
-       req->context = (unsigned int)(ctx->xid);
-    }
-    else {
-       xGLXVendorPrivateReq *vpreq;
-       xGLXQueryContextInfoEXTReq *req;
-
-       GetReqExtra( GLXVendorPrivate,
-                    sz_xGLXQueryContextInfoEXTReq - sz_xGLXVendorPrivateReq,
-                    vpreq );
-       req = (xGLXQueryContextInfoEXTReq *)vpreq;
-       req->reqType = opcode;
-       req->glxCode = X_GLXVendorPrivateWithReply;
-       req->vendorCode = X_GLXvop_QueryContextInfoEXT;
-       req->context = (unsigned int)(ctx->xid);
-    }
-
-    _XReply(dpy, (xReply*) &reply, 0, False);
-
-    numValues = reply.n;
-    if (numValues == 0)
-       retval = Success;
-    else if (numValues > __GLX_MAX_CONTEXT_PROPS)
-       retval = 0;
-    else
-    {
-       int *propList, *pProp;
-       int nPropListBytes;
-       int i;
-
-       nPropListBytes = numValues << 3;
-       propList = (int *) Xmalloc(nPropListBytes);
-       if (NULL == propList) {
-           retval = 0;
-       } else {
-           _XRead(dpy, (char *)propList, nPropListBytes);
-           pProp = propList;
-           for (i=0; i < numValues; i++) {
-               switch (*pProp++) {
-               case GLX_SHARE_CONTEXT_EXT:
-                   ctx->share_xid = *pProp++;
-                   break;
-               case GLX_VISUAL_ID_EXT:
-                   ctx->mode =
-                       _gl_context_modes_find_visual(ctx->psc->visuals, *pProp++);
-                   break;
-               case GLX_SCREEN:
-                   ctx->screen = *pProp++;
-                   break;
-               case GLX_FBCONFIG_ID:
-                   ctx->mode =
-                       _gl_context_modes_find_fbconfig(ctx->psc->configs, *pProp++);
-                   break;
-               case GLX_RENDER_TYPE:
-                   ctx->renderType = *pProp++;
-                   break;
-               default:
-                   pProp++;
-                   continue;
-               }
-           }
-           Xfree((char *)propList);
-           retval = Success;
-       }
-    }
-    UnlockDisplay(dpy);
-    SyncHandle();
-    return retval;
+     static int __glXQueryContextInfo(Display * dpy, GLXContext ctx)
+{
+   __GLXdisplayPrivate *priv = __glXInitialize(dpy);
+   xGLXQueryContextReply reply;
+   CARD8 opcode;
+   GLuint numValues;
+   int retval;
+
+   if (ctx == NULL) {
+      return GLX_BAD_CONTEXT;
+   }
+   opcode = __glXSetupForCommand(dpy);
+   if (!opcode) {
+      return 0;
+   }
+
+   /* Send the glXQueryContextInfoEXT request */
+   LockDisplay(dpy);
+
+   if ((priv->majorVersion > 1) || (priv->minorVersion >= 3)) {
+      xGLXQueryContextReq *req;
+
+      GetReq(GLXQueryContext, req);
+
+      req->reqType = opcode;
+      req->glxCode = X_GLXQueryContext;
+      req->context = (unsigned int) (ctx->xid);
+   }
+   else {
+      xGLXVendorPrivateReq *vpreq;
+      xGLXQueryContextInfoEXTReq *req;
+
+      GetReqExtra(GLXVendorPrivate,
+                  sz_xGLXQueryContextInfoEXTReq - sz_xGLXVendorPrivateReq,
+                  vpreq);
+      req = (xGLXQueryContextInfoEXTReq *) vpreq;
+      req->reqType = opcode;
+      req->glxCode = X_GLXVendorPrivateWithReply;
+      req->vendorCode = X_GLXvop_QueryContextInfoEXT;
+      req->context = (unsigned int) (ctx->xid);
+   }
+
+   _XReply(dpy, (xReply *) & reply, 0, False);
+
+   numValues = reply.n;
+   if (numValues == 0)
+      retval = Success;
+   else if (numValues > __GLX_MAX_CONTEXT_PROPS)
+      retval = 0;
+   else {
+      int *propList, *pProp;
+      int nPropListBytes;
+      int i;
+
+      nPropListBytes = numValues << 3;
+      propList = (int *) Xmalloc(nPropListBytes);
+      if (NULL == propList) {
+         retval = 0;
+      }
+      else {
+         _XRead(dpy, (char *) propList, nPropListBytes);
+         pProp = propList;
+         for (i = 0; i < numValues; i++) {
+            switch (*pProp++) {
+            case GLX_SHARE_CONTEXT_EXT:
+               ctx->share_xid = *pProp++;
+               break;
+            case GLX_VISUAL_ID_EXT:
+               ctx->mode =
+                  _gl_context_modes_find_visual(ctx->psc->visuals, *pProp++);
+               break;
+            case GLX_SCREEN:
+               ctx->screen = *pProp++;
+               break;
+            case GLX_FBCONFIG_ID:
+               ctx->mode =
+                  _gl_context_modes_find_fbconfig(ctx->psc->configs,
+                                                  *pProp++);
+               break;
+            case GLX_RENDER_TYPE:
+               ctx->renderType = *pProp++;
+               break;
+            default:
+               pProp++;
+               continue;
+            }
+         }
+         Xfree((char *) propList);
+         retval = Success;
+      }
+   }
+   UnlockDisplay(dpy);
+   SyncHandle();
+   return retval;
 }
 
 PUBLIC int
-glXQueryContext(Display *dpy, GLXContext ctx, int attribute, int *value)
+glXQueryContext(Display * dpy, GLXContext ctx, int attribute, int *value)
 {
-    int retVal;
+   int retVal;
 
-    /* get the information from the server if we don't have it already */
+   /* get the information from the server if we don't have it already */
 #ifdef GLX_DIRECT_RENDERING
-    if (!ctx->driContext && (ctx->mode == NULL)) {
+   if (!ctx->driContext && (ctx->mode == NULL)) {
 #else
-    if (ctx->mode == NULL) {
+   if (ctx->mode == NULL) {
 #endif
-       retVal = __glXQueryContextInfo(dpy, ctx);
-       if (Success != retVal) return retVal;
-    }
-    switch (attribute) {
-    case GLX_SHARE_CONTEXT_EXT:
-       *value = (int)(ctx->share_xid);
-       break;
-    case GLX_VISUAL_ID_EXT:
-       *value = ctx->mode ? ctx->mode->visualID : None;
-       break;
-    case GLX_SCREEN:
-       *value = (int)(ctx->screen);
-       break;
-    case GLX_FBCONFIG_ID:
-       *value = ctx->mode ? ctx->mode->fbconfigID : None;
-       break;
-    case GLX_RENDER_TYPE:
-       *value = (int)(ctx->renderType);
-       break;
-    default:
-       return GLX_BAD_ATTRIBUTE;
-    }
-    return Success;
+      retVal = __glXQueryContextInfo(dpy, ctx);
+      if (Success != retVal)
+         return retVal;
+   }
+   switch (attribute) {
+   case GLX_SHARE_CONTEXT_EXT:
+      *value = (int) (ctx->share_xid);
+      break;
+   case GLX_VISUAL_ID_EXT:
+      *value = ctx->mode ? ctx->mode->visualID : None;
+      break;
+   case GLX_SCREEN:
+      *value = (int) (ctx->screen);
+      break;
+   case GLX_FBCONFIG_ID:
+      *value = ctx->mode ? ctx->mode->fbconfigID : None;
+      break;
+   case GLX_RENDER_TYPE:
+      *value = (int) (ctx->renderType);
+      break;
+   default:
+      return GLX_BAD_ATTRIBUTE;
+   }
+   return Success;
 }
 
-PUBLIC GLX_ALIAS( int, glXQueryContextInfoEXT,
-          (Display *dpy, GLXContext ctx, int attribute, int *value),
-          (dpy, ctx, attribute, value),
-          glXQueryContext )
+PUBLIC
+GLX_ALIAS(int, glXQueryContextInfoEXT,
+          (Display * dpy, GLXContext ctx, int attribute, int *value),
+          (dpy, ctx, attribute, value), glXQueryContext)
 
-PUBLIC GLXContextID glXGetContextIDEXT(const GLXContext ctx)
+     PUBLIC GLXContextID glXGetContextIDEXT(const GLXContext ctx)
 {
-    return ctx->xid;
+   return ctx->xid;
 }
 
-PUBLIC GLXContext glXImportContextEXT(Display *dpy, GLXContextID contextID)
+PUBLIC GLXContext
+glXImportContextEXT(Display * dpy, GLXContextID contextID)
 {
-    GLXContext ctx;
+   GLXContext ctx;
 
-    if (contextID == None) {
-       return NULL;
-    }
-    if (__glXIsDirect(dpy, contextID)) {
-       return NULL;
-    }
+   if (contextID == None) {
+      return NULL;
+   }
+   if (__glXIsDirect(dpy, contextID)) {
+      return NULL;
+   }
 
-    ctx = CreateContext(dpy, NULL, NULL, NULL, False, contextID, False, 0);
-    if (NULL != ctx) {
-       if (Success != __glXQueryContextInfo(dpy, ctx)) {
-          return NULL;
-       }
-    }
-    return ctx;
+   ctx = CreateContext(dpy, NULL, NULL, NULL, False, contextID, False, 0);
+   if (NULL != ctx) {
+      if (Success != __glXQueryContextInfo(dpy, ctx)) {
+         return NULL;
+      }
+   }
+   return ctx;
 }
 
-PUBLIC void glXFreeContextEXT(Display *dpy, GLXContext ctx)
+PUBLIC void
+glXFreeContextEXT(Display * dpy, GLXContext ctx)
 {
-    DestroyContext(dpy, ctx);
+   DestroyContext(dpy, ctx);
 }
 
 
@@ -1670,147 +1723,149 @@ PUBLIC void glXFreeContextEXT(Display *dpy, GLXContext ctx)
  * GLX 1.3 functions - these are just stubs for now!
  */
 
-PUBLIC GLXFBConfig *glXChooseFBConfig(Display *dpy, int screen,
-                                     const int *attribList, int *nitems)
+PUBLIC GLXFBConfig *
+glXChooseFBConfig(Display * dpy, int screen,
+                  const int *attribList, int *nitems)
 {
-    __GLcontextModes ** config_list;
-    int   list_size;
+   __GLcontextModes **config_list;
+   int list_size;
 
 
-    config_list = (__GLcontextModes **) 
-       glXGetFBConfigs( dpy, screen, & list_size );
+   config_list = (__GLcontextModes **)
+      glXGetFBConfigs(dpy, screen, &list_size);
 
-    if ( (config_list != NULL) && (list_size > 0) && (attribList != NULL) ) {
-       list_size = choose_visual( config_list, list_size, attribList,
-                                  GL_TRUE );
-       if ( list_size == 0 ) {
-           XFree( config_list );
-           config_list = NULL;
-       }
-    }
+   if ((config_list != NULL) && (list_size > 0) && (attribList != NULL)) {
+      list_size = choose_visual(config_list, list_size, attribList, GL_TRUE);
+      if (list_size == 0) {
+         XFree(config_list);
+         config_list = NULL;
+      }
+   }
 
-    *nitems = list_size;
-    return (GLXFBConfig *) config_list;
+   *nitems = list_size;
+   return (GLXFBConfig *) config_list;
 }
 
 
-PUBLIC GLXContext glXCreateNewContext(Display *dpy, GLXFBConfig config,
-                                     int renderType, GLXContext shareList,
-                                     Bool allowDirect)
+PUBLIC GLXContext
+glXCreateNewContext(Display * dpy, GLXFBConfig config,
+                    int renderType, GLXContext shareList, Bool allowDirect)
 {
-    return CreateContext( dpy, NULL, (__GLcontextModes *) config, shareList,
-                         allowDirect, None, True, renderType );
+   return CreateContext(dpy, NULL, (__GLcontextModes *) config, shareList,
+                        allowDirect, None, True, renderType);
 }
 
 
-PUBLIC GLXDrawable glXGetCurrentReadDrawable(void)
+PUBLIC GLXDrawable
+glXGetCurrentReadDrawable(void)
 {
-    GLXContext gc = __glXGetCurrentContext();
-    return gc->currentReadable;
+   GLXContext gc = __glXGetCurrentContext();
+   return gc->currentReadable;
 }
 
 
-PUBLIC GLXFBConfig *glXGetFBConfigs(Display *dpy, int screen, int *nelements)
+PUBLIC GLXFBConfig *
+glXGetFBConfigs(Display * dpy, int screen, int *nelements)
 {
-    __GLXdisplayPrivate *priv = __glXInitialize(dpy);
-    __GLcontextModes ** config = NULL;
-    int   i;
+   __GLXdisplayPrivate *priv = __glXInitialize(dpy);
+   __GLcontextModes **config = NULL;
+   int i;
 
-    *nelements = 0;
-    if ( priv
-         && (priv->screenConfigs != NULL)
-        && (screen >= 0) && (screen <= ScreenCount(dpy))
-        && (priv->screenConfigs[screen].configs != NULL)
-        && (priv->screenConfigs[screen].configs->fbconfigID != GLX_DONT_CARE) ) {
-       unsigned num_configs = 0;
-       __GLcontextModes * modes;
+   *nelements = 0;
+   if (priv && (priv->screenConfigs != NULL)
+       && (screen >= 0) && (screen <= ScreenCount(dpy))
+       && (priv->screenConfigs[screen].configs != NULL)
+       && (priv->screenConfigs[screen].configs->fbconfigID != GLX_DONT_CARE)) {
+      unsigned num_configs = 0;
+      __GLcontextModes *modes;
 
 
-       for ( modes = priv->screenConfigs[screen].configs
-             ; modes != NULL
-             ; modes = modes->next ) {
-           if ( modes->fbconfigID != GLX_DONT_CARE ) {
-               num_configs++;
-           }
-       }
+      for (modes = priv->screenConfigs[screen].configs; modes != NULL;
+           modes = modes->next) {
+         if (modes->fbconfigID != GLX_DONT_CARE) {
+            num_configs++;
+         }
+      }
 
-       config = (__GLcontextModes **) Xmalloc( sizeof(__GLcontextModes *)
-                                               * num_configs );
-       if ( config != NULL ) {
-           *nelements = num_configs;
-           i = 0;
-           for ( modes = priv->screenConfigs[screen].configs
-                 ; modes != NULL
-                 ; modes = modes->next ) {
-               if ( modes->fbconfigID != GLX_DONT_CARE ) {
-                   config[i] = modes;
-                   i++;
-               }
-           }
-       }
-    }
-    return (GLXFBConfig *) config;
+      config = (__GLcontextModes **) Xmalloc(sizeof(__GLcontextModes *)
+                                             * num_configs);
+      if (config != NULL) {
+         *nelements = num_configs;
+         i = 0;
+         for (modes = priv->screenConfigs[screen].configs; modes != NULL;
+              modes = modes->next) {
+            if (modes->fbconfigID != GLX_DONT_CARE) {
+               config[i] = modes;
+               i++;
+            }
+         }
+      }
+   }
+   return (GLXFBConfig *) config;
 }
 
 
-PUBLIC int glXGetFBConfigAttrib(Display *dpy, GLXFBConfig config,
-                               int attribute, int *value)
+PUBLIC int
+glXGetFBConfigAttrib(Display * dpy, GLXFBConfig config,
+                     int attribute, int *value)
 {
-    __GLcontextModes * const modes = ValidateGLXFBConfig( dpy, config );
+   __GLcontextModes *const modes = ValidateGLXFBConfig(dpy, config);
 
-    return (modes != NULL)
-       ? _gl_get_context_mode_data( modes, attribute, value )
-       : GLXBadFBConfig;
+   return (modes != NULL)
+      ? _gl_get_context_mode_data(modes, attribute, value)
+      : GLXBadFBConfig;
 }
 
 
-PUBLIC XVisualInfo *glXGetVisualFromFBConfig(Display *dpy, GLXFBConfig config)
+PUBLIC XVisualInfo *
+glXGetVisualFromFBConfig(Display * dpy, GLXFBConfig config)
 {
-    XVisualInfo visualTemplate;
-    __GLcontextModes * fbconfig = (__GLcontextModes *) config;
-    int  count;
+   XVisualInfo visualTemplate;
+   __GLcontextModes *fbconfig = (__GLcontextModes *) config;
+   int count;
 
-    /*
+   /*
     ** Get a list of all visuals, return if list is empty
     */
-    visualTemplate.visualid = fbconfig->visualID;
-    return XGetVisualInfo(dpy,VisualIDMask,&visualTemplate,&count);
+   visualTemplate.visualid = fbconfig->visualID;
+   return XGetVisualInfo(dpy, VisualIDMask, &visualTemplate, &count);
 }
 
 
 /*
 ** GLX_SGI_swap_control
 */
-static int __glXSwapIntervalSGI(int interval)
+static int
+__glXSwapIntervalSGI(int interval)
 {
    xGLXVendorPrivateReq *req;
    GLXContext gc = __glXGetCurrentContext();
-   Display * dpy;
-   CARD32 * interval_ptr;
+   Display *dpy;
+   CARD32 *interval_ptr;
    CARD8 opcode;
 
-   if ( gc == NULL ) {
+   if (gc == NULL) {
       return GLX_BAD_CONTEXT;
    }
-   
-   if ( interval <= 0 ) {
+
+   if (interval <= 0) {
       return GLX_BAD_VALUE;
    }
 
 #ifdef __DRI_SWAP_CONTROL
    if (gc->driContext) {
-       __GLXscreenConfigs * const psc = GetGLXScreenConfigs( gc->currentDpy,
-                                                            gc->screen );
-       __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(gc->currentDpy,
-                                                  gc->currentDrawable,
-                                                  NULL);
-       if (psc->swapControl != NULL && pdraw != NULL) {
-          psc->swapControl->setSwapInterval(pdraw->driDrawable, interval);
-          return 0;
-       }
-       else {
-          return GLX_BAD_CONTEXT;
-       }
+      __GLXscreenConfigs *const psc = GetGLXScreenConfigs(gc->currentDpy,
+                                                          gc->screen);
+      __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(gc->currentDpy,
+                                                  gc->currentDrawable,
+                                                  NULL);
+      if (psc->swapControl != NULL && pdraw != NULL) {
+         psc->swapControl->setSwapInterval(pdraw->driDrawable, interval);
+         return 0;
+      }
+      else {
+         return GLX_BAD_CONTEXT;
+      }
    }
 #endif
    dpy = gc->currentDpy;
@@ -1821,7 +1876,7 @@ static int __glXSwapIntervalSGI(int interval)
 
    /* Send the glXSwapIntervalSGI request */
    LockDisplay(dpy);
-   GetReqExtra(GLXVendorPrivate,sizeof(CARD32),req);
+   GetReqExtra(GLXVendorPrivate, sizeof(CARD32), req);
    req->reqType = opcode;
    req->glxCode = X_GLXVendorPrivate;
    req->vendorCode = X_GLXvop_SwapIntervalSGI;
@@ -1841,26 +1896,27 @@ static int __glXSwapIntervalSGI(int interval)
 /*
 ** GLX_MESA_swap_control
 */
-static int __glXSwapIntervalMESA(unsigned int interval)
+static int
+__glXSwapIntervalMESA(unsigned int interval)
 {
 #ifdef __DRI_SWAP_CONTROL
    GLXContext gc = __glXGetCurrentContext();
 
-   if ( interval < 0 ) {
+   if (interval < 0) {
       return GLX_BAD_VALUE;
    }
 
    if (gc != NULL && gc->driContext) {
-      __GLXscreenConfigs * const psc = GetGLXScreenConfigs( gc->currentDpy,
-                                                           gc->screen );
-      
-      if ( (psc != NULL) && (psc->driScreen != NULL) ) {
-        __GLXDRIdrawable *pdraw = 
-            GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable, NULL);
-        if (psc->swapControl != NULL && pdraw != NULL) {
-           psc->swapControl->setSwapInterval(pdraw->driDrawable, interval);
-           return 0;
-        }
+      __GLXscreenConfigs *const psc = GetGLXScreenConfigs(gc->currentDpy,
+                                                          gc->screen);
+
+      if ((psc != NULL) && (psc->driScreen != NULL)) {
+         __GLXDRIdrawable *pdraw =
+            GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable, NULL);
+         if (psc->swapControl != NULL && pdraw != NULL) {
+            psc->swapControl->setSwapInterval(pdraw->driDrawable, interval);
+            return 0;
+         }
       }
    }
 #else
@@ -1869,23 +1925,24 @@ static int __glXSwapIntervalMESA(unsigned int interval)
 
    return GLX_BAD_CONTEXT;
 }
 
-static int __glXGetSwapIntervalMESA(void)
+
+static int
+__glXGetSwapIntervalMESA(void)
 {
 #ifdef __DRI_SWAP_CONTROL
    GLXContext gc = __glXGetCurrentContext();
 
    if (gc != NULL && gc->driContext) {
-      __GLXscreenConfigs * const psc = GetGLXScreenConfigs( gc->currentDpy,
-                                                           gc->screen );
-      
-      if ( (psc != NULL) && (psc->driScreen != NULL) ) {
-        __GLXDRIdrawable *pdraw = 
-            GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable, NULL);
-        if (psc->swapControl != NULL && pdraw != NULL) {
-           return psc->swapControl->getSwapInterval(pdraw->driDrawable);
-        }
+      __GLXscreenConfigs *const psc = GetGLXScreenConfigs(gc->currentDpy,
+                                                          gc->screen);
+
+      if ((psc != NULL) && (psc->driScreen != NULL)) {
+         __GLXDRIdrawable *pdraw =
+            GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable, NULL);
+         if (psc->swapControl != NULL && pdraw != NULL) {
+            return psc->swapControl->getSwapInterval(pdraw->driDrawable);
+         }
       }
    }
 #endif
@@ -1898,16 +1955,17 @@ static int __glXGetSwapIntervalMESA(void)
 ** GLX_MESA_swap_frame_usage
 */
 
-static GLint __glXBeginFrameTrackingMESA(Display *dpy, GLXDrawable drawable)
+static GLint
+__glXBeginFrameTrackingMESA(Display * dpy, GLXDrawable drawable)
 {
-   int   status = GLX_BAD_CONTEXT;
+   int status = GLX_BAD_CONTEXT;
 #ifdef __DRI_FRAME_TRACKING
    int screen;
    __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, &screen);
-   __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen);
+   __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, screen);
 
    if (pdraw != NULL && psc->frameTracking != NULL)
-       status = psc->frameTracking->frameTracking(pdraw->driDrawable, GL_TRUE);
+      status = psc->frameTracking->frameTracking(pdraw->driDrawable, GL_TRUE);
 #else
    (void) dpy;
    (void) drawable;
@@ -1915,18 +1973,19 @@ static GLint __glXBeginFrameTrackingMESA(Display *dpy, GLXDrawable drawable)
    return status;
 }
 
-    
-static GLint __glXEndFrameTrackingMESA(Display *dpy, GLXDrawable drawable)
+
+static GLint
+__glXEndFrameTrackingMESA(Display * dpy, GLXDrawable drawable)
 {
-   int   status = GLX_BAD_CONTEXT;
+   int status = GLX_BAD_CONTEXT;
 #ifdef __DRI_FRAME_TRACKING
    int screen;
-   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, & screen);
+   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, &screen);
    __GLXscreenConfigs *psc = GetGLXScreenConfigs(dpy, screen);
 
    if (pdraw != NULL && psc->frameTracking != NULL)
-       status = psc->frameTracking->frameTracking(pdraw->driDrawable,
-                                                 GL_FALSE);
+      status = psc->frameTracking->frameTracking(pdraw->driDrawable,
+                                                 GL_FALSE);
 #else
    (void) dpy;
    (void) drawable;
@@ -1935,24 +1994,24 @@ static GLint __glXEndFrameTrackingMESA(Display *dpy, GLXDrawable drawable)
 }
 
 
-static GLint __glXGetFrameUsageMESA(Display *dpy, GLXDrawable drawable,
-                                   GLfloat *usage)
+static GLint
+__glXGetFrameUsageMESA(Display * dpy, GLXDrawable drawable, GLfloat * usage)
 {
-   int   status = GLX_BAD_CONTEXT;
+   int status = GLX_BAD_CONTEXT;
 #ifdef __DRI_FRAME_TRACKING
    int screen;
-   __GLXDRIdrawable * const pdraw = GetGLXDRIDrawable(dpy, drawable, & screen);
-   __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen);
+   __GLXDRIdrawable *const pdraw = GetGLXDRIDrawable(dpy, drawable, &screen);
+   __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, screen);
 
    if (pdraw != NULL && psc->frameTracking != NULL) {
-       int64_t sbc, missedFrames;
-       float   lastMissedUsage;
+      int64_t sbc, missedFrames;
+      float lastMissedUsage;
 
-       status = psc->frameTracking->queryFrameTracking(pdraw->driDrawable,
-                                                      &sbc,
-                                                      &missedFrames,
-                                                      &lastMissedUsage,
-                                                      usage);
+      status = psc->frameTracking->queryFrameTracking(pdraw->driDrawable,
+                                                      &sbc,
+                                                      &missedFrames,
+                                                      &lastMissedUsage,
+                                                      usage);
    }
 #else
    (void) dpy;
@@ -1963,22 +2022,24 @@ static GLint __glXGetFrameUsageMESA(Display *dpy, GLXDrawable drawable,
 }
 
 
-static GLint __glXQueryFrameTrackingMESA(Display *dpy, GLXDrawable drawable,
-                                        int64_t *sbc, int64_t *missedFrames,
-                                        GLfloat *lastMissedUsage)
+static GLint
+__glXQueryFrameTrackingMESA(Display * dpy, GLXDrawable drawable,
+                            int64_t * sbc, int64_t * missedFrames,
+                            GLfloat * lastMissedUsage)
 {
-   int   status = GLX_BAD_CONTEXT;
+   int status = GLX_BAD_CONTEXT;
 #ifdef __DRI_FRAME_TRACKING
    int screen;
-   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, & screen);
-   __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen);
+   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, &screen);
+   __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, screen);
 
    if (pdraw != NULL && psc->frameTracking != NULL) {
-      float   usage;
+      float usage;
 
       status = psc->frameTracking->queryFrameTracking(pdraw->driDrawable,
-                                                     sbc, missedFrames,
-                                                     lastMissedUsage, &usage);
+                                                      sbc, missedFrames,
+                                                      lastMissedUsage,
+                                                      &usage);
    }
 #else
    (void) dpy;
@@ -1994,7 +2055,8 @@ static GLint __glXQueryFrameTrackingMESA(Display *dpy, GLXDrawable drawable,
 /*
 ** GLX_SGI_video_sync
 */
-static int __glXGetVideoSyncSGI(unsigned int *count)
+static int
+__glXGetVideoSyncSGI(unsigned int *count)
 {
    /* FIXME: Looking at the GLX_SGI_video_sync spec in the extension registry,
     * FIXME: there should be a GLX encoding for this call.  I can find no
@@ -2005,49 +2067,50 @@ static int __glXGetVideoSyncSGI(unsigned int *count)
 
 
    if (gc != NULL && gc->driContext) {
-      __GLXscreenConfigs * const psc = GetGLXScreenConfigs( gc->currentDpy,
-                                                           gc->screen );
-      if ( psc->msc && psc->driScreen ) {
-          __GLXDRIdrawable *pdraw = 
-              GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable, NULL);
-         int64_t temp; 
-         int ret;
-         ret = (*psc->msc->getDrawableMSC)(psc->__driScreen,
-                                           pdraw->driDrawable, &temp);
-         *count = (unsigned) temp;
-
-         return (ret == 0) ? 0 : GLX_BAD_CONTEXT;
+      __GLXscreenConfigs *const psc = GetGLXScreenConfigs(gc->currentDpy,
+                                                          gc->screen);
+      if (psc->msc && psc->driScreen) {
+         __GLXDRIdrawable *pdraw =
+            GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable, NULL);
+         int64_t temp;
+         int ret;
+
+         ret = (*psc->msc->getDrawableMSC) (psc->__driScreen,
+                                            pdraw->driDrawable, &temp);
+         *count = (unsigned) temp;
+
+         return (ret == 0) ? 0 : GLX_BAD_CONTEXT;
       }
    }
 #else
-    (void) count;
+   (void) count;
 #endif
    return GLX_BAD_CONTEXT;
 }
 
-static int __glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
+static int
+__glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
 {
 #ifdef __DRI_MEDIA_STREAM_COUNTER
    GLXContext gc = __glXGetCurrentContext();
 
-   if ( divisor <= 0 || remainder < 0 )
-     return GLX_BAD_VALUE;
+   if (divisor <= 0 || remainder < 0)
+      return GLX_BAD_VALUE;
 
    if (gc != NULL && gc->driContext) {
-      __GLXscreenConfigs * const psc = GetGLXScreenConfigs( gc->currentDpy,
-                                                           gc->screen );
-      if (psc->msc != NULL && psc->driScreen ) {
-        __GLXDRIdrawable *pdraw = 
-            GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable, NULL);
-        int       ret;
-        int64_t   msc;
-        int64_t   sbc;
-
-        ret = (*psc->msc->waitForMSC)(pdraw->driDrawable, 0,
-                                      divisor, remainder, &msc, &sbc);
-        *count = (unsigned) msc;
-        return (ret == 0) ? 0 : GLX_BAD_CONTEXT;
+      __GLXscreenConfigs *const psc = GetGLXScreenConfigs(gc->currentDpy,
+                                                          gc->screen);
+      if (psc->msc != NULL && psc->driScreen) {
+         __GLXDRIdrawable *pdraw =
+            GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable, NULL);
+         int ret;
+         int64_t msc;
+         int64_t sbc;
+
+         ret = (*psc->msc->waitForMSC) (pdraw->driDrawable, 0,
+                                        divisor, remainder, &msc, &sbc);
+         *count = (unsigned) msc;
+         return (ret == 0) ? 0 : GLX_BAD_CONTEXT;
       }
    }
 #else
@@ -2063,109 +2126,112 @@ static int __glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count
 ** GLX_functions table.
 */
 
-PUBLIC GLX_ALIAS(int, glXGetFBConfigAttribSGIX,
-         (Display *dpy, GLXFBConfigSGIX config, int attribute, int *value),
-         (dpy, config, attribute, value),
-         glXGetFBConfigAttrib)
+PUBLIC
+GLX_ALIAS(int, glXGetFBConfigAttribSGIX,
+          (Display * dpy, GLXFBConfigSGIX config, int attribute, int *value),
+          (dpy, config, attribute, value), glXGetFBConfigAttrib)
 
-PUBLIC GLX_ALIAS(GLXFBConfigSGIX *, glXChooseFBConfigSGIX,
-         (Display *dpy, int screen, int *attrib_list, int *nelements),
-         (dpy, screen, attrib_list, nelements),
-         glXChooseFBConfig)
+     PUBLIC GLX_ALIAS(GLXFBConfigSGIX *, glXChooseFBConfigSGIX,
+                      (Display * dpy, int screen, int *attrib_list,
+                       int *nelements), (dpy, screen, attrib_list, nelements),
+                      glXChooseFBConfig)
 
-PUBLIC GLX_ALIAS(XVisualInfo *, glXGetVisualFromFBConfigSGIX,
-         (Display * dpy, GLXFBConfigSGIX config),
-         (dpy, config),
-         glXGetVisualFromFBConfig)
+     PUBLIC GLX_ALIAS(XVisualInfo *, glXGetVisualFromFBConfigSGIX,
+                      (Display * dpy, GLXFBConfigSGIX config),
+                      (dpy, config), glXGetVisualFromFBConfig)
 
-PUBLIC GLXPixmap glXCreateGLXPixmapWithConfigSGIX(Display *dpy,
-                            GLXFBConfigSGIX config, Pixmap pixmap)
+     PUBLIC GLXPixmap glXCreateGLXPixmapWithConfigSGIX(Display * dpy,
+                                                       GLXFBConfigSGIX config,
+                                                       Pixmap pixmap)
 {
-    xGLXVendorPrivateWithReplyReq *vpreq;
-    xGLXCreateGLXPixmapWithConfigSGIXReq *req;
-    GLXPixmap xid = None;
-    CARD8 opcode;
-    const __GLcontextModes * const fbconfig = (__GLcontextModes *) config;
-    __GLXscreenConfigs * psc;
+   xGLXVendorPrivateWithReplyReq *vpreq;
+   xGLXCreateGLXPixmapWithConfigSGIXReq *req;
+   GLXPixmap xid = None;
+   CARD8 opcode;
+   const __GLcontextModes *const fbconfig = (__GLcontextModes *) config;
+   __GLXscreenConfigs *psc;
 
 
-    if ( (dpy == NULL) || (config == NULL) ) {
-       return None;
-    }
+   if ((dpy == NULL) || (config == NULL)) {
+      return None;
+   }
 
-    psc = GetGLXScreenConfigs( dpy, fbconfig->screen );
-    if ( (psc != NULL) 
-        && __glXExtensionBitIsEnabled( psc, SGIX_fbconfig_bit ) ) {
-       opcode = __glXSetupForCommand(dpy);
-       if (!opcode) {
-           return None;
-       }
+   psc = GetGLXScreenConfigs(dpy, fbconfig->screen);
+   if ((psc != NULL)
+       && __glXExtensionBitIsEnabled(psc, SGIX_fbconfig_bit)) {
+      opcode = __glXSetupForCommand(dpy);
+      if (!opcode) {
+         return None;
+      }
 
-       /* Send the glXCreateGLXPixmapWithConfigSGIX request */
-       LockDisplay(dpy);
-       GetReqExtra(GLXVendorPrivateWithReply,
-                   sz_xGLXCreateGLXPixmapWithConfigSGIXReq-sz_xGLXVendorPrivateWithReplyReq,vpreq);
-       req = (xGLXCreateGLXPixmapWithConfigSGIXReq *)vpreq;
-       req->reqType = opcode;
-       req->glxCode = X_GLXVendorPrivateWithReply;
-       req->vendorCode = X_GLXvop_CreateGLXPixmapWithConfigSGIX;
-       req->screen = fbconfig->screen;
-       req->fbconfig = fbconfig->fbconfigID;
-       req->pixmap = pixmap;
-       req->glxpixmap = xid = XAllocID(dpy);
-       UnlockDisplay(dpy);
-       SyncHandle();
-    }
+      /* Send the glXCreateGLXPixmapWithConfigSGIX request */
+      LockDisplay(dpy);
+      GetReqExtra(GLXVendorPrivateWithReply,
+                  sz_xGLXCreateGLXPixmapWithConfigSGIXReq -
+                  sz_xGLXVendorPrivateWithReplyReq, vpreq);
+      req = (xGLXCreateGLXPixmapWithConfigSGIXReq *) vpreq;
+      req->reqType = opcode;
+      req->glxCode = X_GLXVendorPrivateWithReply;
+      req->vendorCode = X_GLXvop_CreateGLXPixmapWithConfigSGIX;
+      req->screen = fbconfig->screen;
+      req->fbconfig = fbconfig->fbconfigID;
+      req->pixmap = pixmap;
+      req->glxpixmap = xid = XAllocID(dpy);
+      UnlockDisplay(dpy);
+      SyncHandle();
+   }
 
-    return xid;
+   return xid;
 }
 
-PUBLIC GLXContext glXCreateContextWithConfigSGIX(Display *dpy,
-                             GLXFBConfigSGIX config, int renderType,
-                             GLXContext shareList, Bool allowDirect)
+PUBLIC GLXContext
+glXCreateContextWithConfigSGIX(Display * dpy,
+                               GLXFBConfigSGIX config, int renderType,
+                               GLXContext shareList, Bool allowDirect)
 {
-    GLXContext gc = NULL;
-    const __GLcontextModes * const fbconfig = (__GLcontextModes *) config;
-    __GLXscreenConfigs * psc;
+   GLXContext gc = NULL;
+   const __GLcontextModes *const fbconfig = (__GLcontextModes *) config;
+   __GLXscreenConfigs *psc;
 
 
-    if ( (dpy == NULL) || (config == NULL) ) {
-       return None;
-    }
+   if ((dpy == NULL) || (config == NULL)) {
+      return None;
+   }
 
-    psc = GetGLXScreenConfigs( dpy, fbconfig->screen );
-    if ( (psc != NULL) 
-        && __glXExtensionBitIsEnabled( psc, SGIX_fbconfig_bit ) ) {
-       gc = CreateContext( dpy, NULL, (__GLcontextModes *) config, shareList,
-                           allowDirect, None, False, renderType );
-    }
+   psc = GetGLXScreenConfigs(dpy, fbconfig->screen);
+   if ((psc != NULL)
+       && __glXExtensionBitIsEnabled(psc, SGIX_fbconfig_bit)) {
+      gc = CreateContext(dpy, NULL, (__GLcontextModes *) config, shareList,
+                         allowDirect, None, False, renderType);
+   }
 
-    return gc;
+   return gc;
 }
 
 
-PUBLIC GLXFBConfigSGIX glXGetFBConfigFromVisualSGIX(Display *dpy,
-                                                   XVisualInfo *vis)
+PUBLIC GLXFBConfigSGIX
+glXGetFBConfigFromVisualSGIX(Display * dpy, XVisualInfo * vis)
 {
-    __GLXdisplayPrivate *priv;
-    __GLXscreenConfigs *psc;
+   __GLXdisplayPrivate *priv;
+   __GLXscreenConfigs *psc;
 
-    if ( (GetGLXPrivScreenConfig( dpy, vis->screen, & priv, & psc ) != Success)
-        && __glXExtensionBitIsEnabled( psc, SGIX_fbconfig_bit )
-        && (psc->configs->fbconfigID != GLX_DONT_CARE) ) {
-       return (GLXFBConfigSGIX) _gl_context_modes_find_visual( psc->configs,
-                                                               vis->visualid );
-    }
+   if ((GetGLXPrivScreenConfig(dpy, vis->screen, &priv, &psc) != Success)
+       && __glXExtensionBitIsEnabled(psc, SGIX_fbconfig_bit)
+       && (psc->configs->fbconfigID != GLX_DONT_CARE)) {
+      return (GLXFBConfigSGIX) _gl_context_modes_find_visual(psc->configs,
+                                                             vis->visualid);
+   }
 
-    return NULL;
+   return NULL;
 }
 
 
 /*
 ** GLX_SGIX_swap_group
 */
-static void __glXJoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable,
-                                  GLXDrawable member)
+static void
+__glXJoinSwapGroupSGIX(Display * dpy, GLXDrawable drawable,
+                       GLXDrawable member)
 {
    (void) dpy;
    (void) drawable;
@@ -2176,15 +2242,16 @@ static void __glXJoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable,
 /*
 ** GLX_SGIX_swap_barrier
 */
-static void __glXBindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable,
-                                    int barrier)
+static void
+__glXBindSwapBarrierSGIX(Display * dpy, GLXDrawable drawable, int barrier)
 {
    (void) dpy;
    (void) drawable;
    (void) barrier;
 }
 
-static Bool __glXQueryMaxSwapBarriersSGIX(Display *dpy, int screen, int *max)
+static Bool
+__glXQueryMaxSwapBarriersSGIX(Display * dpy, int screen, int *max)
 {
    (void) dpy;
    (void) screen;
@@ -2196,23 +2263,24 @@ static Bool __glXQueryMaxSwapBarriersSGIX(Display *dpy, int screen, int *max)
 /*
 ** GLX_OML_sync_control
 */
-static Bool __glXGetSyncValuesOML(Display *dpy, GLXDrawable drawable,
-                                 int64_t *ust, int64_t *msc, int64_t *sbc)
+static Bool
+__glXGetSyncValuesOML(Display * dpy, GLXDrawable drawable,
+                      int64_t * ust, int64_t * msc, int64_t * sbc)
 {
 #if defined(__DRI_SWAP_BUFFER_COUNTER) && defined(__DRI_MEDIA_STREAM_COUNTER)
-    __GLXdisplayPrivate * const priv = __glXInitialize(dpy);
-
-    if ( priv != NULL ) {
-       int   i;
-       __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, &i);
-       __GLXscreenConfigs * const psc = &priv->screenConfigs[i];
-
-       assert( (pdraw == NULL) || (i != -1) );
-       return ( (pdraw && psc->sbc && psc->msc)
-                && ((*psc->msc->getMSC)(psc->driScreen, msc) == 0)
-                && ((*psc->sbc->getSBC)(pdraw->driDrawable, sbc) == 0)
-                && (__glXGetUST(ust) == 0) );
-    }
+   __GLXdisplayPrivate *const priv = __glXInitialize(dpy);
+
+   if (priv != NULL) {
+      int i;
+      __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, &i);
+      __GLXscreenConfigs *const psc = &priv->screenConfigs[i];
+
+      assert((pdraw == NULL) || (i != -1));
+      return ((pdraw && psc->sbc && psc->msc)
+              && ((*psc->msc->getMSC) (psc->driScreen, msc) == 0)
+              && ((*psc->sbc->getSBC) (pdraw->driDrawable, sbc) == 0)
+              && (__glXGetUST(ust) == 0));
+   }
 #else
    (void) dpy;
    (void) drawable;
@@ -2225,94 +2293,94 @@ static Bool __glXGetSyncValuesOML(Display *dpy, GLXDrawable drawable,
 
 #ifdef GLX_DIRECT_RENDERING
 _X_HIDDEN GLboolean
-__driGetMscRateOML(__DRIdrawable *draw,
-                  int32_t *numerator, int32_t *denominator, void *private)
+__driGetMscRateOML(__DRIdrawable * draw,
+                   int32_t * numerator, int32_t * denominator, void *private)
 {
 #ifdef XF86VIDMODE
-    __GLXscreenConfigs *psc;
-    XF86VidModeModeLine   mode_line;
-    int   dot_clock;
-    int   i;
-    __GLXDRIdrawable *glxDraw = private;
-
-    psc = glxDraw->psc;
-    if (XF86VidModeQueryVersion(psc->dpy, &i, &i) &&
-       XF86VidModeGetModeLine(psc->dpy, psc->scr, &dot_clock, &mode_line) ) {
-       unsigned   n = dot_clock * 1000;
-       unsigned   d = mode_line.vtotal * mode_line.htotal;
-       
+   __GLXscreenConfigs *psc;
+   XF86VidModeModeLine mode_line;
+   int dot_clock;
+   int i;
+   __GLXDRIdrawable *glxDraw = private;
+
+   psc = glxDraw->psc;
+   if (XF86VidModeQueryVersion(psc->dpy, &i, &i) &&
+       XF86VidModeGetModeLine(psc->dpy, psc->scr, &dot_clock, &mode_line)) {
+      unsigned n = dot_clock * 1000;
+      unsigned d = mode_line.vtotal * mode_line.htotal;
+
 # define V_INTERLACE 0x010
 # define V_DBLSCAN   0x020
 
-       if (mode_line.flags & V_INTERLACE)
-           n *= 2;
-       else if (mode_line.flags & V_DBLSCAN)
-           d *= 2;
-
-       /* The OML_sync_control spec requires that if the refresh rate is a
-        * whole number, that the returned numerator be equal to the refresh
-        * rate and the denominator be 1.
-        */
-
-       if (n % d == 0) {
-           n /= d;
-           d = 1;
-       }
-       else {
-           static const unsigned f[] = { 13, 11, 7, 5, 3, 2, 0 };
-
-           /* This is a poor man's way to reduce a fraction.  It's far from
-            * perfect, but it will work well enough for this situation.
-            */
-
-           for (i = 0; f[i] != 0; i++) {
-               while (n % f[i] == 0 && d % f[i] == 0) {
-                   d /= f[i];
-                   n /= f[i];
-               }
-           }
-       }
-
-       *numerator = n;
-       *denominator = d;
-
-       return True;
-    }
-    else
-       return False;
+      if (mode_line.flags & V_INTERLACE)
+         n *= 2;
+      else if (mode_line.flags & V_DBLSCAN)
+         d *= 2;
+
+      /* The OML_sync_control spec requires that if the refresh rate is a
+       * whole number, that the returned numerator be equal to the refresh
+       * rate and the denominator be 1.
+       */
+
+      if (n % d == 0) {
+         n /= d;
+         d = 1;
+      }
+      else {
+         static const unsigned f[] = { 13, 11, 7, 5, 3, 2, 0 };
+
+         /* This is a poor man's way to reduce a fraction.  It's far from
+          * perfect, but it will work well enough for this situation.
+          */
+
+         for (i = 0; f[i] != 0; i++) {
+            while (n % f[i] == 0 && d % f[i] == 0) {
+               d /= f[i];
+               n /= f[i];
+            }
+         }
+      }
+
+      *numerator = n;
+      *denominator = d;
+
+      return True;
+   }
+   else
+      return False;
 #else
-    return False;
+   return False;
 #endif
 }
 #endif
 
 /**
  * Determine the refresh rate of the specified drawable and display.
- * 
+ *
  * \param dpy          Display whose refresh rate is to be determined.
  * \param drawable     Drawable whose refresh rate is to be determined.
  * \param numerator    Numerator of the refresh rate.
  * \param demoninator  Denominator of the refresh rate.
  * \return  If the refresh rate for the specified display and drawable could
  *          be calculated, True is returned.  Otherwise False is returned.
- * 
+ *
  * \note This function is implemented entirely client-side.  A lot of other
  *       functionality is required to export GLX_OML_sync_control, so on
  *       XFree86 this function can be called for direct-rendering contexts
  *       when GLX_OML_sync_control appears in the client extension string.
  */
 
-_X_HIDDEN GLboolean __glXGetMscRateOML(Display * dpy, GLXDrawable drawable,
-                                      int32_t * numerator,
-                                      int32_t * denominator)
+_X_HIDDEN GLboolean
+__glXGetMscRateOML(Display * dpy, GLXDrawable drawable,
+                   int32_t * numerator, int32_t * denominator)
 {
 #if defined( GLX_DIRECT_RENDERING ) && defined( XF86VIDMODE )
-    __GLXDRIdrawable *draw = GetGLXDRIDrawable(dpy, drawable, NULL);
+   __GLXDRIdrawable *draw = GetGLXDRIDrawable(dpy, drawable, NULL);
 
-    if (draw == NULL)
-       return False;
+   if (draw == NULL)
+      return False;
 
-    return __driGetMscRateOML(draw->driDrawable, numerator, denominator, draw);
+   return __driGetMscRateOML(draw->driDrawable, numerator, denominator, draw);
 #else
    (void) dpy;
    (void) drawable;
@@ -2323,28 +2391,28 @@ _X_HIDDEN GLboolean __glXGetMscRateOML(Display * dpy, GLXDrawable drawable,
 }
 
 
-static int64_t __glXSwapBuffersMscOML(Display *dpy, GLXDrawable drawable,
-                                     int64_t target_msc, int64_t divisor,
-                                     int64_t remainder)
+static int64_t
+__glXSwapBuffersMscOML(Display * dpy, GLXDrawable drawable,
+                       int64_t target_msc, int64_t divisor, int64_t remainder)
 {
 #ifdef __DRI_SWAP_BUFFER_COUNTER
    int screen;
    __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, &screen);
-   __GLXscreenConfigs * const psc = GetGLXScreenConfigs( dpy, screen );
+   __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, screen);
 
    /* The OML_sync_control spec says these should "generate a GLX_BAD_VALUE
     * error", but it also says "It [glXSwapBuffersMscOML] will return a value
     * of -1 if the function failed because of errors detected in the input
     * parameters"
     */
-   if ( divisor < 0 || remainder < 0 || target_msc < 0 )
+   if (divisor < 0 || remainder < 0 || target_msc < 0)
       return -1;
-   if ( divisor > 0 && remainder >= divisor )
+   if (divisor > 0 && remainder >= divisor)
       return -1;
 
    if (pdraw != NULL && psc->counters != NULL)
-      return (*psc->sbc->swapBuffersMSC)(pdraw->driDrawable, target_msc,
-                                        divisor, remainder);
+      return (*psc->sbc->swapBuffersMSC) (pdraw->driDrawable, target_msc,
+                                          divisor, remainder);
 
 #else
    (void) dpy;
@@ -2357,33 +2425,34 @@ static int64_t __glXSwapBuffersMscOML(Display *dpy, GLXDrawable drawable,
 }
 
 
-static Bool __glXWaitForMscOML(Display * dpy, GLXDrawable drawable,
-                              int64_t target_msc, int64_t divisor,
-                              int64_t remainder, int64_t *ust,
-                              int64_t *msc, int64_t *sbc)
+static Bool
+__glXWaitForMscOML(Display * dpy, GLXDrawable drawable,
+                   int64_t target_msc, int64_t divisor,
+                   int64_t remainder, int64_t * ust,
+                   int64_t * msc, int64_t * sbc)
 {
 #ifdef __DRI_MEDIA_STREAM_COUNTER
    int screen;
    __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, &screen);
-   __GLXscreenConfigs * const psc = GetGLXScreenConfigs( dpy, screen );
-   int  ret;
+   __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, screen);
+   int ret;
 
    /* The OML_sync_control spec says these should "generate a GLX_BAD_VALUE
     * error", but the return type in the spec is Bool.
     */
-   if ( divisor < 0 || remainder < 0 || target_msc < 0 )
+   if (divisor < 0 || remainder < 0 || target_msc < 0)
       return False;
-   if ( divisor > 0 && remainder >= divisor )
+   if (divisor > 0 && remainder >= divisor)
       return False;
 
    if (pdraw != NULL && psc->msc != NULL) {
-      ret = (*psc->msc->waitForMSC)(pdraw->driDrawable, target_msc,
-                                   divisor, remainder, msc, sbc);
+      ret = (*psc->msc->waitForMSC) (pdraw->driDrawable, target_msc,
+                                     divisor, remainder, msc, sbc);
 
       /* __glXGetUST returns zero on success and non-zero on failure.
        * This function returns True on success and False on failure.
        */
-      return ( (ret == 0) && (__glXGetUST( ust ) == 0) );
+      return ((ret == 0) && (__glXGetUST(ust) == 0));
    }
 #else
    (void) dpy;
@@ -2399,29 +2468,31 @@ static Bool __glXWaitForMscOML(Display * dpy, GLXDrawable drawable,
 }
 
 
-static Bool __glXWaitForSbcOML(Display * dpy, GLXDrawable drawable,
-                              int64_t target_sbc, int64_t *ust,
-                              int64_t *msc, int64_t *sbc )
+static Bool
+__glXWaitForSbcOML(Display * dpy, GLXDrawable drawable,
+                   int64_t target_sbc, int64_t * ust,
+                   int64_t * msc, int64_t * sbc)
 {
 #ifdef __DRI_SWAP_BUFFER_COUNTER
    int screen;
    __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, &screen);
-   __GLXscreenConfigs * const psc = GetGLXScreenConfigs( dpy, screen );
-   int  ret;
+   __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, screen);
+   int ret;
 
    /* The OML_sync_control spec says this should "generate a GLX_BAD_VALUE
     * error", but the return type in the spec is Bool.
     */
-   if ( target_sbc < 0 )
+   if (target_sbc < 0)
       return False;
 
    if (pdraw != NULL && psc->sbc != NULL) {
-      ret = (*psc->sbc->waitForSBC)(pdraw->driDrawable, target_sbc, msc, sbc);
+      ret =
+         (*psc->sbc->waitForSBC) (pdraw->driDrawable, target_sbc, msc, sbc);
 
       /* __glXGetUST returns zero on success and non-zero on failure.
        * This function returns True on success and False on failure.
        */
-      return( (ret == 0) && (__glXGetUST( ust ) == 0) );
+      return ((ret == 0) && (__glXGetUST(ust) == 0));
    }
 #else
    (void) dpy;
@@ -2440,16 +2511,17 @@ static Bool __glXWaitForSbcOML(Display * dpy, GLXDrawable drawable,
  */
 /*@{*/
 
-PUBLIC void *glXAllocateMemoryMESA(Display *dpy, int scrn,
-                                  size_t size, float readFreq,
-                                  float writeFreq, float priority)
+PUBLIC void *
+glXAllocateMemoryMESA(Display * dpy, int scrn,
+                      size_t size, float readFreq,
+                      float writeFreq, float priority)
 {
 #ifdef __DRI_ALLOCATE
-   __GLXscreenConfigs * const psc = GetGLXScreenConfigs( dpy, scrn );
+   __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, scrn);
 
    if (psc && psc->allocate)
-       return (*psc->allocate->allocateMemory)(psc->__driScreen, size,
-                                              readFreq, writeFreq, priority);
+      return (*psc->allocate->allocateMemory) (psc->__driScreen, size,
+                                               readFreq, writeFreq, priority);
 
 #else
    (void) dpy;
@@ -2464,13 +2536,14 @@ PUBLIC void *glXAllocateMemoryMESA(Display *dpy, int scrn,
 }
 
 
-PUBLIC void glXFreeMemoryMESA(Display *dpy, int scrn, void *pointer)
+PUBLIC void
+glXFreeMemoryMESA(Display * dpy, int scrn, void *pointer)
 {
 #ifdef __DRI_ALLOCATE
-   __GLXscreenConfigs * const psc = GetGLXScreenConfigs( dpy, scrn );
+   __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, scrn);
 
    if (psc && psc->allocate)
-        (*psc->allocate->freeMemory)(psc->__driScreen, pointer);
+      (*psc->allocate->freeMemory) (psc->__driScreen, pointer);
 
 #else
    (void) dpy;
@@ -2480,14 +2553,14 @@ PUBLIC void glXFreeMemoryMESA(Display *dpy, int scrn, void *pointer)
 }
 
 
-PUBLIC GLuint glXGetMemoryOffsetMESA( Display *dpy, int scrn,
-                                     const void *pointer )
+PUBLIC GLuint
+glXGetMemoryOffsetMESA(Display * dpy, int scrn, const void *pointer)
 {
 #ifdef __DRI_ALLOCATE
-   __GLXscreenConfigs * const psc = GetGLXScreenConfigs( dpy, scrn );
+   __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, scrn);
 
    if (psc && psc->allocate)
-       return (*psc->allocate->memoryOffset)(psc->__driScreen, pointer);
+      return (*psc->allocate->memoryOffset) (psc->__driScreen, pointer);
 
 #else
    (void) dpy;
@@ -2497,6 +2570,7 @@ PUBLIC GLuint glXGetMemoryOffsetMESA( Display *dpy, int scrn,
 
    return ~0L;
 }
+
 /*@}*/
 
 
@@ -2527,7 +2601,8 @@ PUBLIC GLuint glXGetMemoryOffsetMESA( Display *dpy, int scrn,
  *     glXDestroyPbuffer glXDestroyPixmap glXDestroyWindow
  *     glXDestroyGLXPbufferSGIX glXDestroyGLXVideoSourceSGIX
  */
-static Bool __glXReleaseBuffersMESA( Display *dpy, GLXDrawable d )
+static Bool
+__glXReleaseBuffersMESA(Display * dpy, GLXDrawable d)
 {
    (void) dpy;
    (void) d;
@@ -2535,8 +2610,9 @@ static Bool __glXReleaseBuffersMESA( Display *dpy, GLXDrawable d )
 }
 
 
-PUBLIC GLXPixmap glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visual,
-                                        Pixmap pixmap, Colormap cmap )
+PUBLIC GLXPixmap
+glXCreateGLXPixmapMESA(Display * dpy, XVisualInfo * visual,
+                       Pixmap pixmap, Colormap cmap)
 {
    (void) dpy;
    (void) visual;
@@ -2544,6 +2620,7 @@ PUBLIC GLXPixmap glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visual,
    (void) cmap;
    return 0;
 }
+
 /*@}*/
 
 
@@ -2551,68 +2628,70 @@ PUBLIC GLXPixmap glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visual,
  * GLX_MESA_copy_sub_buffer
  */
 #define X_GLXvop_CopySubBufferMESA 5154 /* temporary */
-static void __glXCopySubBufferMESA(Display *dpy, GLXDrawable drawable,
-                                  int x, int y, int width, int height)
+static void
+__glXCopySubBufferMESA(Display * dpy, GLXDrawable drawable,
+                       int x, int y, int width, int height)
 {
-    xGLXVendorPrivateReq *req;
-    GLXContext gc;
-    GLXContextTag tag;
-    CARD32 *drawable_ptr;
-    INT32 *x_ptr, *y_ptr, *w_ptr, *h_ptr;
-    CARD8 opcode;
+   xGLXVendorPrivateReq *req;
+   GLXContext gc;
+   GLXContextTag tag;
+   CARD32 *drawable_ptr;
+   INT32 *x_ptr, *y_ptr, *w_ptr, *h_ptr;
+   CARD8 opcode;
 
 #ifdef __DRI_COPY_SUB_BUFFER
-    int screen;
-    __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, &screen);
-    if ( pdraw != NULL ) {
-       __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen);
-       if (psc->driScreen->copySubBuffer != NULL) {
-           glFlush();      
-           (*psc->driScreen->copySubBuffer)(pdraw, x, y, width, height);
-       }
-
-       return;
-    }
+   int screen;
+   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, &screen);
+   if (pdraw != NULL) {
+      __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, screen);
+      if (psc->driScreen->copySubBuffer != NULL) {
+         glFlush();
+         (*psc->driScreen->copySubBuffer) (pdraw, x, y, width, height);
+      }
+
+      return;
+   }
 #endif
 
-    opcode = __glXSetupForCommand(dpy);
-    if (!opcode)
-       return;
+   opcode = __glXSetupForCommand(dpy);
+   if (!opcode)
+      return;
 
-    /*
+   /*
     ** The calling thread may or may not have a current context.  If it
     ** does, send the context tag so the server can do a flush.
     */
-    gc = __glXGetCurrentContext();
-    if ((gc != NULL) && (dpy == gc->currentDpy) &&
-       ((drawable == gc->currentDrawable) ||
-        (drawable == gc->currentReadable)) ) {
-       tag = gc->currentContextTag;
-    } else {
-       tag = 0;
-    }
-
-    LockDisplay(dpy);
-    GetReqExtra(GLXVendorPrivate, sizeof(CARD32) + sizeof(INT32) * 4,req);
-    req->reqType = opcode;
-    req->glxCode = X_GLXVendorPrivate;
-    req->vendorCode = X_GLXvop_CopySubBufferMESA;
-    req->contextTag = tag;
-
-    drawable_ptr = (CARD32 *) (req + 1);
-    x_ptr = (INT32 *) (drawable_ptr + 1);
-    y_ptr = (INT32 *) (drawable_ptr + 2);
-    w_ptr = (INT32 *) (drawable_ptr + 3);
-    h_ptr = (INT32 *) (drawable_ptr + 4);
-
-    *drawable_ptr = drawable;
-    *x_ptr = x;
-    *y_ptr = y;
-    *w_ptr = width;
-    *h_ptr = height;
-
-    UnlockDisplay(dpy);
-    SyncHandle();
+   gc = __glXGetCurrentContext();
+   if ((gc != NULL) && (dpy == gc->currentDpy) &&
+       ((drawable == gc->currentDrawable) ||
+        (drawable == gc->currentReadable))) {
+      tag = gc->currentContextTag;
+   }
+   else {
+      tag = 0;
+   }
+
+   LockDisplay(dpy);
+   GetReqExtra(GLXVendorPrivate, sizeof(CARD32) + sizeof(INT32) * 4, req);
+   req->reqType = opcode;
+   req->glxCode = X_GLXVendorPrivate;
+   req->vendorCode = X_GLXvop_CopySubBufferMESA;
+   req->contextTag = tag;
+
+   drawable_ptr = (CARD32 *) (req + 1);
+   x_ptr = (INT32 *) (drawable_ptr + 1);
+   y_ptr = (INT32 *) (drawable_ptr + 2);
+   w_ptr = (INT32 *) (drawable_ptr + 3);
+   h_ptr = (INT32 *) (drawable_ptr + 4);
+
+   *drawable_ptr = drawable;
+   *x_ptr = x;
+   *y_ptr = y;
+   *w_ptr = width;
+   *h_ptr = height;
+
+   UnlockDisplay(dpy);
+   SyncHandle();
 }
 
 
@@ -2620,128 +2699,127 @@ static void __glXCopySubBufferMESA(Display *dpy, GLXDrawable drawable,
  * GLX_EXT_texture_from_pixmap
  */
 /*@{*/
-static void __glXBindTexImageEXT(Display *dpy,
-                                GLXDrawable drawable,
-                                int buffer,
-                                const int *attrib_list)
-{
-    xGLXVendorPrivateReq *req;
-    GLXContext gc = __glXGetCurrentContext();
-    CARD32 *drawable_ptr;
-    INT32 *buffer_ptr;
-    CARD32 *num_attrib_ptr;
-    CARD32 *attrib_ptr;
-    CARD8 opcode;
-    unsigned int i;
-
-    if (gc == NULL)
-       return;
-
-    i = 0;
-    if (attrib_list) {
-       while (attrib_list[i * 2] != None)
-           i++;
-    }
+static void
+__glXBindTexImageEXT(Display * dpy,
+                     GLXDrawable drawable, int buffer, const int *attrib_list)
+{
+   xGLXVendorPrivateReq *req;
+   GLXContext gc = __glXGetCurrentContext();
+   CARD32 *drawable_ptr;
+   INT32 *buffer_ptr;
+   CARD32 *num_attrib_ptr;
+   CARD32 *attrib_ptr;
+   CARD8 opcode;
+   unsigned int i;
+
+   if (gc == NULL)
+      return;
+
+   i = 0;
+   if (attrib_list) {
+      while (attrib_list[i * 2] != None)
+         i++;
+   }
+
 #ifdef GLX_DIRECT_RENDERING
-    if (gc->driContext) {
-       __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, NULL);
-
-       if (pdraw != NULL) {
-           if (pdraw->psc->texBuffer->base.version >= 2 &&
-               pdraw->psc->texBuffer->setTexBuffer2 != NULL) {
-               (*pdraw->psc->texBuffer->setTexBuffer2)(gc->__driContext,
-                                                       pdraw->textureTarget,
-                                                       pdraw->textureFormat,
-                                                       pdraw->driDrawable);
-           } else {
-               (*pdraw->psc->texBuffer->setTexBuffer)(gc->__driContext,
-                                                      pdraw->textureTarget,
-                                                      pdraw->driDrawable);
-           }
-       }
-       return;
-    }
+   if (gc->driContext) {
+      __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, NULL);
+
+      if (pdraw != NULL) {
+         if (pdraw->psc->texBuffer->base.version >= 2 &&
+             pdraw->psc->texBuffer->setTexBuffer2 != NULL) {
+            (*pdraw->psc->texBuffer->setTexBuffer2) (gc->__driContext,
+                                                     pdraw->textureTarget,
+                                                     pdraw->textureFormat,
+                                                     pdraw->driDrawable);
+         }
+         else {
+            (*pdraw->psc->texBuffer->setTexBuffer) (gc->__driContext,
+                                                    pdraw->textureTarget,
+                                                    pdraw->driDrawable);
+         }
+      }
+      return;
+   }
 #endif
 
-    opcode = __glXSetupForCommand(dpy);
-    if (!opcode)
-       return;
-
-    LockDisplay(dpy);
-    GetReqExtra(GLXVendorPrivate, 12 + 8 * i,req);
-    req->reqType = opcode;
-    req->glxCode = X_GLXVendorPrivate;
-    req->vendorCode = X_GLXvop_BindTexImageEXT;
-    req->contextTag = gc->currentContextTag;
-
-    drawable_ptr = (CARD32 *) (req + 1);
-    buffer_ptr = (INT32 *) (drawable_ptr + 1);
-    num_attrib_ptr = (CARD32 *) (buffer_ptr + 1);
-    attrib_ptr = (CARD32 *) (num_attrib_ptr + 1);
-
-    *drawable_ptr = drawable;
-    *buffer_ptr = buffer;
-    *num_attrib_ptr = (CARD32) i;
-
-    i = 0;
-    if (attrib_list) {
-       while (attrib_list[i * 2] != None)
-       {
-           *attrib_ptr++ = (CARD32) attrib_list[i * 2 + 0];
-           *attrib_ptr++ = (CARD32) attrib_list[i * 2 + 1];
-           i++;
-       }
-    }
-
-    UnlockDisplay(dpy);
-    SyncHandle();
-}
-
-static void __glXReleaseTexImageEXT(Display *dpy,
-                                   GLXDrawable drawable,
-                                   int buffer)
-{
-    xGLXVendorPrivateReq *req;
-    GLXContext gc = __glXGetCurrentContext();
-    CARD32 *drawable_ptr;
-    INT32 *buffer_ptr;
-    CARD8 opcode;
-
-    if (gc == NULL)
-       return;
+   opcode = __glXSetupForCommand(dpy);
+   if (!opcode)
+      return;
+
+   LockDisplay(dpy);
+   GetReqExtra(GLXVendorPrivate, 12 + 8 * i, req);
+   req->reqType = opcode;
+   req->glxCode = X_GLXVendorPrivate;
+   req->vendorCode = X_GLXvop_BindTexImageEXT;
+   req->contextTag = gc->currentContextTag;
+
+   drawable_ptr = (CARD32 *) (req + 1);
+   buffer_ptr = (INT32 *) (drawable_ptr + 1);
+   num_attrib_ptr = (CARD32 *) (buffer_ptr + 1);
+   attrib_ptr = (CARD32 *) (num_attrib_ptr + 1);
+
+   *drawable_ptr = drawable;
+   *buffer_ptr = buffer;
+   *num_attrib_ptr = (CARD32) i;
+
+   i = 0;
+   if (attrib_list) {
+      while (attrib_list[i * 2] != None) {
+         *attrib_ptr++ = (CARD32) attrib_list[i * 2 + 0];
+         *attrib_ptr++ = (CARD32) attrib_list[i * 2 + 1];
+         i++;
+      }
+   }
+
+   UnlockDisplay(dpy);
+   SyncHandle();
+}
+
+static void
+__glXReleaseTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer)
+{
+   xGLXVendorPrivateReq *req;
+   GLXContext gc = __glXGetCurrentContext();
+   CARD32 *drawable_ptr;
+   INT32 *buffer_ptr;
+   CARD8 opcode;
+
+   if (gc == NULL)
+      return;
 
 #ifdef GLX_DIRECT_RENDERING
-    if (gc->driContext)
-       return;
+   if (gc->driContext)
+      return;
 #endif
 
-    opcode = __glXSetupForCommand(dpy);
-    if (!opcode)
-       return;
+   opcode = __glXSetupForCommand(dpy);
+   if (!opcode)
+      return;
 
-    LockDisplay(dpy);
-    GetReqExtra(GLXVendorPrivate, sizeof(CARD32)+sizeof(INT32),req);
-    req->reqType = opcode;
-    req->glxCode = X_GLXVendorPrivate;
-    req->vendorCode = X_GLXvop_ReleaseTexImageEXT;
-    req->contextTag = gc->currentContextTag;
+   LockDisplay(dpy);
+   GetReqExtra(GLXVendorPrivate, sizeof(CARD32) + sizeof(INT32), req);
+   req->reqType = opcode;
+   req->glxCode = X_GLXVendorPrivate;
+   req->vendorCode = X_GLXvop_ReleaseTexImageEXT;
+   req->contextTag = gc->currentContextTag;
 
-    drawable_ptr = (CARD32 *) (req + 1);
-    buffer_ptr = (INT32 *) (drawable_ptr + 1);
+   drawable_ptr = (CARD32 *) (req + 1);
+   buffer_ptr = (INT32 *) (drawable_ptr + 1);
 
-    *drawable_ptr = drawable;
-    *buffer_ptr = buffer;
+   *drawable_ptr = drawable;
+   *buffer_ptr = buffer;
 
-    UnlockDisplay(dpy);
-    SyncHandle();
+   UnlockDisplay(dpy);
+   SyncHandle();
 }
+
 /*@}*/
 
 /**
  * \c strdup is actually not a standard ANSI C or POSIX routine.
  * Irix will not define it if ANSI mode is in effect.
- * 
+ *
  * \sa strdup
  */
 _X_HIDDEN char *
@@ -2759,7 +2837,8 @@ __glXstrdup(const char *str)
 ** glXGetProcAddress support
 */
 
-struct name_address_pair {
+struct name_address_pair
+{
    const char *Name;
    GLvoid *Address;
 };
@@ -2769,139 +2848,139 @@ struct name_address_pair {
 
 static const struct name_address_pair GLX_functions[] = {
    /*** GLX_VERSION_1_0 ***/
-   GLX_FUNCTION( glXChooseVisual ),
-   GLX_FUNCTION( glXCopyContext ),
-   GLX_FUNCTION( glXCreateContext ),
-   GLX_FUNCTION( glXCreateGLXPixmap ),
-   GLX_FUNCTION( glXDestroyContext ),
-   GLX_FUNCTION( glXDestroyGLXPixmap ),
-   GLX_FUNCTION( glXGetConfig ),
-   GLX_FUNCTION( glXGetCurrentContext ),
-   GLX_FUNCTION( glXGetCurrentDrawable ),
-   GLX_FUNCTION( glXIsDirect ),
-   GLX_FUNCTION( glXMakeCurrent ),
-   GLX_FUNCTION( glXQueryExtension ),
-   GLX_FUNCTION( glXQueryVersion ),
-   GLX_FUNCTION( glXSwapBuffers ),
-   GLX_FUNCTION( glXUseXFont ),
-   GLX_FUNCTION( glXWaitGL ),
-   GLX_FUNCTION( glXWaitX ),
+   GLX_FUNCTION(glXChooseVisual),
+   GLX_FUNCTION(glXCopyContext),
+   GLX_FUNCTION(glXCreateContext),
+   GLX_FUNCTION(glXCreateGLXPixmap),
+   GLX_FUNCTION(glXDestroyContext),
+   GLX_FUNCTION(glXDestroyGLXPixmap),
+   GLX_FUNCTION(glXGetConfig),
+   GLX_FUNCTION(glXGetCurrentContext),
+   GLX_FUNCTION(glXGetCurrentDrawable),
+   GLX_FUNCTION(glXIsDirect),
+   GLX_FUNCTION(glXMakeCurrent),
+   GLX_FUNCTION(glXQueryExtension),
+   GLX_FUNCTION(glXQueryVersion),
+   GLX_FUNCTION(glXSwapBuffers),
+   GLX_FUNCTION(glXUseXFont),
+   GLX_FUNCTION(glXWaitGL),
+   GLX_FUNCTION(glXWaitX),
 
    /*** GLX_VERSION_1_1 ***/
-   GLX_FUNCTION( glXGetClientString ),
-   GLX_FUNCTION( glXQueryExtensionsString ),
-   GLX_FUNCTION( glXQueryServerString ),
+   GLX_FUNCTION(glXGetClientString),
+   GLX_FUNCTION(glXQueryExtensionsString),
+   GLX_FUNCTION(glXQueryServerString),
 
    /*** GLX_VERSION_1_2 ***/
-   GLX_FUNCTION( glXGetCurrentDisplay ),
+   GLX_FUNCTION(glXGetCurrentDisplay),
 
    /*** GLX_VERSION_1_3 ***/
-   GLX_FUNCTION( glXChooseFBConfig ),
-   GLX_FUNCTION( glXCreateNewContext ),
-   GLX_FUNCTION( glXCreatePbuffer ),
-   GLX_FUNCTION( glXCreatePixmap ),
-   GLX_FUNCTION( glXCreateWindow ),
-   GLX_FUNCTION( glXDestroyPbuffer ),
-   GLX_FUNCTION( glXDestroyPixmap ),
-   GLX_FUNCTION( glXDestroyWindow ),
-   GLX_FUNCTION( glXGetCurrentReadDrawable ),
-   GLX_FUNCTION( glXGetFBConfigAttrib ),
-   GLX_FUNCTION( glXGetFBConfigs ),
-   GLX_FUNCTION( glXGetSelectedEvent ),
-   GLX_FUNCTION( glXGetVisualFromFBConfig ),
-   GLX_FUNCTION( glXMakeContextCurrent ),
-   GLX_FUNCTION( glXQueryContext ),
-   GLX_FUNCTION( glXQueryDrawable ),
-   GLX_FUNCTION( glXSelectEvent ),
+   GLX_FUNCTION(glXChooseFBConfig),
+   GLX_FUNCTION(glXCreateNewContext),
+   GLX_FUNCTION(glXCreatePbuffer),
+   GLX_FUNCTION(glXCreatePixmap),
+   GLX_FUNCTION(glXCreateWindow),
+   GLX_FUNCTION(glXDestroyPbuffer),
+   GLX_FUNCTION(glXDestroyPixmap),
+   GLX_FUNCTION(glXDestroyWindow),
+   GLX_FUNCTION(glXGetCurrentReadDrawable),
+   GLX_FUNCTION(glXGetFBConfigAttrib),
+   GLX_FUNCTION(glXGetFBConfigs),
+   GLX_FUNCTION(glXGetSelectedEvent),
+   GLX_FUNCTION(glXGetVisualFromFBConfig),
+   GLX_FUNCTION(glXMakeContextCurrent),
+   GLX_FUNCTION(glXQueryContext),
+   GLX_FUNCTION(glXQueryDrawable),
+   GLX_FUNCTION(glXSelectEvent),
 
    /*** GLX_SGI_swap_control ***/
-   GLX_FUNCTION2( glXSwapIntervalSGI, __glXSwapIntervalSGI ),
+   GLX_FUNCTION2(glXSwapIntervalSGI, __glXSwapIntervalSGI),
 
    /*** GLX_SGI_video_sync ***/
-   GLX_FUNCTION2( glXGetVideoSyncSGI, __glXGetVideoSyncSGI ),
-   GLX_FUNCTION2( glXWaitVideoSyncSGI, __glXWaitVideoSyncSGI ),
+   GLX_FUNCTION2(glXGetVideoSyncSGI, __glXGetVideoSyncSGI),
+   GLX_FUNCTION2(glXWaitVideoSyncSGI, __glXWaitVideoSyncSGI),
 
    /*** GLX_SGI_make_current_read ***/
-   GLX_FUNCTION2( glXMakeCurrentReadSGI, glXMakeContextCurrent ),
-   GLX_FUNCTION2( glXGetCurrentReadDrawableSGI, glXGetCurrentReadDrawable ),
+   GLX_FUNCTION2(glXMakeCurrentReadSGI, glXMakeContextCurrent),
+   GLX_FUNCTION2(glXGetCurrentReadDrawableSGI, glXGetCurrentReadDrawable),
 
    /*** GLX_EXT_import_context ***/
-   GLX_FUNCTION( glXFreeContextEXT ),
-   GLX_FUNCTION( glXGetContextIDEXT ),
-   GLX_FUNCTION2( glXGetCurrentDisplayEXT, glXGetCurrentDisplay ),
-   GLX_FUNCTION( glXImportContextEXT ),
-   GLX_FUNCTION2( glXQueryContextInfoEXT, glXQueryContext ),
+   GLX_FUNCTION(glXFreeContextEXT),
+   GLX_FUNCTION(glXGetContextIDEXT),
+   GLX_FUNCTION2(glXGetCurrentDisplayEXT, glXGetCurrentDisplay),
+   GLX_FUNCTION(glXImportContextEXT),
+   GLX_FUNCTION2(glXQueryContextInfoEXT, glXQueryContext),
 
    /*** GLX_SGIX_fbconfig ***/
-   GLX_FUNCTION2( glXGetFBConfigAttribSGIX, glXGetFBConfigAttrib ),
-   GLX_FUNCTION2( glXChooseFBConfigSGIX, glXChooseFBConfig ),
-   GLX_FUNCTION( glXCreateGLXPixmapWithConfigSGIX ),
-   GLX_FUNCTION( glXCreateContextWithConfigSGIX ),
-   GLX_FUNCTION2( glXGetVisualFromFBConfigSGIX, glXGetVisualFromFBConfig ),
-   GLX_FUNCTION( glXGetFBConfigFromVisualSGIX ),
+   GLX_FUNCTION2(glXGetFBConfigAttribSGIX, glXGetFBConfigAttrib),
+   GLX_FUNCTION2(glXChooseFBConfigSGIX, glXChooseFBConfig),
+   GLX_FUNCTION(glXCreateGLXPixmapWithConfigSGIX),
+   GLX_FUNCTION(glXCreateContextWithConfigSGIX),
+   GLX_FUNCTION2(glXGetVisualFromFBConfigSGIX, glXGetVisualFromFBConfig),
+   GLX_FUNCTION(glXGetFBConfigFromVisualSGIX),
 
    /*** GLX_SGIX_pbuffer ***/
-   GLX_FUNCTION( glXCreateGLXPbufferSGIX ),
-   GLX_FUNCTION( glXDestroyGLXPbufferSGIX ),
-   GLX_FUNCTION( glXQueryGLXPbufferSGIX ),
-   GLX_FUNCTION( glXSelectEventSGIX ),
-   GLX_FUNCTION( glXGetSelectedEventSGIX ),
+   GLX_FUNCTION(glXCreateGLXPbufferSGIX),
+   GLX_FUNCTION(glXDestroyGLXPbufferSGIX),
+   GLX_FUNCTION(glXQueryGLXPbufferSGIX),
+   GLX_FUNCTION(glXSelectEventSGIX),
+   GLX_FUNCTION(glXGetSelectedEventSGIX),
 
    /*** GLX_SGIX_swap_group ***/
-   GLX_FUNCTION2( glXJoinSwapGroupSGIX, __glXJoinSwapGroupSGIX ),
+   GLX_FUNCTION2(glXJoinSwapGroupSGIX, __glXJoinSwapGroupSGIX),
 
    /*** GLX_SGIX_swap_barrier ***/
-   GLX_FUNCTION2( glXBindSwapBarrierSGIX, __glXBindSwapBarrierSGIX ),
-   GLX_FUNCTION2( glXQueryMaxSwapBarriersSGIX, __glXQueryMaxSwapBarriersSGIX ),
+   GLX_FUNCTION2(glXBindSwapBarrierSGIX, __glXBindSwapBarrierSGIX),
+   GLX_FUNCTION2(glXQueryMaxSwapBarriersSGIX, __glXQueryMaxSwapBarriersSGIX),
 
    /*** GLX_MESA_allocate_memory ***/
-   GLX_FUNCTION( glXAllocateMemoryMESA ),
-   GLX_FUNCTION( glXFreeMemoryMESA ),
-   GLX_FUNCTION( glXGetMemoryOffsetMESA ),
+   GLX_FUNCTION(glXAllocateMemoryMESA),
+   GLX_FUNCTION(glXFreeMemoryMESA),
+   GLX_FUNCTION(glXGetMemoryOffsetMESA),
 
    /*** GLX_MESA_copy_sub_buffer ***/
-   GLX_FUNCTION2( glXCopySubBufferMESA, __glXCopySubBufferMESA ),
+   GLX_FUNCTION2(glXCopySubBufferMESA, __glXCopySubBufferMESA),
 
    /*** GLX_MESA_pixmap_colormap ***/
-   GLX_FUNCTION( glXCreateGLXPixmapMESA ),
+   GLX_FUNCTION(glXCreateGLXPixmapMESA),
 
    /*** GLX_MESA_release_buffers ***/
-   GLX_FUNCTION2( glXReleaseBuffersMESA, __glXReleaseBuffersMESA ),
+   GLX_FUNCTION2(glXReleaseBuffersMESA, __glXReleaseBuffersMESA),
 
    /*** GLX_MESA_swap_control ***/
-   GLX_FUNCTION2( glXSwapIntervalMESA, __glXSwapIntervalMESA ),
-   GLX_FUNCTION2( glXGetSwapIntervalMESA, __glXGetSwapIntervalMESA ),
+   GLX_FUNCTION2(glXSwapIntervalMESA, __glXSwapIntervalMESA),
+   GLX_FUNCTION2(glXGetSwapIntervalMESA, __glXGetSwapIntervalMESA),
 
    /*** GLX_MESA_swap_frame_usage ***/
-   GLX_FUNCTION2( glXBeginFrameTrackingMESA, __glXBeginFrameTrackingMESA ),
-   GLX_FUNCTION2( glXEndFrameTrackingMESA, __glXEndFrameTrackingMESA ),
-   GLX_FUNCTION2( glXGetFrameUsageMESA, __glXGetFrameUsageMESA ),
-   GLX_FUNCTION2( glXQueryFrameTrackingMESA, __glXQueryFrameTrackingMESA ),
+   GLX_FUNCTION2(glXBeginFrameTrackingMESA, __glXBeginFrameTrackingMESA),
+   GLX_FUNCTION2(glXEndFrameTrackingMESA, __glXEndFrameTrackingMESA),
+   GLX_FUNCTION2(glXGetFrameUsageMESA, __glXGetFrameUsageMESA),
+   GLX_FUNCTION2(glXQueryFrameTrackingMESA, __glXQueryFrameTrackingMESA),
 
    /*** GLX_ARB_get_proc_address ***/
-   GLX_FUNCTION( glXGetProcAddressARB ),
+   GLX_FUNCTION(glXGetProcAddressARB),
 
    /*** GLX 1.4 ***/
-   GLX_FUNCTION2( glXGetProcAddress, glXGetProcAddressARB ),
+   GLX_FUNCTION2(glXGetProcAddress, glXGetProcAddressARB),
 
    /*** GLX_OML_sync_control ***/
-   GLX_FUNCTION2( glXWaitForSbcOML, __glXWaitForSbcOML ),
-   GLX_FUNCTION2( glXWaitForMscOML, __glXWaitForMscOML ),
-   GLX_FUNCTION2( glXSwapBuffersMscOML, __glXSwapBuffersMscOML ),
-   GLX_FUNCTION2( glXGetMscRateOML, __glXGetMscRateOML ),
-   GLX_FUNCTION2( glXGetSyncValuesOML, __glXGetSyncValuesOML ),
+   GLX_FUNCTION2(glXWaitForSbcOML, __glXWaitForSbcOML),
+   GLX_FUNCTION2(glXWaitForMscOML, __glXWaitForMscOML),
+   GLX_FUNCTION2(glXSwapBuffersMscOML, __glXSwapBuffersMscOML),
+   GLX_FUNCTION2(glXGetMscRateOML, __glXGetMscRateOML),
+   GLX_FUNCTION2(glXGetSyncValuesOML, __glXGetSyncValuesOML),
 
    /*** GLX_EXT_texture_from_pixmap ***/
-   GLX_FUNCTION2( glXBindTexImageEXT, __glXBindTexImageEXT ),
-   GLX_FUNCTION2( glXReleaseTexImageEXT, __glXReleaseTexImageEXT ),
+   GLX_FUNCTION2(glXBindTexImageEXT, __glXBindTexImageEXT),
+   GLX_FUNCTION2(glXReleaseTexImageEXT, __glXReleaseTexImageEXT),
 
 #ifdef GLX_DIRECT_RENDERING
    /*** DRI configuration ***/
-   GLX_FUNCTION( glXGetScreenDriver ),
-   GLX_FUNCTION( glXGetDriverConfig ),
+   GLX_FUNCTION(glXGetScreenDriver),
+   GLX_FUNCTION(glXGetDriverConfig),
 #endif
 
-   { NULL, NULL }   /* end of list */
+   {NULL, NULL}                 /* end of list */
 };
 
 
@@ -2913,7 +2992,7 @@ get_glx_proc_address(const char *funcName)
    /* try static functions */
    for (i = 0; GLX_functions[i].Name; i++) {
       if (strcmp(GLX_functions[i].Name, funcName) == 0)
-        return GLX_functions[i].Address;
+         return GLX_functions[i].Address;
    }
 
    return NULL;
@@ -2929,9 +3008,9 @@ get_glx_proc_address(const char *funcName)
  *
  * \sa glXGetProcAddress
  */
-PUBLIC void (*glXGetProcAddressARB(const GLubyte *procName))( void )
+PUBLIC void (*glXGetProcAddressARB(const GLubyte * procName)) (void)
 {
-   typedef void (*gl_function)( void );
+   typedef void (*gl_function) (void);
    gl_function f;
 
 
@@ -2943,8 +3022,8 @@ PUBLIC void (*glXGetProcAddressARB(const GLubyte *procName))( void )
     */
 
    f = (gl_function) get_glx_proc_address((const char *) procName);
-   if ( (f == NULL) && (procName[0] == 'g') && (procName[1] == 'l')
-       && (procName[2] != 'X') ) {
+   if ((f == NULL) && (procName[0] == 'g') && (procName[1] == 'l')
+       && (procName[2] != 'X')) {
       f = (gl_function) _glapi_get_proc_address((const char *) procName);
    }
 
@@ -2960,9 +3039,9 @@ PUBLIC void (*glXGetProcAddressARB(const GLubyte *procName))( void )
  *
  * \sa glXGetProcAddressARB
  */
-PUBLIC void (*glXGetProcAddress(const GLubyte *procName))( void )
+PUBLIC void (*glXGetProcAddress(const GLubyte * procName)) (void)
 #if defined(__GNUC__) && !defined(GLX_ALIAS_UNSUPPORTED)
-    __attribute__ ((alias ("glXGetProcAddressARB")));
+   __attribute__ ((alias("glXGetProcAddressARB")));
 #else
 {
    return glXGetProcAddressARB(procName);
@@ -2980,24 +3059,26 @@ PUBLIC void (*glXGetProcAddress(const GLubyte *procName))( void )
  *
  * \param ust Location to store the 64-bit UST
  * \returns Zero on success or a negative errno value on failure.
- * 
+ *
  * \sa glXGetProcAddress, PFNGLXGETUSTPROC
  *
  * \since Internal API version 20030317.
  */
-_X_HIDDEN int __glXGetUST( int64_t * ust )
-{
-    struct timeval  tv;
-    
-    if ( ust == NULL ) {
-       return -EFAULT;
-    }
-
-    if ( gettimeofday( & tv, NULL ) == 0 ) {
-       ust[0] = (tv.tv_sec * 1000000) + tv.tv_usec;
-       return 0;
-    } else {
-       return -errno;
-    }
+_X_HIDDEN int
+__glXGetUST(int64_t * ust)
+{
+   struct timeval tv;
+
+   if (ust == NULL) {
+      return -EFAULT;
+   }
+
+   if (gettimeofday(&tv, NULL) == 0) {
+      ust[0] = (tv.tv_sec * 1000000) + tv.tv_usec;
+      return 0;
+   }
+   else {
+      return -errno;
+   }
 }
 #endif /* GLX_DIRECT_RENDERING */
index d44e0dd..f1e3e16 100644 (file)
@@ -73,45 +73,7 @@ static __GLapi *IndirectAPI = NULL;
  * Current context management and locking
  */
 
-#if defined( USE_XTHREADS )
-
-/* thread safe */
-static GLboolean TSDinitialized = GL_FALSE;
-static xthread_key_t ContextTSD;
-
-_X_HIDDEN __GLXcontext *
-__glXGetCurrentContext(void)
-{
-   if (!TSDinitialized) {
-      xthread_key_create(&ContextTSD, NULL);
-      TSDinitialized = GL_TRUE;
-      return &dummyContext;
-   }
-   else {
-      void *p;
-      xthread_get_specific(ContextTSD, &p);
-      if (!p)
-         return &dummyContext;
-      else
-         return (__GLXcontext *) p;
-   }
-}
-
-_X_HIDDEN void
-__glXSetCurrentContext(__GLXcontext * c)
-{
-   if (!TSDinitialized) {
-      xthread_key_create(&ContextTSD, NULL);
-      TSDinitialized = GL_TRUE;
-   }
-   xthread_set_specific(ContextTSD, c);
-}
-
-
-/* Used by the __glXLock() and __glXUnlock() macros */
-_X_HIDDEN xmutex_rec __glXmutex;
-
-#elif defined( PTHREADS )
+#if defined( PTHREADS )
 
 _X_HIDDEN pthread_mutex_t __glXmutex = PTHREAD_MUTEX_INITIALIZER;
 
@@ -119,7 +81,7 @@ _X_HIDDEN pthread_mutex_t __glXmutex = PTHREAD_MUTEX_INITIALIZER;
 
 /**
  * Per-thread GLX context pointer.
- * 
+ *
  * \c __glXSetCurrentContext is written is such a way that this pointer can
  * \b never be \c NULL.  This is important!  Because of this
  * \c __glXGetCurrentContext can be implemented as trivial macro.
@@ -139,7 +101,7 @@ static pthread_once_t once_control = PTHREAD_ONCE_INIT;
 
 /**
  * Per-thread data key.
- * 
+ *
  * Once \c init_thread_data has been called, the per-thread data key will
  * take a value of \c NULL.  As each new thread is created the default
  * value, in that thread, will be \c NULL.
@@ -148,7 +110,7 @@ static pthread_key_t ContextTSD;
 
 /**
  * Initialize the per-thread data key.
- * 
+ *
  * This function is called \b exactly once per-process (not per-thread!) to
  * initialize the per-thread data key.  This is ideally done using the
  * \c pthread_once mechanism.
@@ -340,8 +302,8 @@ FetchDRIDrawable(Display * dpy, GLXDrawable glxDrawable, GLXContext gc)
 #endif /* GLX_DIRECT_RENDERING */
 
 static void
-__glXGenerateError(Display *dpy, GLXContext gc, XID resource,
-                  BYTE errorCode, CARD16 minorCode)
+__glXGenerateError(Display * dpy, GLXContext gc, XID resource,
+                   BYTE errorCode, CARD16 minorCode)
 {
    xError error;
 
@@ -356,7 +318,7 @@ __glXGenerateError(Display *dpy, GLXContext gc, XID resource,
 
 /**
  * Make a particular context current.
- * 
+ *
  * \note This is in this file so that it can access dummyContext.
  */
 static Bool
@@ -385,21 +347,19 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw,
 
    if (gc == NULL && (draw != None || read != None)) {
       __glXGenerateError(dpy, gc, (draw != None) ? draw : read,
-                        BadMatch, X_GLXMakeContextCurrent);
+                         BadMatch, X_GLXMakeContextCurrent);
       return False;
    }
    if (gc != NULL && (draw == None || read == None)) {
-      __glXGenerateError(dpy, gc, None,
-                        BadMatch, X_GLXMakeContextCurrent);
+      __glXGenerateError(dpy, gc, None, BadMatch, X_GLXMakeContextCurrent);
       return False;
    }
 
    _glapi_check_multithread();
 
-   if (gc != NULL && gc->thread_id != 0 &&
-       gc->thread_id != _glthread_GetID()) {
+   if (gc != NULL && gc->thread_id != 0 && gc->thread_id != _glthread_GetID()) {
       __glXGenerateError(dpy, gc, gc->xid,
-                        BadAccess, X_GLXMakeContextCurrent);
+                         BadAccess, X_GLXMakeContextCurrent);
       return False;
    }
 
@@ -411,7 +371,7 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw,
 
       if ((pdraw == NULL) || (pread == NULL)) {
          __glXGenerateError(dpy, gc, (pdraw == NULL) ? draw : read,
-                           GLXBadDrawable, X_GLXMakeContextCurrent);
+                            GLXBadDrawable, X_GLXMakeContextCurrent);
          return False;
       }
 
@@ -559,6 +519,5 @@ GLX_ALIAS(Bool, glXMakeCurrentReadSGI,
 
 PUBLIC
 GLX_ALIAS(Bool, glXMakeContextCurrent,
-         (Display * dpy, GLXDrawable d, GLXDrawable r,
-          GLXContext ctx), (dpy, d, r, ctx),
-         MakeContextCurrent)
+          (Display * dpy, GLXDrawable d, GLXDrawable r,
+           GLXContext ctx), (dpy, d, r, ctx), MakeContextCurrent)
index b296b7c..e5553cb 100644 (file)
@@ -102,19 +102,19 @@ static
 XEXT_GENERATE_ERROR_STRING(__glXErrorString, __glXExtensionName,
                            __GLX_NUMBER_ERRORS, error_list)
 
-     static /* const */ XExtensionHooks __glXExtensionHooks = {
-        NULL,                   /* create_gc */
-        NULL,                   /* copy_gc */
-        NULL,                   /* flush_gc */
-        NULL,                   /* free_gc */
-        NULL,                   /* create_font */
-        NULL,                   /* free_font */
-        __glXCloseDisplay,      /* close_display */
-        NULL,                   /* wire_to_event */
-        NULL,                   /* event_to_wire */
-        NULL,                   /* error */
-        __glXErrorString,       /* error_string */
-     };
+static /* const */ XExtensionHooks __glXExtensionHooks = {
+  NULL,                   /* create_gc */
+  NULL,                   /* copy_gc */
+  NULL,                   /* flush_gc */
+  NULL,                   /* free_gc */
+  NULL,                   /* create_font */
+  NULL,                   /* free_font */
+  __glXCloseDisplay,      /* close_display */
+  NULL,                   /* wire_to_event */
+  NULL,                   /* event_to_wire */
+  NULL,                   /* error */
+  __glXErrorString,       /* error_string */
+};
 
 static
 XEXT_GENERATE_FIND_DISPLAY(__glXFindDisplay, __glXExtensionInfo,
@@ -149,6 +149,12 @@ FreeScreenConfigs(__GLXdisplayPrivate * priv)
       Xfree((char *) psc->serverGLXexts);
 
 #ifdef GLX_DIRECT_RENDERING
+      if (psc->driver_configs) {
+         for (unsigned int i = 0; psc->driver_configs[i]; i++)
+            free((__DRIconfig *) psc->driver_configs[i]);
+         free(psc->driver_configs);
+         psc->driver_configs = NULL;
+      }
       if (psc->driScreen) {
          psc->driScreen->destroyScreen(psc);
          __glxHashDestroy(psc->drawHash);
@@ -211,15 +217,14 @@ QueryVersion(Display * dpy, int opcode, int *major, int *minor)
 {
 #ifdef USE_XCB
    xcb_connection_t *c = XGetXCBConnection(dpy);
-   xcb_glx_query_version_reply_t* reply =
-      xcb_glx_query_version_reply(c,
-                                  xcb_glx_query_version(c,
-                                                        GLX_MAJOR_VERSION,
-                                                        GLX_MINOR_VERSION),
-                                  NULL);
-
-   if(reply->major_version != GLX_MAJOR_VERSION)
-   {
+   xcb_glx_query_version_reply_t *reply = xcb_glx_query_version_reply(c,
+                                                                      xcb_glx_query_version
+                                                                      (c,
+                                                                       GLX_MAJOR_VERSION,
+                                                                       GLX_MINOR_VERSION),
+                                                                      NULL);
+
+   if (reply->major_version != GLX_MAJOR_VERSION) {
       free(reply);
       return GL_FALSE;
    }
@@ -537,7 +542,8 @@ getFBConfigs(Display * dpy, __GLXdisplayPrivate * priv, int screen)
    __GLXscreenConfigs *psc;
 
    psc = priv->screenConfigs + screen;
-   psc->serverGLXexts = __glXQueryServerString(dpy, priv->majorOpcode, screen, GLX_EXTENSIONS);
+   psc->serverGLXexts =
+      __glXQueryServerString(dpy, priv->majorOpcode, screen, GLX_EXTENSIONS);
 
    LockDisplay(dpy);
 
@@ -595,7 +601,8 @@ AllocAndFetchScreenConfigs(Display * dpy, __GLXdisplayPrivate * priv)
    memset(psc, 0, screens * sizeof(__GLXscreenConfigs));
    priv->screenConfigs = psc;
 
-   priv->serverGLXversion = __glXQueryServerString(dpy, priv->majorOpcode, 0, GLX_VERSION);
+   priv->serverGLXversion =
+      __glXQueryServerString(dpy, priv->majorOpcode, 0, GLX_VERSION);
    if (priv->serverGLXversion == NULL) {
       FreeScreenConfigs(priv);
       return GL_FALSE;
@@ -646,17 +653,6 @@ __glXInitialize(Display * dpy)
    Bool glx_direct, glx_accel;
 #endif
 
-#if defined(USE_XTHREADS)
-   {
-      static int firstCall = 1;
-      if (firstCall) {
-         /* initialize the GLX mutexes */
-         xmutex_init(&__glXmutex);
-         firstCall = 0;
-      }
-   }
-#endif
-
    /* The one and only long long lock */
    __glXLock();
 
@@ -791,10 +787,10 @@ __glXSetupForCommand(Display * dpy)
 
 /**
  * Flush the drawing command transport buffer.
- * 
+ *
  * \param ctx  Context whose transport buffer is to be flushed.
  * \param pc   Pointer to first unused buffer location.
- * 
+ *
  * \todo
  * Modify this function to use \c ctx->pc instead of the explicit
  * \c pc parameter.
@@ -886,11 +882,11 @@ __glXSendLargeChunk(__GLXcontext * gc, GLint requestNumber,
 
 /**
  * Send a command that is too large for the GLXRender protocol request.
- * 
+ *
  * Send a large command, one that is too large for some reason to
  * send using the GLXRender protocol request.  One reason to send
  * a large command is to avoid copying the data.
- * 
+ *
  * \param ctx        GLX context
  * \param header     Header data.
  * \param headerLen  Size, in bytes, of the header data.  It is assumed that
index 051433a..473f46d 100644 (file)
@@ -315,10 +315,10 @@ set_glx_extension(const struct extension_info *ext,
 
 /**
  * Convert the server's extension string to a bit-field.
- * 
+ *
  * \param server_string   GLX extension string from the server.
  * \param server_support  Bit-field of supported extensions.
- * 
+ *
  * \note
  * This function is used to process both GLX and GL extension strings.  The
  * bit-fields used to track each of these have different sizes.  Therefore,
@@ -336,8 +336,7 @@ __glXProcessServerString(const struct extension_info *ext,
       /* Determine the length of the next extension name.
        */
       for (len = 0; (server_string[base + len] != SEPARATOR)
-           && (server_string[base + len] != NUL);
-           len++) {
+           && (server_string[base + len] != NUL); len++) {
          /* empty */
       }
 
@@ -351,8 +350,7 @@ __glXProcessServerString(const struct extension_info *ext,
        * over the previous string and any trialing white-space.
        */
       for (base += len; (server_string[base] == SEPARATOR)
-           && (server_string[base] != NUL);
-           base++) {
+           && (server_string[base] != NUL); base++) {
          /* empty */
       }
    }
@@ -549,7 +547,7 @@ __glXGetClientExtensions(void)
 /**
  * Calculate the list of application usable extensions.  The resulting
  * string is stored in \c psc->effectiveGLXexts.
- * 
+ *
  * \param psc                        Pointer to GLX per-screen record.
  * \param display_is_direct_capable  True if the display is capable of
  *                                   direct rendering.
@@ -600,7 +598,7 @@ __glXCalculateUsableExtensions(__GLXscreenConfigs * psc,
     * it and the "server" supports it.  In this case that means that either
     * the true server supports it or it is only for direct-rendering and
     * the direct rendering driver supports it.
-    * 
+    *
     * If the display is not capable of direct rendering, then the extension
     * is enabled if and only if the client-side library and the server
     * support it.
@@ -609,10 +607,10 @@ __glXCalculateUsableExtensions(__GLXscreenConfigs * psc,
    if (display_is_direct_capable) {
       for (i = 0; i < 8; i++) {
          usable[i] = (client_glx_support[i] & client_glx_only[i])
-            | (client_glx_support[i] & psc->
-               direct_support[i] & server_support[i])
-            | (client_glx_support[i] & psc->
-               direct_support[i] & direct_glx_only[i]);
+            | (client_glx_support[i] & psc->direct_support[i] &
+               server_support[i])
+            | (client_glx_support[i] & psc->direct_support[i] &
+               direct_glx_only[i]);
       }
    }
    else {
@@ -630,7 +628,7 @@ __glXCalculateUsableExtensions(__GLXscreenConfigs * psc,
 /**
  * Calculate the list of application usable extensions.  The resulting
  * string is stored in \c gc->extensions.
- * 
+ *
  * \param gc             Pointer to GLX context.
  * \param server_string  Extension string from the server.
  * \param major_version  GL major version from the server.
index 54c039d..cdaf02f 100644 (file)
@@ -192,6 +192,10 @@ __glTexParameterfv_size(GLenum e)
     case GL_TEXTURE_MAX_ANISOTROPY_EXT:
     case GL_TEXTURE_LOD_BIAS:
 /*      case GL_TEXTURE_LOD_BIAS_EXT:*/
+    case GL_TEXTURE_STORAGE_HINT_APPLE:
+    case GL_STORAGE_PRIVATE_APPLE:
+    case GL_STORAGE_CACHED_APPLE:
+    case GL_STORAGE_SHARED_APPLE:
     case GL_DEPTH_TEXTURE_MODE:
 /*      case GL_DEPTH_TEXTURE_MODE_ARB:*/
     case GL_TEXTURE_COMPARE_MODE:
index bb5232f..ad98825 100644 (file)
@@ -1,18 +1,18 @@
 /*
  * (C) Copyright IBM Corporation 2004, 2005
  * All Rights Reserved.
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
  * the rights to use, copy, modify, merge, publish, distribute, sub license,
  * and/or sell copies of the Software, and to permit persons to whom the
  * Software is furnished to do so, subject to the following conditions:
- * 
+ *
  * The above copyright notice and this permission notice (including the next
  * paragraph) shall be included in all copies or substantial portions of the
  * Software.
- * 
+ *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
@@ -39,7 +39,7 @@
 /**
  * \file indirect_vertex_array.c
  * Implement GLX protocol for vertex arrays and vertex buffer objects.
- * 
+ *
  * The most important function in this fill is \c fill_array_info_cache.
  * The \c array_state_vector contains a cache of the ARRAY_INFO data sent
  * in the DrawArrays protocol.  Certain operations, such as enabling or
@@ -47,7 +47,7 @@
  * fills-in this data.  Additionally, it examines the enabled state and
  * other factors to determine what "version" of DrawArrays protocoal can be
  * used.
- * 
+ *
  * Current, only two versions of DrawArrays protocol are implemented.  The
  * first version is the "none" protocol.  This is the fallback when the
  * server does not support GL 1.1 / EXT_vertex_arrays.  It is implemented
@@ -90,11 +90,11 @@ static GLboolean validate_type(__GLXcontext * gc, GLenum type);
 
 
 /**
- * Table of sizes, in bytes, of a GL types.  All of the type enums are be in 
+ * Table of sizes, in bytes, of a GL types.  All of the type enums are be in
  * the range 0x1400 - 0x140F.  That includes types added by extensions (i.e.,
  * \c GL_HALF_FLOAT_NV).  This elements of this table correspond to the
  * type enums masked with 0x0f.
- * 
+ *
  * \notes
  * \c GL_HALF_FLOAT_NV is not included.  Neither are \c GL_2_BYTES,
  * \c GL_3_BYTES, or \c GL_4_BYTES.
@@ -131,15 +131,15 @@ __glXFreeVertexArrayState(__GLXcontext * gc)
 
 /**
  * Initialize vertex array state of a GLX context.
- * 
+ *
  * \param gc  GLX context whose vertex array state is to be initialized.
- * 
+ *
  * \warning
  * This function may only be called after __GLXcontext::gl_extension_bits,
  * __GLXcontext::server_minor, and __GLXcontext::server_major have been
  * initialized.  These values are used to determine what vertex arrays are
  * supported.
- * 
+ *
  * \bug
  * Return values from malloc are not properly tested.
  */
@@ -171,7 +171,7 @@ __glXInitVertexArrayState(__GLXcontext * gc)
     * are supported by the server are create.  For example, if the server
     * supports only 2 texture units, then only 2 texture coordinate arrays
     * are created.
-    * 
+    *
     * At the very least, GL_VERTEX_ARRAY, GL_NORMAL_ARRAY,
     * GL_COLOR_ARRAY, GL_INDEX_ARRAY, GL_TEXTURE_COORD_ARRAY, and
     * GL_EDGE_FLAG_ARRAY are supported.
@@ -532,7 +532,7 @@ emit_DrawArrays_none(GLenum mode, GLint first, GLsizei count)
 /**
  * Emit the header data for the GL 1.1 / EXT_vertex_arrays DrawArrays
  * protocol.
- * 
+ *
  * \param gc                    GLX context.
  * \param arrays                Array state.
  * \param elements_per_request  Location to store the number of elements that
@@ -543,7 +543,7 @@ emit_DrawArrays_none(GLenum mode, GLint first, GLsizei count)
  *                              will be zero.
  * \param mode                  Drawing mode.
  * \param count                 Number of vertices.
- * 
+ *
  * \returns
  * A pointer to the buffer for array data.
  */
@@ -594,7 +594,7 @@ emit_DrawArrays_header_old(__GLXcontext * gc,
       /* Calculate the number of data packets that will be required to send
        * the whole command.  To do this, the number of verticies that
        * will fit in a single buffer must be calculated.
-       * 
+       *
        * The important value here is elements_per_request.  This is the
        * number of complete array elements that will fit in a single
        * buffer.  There may be some wasted space at the end of the buffer,
@@ -869,7 +869,7 @@ emit_DrawElements_old(GLenum mode, GLsizei count, GLenum type,
 /**
  * Validate that the \c mode parameter to \c glDrawArrays, et. al. is valid.
  * If it is not valid, then an error code is set in the GLX context.
- * 
+ *
  * \returns
  * \c GL_TRUE if the argument is valid, \c GL_FALSE if is not.
  */
@@ -902,7 +902,7 @@ validate_mode(__GLXcontext * gc, GLenum mode)
  * A value less than zero is invalid and will result in \c GL_INVALID_VALUE
  * being set.  A value of zero will not result in an error being set, but
  * will result in \c GL_FALSE being returned.
- * 
+ *
  * \returns
  * \c GL_TRUE if the argument is valid, \c GL_FALSE if it is not.
  */
@@ -1084,21 +1084,21 @@ __indirect_glMultiDrawElementsEXT(GLenum mode, const GLsizei * count,
 
 
 #define COMMON_ARRAY_DATA_INIT(a, PTR, TYPE, STRIDE, COUNT, NORMALIZED, HDR_SIZE, OPCODE) \
-    do { \
-       (a)->data = PTR; \
-       (a)->data_type = TYPE; \
-       (a)->user_stride = STRIDE; \
-       (a)->count = COUNT; \
-       (a)->normalized = NORMALIZED; \
-       \
-       (a)->element_size = __glXTypeSize( TYPE ) * COUNT; \
-       (a)->true_stride = (STRIDE == 0) \
-         ? (a)->element_size : STRIDE; \
-       \
-       (a)->header_size = HDR_SIZE; \
-       ((uint16_t *) (a)->header)[0] = __GLX_PAD((a)->header_size + (a)->element_size); \
-       ((uint16_t *) (a)->header)[1] = OPCODE; \
-    } while(0)
+  do {                                                                  \
+    (a)->data = PTR;                                                    \
+    (a)->data_type = TYPE;                                              \
+    (a)->user_stride = STRIDE;                                          \
+    (a)->count = COUNT;                                                 \
+    (a)->normalized = NORMALIZED;                                       \
+                                                                        \
+    (a)->element_size = __glXTypeSize( TYPE ) * COUNT;                  \
+    (a)->true_stride = (STRIDE == 0)                                    \
+      ? (a)->element_size : STRIDE;                                     \
+                                                                        \
+    (a)->header_size = HDR_SIZE;                                        \
+    ((uint16_t *) (a)->header)[0] = __GLX_PAD((a)->header_size + (a)->element_size); \
+    ((uint16_t *) (a)->header)[1] = OPCODE;                             \
+  } while(0)
 
 
 void
@@ -1363,36 +1363,36 @@ __indirect_glTexCoordPointer(GLint size, GLenum type, GLsizei stride,
 {
    static const uint16_t short_ops[5] = {
       0, X_GLrop_TexCoord1sv, X_GLrop_TexCoord2sv, X_GLrop_TexCoord3sv,
-         X_GLrop_TexCoord4sv
+      X_GLrop_TexCoord4sv
    };
    static const uint16_t int_ops[5] = {
       0, X_GLrop_TexCoord1iv, X_GLrop_TexCoord2iv, X_GLrop_TexCoord3iv,
-         X_GLrop_TexCoord4iv
+      X_GLrop_TexCoord4iv
    };
    static const uint16_t float_ops[5] = {
       0, X_GLrop_TexCoord1dv, X_GLrop_TexCoord2fv, X_GLrop_TexCoord3fv,
-         X_GLrop_TexCoord4fv
+      X_GLrop_TexCoord4fv
    };
    static const uint16_t double_ops[5] = {
       0, X_GLrop_TexCoord1dv, X_GLrop_TexCoord2dv, X_GLrop_TexCoord3dv,
-         X_GLrop_TexCoord4dv
+      X_GLrop_TexCoord4dv
    };
 
    static const uint16_t mshort_ops[5] = {
       0, X_GLrop_MultiTexCoord1svARB, X_GLrop_MultiTexCoord2svARB,
-         X_GLrop_MultiTexCoord3svARB, X_GLrop_MultiTexCoord4svARB
+      X_GLrop_MultiTexCoord3svARB, X_GLrop_MultiTexCoord4svARB
    };
    static const uint16_t mint_ops[5] = {
       0, X_GLrop_MultiTexCoord1ivARB, X_GLrop_MultiTexCoord2ivARB,
-         X_GLrop_MultiTexCoord3ivARB, X_GLrop_MultiTexCoord4ivARB
+      X_GLrop_MultiTexCoord3ivARB, X_GLrop_MultiTexCoord4ivARB
    };
    static const uint16_t mfloat_ops[5] = {
       0, X_GLrop_MultiTexCoord1dvARB, X_GLrop_MultiTexCoord2fvARB,
-         X_GLrop_MultiTexCoord3fvARB, X_GLrop_MultiTexCoord4fvARB
+      X_GLrop_MultiTexCoord3fvARB, X_GLrop_MultiTexCoord4fvARB
    };
    static const uint16_t mdouble_ops[5] = {
       0, X_GLrop_MultiTexCoord1dvARB, X_GLrop_MultiTexCoord2dvARB,
-         X_GLrop_MultiTexCoord3dvARB, X_GLrop_MultiTexCoord4dvARB
+      X_GLrop_MultiTexCoord3dvARB, X_GLrop_MultiTexCoord4dvARB
    };
 
    uint16_t opcode;
index 0b2d511..d128ba2 100644 (file)
@@ -147,7 +147,7 @@ __indirect_glGetError(void)
 
 /**
  * Get the selected attribute from the client state.
- * 
+ *
  * \returns
  * On success \c GL_TRUE is returned.  Otherwise, \c GL_FALSE is returned.
  */
@@ -679,7 +679,8 @@ __indirect_glGetString(GLenum name)
     */
 
    (void) __glXFlushRenderBuffer(gc, gc->pc);
-   s = (GLubyte *) __glXGetString(dpy, gc->majorOpcode, gc->currentContextTag, name);
+   s = (GLubyte *) __glXGetString(dpy, gc->majorOpcode, gc->currentContextTag,
+                                  name);
    if (!s) {
       /* Throw data on the floor */
       __glXSetError(gc, GL_OUT_OF_MEMORY);
@@ -753,7 +754,7 @@ __indirect_glGetString(GLenum name)
              * hardware accelerated.  For example, a TNT will show core
              * version 1.5, but most of the post-1.2 functionality is a
              * software fallback.
-             * 
+             *
              * I don't want to break applications that rely on this odd
              * behavior.  At the same time, the code is written and tested,
              * so I didn't want to throw it away.  Therefore, the code is here
@@ -766,7 +767,7 @@ __indirect_glGetString(GLenum name)
              * gc->server_minor are set.  This version may be higher than we
              * can completely support, but it may imply support for some
              * extensions that we can support.
-             * 
+             *
              * For example, at the time of this writing, the client-side
              * library only supports upto core GL version 1.2.  However, cubic
              * textures, multitexture, multisampling, and some other 1.3
@@ -880,50 +881,50 @@ GLboolean
 __indirect_glAreTexturesResident(GLsizei n, const GLuint * textures,
                                  GLboolean * residences)
 {
-    __GLXcontext *const gc = __glXGetCurrentContext();
-    Display *const dpy = gc->currentDpy;
-    GLboolean retval = (GLboolean) 0;
-    const GLuint cmdlen = 4 + __GLX_PAD((n * 4));
-    if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
+   __GLXcontext *const gc = __glXGetCurrentContext();
+   Display *const dpy = gc->currentDpy;
+   GLboolean retval = (GLboolean) 0;
+   const GLuint cmdlen = 4 + __GLX_PAD((n * 4));
+   if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
 #ifdef USE_XCB
-        xcb_connection_t *c = XGetXCBConnection(dpy);
-        (void) __glXFlushRenderBuffer(gc, gc->pc);
-        xcb_glx_are_textures_resident_reply_t *reply =
-            xcb_glx_are_textures_resident_reply(c,
-                                                xcb_glx_are_textures_resident
-                                                (c, gc->currentContextTag, n,
-                                                 textures), NULL);
-        (void) memcpy(residences, xcb_glx_are_textures_resident_data(reply),
-                      xcb_glx_are_textures_resident_data_length(reply) *
-                      sizeof(GLboolean));
-        retval = reply->ret_val;
-        free(reply);
+      xcb_connection_t *c = XGetXCBConnection(dpy);
+      (void) __glXFlushRenderBuffer(gc, gc->pc);
+      xcb_glx_are_textures_resident_reply_t *reply =
+         xcb_glx_are_textures_resident_reply(c,
+                                             xcb_glx_are_textures_resident
+                                             (c, gc->currentContextTag, n,
+                                              textures), NULL);
+      (void) memcpy(residences, xcb_glx_are_textures_resident_data(reply),
+                    xcb_glx_are_textures_resident_data_length(reply) *
+                    sizeof(GLboolean));
+      retval = reply->ret_val;
+      free(reply);
 #else
-        GLubyte const *pc =
-            __glXSetupSingleRequest(gc, X_GLsop_AreTexturesResident, cmdlen);
-        (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
-        (void) memcpy((void *) (pc + 4), (void *) (textures), (n * 4));
-        if (n & 3) {
-           /* n is not a multiple of four.
-            * When reply_is_always_array is TRUE, __glXReadReply() will
-            * put a multiple of four bytes into the dest buffer.  If the
-            * caller's buffer is not a multiple of four in size, we'll write
-            * out of bounds.  So use a temporary buffer that's a few bytes
-            * larger.
-            */
-           GLboolean *res4 = malloc((n + 3) & ~3);
-           retval = (GLboolean) __glXReadReply(dpy, 1, res4, GL_TRUE);
-           memcpy(residences, res4, n);
-           free(res4);
-        }
-        else {
-           retval = (GLboolean) __glXReadReply(dpy, 1, residences, GL_TRUE);
-        }
-        UnlockDisplay(dpy);
-        SyncHandle();
+      GLubyte const *pc =
+         __glXSetupSingleRequest(gc, X_GLsop_AreTexturesResident, cmdlen);
+      (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
+      (void) memcpy((void *) (pc + 4), (void *) (textures), (n * 4));
+      if (n & 3) {
+         /* n is not a multiple of four.
+          * When reply_is_always_array is TRUE, __glXReadReply() will
+          * put a multiple of four bytes into the dest buffer.  If the
+          * caller's buffer is not a multiple of four in size, we'll write
+          * out of bounds.  So use a temporary buffer that's a few bytes
+          * larger.
+          */
+         GLboolean *res4 = malloc((n + 3) & ~3);
+         retval = (GLboolean) __glXReadReply(dpy, 1, res4, GL_TRUE);
+         memcpy(residences, res4, n);
+         free(res4);
+      }
+      else {
+         retval = (GLboolean) __glXReadReply(dpy, 1, residences, GL_TRUE);
+      }
+      UnlockDisplay(dpy);
+      SyncHandle();
 #endif /* USE_XCB */
-    }
-    return retval;
+   }
+   return retval;
 }
 
 
@@ -936,36 +937,37 @@ GLboolean
 glAreTexturesResidentEXT(GLsizei n, const GLuint * textures,
                          GLboolean * residences)
 {
-    __GLXcontext *const gc = __glXGetCurrentContext();
-
-    if (gc->isDirect) {
-        return CALL_AreTexturesResident(GET_DISPATCH(),
-                                        (n, textures, residences));
-    } else {
-        __GLXcontext *const gc = __glXGetCurrentContext();
-        Display *const dpy = gc->currentDpy;
-        GLboolean retval = (GLboolean) 0;
-        const GLuint cmdlen = 4 + __GLX_PAD((n * 4));
-        if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
-            GLubyte const *pc =
-                __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
-                                        X_GLvop_AreTexturesResidentEXT,
-                                        cmdlen);
-            (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
-            (void) memcpy((void *) (pc + 4), (void *) (textures), (n * 4));
-            if (n & 3) {
-               /* see comments in __indirect_glAreTexturesResident() */
-               GLboolean *res4 = malloc((n + 3) & ~3);
-               retval = (GLboolean) __glXReadReply(dpy, 1, res4, GL_TRUE);
-               memcpy(residences, res4, n);
-               free(res4);
-            }
-            else {
-               retval = (GLboolean) __glXReadReply(dpy, 1, residences, GL_TRUE);
-            }
-            UnlockDisplay(dpy);
-            SyncHandle();
-        }
-        return retval;
-    }
+   __GLXcontext *const gc = __glXGetCurrentContext();
+
+   if (gc->isDirect) {
+      return CALL_AreTexturesResident(GET_DISPATCH(),
+                                      (n, textures, residences));
+   }
+   else {
+      __GLXcontext *const gc = __glXGetCurrentContext();
+      Display *const dpy = gc->currentDpy;
+      GLboolean retval = (GLboolean) 0;
+      const GLuint cmdlen = 4 + __GLX_PAD((n * 4));
+      if (__builtin_expect((n >= 0) && (dpy != NULL), 1)) {
+         GLubyte const *pc =
+            __glXSetupVendorRequest(gc, X_GLXVendorPrivateWithReply,
+                                    X_GLvop_AreTexturesResidentEXT,
+                                    cmdlen);
+         (void) memcpy((void *) (pc + 0), (void *) (&n), 4);
+         (void) memcpy((void *) (pc + 4), (void *) (textures), (n * 4));
+         if (n & 3) {
+            /* see comments in __indirect_glAreTexturesResident() */
+            GLboolean *res4 = malloc((n + 3) & ~3);
+            retval = (GLboolean) __glXReadReply(dpy, 1, res4, GL_TRUE);
+            memcpy(residences, res4, n);
+            free(res4);
+         }
+         else {
+            retval = (GLboolean) __glXReadReply(dpy, 1, residences, GL_TRUE);
+         }
+         UnlockDisplay(dpy);
+         SyncHandle();
+      }
+      return retval;
+   }
 }
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
new file mode 100644 (file)
index 0000000..e42beab
--- /dev/null
@@ -0,0 +1,1249 @@
+/*
+ * Mesa 3-D graphics library
+ * Version:  7.6
+ *
+ * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * Meta operations.  Some GL operations can be expressed in terms of
+ * other GL operations.  For example, glBlitFramebuffer() can be done
+ * with texture mapping and glClear() can be done with polygon rendering.
+ *
+ * \author Brian Paul
+ */
+
+
+#include "main/glheader.h"
+#include "main/mtypes.h"
+#include "main/imports.h"
+#include "main/arrayobj.h"
+#include "main/blend.h"
+#include "main/bufferobj.h"
+#include "main/depth.h"
+#include "main/enable.h"
+#include "main/image.h"
+#include "main/macros.h"
+#include "main/matrix.h"
+#include "main/polygon.h"
+#include "main/scissor.h"
+#include "main/shaders.h"
+#include "main/stencil.h"
+#include "main/texobj.h"
+#include "main/texenv.h"
+#include "main/teximage.h"
+#include "main/texparam.h"
+#include "main/texstate.h"
+#include "main/varray.h"
+#include "main/viewport.h"
+#include "shader/program.h"
+#include "swrast/swrast.h"
+#include "drivers/common/meta.h"
+
+
+/**
+ * State which we may save/restore across meta ops.
+ * XXX this may be incomplete...
+ */
+struct save_state
+{
+   GLbitfield SavedState;  /**< bitmask of META_* flags */
+
+   /** META_ALPHA_TEST */
+   GLboolean AlphaEnabled;
+
+   /** META_BLEND */
+   GLboolean BlendEnabled;
+   GLboolean ColorLogicOpEnabled;
+
+   /** META_COLOR_MASK */
+   GLubyte ColorMask[4];
+
+   /** META_DEPTH_TEST */
+   struct gl_depthbuffer_attrib Depth;
+
+   /** META_FOG */
+   GLboolean Fog;
+
+   /** META_PIXELSTORE */
+   /* XXX / TO-DO */
+
+   /** META_RASTERIZATION */
+   GLenum FrontPolygonMode, BackPolygonMode;
+   GLboolean PolygonOffset;
+   GLboolean PolygonSmooth;
+   GLboolean PolygonStipple;
+   GLboolean PolygonCull;
+
+   /** META_SCISSOR */
+   struct gl_scissor_attrib Scissor;
+
+   /** META_SHADER */
+   GLboolean VertexProgramEnabled;
+   struct gl_vertex_program *VertexProgram;
+   GLboolean FragmentProgramEnabled;
+   struct gl_fragment_program *FragmentProgram;
+   GLuint Shader;
+
+   /** META_STENCIL_TEST */
+   struct gl_stencil_attrib Stencil;
+
+   /** META_TRANSFORM */
+   GLenum MatrixMode;
+   GLfloat ModelviewMatrix[16];
+   GLfloat ProjectionMatrix[16];
+   GLfloat TextureMatrix[16];
+   GLbitfield ClipPlanesEnabled;
+
+   /** META_TEXTURE */
+   GLuint ActiveUnit;
+   GLuint ClientActiveUnit;
+   /** for unit[0] only */
+   struct gl_texture_object *CurrentTexture[NUM_TEXTURE_TARGETS];
+   /** mask of TEXTURE_2D_BIT, etc */
+   GLbitfield TexEnabled[MAX_TEXTURE_UNITS];
+   GLbitfield TexGenEnabled[MAX_TEXTURE_UNITS];
+   GLuint EnvMode;  /* unit[0] only */
+
+   /** META_VERTEX */
+   struct gl_array_object *ArrayObj;
+   struct gl_buffer_object *ArrayBufferObj;
+
+   /** META_VIEWPORT */
+   GLint ViewportX, ViewportY, ViewportW, ViewportH;
+   GLclampd DepthNear, DepthFar;
+
+   /** Miscellaneous (always disabled) */
+   GLboolean Lighting;
+};
+
+
+/**
+ * State for glBlitFramebufer()
+ */
+struct blit_state
+{
+   GLuint TexObj;
+   GLsizei TexWidth, TexHeight;
+   GLenum TexType;
+   GLuint ArrayObj;
+   GLuint VBO;
+   GLfloat verts[4][4]; /** four verts of X,Y,S,T */
+};
+
+
+/**
+ * State for glClear()
+ */
+struct clear_state
+{
+   GLuint ArrayObj;
+   GLuint VBO;
+   GLfloat verts[4][7]; /** four verts of X,Y,Z,R,G,B,A */
+};
+
+
+/**
+ * State for glCopyPixels()
+ */
+struct copypix_state
+{
+   GLuint TexObj;
+   GLsizei TexWidth, TexHeight;
+   GLenum TexType;
+   GLuint ArrayObj;
+   GLuint VBO;
+   GLfloat verts[4][5]; /** four verts of X,Y,Z,S,T */
+};
+
+
+/**
+ * State for glDrawPixels()
+ */
+struct drawpix_state
+{
+   GLuint TexObj;
+   GLsizei TexWidth, TexHeight;
+   GLenum TexIntFormat;
+   GLuint ArrayObj;
+   GLuint VBO;
+   GLfloat verts[4][5]; /** four verts of X,Y,Z,S,T */
+};
+
+
+
+/**
+ * All per-context meta state.
+ */
+struct gl_meta_state
+{
+   struct save_state Save;    /**< state saved during meta-ops */
+
+   struct blit_state Blit;    /**< For _mesa_meta_blit_framebuffer() */
+   struct clear_state Clear;  /**< For _mesa_meta_clear() */
+   struct copypix_state CopyPix;  /**< For _mesa_meta_copy_pixels() */
+   struct drawpix_state DrawPix;  /**< For _mesa_meta_draw_pixels() */
+
+   /* other possible meta-ops:
+    * glDrawPixels()
+    * glBitmap()
+    * glGenerateMipmap()
+    */
+};
+
+
+/**
+ * Initialize meta-ops for a context.
+ * To be called once during context creation.
+ */
+void
+_mesa_meta_init(GLcontext *ctx)
+{
+   ASSERT(!ctx->Meta);
+
+   ctx->Meta = CALLOC_STRUCT(gl_meta_state);
+}
+
+
+/**
+ * Free context meta-op state.
+ * To be called once during context destruction.
+ */
+void
+_mesa_meta_free(GLcontext *ctx)
+{
+   struct gl_meta_state *meta = ctx->Meta;
+
+   if (meta->Blit.TexObj) {
+      _mesa_DeleteTextures(1, &meta->Blit.TexObj);
+      _mesa_DeleteBuffersARB(1, & meta->Blit.VBO);
+      _mesa_DeleteVertexArraysAPPLE(1, &meta->Blit.ArrayObj);
+   }
+
+   if (meta->Clear.VBO) {
+      _mesa_DeleteBuffersARB(1, & meta->Clear.VBO);
+      _mesa_DeleteVertexArraysAPPLE(1, &meta->Clear.ArrayObj);
+   }
+
+   if (meta->CopyPix.TexObj) {
+      _mesa_DeleteTextures(1, &meta->CopyPix.TexObj);
+      _mesa_DeleteBuffersARB(1, & meta->CopyPix.VBO);
+      _mesa_DeleteVertexArraysAPPLE(1, &meta->CopyPix.ArrayObj);
+   }
+
+   if (meta->DrawPix.TexObj) {
+      _mesa_DeleteTextures(1, &meta->DrawPix.TexObj);
+      _mesa_DeleteBuffersARB(1, & meta->DrawPix.VBO);
+      _mesa_DeleteVertexArraysAPPLE(1, &meta->DrawPix.ArrayObj);
+   }
+
+   _mesa_free(ctx->Meta);
+   ctx->Meta = NULL;
+}
+
+
+/**
+ * Enter meta state.  This is like a light-weight version of glPushAttrib
+ * but it also resets most GL state back to default values.
+ *
+ * \param state  bitmask of META_* flags indicating which attribute groups
+ *               to save and reset to their defaults
+ */
+static void
+_mesa_meta_begin(GLcontext *ctx, GLbitfield state)
+{
+   struct save_state *save = &ctx->Meta->Save;
+
+   save->SavedState = state;
+
+   if (state & META_ALPHA_TEST) {
+      save->AlphaEnabled = ctx->Color.AlphaEnabled;
+      if (ctx->Color.AlphaEnabled)
+         _mesa_Disable(GL_ALPHA_TEST);
+   }
+
+   if (state & META_BLEND) {
+      save->BlendEnabled = ctx->Color.BlendEnabled;
+      if (ctx->Color.BlendEnabled)
+         _mesa_Disable(GL_BLEND);
+      save->ColorLogicOpEnabled = ctx->Color.ColorLogicOpEnabled;
+      if (ctx->Color.ColorLogicOpEnabled)
+         _mesa_Disable(GL_COLOR_LOGIC_OP);
+   }
+
+   if (state & META_COLOR_MASK) {
+      COPY_4V(save->ColorMask, ctx->Color.ColorMask);
+      if (!ctx->Color.ColorMask[0] ||
+          !ctx->Color.ColorMask[1] ||
+          !ctx->Color.ColorMask[2] ||
+          !ctx->Color.ColorMask[3])
+         _mesa_ColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+   }
+
+   if (state & META_DEPTH_TEST) {
+      save->Depth = ctx->Depth; /* struct copy */
+      if (ctx->Depth.Test)
+         _mesa_Disable(GL_DEPTH_TEST);
+   }
+
+   if (state & META_FOG) {
+      save->Fog = ctx->Fog.Enabled;
+      if (ctx->Fog.Enabled)
+         _mesa_set_enable(ctx, GL_FOG, GL_FALSE);
+   }
+
+   if (state & META_RASTERIZATION) {
+      save->FrontPolygonMode = ctx->Polygon.FrontMode;
+      save->BackPolygonMode = ctx->Polygon.BackMode;
+      save->PolygonOffset = ctx->Polygon.OffsetFill;
+      save->PolygonSmooth = ctx->Polygon.SmoothFlag;
+      save->PolygonStipple = ctx->Polygon.StippleFlag;
+      save->PolygonCull = ctx->Polygon.CullFlag;
+      _mesa_PolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+      _mesa_set_enable(ctx, GL_POLYGON_OFFSET_FILL, GL_FALSE);
+      _mesa_set_enable(ctx, GL_POLYGON_SMOOTH, GL_FALSE);
+      _mesa_set_enable(ctx, GL_POLYGON_STIPPLE, GL_FALSE);
+      _mesa_set_enable(ctx, GL_CULL_FACE, GL_FALSE);
+   }
+
+   if (state & META_SCISSOR) {
+      save->Scissor = ctx->Scissor; /* struct copy */
+   }
+
+   if (state & META_SHADER) {
+      if (ctx->Extensions.ARB_vertex_program) {
+         save->VertexProgramEnabled = ctx->VertexProgram.Enabled;
+         save->VertexProgram = ctx->VertexProgram.Current;
+         _mesa_set_enable(ctx, GL_VERTEX_PROGRAM_ARB, GL_FALSE);
+      }
+
+      if (ctx->Extensions.ARB_fragment_program) {
+         save->FragmentProgramEnabled = ctx->FragmentProgram.Enabled;
+         save->FragmentProgram = ctx->FragmentProgram.Current;
+         _mesa_set_enable(ctx, GL_FRAGMENT_PROGRAM_ARB, GL_FALSE);
+      }
+
+      if (ctx->Extensions.ARB_shader_objects) {
+         save->Shader = ctx->Shader.CurrentProgram ?
+            ctx->Shader.CurrentProgram->Name : 0;
+         _mesa_UseProgramObjectARB(0);
+      }
+   }
+
+   if (state & META_STENCIL_TEST) {
+      save->Stencil = ctx->Stencil; /* struct copy */
+      if (ctx->Stencil.Enabled)
+         _mesa_Disable(GL_STENCIL_TEST);
+      /* NOTE: other stencil state not reset */
+   }
+
+   if (state & META_TEXTURE) {
+      GLuint u, tgt;
+
+      save->ActiveUnit = ctx->Texture.CurrentUnit;
+      save->ClientActiveUnit = ctx->Array.ActiveTexture;
+      save->EnvMode = ctx->Texture.Unit[0].EnvMode;
+
+      /* Disable all texture units */
+      for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
+         save->TexEnabled[u] = ctx->Texture.Unit[u].Enabled;
+         save->TexGenEnabled[u] = ctx->Texture.Unit[u].TexGenEnabled;
+         if (ctx->Texture.Unit[u].Enabled ||
+             ctx->Texture.Unit[u].TexGenEnabled) {
+            _mesa_ActiveTextureARB(GL_TEXTURE0 + u);
+            _mesa_set_enable(ctx, GL_TEXTURE_1D, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_2D, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_3D, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_CUBE_MAP, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_RECTANGLE, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_GEN_S, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_GEN_T, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_GEN_R, GL_FALSE);
+            _mesa_set_enable(ctx, GL_TEXTURE_GEN_Q, GL_FALSE);
+         }
+      }
+
+      /* save current texture objects for unit[0] only */
+      for (tgt = 0; tgt < NUM_TEXTURE_TARGETS; tgt++) {
+         _mesa_reference_texobj(&save->CurrentTexture[tgt],
+                                ctx->Texture.Unit[0].CurrentTex[tgt]);
+      }
+
+      /* set defaults for unit[0] */
+      _mesa_ActiveTextureARB(GL_TEXTURE0);
+      _mesa_ClientActiveTextureARB(GL_TEXTURE0);
+      _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+   }
+
+   if (state & META_TRANSFORM) {
+      GLuint activeTexture = ctx->Texture.CurrentUnit;
+      _mesa_memcpy(save->ModelviewMatrix, ctx->ModelviewMatrixStack.Top->m,
+                   16 * sizeof(GLfloat));
+      _mesa_memcpy(save->ProjectionMatrix, ctx->ProjectionMatrixStack.Top->m,
+                   16 * sizeof(GLfloat));
+      _mesa_memcpy(save->TextureMatrix, ctx->TextureMatrixStack[0].Top->m,
+                   16 * sizeof(GLfloat));
+      save->MatrixMode = ctx->Transform.MatrixMode;
+      /* set 1:1 vertex:pixel coordinate transform */
+      _mesa_ActiveTextureARB(GL_TEXTURE0);
+      _mesa_MatrixMode(GL_TEXTURE);
+      _mesa_LoadIdentity();
+      _mesa_ActiveTextureARB(GL_TEXTURE0 + activeTexture);
+      _mesa_MatrixMode(GL_MODELVIEW);
+      _mesa_LoadIdentity();
+      _mesa_MatrixMode(GL_PROJECTION);
+      _mesa_LoadIdentity();
+      _mesa_Ortho(0.0F, ctx->DrawBuffer->Width,
+                  0.0F, ctx->DrawBuffer->Height,
+                  -1.0F, 1.0F);
+      save->ClipPlanesEnabled = ctx->Transform.ClipPlanesEnabled;
+      if (ctx->Transform.ClipPlanesEnabled) {
+         GLuint i;
+         for (i = 0; i < ctx->Const.MaxClipPlanes; i++) {
+            _mesa_set_enable(ctx, GL_CLIP_PLANE0 + i, GL_FALSE);
+         }
+      }
+   }
+
+   if (state & META_VERTEX) {
+      /* save vertex array object state */
+      _mesa_reference_array_object(ctx, &save->ArrayObj,
+                                   ctx->Array.ArrayObj);
+      _mesa_reference_buffer_object(ctx, &save->ArrayBufferObj,
+                                    ctx->Array.ArrayBufferObj);
+      /* set some default state? */
+   }
+
+   if (state & META_VIEWPORT) {
+      save->ViewportX = ctx->Viewport.X;
+      save->ViewportY = ctx->Viewport.Y;
+      save->ViewportW = ctx->Viewport.Width;
+      save->ViewportH = ctx->Viewport.Height;
+      _mesa_Viewport(0, 0, ctx->DrawBuffer->Width, ctx->DrawBuffer->Height);
+      save->DepthNear = ctx->Viewport.Near;
+      save->DepthFar = ctx->Viewport.Far;
+      _mesa_DepthRange(0.0, 1.0);
+   }
+
+   /* misc */
+   {
+      save->Lighting = ctx->Light.Enabled;
+      if (ctx->Light.Enabled)
+         _mesa_set_enable(ctx, GL_LIGHTING, GL_FALSE);
+   }
+}
+
+
+/**
+ * Leave meta state.  This is like a light-weight version of glPopAttrib().
+ */
+static void
+_mesa_meta_end(GLcontext *ctx)
+{
+   struct save_state *save = &ctx->Meta->Save;
+   const GLbitfield state = save->SavedState;
+
+   if (state & META_ALPHA_TEST) {
+      if (ctx->Color.AlphaEnabled != save->AlphaEnabled)
+         _mesa_set_enable(ctx, GL_ALPHA_TEST, save->AlphaEnabled);
+   }
+
+   if (state & META_BLEND) {
+      if (ctx->Color.BlendEnabled != save->BlendEnabled)
+         _mesa_set_enable(ctx, GL_BLEND, save->BlendEnabled);
+      if (ctx->Color.ColorLogicOpEnabled != save->ColorLogicOpEnabled)
+         _mesa_set_enable(ctx, GL_COLOR_LOGIC_OP, save->ColorLogicOpEnabled);
+   }
+
+   if (state & META_COLOR_MASK) {
+      if (!TEST_EQ_4V(ctx->Color.ColorMask, save->ColorMask))
+         _mesa_ColorMask(save->ColorMask[0], save->ColorMask[1],
+                         save->ColorMask[2], save->ColorMask[3]);
+   }
+
+   if (state & META_DEPTH_TEST) {
+      if (ctx->Depth.Test != save->Depth.Test)
+         _mesa_set_enable(ctx, GL_DEPTH_TEST, save->Depth.Test);
+      _mesa_DepthFunc(save->Depth.Func);
+      _mesa_DepthMask(save->Depth.Mask);
+   }
+
+   if (state & META_FOG) {
+      _mesa_set_enable(ctx, GL_FOG, save->Fog);
+   }
+
+   if (state & META_RASTERIZATION) {
+      _mesa_PolygonMode(GL_FRONT, save->FrontPolygonMode);
+      _mesa_PolygonMode(GL_BACK, save->BackPolygonMode);
+      _mesa_set_enable(ctx, GL_POLYGON_STIPPLE, save->PolygonStipple);
+      _mesa_set_enable(ctx, GL_POLYGON_OFFSET_FILL, save->PolygonOffset);
+      _mesa_set_enable(ctx, GL_POLYGON_SMOOTH, save->PolygonSmooth);
+      _mesa_set_enable(ctx, GL_CULL_FACE, save->PolygonCull);
+   }
+
+   if (state & META_SCISSOR) {
+      _mesa_set_enable(ctx, GL_SCISSOR_TEST, save->Scissor.Enabled);
+      _mesa_Scissor(save->Scissor.X, save->Scissor.Y,
+                    save->Scissor.Width, save->Scissor.Height);
+   }
+
+   if (state & META_SHADER) {
+      if (ctx->Extensions.ARB_vertex_program) {
+         _mesa_set_enable(ctx, GL_VERTEX_PROGRAM_ARB,
+                          save->VertexProgramEnabled);
+         _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current, 
+                                  save->VertexProgram);
+      }
+
+      if (ctx->Extensions.ARB_fragment_program) {
+         _mesa_set_enable(ctx, GL_FRAGMENT_PROGRAM_ARB,
+                          save->FragmentProgramEnabled);
+         _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current,
+                                  save->FragmentProgram);
+      }
+
+      if (ctx->Extensions.ARB_shader_objects) {
+         _mesa_UseProgramObjectARB(save->Shader);
+      }
+   }
+
+   if (state & META_STENCIL_TEST) {
+      const struct gl_stencil_attrib *stencil = &save->Stencil;
+
+      _mesa_set_enable(ctx, GL_STENCIL_TEST, stencil->Enabled);
+      _mesa_ClearStencil(stencil->Clear);
+      if (ctx->Extensions.EXT_stencil_two_side) {
+         _mesa_set_enable(ctx, GL_STENCIL_TEST_TWO_SIDE_EXT,
+                          stencil->TestTwoSide);
+         _mesa_ActiveStencilFaceEXT(stencil->ActiveFace
+                                    ? GL_BACK : GL_FRONT);
+      }
+      /* front state */
+      _mesa_StencilFuncSeparate(GL_FRONT,
+                                stencil->Function[0],
+                                stencil->Ref[0],
+                                stencil->ValueMask[0]);
+      _mesa_StencilMaskSeparate(GL_FRONT, stencil->WriteMask[0]);
+      _mesa_StencilOpSeparate(GL_FRONT, stencil->FailFunc[0],
+                              stencil->ZFailFunc[0],
+                              stencil->ZPassFunc[0]);
+      /* back state */
+      _mesa_StencilFuncSeparate(GL_BACK,
+                                stencil->Function[1],
+                                stencil->Ref[1],
+                                stencil->ValueMask[1]);
+      _mesa_StencilMaskSeparate(GL_BACK, stencil->WriteMask[1]);
+      _mesa_StencilOpSeparate(GL_BACK, stencil->FailFunc[1],
+                              stencil->ZFailFunc[1],
+                              stencil->ZPassFunc[1]);
+   }
+
+   if (state & META_TEXTURE) {
+      GLuint u, tgt;
+
+      ASSERT(ctx->Texture.CurrentUnit == 0);
+
+      /* restore texenv for unit[0] */
+      _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, save->EnvMode);
+
+      /* restore texture objects for unit[0] only */
+      for (tgt = 0; tgt < NUM_TEXTURE_TARGETS; tgt++) {
+         _mesa_reference_texobj(&ctx->Texture.Unit[0].CurrentTex[tgt],
+                                save->CurrentTexture[tgt]);
+      }
+
+      /* Re-enable textures, texgen */
+      for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
+         if (save->TexEnabled[u]) {
+            _mesa_ActiveTextureARB(GL_TEXTURE0 + u);
+
+            if (save->TexEnabled[u] & TEXTURE_1D_BIT)
+               _mesa_set_enable(ctx, GL_TEXTURE_1D, GL_TRUE);
+            if (save->TexEnabled[u] & TEXTURE_2D_BIT)
+               _mesa_set_enable(ctx, GL_TEXTURE_2D, GL_TRUE);
+            if (save->TexEnabled[u] & TEXTURE_3D_BIT)
+               _mesa_set_enable(ctx, GL_TEXTURE_3D, GL_TRUE);
+            if (save->TexEnabled[u] & TEXTURE_CUBE_BIT)
+               _mesa_set_enable(ctx, GL_TEXTURE_CUBE_MAP, GL_TRUE);
+            if (save->TexEnabled[u] & TEXTURE_RECT_BIT)
+               _mesa_set_enable(ctx, GL_TEXTURE_RECTANGLE, GL_TRUE);
+         }
+
+         if (save->TexGenEnabled[u]) {
+            _mesa_ActiveTextureARB(GL_TEXTURE0 + u);
+
+            if (save->TexGenEnabled[u] & S_BIT)
+               _mesa_set_enable(ctx, GL_TEXTURE_GEN_S, GL_TRUE);
+            if (save->TexGenEnabled[u] & T_BIT)
+               _mesa_set_enable(ctx, GL_TEXTURE_GEN_T, GL_TRUE);
+            if (save->TexGenEnabled[u] & R_BIT)
+               _mesa_set_enable(ctx, GL_TEXTURE_GEN_R, GL_TRUE);
+            if (save->TexGenEnabled[u] & Q_BIT)
+               _mesa_set_enable(ctx, GL_TEXTURE_GEN_Q, GL_TRUE);
+         }
+      }
+
+      /* restore current unit state */
+      _mesa_ActiveTextureARB(GL_TEXTURE0 + save->ActiveUnit);
+      _mesa_ClientActiveTextureARB(GL_TEXTURE0 + save->ClientActiveUnit);
+   }
+
+   if (state & META_TRANSFORM) {
+      GLuint activeTexture = ctx->Texture.CurrentUnit;
+      _mesa_ActiveTextureARB(GL_TEXTURE0);
+      _mesa_MatrixMode(GL_TEXTURE);
+      _mesa_LoadMatrixf(save->TextureMatrix);
+      _mesa_ActiveTextureARB(GL_TEXTURE0 + activeTexture);
+
+      _mesa_MatrixMode(GL_MODELVIEW);
+      _mesa_LoadMatrixf(save->ModelviewMatrix);
+
+      _mesa_MatrixMode(GL_PROJECTION);
+      _mesa_LoadMatrixf(save->ProjectionMatrix);
+
+      _mesa_MatrixMode(save->MatrixMode);
+
+      save->ClipPlanesEnabled = ctx->Transform.ClipPlanesEnabled;
+      if (save->ClipPlanesEnabled) {
+         GLuint i;
+         for (i = 0; i < ctx->Const.MaxClipPlanes; i++) {
+            if (save->ClipPlanesEnabled & (1 << i)) {
+               _mesa_set_enable(ctx, GL_CLIP_PLANE0 + i, GL_TRUE);
+            }
+         }
+      }
+   }
+
+   if (state & META_VERTEX) {
+      /* restore vertex buffer object */
+      _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, save->ArrayBufferObj->Name);
+      _mesa_reference_buffer_object(ctx, &save->ArrayBufferObj, NULL);
+
+      /* restore vertex array object */
+      _mesa_BindVertexArray(save->ArrayObj->Name);
+      _mesa_reference_array_object(ctx, &save->ArrayObj, NULL);
+   }
+
+   if (state & META_VIEWPORT) {
+      _mesa_Viewport(save->ViewportX, save->ViewportY,
+                     save->ViewportW, save->ViewportH);
+      _mesa_DepthRange(save->DepthNear, save->DepthFar);
+   }
+
+   /* misc */
+   if (save->Lighting) {
+      _mesa_set_enable(ctx, GL_LIGHTING, GL_TRUE);
+   }
+   if (save->Fog) {
+      _mesa_set_enable(ctx, GL_FOG, GL_TRUE);
+   }
+}
+
+
+/**
+ * Meta implementation of ctx->Driver.BlitFramebuffer() in terms
+ * of texture mapping and polygon rendering.
+ * Note: this function requires GL_ARB_texture_rectangle support.
+ */
+void
+_mesa_meta_blit_framebuffer(GLcontext *ctx,
+                            GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
+                            GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
+                            GLbitfield mask, GLenum filter)
+{
+   struct blit_state *blit = &ctx->Meta->Blit;
+   const GLint srcX = MIN2(srcX0, srcX1);
+   const GLint srcY = MIN2(srcY0, srcY1);
+   const GLint srcW = abs(srcX1 - srcX0);
+   const GLint srcH = abs(srcY1 - srcY0);
+   GLboolean srcFlipX = srcX1 < srcX0;
+   GLboolean srcFlipY = srcY1 < srcY0;
+
+   ASSERT(ctx->Extensions.NV_texture_rectangle);
+
+   if (srcW > ctx->Const.MaxTextureRectSize ||
+       srcH > ctx->Const.MaxTextureRectSize) {
+      /* XXX avoid this fallback */
+      _swrast_BlitFramebuffer(ctx, srcX0, srcY0, srcX1, srcY1,
+                              dstX0, dstY0, dstX1, dstY1, mask, filter);
+      return;
+   }
+
+
+   if (srcFlipX) {
+      GLint tmp = dstX0;
+      dstX0 = dstX1;
+      dstX1 = tmp;
+   }
+
+   if (srcFlipY) {
+      GLint tmp = dstY0;
+      dstY0 = dstY1;
+      dstY1 = tmp;
+   }
+
+   /* only scissor effects blit so save/clear all other relevant state */
+   _mesa_meta_begin(ctx, ~META_SCISSOR);
+
+   if (blit->TexObj == 0) {
+      /* one-time setup */
+
+      /* create texture object */
+      _mesa_GenTextures(1, &blit->TexObj);
+      _mesa_BindTexture(GL_TEXTURE_RECTANGLE, blit->TexObj);
+      _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+   }
+   else {
+      _mesa_BindTexture(GL_TEXTURE_RECTANGLE, blit->TexObj);
+   }
+
+   _mesa_TexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, filter);
+   _mesa_TexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, filter);
+
+   if (blit->ArrayObj == 0) {
+      /* one-time setup */
+
+      /* create vertex array object */
+      _mesa_GenVertexArrays(1, &blit->ArrayObj);
+      _mesa_BindVertexArray(blit->ArrayObj);
+
+      /* create vertex array buffer */
+      _mesa_GenBuffersARB(1, &blit->VBO);
+      _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, blit->VBO);
+      _mesa_BufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(blit->verts),
+                          blit->verts, GL_STREAM_DRAW_ARB);
+
+      /* setup vertex arrays */
+      _mesa_VertexPointer(2, GL_FLOAT, 4 * sizeof(GLfloat),
+                          (void*) (0 * sizeof(GLfloat)));
+      _mesa_TexCoordPointer(2, GL_FLOAT, 4 * sizeof(GLfloat),
+                            (void *) (2 * sizeof(GLfloat)));
+      _mesa_EnableClientState(GL_VERTEX_ARRAY);
+      _mesa_EnableClientState(GL_TEXTURE_COORD_ARRAY);
+   }
+   else {
+      _mesa_BindVertexArray(blit->ArrayObj);
+      _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, blit->VBO);
+   }
+
+   /* vertex positions */
+   blit->verts[0][0] = (GLfloat) dstX0;
+   blit->verts[0][1] = (GLfloat) dstY0;
+   blit->verts[1][0] = (GLfloat) dstX1;
+   blit->verts[1][1] = (GLfloat) dstY0;
+   blit->verts[2][0] = (GLfloat) dstX1;
+   blit->verts[2][1] = (GLfloat) dstY1;
+   blit->verts[3][0] = (GLfloat) dstX0;
+   blit->verts[3][1] = (GLfloat) dstY1;
+
+   /* texcoords */
+   blit->verts[0][2] = 0.0F;
+   blit->verts[0][3] = 0.0F;
+   blit->verts[1][2] = (GLfloat) srcW;
+   blit->verts[1][3] = 0.0F;
+   blit->verts[2][2] = (GLfloat) srcW;
+   blit->verts[2][3] = (GLfloat) srcH;
+   blit->verts[3][2] = 0.0F;
+   blit->verts[3][3] = (GLfloat) srcH;
+
+   /* upload new vertex data */
+   _mesa_BufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0,
+                          sizeof(blit->verts), blit->verts);
+
+   /* copy framebuffer image to texture */
+   if (mask & GL_COLOR_BUFFER_BIT) {
+      if (blit->TexWidth == srcW &&
+          blit->TexHeight == srcH &&
+          blit->TexType == GL_RGBA) {
+         /* replace existing tex image */
+         _mesa_CopyTexSubImage2D(GL_TEXTURE_RECTANGLE, 0,
+                                 0, 0, srcX, srcY, srcW, srcH);
+      }
+      else {
+         /* create new tex image */
+         _mesa_CopyTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA,
+                              srcX, srcY, srcW, srcH, 0);
+         blit->TexWidth = srcW;
+         blit->TexHeight = srcH;
+         blit->TexType = GL_RGBA;
+      }
+
+      mask &= ~GL_COLOR_BUFFER_BIT;
+   }
+
+   _mesa_Enable(GL_TEXTURE_RECTANGLE);
+
+   /* draw textured quad */
+   _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+   _mesa_Disable(GL_TEXTURE_RECTANGLE);
+
+   _mesa_meta_end(ctx);
+
+   /* XXX, TO-DO: try to handle these cases above! */
+   if (mask & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) {
+      _swrast_BlitFramebuffer(ctx, srcX0, srcY0, srcX1, srcY1,
+                              dstX0, dstY0, dstX1, dstY1, mask, filter);
+   }
+}
+
+
+/**
+ * Meta implementation of ctx->Driver.Clear() in terms of polygon rendering.
+ */
+void
+_mesa_meta_clear(GLcontext *ctx, GLbitfield buffers)
+{
+   struct clear_state *clear = &ctx->Meta->Clear;
+   GLfloat z = 1.0 - 2.0 * ctx->Depth.Clear;
+   GLuint i;
+
+   /* only scissor and color mask effects clearing */
+   _mesa_meta_begin(ctx, ~(META_SCISSOR | META_COLOR_MASK));
+
+   if (clear->ArrayObj == 0) {
+      /* one-time setup */
+
+      /* create vertex array object */
+      _mesa_GenVertexArrays(1, &clear->ArrayObj);
+      _mesa_BindVertexArray(clear->ArrayObj);
+
+      /* create vertex array buffer */
+      _mesa_GenBuffersARB(1, &clear->VBO);
+      _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, clear->VBO);
+      _mesa_BufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(clear->verts),
+                          clear->verts, GL_STREAM_DRAW_ARB);
+
+      /* setup vertex arrays */
+      _mesa_VertexPointer(3, GL_FLOAT, 7 * sizeof(GLfloat), (void *) 0);
+      _mesa_ColorPointer(4, GL_FLOAT, 7 * sizeof(GLfloat),
+                         (void *) (3 * sizeof(GLfloat)));
+      _mesa_EnableClientState(GL_VERTEX_ARRAY);
+      _mesa_EnableClientState(GL_COLOR_ARRAY);
+   }
+   else {
+      _mesa_BindVertexArray(clear->ArrayObj);
+      _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, clear->VBO);
+   }
+
+   /* GL_COLOR_BUFFER_BIT */
+   if (buffers & BUFFER_BITS_COLOR) {
+      /* leave colormask, glDrawBuffer state as-is */
+   }
+   else {
+      _mesa_ColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+   }
+
+   /* GL_DEPTH_BUFFER_BIT */
+   if (buffers & BUFFER_BIT_DEPTH) {
+      _mesa_set_enable(ctx, GL_DEPTH_TEST, GL_TRUE);
+      _mesa_DepthFunc(GL_ALWAYS);
+      _mesa_DepthMask(GL_TRUE);
+   }
+   else {
+      assert(!ctx->Depth.Test);
+   }
+
+   /* GL_STENCIL_BUFFER_BIT */
+   if (buffers & BUFFER_BIT_STENCIL) {
+      _mesa_set_enable(ctx, GL_STENCIL_TEST, GL_TRUE);
+      _mesa_StencilOpSeparate(GL_FRONT_AND_BACK,
+                              GL_REPLACE, GL_REPLACE, GL_REPLACE);
+      _mesa_StencilFuncSeparate(GL_FRONT_AND_BACK, GL_ALWAYS,
+                                ctx->Stencil.Clear & 0x7fffffff,
+                                ctx->Stencil.WriteMask[0]);
+   }
+   else {
+      assert(!ctx->Stencil.Enabled);
+   }
+
+   /* vertex positions */
+   clear->verts[0][0] = (GLfloat) ctx->DrawBuffer->_Xmin;
+   clear->verts[0][1] = (GLfloat) ctx->DrawBuffer->_Ymin;
+   clear->verts[0][2] = z;
+   clear->verts[1][0] = (GLfloat) ctx->DrawBuffer->_Xmax;
+   clear->verts[1][1] = (GLfloat) ctx->DrawBuffer->_Ymin;
+   clear->verts[1][2] = z;
+   clear->verts[2][0] = (GLfloat) ctx->DrawBuffer->_Xmax;
+   clear->verts[2][1] = (GLfloat) ctx->DrawBuffer->_Ymax;
+   clear->verts[2][2] = z;
+   clear->verts[3][0] = (GLfloat) ctx->DrawBuffer->_Xmin;
+   clear->verts[3][1] = (GLfloat) ctx->DrawBuffer->_Ymax;
+   clear->verts[3][2] = z;
+
+   /* vertex colors */
+   for (i = 0; i < 4; i++) {
+      COPY_4FV(&clear->verts[i][3], ctx->Color.ClearColor);
+   }
+
+   /* upload new vertex data */
+   _mesa_BufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0,
+                          sizeof(clear->verts), clear->verts);
+
+   /* draw quad */
+   _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+   _mesa_meta_end(ctx);
+}
+
+
+/**
+ * Meta implementation of ctx->Driver.CopyPixels() in terms
+ * of texture mapping and polygon rendering.
+ * Note: this function requires GL_ARB_texture_rectangle support.
+ */
+void
+_mesa_meta_copy_pixels(GLcontext *ctx, GLint srcX, GLint srcY,
+                       GLsizei width, GLsizei height,
+                       GLint dstX, GLint dstY, GLenum type)
+{
+   const GLenum filter = GL_NEAREST;
+   struct copypix_state *copypix = &ctx->Meta->CopyPix;
+   const GLfloat z = ctx->Current.RasterPos[2];
+   const GLfloat dstX1 = dstX + width * ctx->Pixel.ZoomX;
+   const GLfloat dstY1 = dstY + height * ctx->Pixel.ZoomY;
+
+   ASSERT(ctx->Extensions.NV_texture_rectangle);
+
+   if (type != GL_COLOR ||
+       ctx->_ImageTransferState ||
+       ctx->Fog.Enabled ||
+       width > ctx->Const.MaxTextureRectSize ||
+       height > ctx->Const.MaxTextureRectSize) {
+      /* XXX avoid this fallback */
+      _swrast_CopyPixels(ctx, srcX, srcY, width, height, dstX, dstY, type);
+      return;
+   }
+
+   /* Most GL state applies to glCopyPixels, but a there's a few things
+    * we need to override:
+    */
+   _mesa_meta_begin(ctx, (META_RASTERIZATION |
+                          META_SHADER |
+                          META_TEXTURE |
+                          META_TRANSFORM |
+                          META_VERTEX |
+                          META_VIEWPORT));
+
+   if (copypix->TexObj == 0) {
+      /* one-time setup */
+
+      /* create texture object */
+      _mesa_GenTextures(1, &copypix->TexObj);
+      _mesa_BindTexture(GL_TEXTURE_RECTANGLE, copypix->TexObj);
+      _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+      _mesa_TexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, filter);
+      _mesa_TexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, filter);
+   }
+   else {
+      _mesa_BindTexture(GL_TEXTURE_RECTANGLE, copypix->TexObj);
+   }
+
+   if (copypix->ArrayObj == 0) {
+      /* one-time setup */
+
+      /* create vertex array object */
+      _mesa_GenVertexArrays(1, &copypix->ArrayObj);
+      _mesa_BindVertexArray(copypix->ArrayObj);
+
+      /* create vertex array buffer */
+      _mesa_GenBuffersARB(1, &copypix->VBO);
+      _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, copypix->VBO);
+      _mesa_BufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(copypix->verts),
+                          copypix->verts, GL_STREAM_DRAW_ARB);
+
+      /* setup vertex arrays */
+      _mesa_VertexPointer(3, GL_FLOAT, sizeof(copypix->verts[0]),
+                          (void*) (0 * sizeof(GLfloat)));
+      _mesa_TexCoordPointer(2, GL_FLOAT, sizeof(copypix->verts[0]),
+                            (void *) (3 * sizeof(GLfloat)));
+      _mesa_EnableClientState(GL_VERTEX_ARRAY);
+      _mesa_EnableClientState(GL_TEXTURE_COORD_ARRAY);
+   }
+   else {
+      _mesa_BindVertexArray(copypix->ArrayObj);
+      _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, copypix->VBO);
+   }
+
+   /* vertex positions, texcoords */
+   copypix->verts[0][0] = (GLfloat) dstX;
+   copypix->verts[0][1] = (GLfloat) dstY;
+   copypix->verts[0][2] = z;
+   copypix->verts[0][3] = 0.0F;
+   copypix->verts[0][4] = 0.0F;
+   copypix->verts[1][0] = (GLfloat) dstX1;
+   copypix->verts[1][1] = (GLfloat) dstY;
+   copypix->verts[1][2] = z;
+   copypix->verts[1][3] = (GLfloat) width;
+   copypix->verts[1][4] = 0.0F;
+   copypix->verts[2][0] = (GLfloat) dstX1;
+   copypix->verts[2][1] = (GLfloat) dstY1;
+   copypix->verts[2][2] = z;
+   copypix->verts[2][3] = (GLfloat) width;
+   copypix->verts[2][4] = (GLfloat) height;
+   copypix->verts[3][0] = (GLfloat) dstX;
+   copypix->verts[3][1] = (GLfloat) dstY1;
+   copypix->verts[3][2] = z;
+   copypix->verts[3][3] = 0.0F;
+   copypix->verts[3][4] = (GLfloat) height;
+
+   /* upload new vertex data */
+   _mesa_BufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0,
+                          sizeof(copypix->verts), copypix->verts);
+
+   /* copy framebuffer image to texture */
+   if (type == GL_COLOR) {
+      if (copypix->TexWidth == width &&
+          copypix->TexHeight == height &&
+          copypix->TexType == type) {
+         /* replace existing tex image */
+         _mesa_CopyTexSubImage2D(GL_TEXTURE_RECTANGLE, 0,
+                                 0, 0, srcX, srcY, width, height);
+      }
+      else {
+         /* create new tex image */
+         _mesa_CopyTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA,
+                              srcX, srcY, width, height, 0);
+         copypix->TexWidth = width;
+         copypix->TexHeight = height;
+         copypix->TexType = type;
+      }
+   }
+   else if (type == GL_DEPTH) {
+      /* TO-DO: Use a GL_DEPTH_COMPONENT texture and a fragment program/shader
+       * that replaces the fragment.z value.
+       */
+   }
+   else {
+      ASSERT(type == GL_STENCIL);
+      /* have to use sw fallback */
+   }
+
+   _mesa_Enable(GL_TEXTURE_RECTANGLE);
+
+   /* draw textured quad */
+   _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+   _mesa_Disable(GL_TEXTURE_RECTANGLE);
+
+   _mesa_meta_end(ctx);
+}
+
+
+
+/**
+ * When the glDrawPixels() image size is greater than the max rectangle
+ * texture size we use this function to break the glDrawPixels() image
+ * into tiles which fit into the max texture size.
+ */
+static void
+tiled_draw_pixels(GLcontext *ctx,
+                  GLint x, GLint y, GLsizei width, GLsizei height,
+                  GLenum format, GLenum type,
+                  const struct gl_pixelstore_attrib *unpack,
+                  const GLvoid *pixels)
+{
+   const GLint maxSize = ctx->Const.MaxTextureRectSize;
+   struct gl_pixelstore_attrib tileUnpack = *unpack;
+   GLint i, j;
+
+   for (i = 0; i < width; i += maxSize) {
+      const GLint tileWidth = MIN2(maxSize, width - i);
+      const GLint tileX = (GLint) (x + i * ctx->Pixel.ZoomX);
+
+      tileUnpack.SkipPixels = unpack->SkipPixels + i;
+
+      for (j = 0; j < height; j += maxSize) {
+         const GLint tileHeight = MIN2(maxSize, height - j);
+         const GLint tileY = (GLint) (y + j * ctx->Pixel.ZoomY);
+
+         tileUnpack.SkipRows = unpack->SkipRows + j;
+
+         _mesa_meta_draw_pixels(ctx, tileX, tileY,
+                                tileWidth, tileHeight,
+                                format, type, &tileUnpack, pixels);
+      }
+   }
+}
+
+
+/**
+ * Meta implementation of ctx->Driver.DrawPixels() in terms
+ * of texture mapping and polygon rendering.
+ * Note: this function requires GL_ARB_texture_rectangle support.
+ */
+void
+_mesa_meta_draw_pixels(GLcontext *ctx,
+                      GLint x, GLint y, GLsizei width, GLsizei height,
+                      GLenum format, GLenum type,
+                      const struct gl_pixelstore_attrib *unpack,
+                      const GLvoid *pixels)
+{
+   const GLenum filter = GL_NEAREST;
+   struct drawpix_state *drawpix = &ctx->Meta->DrawPix;
+   const GLfloat z = ctx->Current.RasterPos[2];
+   const GLfloat x1 = x + width * ctx->Pixel.ZoomX;
+   const GLfloat y1 = y + height * ctx->Pixel.ZoomY;
+   const struct gl_pixelstore_attrib unpackSave = ctx->Unpack;
+   GLenum texIntFormat;
+   GLboolean fallback;
+
+   ASSERT(ctx->Extensions.NV_texture_rectangle);
+
+   /*
+    * Determine if we can do the glDrawPixels with texture mapping.
+    */
+   fallback = GL_FALSE;
+   if (ctx->_ImageTransferState ||
+       ctx->Fog.Enabled) {
+      fallback = GL_TRUE;
+   }
+
+   if (_mesa_is_color_format(format)) {
+      texIntFormat = GL_RGBA;
+   }
+   else {
+      fallback = GL_TRUE;
+   }
+
+   if (fallback) {
+      _swrast_DrawPixels(ctx, x, y, width, height,
+                         format, type, unpack, pixels);
+      return;
+   }
+
+   /*
+    * Check image size against max texture size, draw as tiles if needed.
+    */
+   if (width > ctx->Const.MaxTextureRectSize ||
+       height > ctx->Const.MaxTextureRectSize) {
+      tiled_draw_pixels(ctx, x, y, width, height,
+                        format, type, unpack, pixels);
+      return;
+   }
+
+   /* Most GL state applies to glDrawPixels, but a there's a few things
+    * we need to override:
+    */
+   _mesa_meta_begin(ctx, (META_RASTERIZATION |
+                          META_SHADER |
+                          META_TEXTURE |
+                          META_TRANSFORM |
+                          META_VERTEX |
+                          META_VIEWPORT));
+
+   if (drawpix->TexObj == 0) {
+      /* one-time setup */
+
+      /* create texture object */
+      _mesa_GenTextures(1, &drawpix->TexObj);
+      _mesa_BindTexture(GL_TEXTURE_RECTANGLE, drawpix->TexObj);
+      _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+      _mesa_TexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, filter);
+      _mesa_TexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, filter);
+   }
+   else {
+      _mesa_BindTexture(GL_TEXTURE_RECTANGLE, drawpix->TexObj);
+   }
+
+   if (drawpix->ArrayObj == 0) {
+      /* one-time setup */
+
+      /* create vertex array object */
+      _mesa_GenVertexArrays(1, &drawpix->ArrayObj);
+      _mesa_BindVertexArray(drawpix->ArrayObj);
+
+      /* create vertex array buffer */
+      _mesa_GenBuffersARB(1, &drawpix->VBO);
+      _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, drawpix->VBO);
+      _mesa_BufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(drawpix->verts),
+                          drawpix->verts, GL_STREAM_DRAW_ARB);
+
+      /* setup vertex arrays */
+      _mesa_VertexPointer(3, GL_FLOAT, sizeof(drawpix->verts[0]),
+                          (void*) (0 * sizeof(GLfloat)));
+      _mesa_TexCoordPointer(2, GL_FLOAT, sizeof(drawpix->verts[0]),
+                            (void *) (3 * sizeof(GLfloat)));
+      _mesa_EnableClientState(GL_VERTEX_ARRAY);
+      _mesa_EnableClientState(GL_TEXTURE_COORD_ARRAY);
+   }
+   else {
+      _mesa_BindVertexArray(drawpix->ArrayObj);
+      _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, drawpix->VBO);
+   }
+
+   /* vertex positions, texcoords */
+   drawpix->verts[0][0] = (GLfloat) x;
+   drawpix->verts[0][1] = (GLfloat) y;
+   drawpix->verts[0][2] = z;
+   drawpix->verts[0][3] = 0.0F;
+   drawpix->verts[0][4] = 0.0F;
+   drawpix->verts[1][0] = (GLfloat) x1;
+   drawpix->verts[1][1] = (GLfloat) y;
+   drawpix->verts[1][2] = z;
+   drawpix->verts[1][3] = (GLfloat) width;
+   drawpix->verts[1][4] = 0.0F;
+   drawpix->verts[2][0] = (GLfloat) x1;
+   drawpix->verts[2][1] = (GLfloat) y1;
+   drawpix->verts[2][2] = z;
+   drawpix->verts[2][3] = (GLfloat) width;
+   drawpix->verts[2][4] = (GLfloat) height;
+   drawpix->verts[3][0] = (GLfloat) x;
+   drawpix->verts[3][1] = (GLfloat) y1;
+   drawpix->verts[3][2] = z;
+   drawpix->verts[3][3] = 0.0F;
+   drawpix->verts[3][4] = (GLfloat) height;
+
+   /* upload new vertex data */
+   _mesa_BufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0,
+                          sizeof(drawpix->verts), drawpix->verts);
+
+   /* set given unpack params */
+   ctx->Unpack = *unpack; /* XXX bufobj */
+
+   /* copy pixel data to texture */
+   if (drawpix->TexWidth == width &&
+       drawpix->TexHeight == height &&
+       drawpix->TexIntFormat == texIntFormat) {
+      /* replace existing tex image */
+      _mesa_TexSubImage2D(GL_TEXTURE_RECTANGLE, 0,
+                          0, 0, width, height, format, type, pixels);
+   }
+   else {
+      /* create new tex image */
+      _mesa_TexImage2D(GL_TEXTURE_RECTANGLE, 0, texIntFormat,
+                       width, height, 0, format, type, pixels);
+      drawpix->TexWidth = width;
+      drawpix->TexHeight = height;
+      drawpix->TexIntFormat = texIntFormat;
+   }
+
+   /* restore unpack params */
+   ctx->Unpack = unpackSave; /* XXX bufobj */
+
+   _mesa_Enable(GL_TEXTURE_RECTANGLE);
+
+   /* draw textured quad */
+   _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+   _mesa_Disable(GL_TEXTURE_RECTANGLE);
+
+   _mesa_meta_end(ctx);
+}
diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h
new file mode 100644 (file)
index 0000000..a9c5f98
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Mesa 3-D graphics library
+ * Version:  7.6
+ *
+ * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+#ifndef META_H
+#define META_H
+
+
+/**
+ * Flags passed to _mesa_meta_begin().
+ * XXX these flags may evolve...
+ */
+/*@{*/
+#define META_ALPHA_TEST      0x1
+#define META_BLEND           0x2  /**< includes logicop */
+#define META_COLOR_MASK      0x4
+#define META_DEPTH_TEST      0x8
+#define META_FOG            0x10
+#define META_RASTERIZATION  0x20
+#define META_SCISSOR        0x40
+#define META_SHADER         0x80
+#define META_STENCIL_TEST  0x100
+#define META_TRANSFORM     0x200 /**< modelview, projection */
+#define META_TEXTURE       0x400
+#define META_VERTEX        0x800
+#define META_VIEWPORT     0x1000
+#define META_ALL            ~0x0
+/*@}*/
+
+
+extern void
+_mesa_meta_init(GLcontext *ctx);
+
+extern void
+_mesa_meta_free(GLcontext *ctx);
+
+extern void
+_mesa_meta_blit_framebuffer(GLcontext *ctx,
+                            GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
+                            GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
+                            GLbitfield mask, GLenum filter);
+
+extern void
+_mesa_meta_clear(GLcontext *ctx, GLbitfield buffers);
+
+extern void
+_mesa_meta_copy_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
+                       GLsizei width, GLsizei height,
+                       GLint dstx, GLint dsty, GLenum type);
+
+extern void
+_mesa_meta_draw_pixels(GLcontext *ctx,
+                      GLint x, GLint y, GLsizei width, GLsizei height,
+                      GLenum format, GLenum type,
+                      const struct gl_pixelstore_attrib *unpack,
+                      const GLvoid *pixels);
+
+
+#endif /* META_H */
diff --git a/src/mesa/drivers/dri/common/.gitignore b/src/mesa/drivers/dri/common/.gitignore
new file mode 100644 (file)
index 0000000..1edeb79
--- /dev/null
@@ -0,0 +1 @@
+*.os
index fe183c2..cdbea34 100644 (file)
@@ -357,6 +357,7 @@ meta_clear_tris(struct dri_metaops *meta, GLbitfield mask)
    GLuint saved_shader_program = 0;
    unsigned int saved_active_texture;
    struct gl_array_object *arraySave = NULL;
+   GLfloat saved_near, saved_far;
 
    if (!meta->clear.arrayObj)
       meta_init_clear(meta);
@@ -370,8 +371,7 @@ meta_clear_tris(struct dri_metaops *meta, GLbitfield mask)
                    GL_POLYGON_BIT |
                    GL_STENCIL_BUFFER_BIT |
                    GL_TRANSFORM_BIT |
-                   GL_CURRENT_BIT |
-                   GL_VIEWPORT_BIT);
+                   GL_CURRENT_BIT);
    saved_active_texture = ctx->Texture.CurrentUnit;
 
    /* Disable existing GL state we don't want to apply to a clear. */
@@ -440,6 +440,8 @@ meta_clear_tris(struct dri_metaops *meta, GLbitfield mask)
    /* The ClearDepth value is unaffected by DepthRange, so do a default
     * mapping.
     */
+   saved_near = ctx->Viewport.Near;
+   saved_far = ctx->Viewport.Far;
    _mesa_DepthRange(0.0, 1.0);
 
    /* Prepare the vertices, which are the same regardless of which buffer we're
@@ -519,6 +521,7 @@ meta_clear_tris(struct dri_metaops *meta, GLbitfield mask)
    if (saved_shader_program)
       _mesa_UseProgramObjectARB(saved_shader_program);
 
+   _mesa_DepthRange(saved_near, saved_far);
    _mesa_PopAttrib();
 
    /* restore current array object */
index 1d94060..e48e10d 100644 (file)
@@ -778,7 +778,7 @@ dri2CreateNewScreen(int scrn, int fd,
     if (driDriverAPI.InitScreen2 == NULL)
         return NULL;
 
-    psp = _mesa_malloc(sizeof(*psp));
+    psp = _mesa_calloc(sizeof(*psp));
     if (!psp)
        return NULL;
 
index e308fd2..08a97bb 100644 (file)
@@ -752,6 +752,13 @@ static const char VertexAttrib4ubNV_names[] =
     "";
 #endif
 
+#if defined(need_GL_APPLE_texture_range)
+static const char TextureRangeAPPLE_names[] = 
+    "iip\0" /* Parameter signature */
+    "glTextureRangeAPPLE\0"
+    "";
+#endif
+
 #if defined(need_GL_SUN_vertex)
 static const char TexCoord2fColor4fNormal3fVertex3fSUN_names[] = 
     "ffffffffffff\0" /* Parameter signature */
@@ -1567,6 +1574,13 @@ static const char FragmentLightivSGIX_names[] =
     "";
 #endif
 
+#if defined(need_GL_APPLE_texture_range)
+static const char GetTexParameterPointervAPPLE_names[] = 
+    "iip\0" /* Parameter signature */
+    "glGetTexParameterPointervAPPLE\0"
+    "";
+#endif
+
 #if defined(need_GL_EXT_pixel_transform)
 static const char PixelTransformParameterfvEXT_names[] = 
     "iip\0" /* Parameter signature */
@@ -2079,6 +2093,13 @@ static const char Uniform2fvARB_names[] =
     "";
 #endif
 
+#if defined(need_GL_APPLE_flush_buffer_range)
+static const char BufferParameteriAPPLE_names[] = 
+    "iii\0" /* Parameter signature */
+    "glBufferParameteriAPPLE\0"
+    "";
+#endif
+
 #if defined(need_GL_VERSION_1_3)
 static const char MultiTexCoord3dvARB_names[] = 
     "ip\0" /* Parameter signature */
@@ -2803,6 +2824,13 @@ static const char IsProgramNV_names[] =
     "";
 #endif
 
+#if defined(need_GL_APPLE_flush_buffer_range)
+static const char FlushMappedBufferRangeAPPLE_names[] = 
+    "iii\0" /* Parameter signature */
+    "glFlushMappedBufferRangeAPPLE\0"
+    "";
+#endif
+
 #if defined(need_GL_SUN_triangle_list)
 static const char ReplacementCodePointerSUN_names[] = 
     "iip\0" /* Parameter signature */
@@ -4973,6 +5001,22 @@ static const struct dri_extension_function GL_3DFX_tbuffer_functions[] = {
 };
 #endif
 
+#if defined(need_GL_APPLE_flush_buffer_range)
+static const struct dri_extension_function GL_APPLE_flush_buffer_range_functions[] = {
+    { BufferParameteriAPPLE_names, BufferParameteriAPPLE_remap_index, -1 },
+    { FlushMappedBufferRangeAPPLE_names, FlushMappedBufferRangeAPPLE_remap_index, -1 },
+    { NULL, 0, 0 }
+};
+#endif
+
+#if defined(need_GL_APPLE_texture_range)
+static const struct dri_extension_function GL_APPLE_texture_range_functions[] = {
+    { TextureRangeAPPLE_names, TextureRangeAPPLE_remap_index, -1 },
+    { GetTexParameterPointervAPPLE_names, GetTexParameterPointervAPPLE_remap_index, -1 },
+    { NULL, 0, 0 }
+};
+#endif
+
 #if defined(need_GL_APPLE_vertex_array_object)
 static const struct dri_extension_function GL_APPLE_vertex_array_object_functions[] = {
     { DeleteVertexArraysAPPLE_names, DeleteVertexArraysAPPLE_remap_index, -1 },
index dee67fe..4e41860 100644 (file)
@@ -605,7 +605,7 @@ fbDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
 {
    fbSurface *fs = Lookup_fbSurface(surface);
    _eglUnlinkSurface(&fs->Base);
-   if (!fs->Base.IsBound)
+   if (!_eglIsSurfaceBound(&fs->Base))
       free(fs);
    return EGL_TRUE;
 }
@@ -616,7 +616,7 @@ fbDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext context)
 {
    fbContext *fc = Lookup_fbContext(context);
    _eglUnlinkContext(&fc->Base);
-   if (!fc->Base.IsBound)
+   if (!_eglIsContextBound(&fc->Base))
       free(fc);
    return EGL_TRUE;
 }
index 1bdb320..f73cbbf 100644 (file)
@@ -40,6 +40,7 @@
 #define I830_UPLOAD_BUFFERS          0x2
 #define I830_UPLOAD_STIPPLE          0x4
 #define I830_UPLOAD_INVARIENT        0x8
+#define I830_UPLOAD_RASTER_RULES     0x10
 #define I830_UPLOAD_TEX(i)           (0x10<<(i))
 #define I830_UPLOAD_TEXBLEND(i)      (0x100<<(i))
 #define I830_UPLOAD_TEX_ALL          (0x0f0)
 
 #define I830_TEXBLEND_SIZE     12      /* (4 args + op) * 2 + COLOR_FACTOR */
 
+enum {
+   I830_RASTER_RULES,
+   I830_RASTER_RULES_SIZE
+};
+
 struct i830_texture_object
 {
    struct intel_texture_object intel;
@@ -112,6 +118,7 @@ struct i830_hw_state
    GLuint Ctx[I830_CTX_SETUP_SIZE];
    GLuint Buffer[I830_DEST_SETUP_SIZE];
    GLuint Stipple[I830_STP_SETUP_SIZE];
+   GLuint RasterRules[I830_RASTER_RULES_SIZE];
    GLuint Tex[I830_TEX_UNITS][I830_TEX_SETUP_SIZE];
    GLuint TexBlend[I830_TEX_UNITS][I830_TEXBLEND_SIZE];
    GLuint TexBlendWordsUsed[I830_TEX_UNITS];
@@ -197,6 +204,7 @@ extern void i830InitStateFuncs(struct dd_function_table *functions);
 extern void i830EmitState(struct i830_context *i830);
 
 extern void i830InitState(struct i830_context *i830);
+extern void i830_update_provoking_vertex(GLcontext *ctx);
 
 /* i830_metaops.c
  */
index db16871..ae13170 100644 (file)
 #define ENABLE_LINE_STRIP_PROVOKE_VRTX (1<<8)
 #define ENABLE_TRI_FAN_PROVOKE_VRTX    (1<<5)
 #define ENABLE_TRI_STRIP_PROVOKE_VRTX  (1<<2)
+#define LINE_STRIP_PROVOKE_VRTX_MASK   (3<<6)
 #define LINE_STRIP_PROVOKE_VRTX(x)     ((x)<<6)
+#define TRI_FAN_PROVOKE_VRTX_MASK      (3<<3)
 #define TRI_FAN_PROVOKE_VRTX(x)        ((x)<<3)
+#define TRI_STRIP_PROVOKE_VRTX_MASK    (3<<0)
 #define TRI_STRIP_PROVOKE_VRTX(x)      (x)
 
 /* _3DSTATE_SCISSOR_ENABLE, p200 */
index 8ef6c91..645ebe3 100644 (file)
@@ -1047,6 +1047,16 @@ i830_init_packets(struct i830_context *i830)
                                          TEXBIND_SET1(TEXCOORDSRC_VTXSET_1) |
                                          TEXBIND_SET0(TEXCOORDSRC_VTXSET_0));
 
+   i830->state.RasterRules[I830_RASTER_RULES] = (_3DSTATE_RASTER_RULES_CMD |
+                                                ENABLE_POINT_RASTER_RULE |
+                                                OGL_POINT_RASTER_RULE |
+                                                ENABLE_LINE_STRIP_PROVOKE_VRTX |
+                                                ENABLE_TRI_FAN_PROVOKE_VRTX |
+                                                ENABLE_TRI_STRIP_PROVOKE_VRTX |
+                                                LINE_STRIP_PROVOKE_VRTX(1) |
+                                                TRI_FAN_PROVOKE_VRTX(2) |
+                                                TRI_STRIP_PROVOKE_VRTX(2));
+
 
    i830->state.Stipple[I830_STPREG_ST0] = _3DSTATE_STIPPLE;
 
@@ -1058,6 +1068,27 @@ i830_init_packets(struct i830_context *i830)
    i830->state.Buffer[I830_DESTREG_SR2] = 0;
 }
 
+void
+i830_update_provoking_vertex(GLcontext * ctx)
+{
+   struct i830_context *i830 = i830_context(ctx);
+
+   I830_STATECHANGE(i830, I830_UPLOAD_RASTER_RULES);
+   i830->state.RasterRules[I830_RASTER_RULES] &= ~(LINE_STRIP_PROVOKE_VRTX_MASK |
+                                                  TRI_FAN_PROVOKE_VRTX_MASK |
+                                                  TRI_STRIP_PROVOKE_VRTX_MASK);
+
+   /* _NEW_LIGHT */
+   if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION) {
+      i830->state.RasterRules[I830_RASTER_RULES] |= (LINE_STRIP_PROVOKE_VRTX(1) |
+                                                    TRI_FAN_PROVOKE_VRTX(2) |
+                                                    TRI_STRIP_PROVOKE_VRTX(2));
+   } else {
+      i830->state.RasterRules[I830_RASTER_RULES] |= (LINE_STRIP_PROVOKE_VRTX(0) |
+                                                    TRI_FAN_PROVOKE_VRTX(1) |
+                                                    TRI_STRIP_PROVOKE_VRTX(0));
+    }
+}
 
 void
 i830InitStateFuncs(struct dd_function_table *functions)
@@ -1101,6 +1132,7 @@ i830InitState(struct i830_context *i830)
    i830->current = &i830->state;
    i830->state.emitted = 0;
    i830->state.active = (I830_UPLOAD_INVARIENT |
+                         I830_UPLOAD_RASTER_RULES |
                          I830_UPLOAD_TEXBLEND(0) |
                          I830_UPLOAD_STIPPLE |
                          I830_UPLOAD_CTX | I830_UPLOAD_BUFFERS);
index 9c6f891..983f672 100644 (file)
@@ -299,7 +299,7 @@ i830_emit_invarient_state(struct intel_context *intel)
 {
    BATCH_LOCALS;
 
-   BEGIN_BATCH(30, IGNORE_CLIPRECTS);
+   BEGIN_BATCH(29, IGNORE_CLIPRECTS);
 
    OUT_BATCH(_3DSTATE_DFLT_DIFFUSE_CMD);
    OUT_BATCH(0);
@@ -351,15 +351,6 @@ i830_emit_invarient_state(struct intel_context *intel)
    OUT_BATCH(_3DSTATE_MAP_COORD_TRANSFORM);
    OUT_BATCH(DISABLE_TEX_TRANSFORM | TEXTURE_SET(3));
 
-   OUT_BATCH(_3DSTATE_RASTER_RULES_CMD |
-             ENABLE_POINT_RASTER_RULE |
-             OGL_POINT_RASTER_RULE |
-             ENABLE_LINE_STRIP_PROVOKE_VRTX |
-             ENABLE_TRI_FAN_PROVOKE_VRTX |
-             ENABLE_TRI_STRIP_PROVOKE_VRTX |
-             LINE_STRIP_PROVOKE_VRTX(1) |
-             TRI_FAN_PROVOKE_VRTX(2) | TRI_STRIP_PROVOKE_VRTX(2));
-
    OUT_BATCH(_3DSTATE_VERTEX_TRANSFORM);
    OUT_BATCH(DISABLE_VIEWPORT_TRANSFORM | DISABLE_PERSPECTIVE_DIVIDE);
 
@@ -394,6 +385,9 @@ get_state_size(struct i830_hw_state *state)
    if (dirty & I830_UPLOAD_INVARIENT)
       sz += 40 * sizeof(int);
 
+   if (dirty & I830_UPLOAD_RASTER_RULES)
+      sz += sizeof(state->RasterRules);
+
    if (dirty & I830_UPLOAD_CTX)
       sz += sizeof(state->Ctx);
 
@@ -486,6 +480,11 @@ i830_emit_state(struct intel_context *intel)
       i830_emit_invarient_state(intel);
    }
 
+   if (dirty & I830_UPLOAD_RASTER_RULES) {
+      DBG("I830_UPLOAD_RASTER_RULES:\n");
+      emit(intel, state->RasterRules, sizeof(state->RasterRules));
+   }
+
    if (dirty & I830_UPLOAD_CTX) {
       DBG("I830_UPLOAD_CTX:\n");
       emit(intel, state->Ctx, sizeof(state->Ctx));
@@ -737,6 +736,13 @@ i830_assert_not_dirty( struct intel_context *intel )
    assert(!get_dirty(state));
 }
 
+static void
+i830_invalidate_state(struct intel_context *intel, GLuint new_state)
+{
+   if (new_state & _NEW_LIGHT)
+      i830_update_provoking_vertex(&intel->ctx);
+}
+
 void
 i830InitVtbl(struct i830_context *i830)
 {
@@ -752,4 +758,5 @@ i830InitVtbl(struct i830_context *i830)
    i830->intel.vtbl.render_prevalidate = i830_render_prevalidate;
    i830->intel.vtbl.assert_not_dirty = i830_assert_not_dirty;
    i830->intel.vtbl.finish_batch = intel_finish_vb;
+   i830->intel.vtbl.invalidate_state = i830_invalidate_state;
 }
index 367d2a3..bb08cf8 100644 (file)
@@ -75,6 +75,10 @@ i915InvalidateState(GLcontext * ctx, GLuint new_state)
 
    if (new_state & (_NEW_FOG | _NEW_HINT | _NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS))
       i915_update_fog(ctx);
+   if (new_state & (_NEW_STENCIL | _NEW_BUFFERS | _NEW_POLYGON))
+      i915_update_stencil(ctx);
+   if (new_state & (_NEW_LIGHT))
+       i915_update_provoking_vertex(ctx);
 }
 
 
index 87bbf5f..8de4a9d 100644 (file)
@@ -48,6 +48,7 @@
 #define I915_UPLOAD_FOG              0x20
 #define I915_UPLOAD_INVARIENT        0x40
 #define I915_UPLOAD_DEFAULTS         0x80
+#define I915_UPLOAD_RASTER_RULES     0x100
 #define I915_UPLOAD_TEX(i)           (0x00010000<<(i))
 #define I915_UPLOAD_TEX_ALL          (0x00ff0000)
 #define I915_UPLOAD_TEX_0_SHIFT      16
@@ -82,7 +83,9 @@
 #define I915_CTXREG_IAB                6
 #define I915_CTXREG_BLENDCOLOR0                7
 #define I915_CTXREG_BLENDCOLOR1                8
-#define I915_CTX_SETUP_SIZE            9
+#define I915_CTXREG_BF_STENCIL_OPS     9
+#define I915_CTXREG_BF_STENCIL_MASKS   10
+#define I915_CTX_SETUP_SIZE            11
 
 #define I915_FOGREG_COLOR              0
 #define I915_FOGREG_MODE0              1
 #define I915_DEFREG_Z1    5
 #define I915_DEF_SETUP_SIZE    6
 
+enum {
+   I915_RASTER_RULES,
+   I915_RASTER_RULES_SETUP_SIZE,
+};
 
 #define I915_MAX_CONSTANT      32
 #define I915_CONSTANT_SIZE     (2+(4*I915_MAX_CONSTANT))
@@ -206,6 +213,7 @@ struct i915_hw_state
    GLuint Stipple[I915_STP_SETUP_SIZE];
    GLuint Fog[I915_FOG_SETUP_SIZE];
    GLuint Defaults[I915_DEF_SETUP_SIZE];
+   GLuint RasterRules[I915_RASTER_RULES_SETUP_SIZE];
    GLuint Tex[I915_TEX_UNITS][I915_TEX_SETUP_SIZE];
    GLuint Constant[I915_CONSTANT_SIZE];
    GLuint ConstantSize;
@@ -321,6 +329,8 @@ extern void i915_print_ureg(const char *msg, GLuint ureg);
 extern void i915InitStateFunctions(struct dd_function_table *functions);
 extern void i915InitState(struct i915_context *i915);
 extern void i915_update_fog(GLcontext * ctx);
+extern void i915_update_stencil(GLcontext * ctx);
+extern void i915_update_provoking_vertex(GLcontext *ctx);
 
 
 /*======================================================================
index 84db58e..b5fa7fd 100644 (file)
 #define BFM_ENABLE_STENCIL_WRITE_MASK     (1<<16)
 #define BFM_STENCIL_TEST_MASK_SHIFT       8
 #define BFM_STENCIL_TEST_MASK_MASK        (0xff<<8)
+#define BFM_STENCIL_TEST_MASK(x)         (((x)&0xff) << 8)
 #define BFM_STENCIL_WRITE_MASK_SHIFT      0
 #define BFM_STENCIL_WRITE_MASK_MASK       (0xff<<0)
+#define BFM_STENCIL_WRITE_MASK(x)        ((x)&0xff)
 
 
 
 #define TEXKILL_4D                      (1<<9)
 #define ENABLE_LINE_STRIP_PROVOKE_VRTX (1<<8)
 #define ENABLE_TRI_FAN_PROVOKE_VRTX    (1<<5)
+#define LINE_STRIP_PROVOKE_VRTX_MASK   (3 << 6)
 #define LINE_STRIP_PROVOKE_VRTX(x)     ((x)<<6)
+#define TRI_FAN_PROVOKE_VRTX_MASK      (3 << 3)
 #define TRI_FAN_PROVOKE_VRTX(x)        ((x)<<3)
 
 /* _3DSTATE_SCISSOR_ENABLE, p256 */
index 814fb59..b60efea 100644 (file)
 
 #define FILE_DEBUG_FLAG DEBUG_STATE
 
-static void
-i915StencilFuncSeparate(GLcontext * ctx, GLenum face, GLenum func, GLint ref,
-                        GLuint mask)
+void
+i915_update_stencil(GLcontext * ctx)
 {
    struct i915_context *i915 = I915_CONTEXT(ctx);
-   int test = intel_translate_compare_func(func);
+   GLuint front_ref, front_writemask, front_mask;
+   GLenum front_func, front_fail, front_pass_z_fail, front_pass_z_pass;
+   GLuint back_ref, back_writemask, back_mask;
+   GLenum back_func, back_fail, back_pass_z_fail, back_pass_z_pass;
 
-   mask = mask & 0xff;
-
-   DBG("%s : func: %s, ref : 0x%x, mask: 0x%x\n", __FUNCTION__,
-       _mesa_lookup_enum_by_nr(func), ref, mask);
+   I915_STATECHANGE(i915, I915_UPLOAD_CTX);
 
+   /* The 915 considers CW to be "front" for two-sided stencil, so choose
+    * appropriately.
+    */
+   /* _NEW_POLYGON | _NEW_STENCIL */
+   if (ctx->Polygon.FrontFace == GL_CW) {
+      front_ref = ctx->Stencil.Ref[0];
+      front_mask = ctx->Stencil.ValueMask[0];
+      front_writemask = ctx->Stencil.WriteMask[0];
+      front_func = ctx->Stencil.Function[0];
+      front_fail = ctx->Stencil.FailFunc[0];
+      front_pass_z_fail = ctx->Stencil.ZFailFunc[0];
+      front_pass_z_pass = ctx->Stencil.ZPassFunc[0];
+      back_ref = ctx->Stencil.Ref[ctx->Stencil._BackFace];
+      back_mask = ctx->Stencil.ValueMask[ctx->Stencil._BackFace];
+      back_writemask = ctx->Stencil.WriteMask[ctx->Stencil._BackFace];
+      back_func = ctx->Stencil.Function[ctx->Stencil._BackFace];
+      back_fail = ctx->Stencil.FailFunc[ctx->Stencil._BackFace];
+      back_pass_z_fail = ctx->Stencil.ZFailFunc[ctx->Stencil._BackFace];
+      back_pass_z_pass = ctx->Stencil.ZPassFunc[ctx->Stencil._BackFace];
+   } else {
+      front_ref = ctx->Stencil.Ref[ctx->Stencil._BackFace];
+      front_mask = ctx->Stencil.ValueMask[ctx->Stencil._BackFace];
+      front_writemask = ctx->Stencil.WriteMask[ctx->Stencil._BackFace];
+      front_func = ctx->Stencil.Function[ctx->Stencil._BackFace];
+      front_fail = ctx->Stencil.FailFunc[ctx->Stencil._BackFace];
+      front_pass_z_fail = ctx->Stencil.ZFailFunc[ctx->Stencil._BackFace];
+      front_pass_z_pass = ctx->Stencil.ZPassFunc[ctx->Stencil._BackFace];
+      back_ref = ctx->Stencil.Ref[0];
+      back_mask = ctx->Stencil.ValueMask[0];
+      back_writemask = ctx->Stencil.WriteMask[0];
+      back_func = ctx->Stencil.Function[0];
+      back_fail = ctx->Stencil.FailFunc[0];
+      back_pass_z_fail = ctx->Stencil.ZFailFunc[0];
+      back_pass_z_pass = ctx->Stencil.ZPassFunc[0];
+   }
 
-   I915_STATECHANGE(i915, I915_UPLOAD_CTX);
-   i915->state.Ctx[I915_CTXREG_STATE4] &= ~MODE4_ENABLE_STENCIL_TEST_MASK;
+   /* Set front state. */
+   i915->state.Ctx[I915_CTXREG_STATE4] &= ~(MODE4_ENABLE_STENCIL_TEST_MASK |
+                                           MODE4_ENABLE_STENCIL_WRITE_MASK);
    i915->state.Ctx[I915_CTXREG_STATE4] |= (ENABLE_STENCIL_TEST_MASK |
-                                           STENCIL_TEST_MASK(mask));
+                                          ENABLE_STENCIL_WRITE_MASK |
+                                          STENCIL_TEST_MASK(front_mask) |
+                                          STENCIL_WRITE_MASK(front_writemask));
 
    i915->state.Ctx[I915_CTXREG_LIS5] &= ~(S5_STENCIL_REF_MASK |
-                                          S5_STENCIL_TEST_FUNC_MASK);
+                                         S5_STENCIL_TEST_FUNC_MASK |
+                                         S5_STENCIL_FAIL_MASK |
+                                         S5_STENCIL_PASS_Z_FAIL_MASK |
+                                         S5_STENCIL_PASS_Z_PASS_MASK);
+
+   i915->state.Ctx[I915_CTXREG_LIS5] |=
+      (front_ref << S5_STENCIL_REF_SHIFT) |
+      (intel_translate_compare_func(front_func) << S5_STENCIL_TEST_FUNC_SHIFT) |
+      (intel_translate_stencil_op(front_fail) << S5_STENCIL_FAIL_SHIFT) |
+      (intel_translate_stencil_op(front_pass_z_fail) <<
+       S5_STENCIL_PASS_Z_FAIL_SHIFT) |
+      (intel_translate_stencil_op(front_pass_z_pass) <<
+       S5_STENCIL_PASS_Z_PASS_SHIFT);
+
+   /* Set back state if different from front. */
+   if (ctx->Stencil._TestTwoSide) {
+      i915->state.Ctx[I915_CTXREG_BF_STENCIL_OPS] &=
+        ~(BFO_STENCIL_REF_MASK |
+          BFO_STENCIL_TEST_MASK |
+          BFO_STENCIL_FAIL_MASK |
+          BFO_STENCIL_PASS_Z_FAIL_MASK |
+          BFO_STENCIL_PASS_Z_PASS_MASK);
+      i915->state.Ctx[I915_CTXREG_BF_STENCIL_OPS] |= BFO_STENCIL_TWO_SIDE |
+        (back_ref << BFO_STENCIL_REF_SHIFT) |
+        (intel_translate_compare_func(back_func) << BFO_STENCIL_TEST_SHIFT) |
+        (intel_translate_stencil_op(back_fail) << BFO_STENCIL_FAIL_SHIFT) |
+        (intel_translate_stencil_op(back_pass_z_fail) <<
+         BFO_STENCIL_PASS_Z_FAIL_SHIFT) |
+        (intel_translate_stencil_op(back_pass_z_pass) <<
+         BFO_STENCIL_PASS_Z_PASS_SHIFT);
+
+      i915->state.Ctx[I915_CTXREG_BF_STENCIL_MASKS] &=
+        ~(BFM_STENCIL_TEST_MASK_MASK |
+          BFM_STENCIL_WRITE_MASK_MASK);
+      i915->state.Ctx[I915_CTXREG_BF_STENCIL_MASKS] |=
+        BFM_STENCIL_TEST_MASK(back_mask) |
+        BFM_STENCIL_WRITE_MASK(back_writemask);
+   } else {
+      i915->state.Ctx[I915_CTXREG_BF_STENCIL_OPS] &= ~BFO_STENCIL_TWO_SIDE;
+   }
+}
 
-   i915->state.Ctx[I915_CTXREG_LIS5] |= ((ref << S5_STENCIL_REF_SHIFT) |
-                                         (test <<
-                                          S5_STENCIL_TEST_FUNC_SHIFT));
+static void
+i915StencilFuncSeparate(GLcontext * ctx, GLenum face, GLenum func, GLint ref,
+                        GLuint mask)
+{
 }
 
 static void
 i915StencilMaskSeparate(GLcontext * ctx, GLenum face, GLuint mask)
 {
-   struct i915_context *i915 = I915_CONTEXT(ctx);
-
-   DBG("%s : mask 0x%x\n", __FUNCTION__, mask);
-   
-   mask = mask & 0xff;
-
-   I915_STATECHANGE(i915, I915_UPLOAD_CTX);
-   i915->state.Ctx[I915_CTXREG_STATE4] &= ~MODE4_ENABLE_STENCIL_WRITE_MASK;
-   i915->state.Ctx[I915_CTXREG_STATE4] |= (ENABLE_STENCIL_WRITE_MASK |
-                                           STENCIL_WRITE_MASK(mask));
 }
 
-
 static void
 i915StencilOpSeparate(GLcontext * ctx, GLenum face, GLenum fail, GLenum zfail,
                       GLenum zpass)
 {
-   struct i915_context *i915 = I915_CONTEXT(ctx);
-   int fop = intel_translate_stencil_op(fail);
-   int dfop = intel_translate_stencil_op(zfail);
-   int dpop = intel_translate_stencil_op(zpass);
-
-
-   DBG("%s: fail : %s, zfail: %s, zpass : %s\n", __FUNCTION__,
-       _mesa_lookup_enum_by_nr(fail),
-       _mesa_lookup_enum_by_nr(zfail), _mesa_lookup_enum_by_nr(zpass));
-
-   I915_STATECHANGE(i915, I915_UPLOAD_CTX);
-
-   i915->state.Ctx[I915_CTXREG_LIS5] &= ~(S5_STENCIL_FAIL_MASK |
-                                          S5_STENCIL_PASS_Z_FAIL_MASK |
-                                          S5_STENCIL_PASS_Z_PASS_MASK);
-
-   i915->state.Ctx[I915_CTXREG_LIS5] |= ((fop << S5_STENCIL_FAIL_SHIFT) |
-                                         (dfop <<
-                                          S5_STENCIL_PASS_Z_FAIL_SHIFT) |
-                                         (dpop <<
-                                          S5_STENCIL_PASS_Z_PASS_SHIFT));
 }
 
 static void
@@ -945,6 +991,17 @@ i915_init_packets(struct i915_context *i915)
          _3DSTATE_CONST_BLEND_COLOR_CMD;
       i915->state.Ctx[I915_CTXREG_BLENDCOLOR1] = 0;
 
+      i915->state.Ctx[I915_CTXREG_BF_STENCIL_MASKS] =
+        _3DSTATE_BACKFACE_STENCIL_MASKS |
+        BFM_ENABLE_STENCIL_TEST_MASK |
+        BFM_ENABLE_STENCIL_WRITE_MASK |
+        (0xff << BFM_STENCIL_WRITE_MASK_SHIFT) |
+        (0xff << BFM_STENCIL_TEST_MASK_SHIFT);
+      i915->state.Ctx[I915_CTXREG_BF_STENCIL_OPS] =
+        _3DSTATE_BACKFACE_STENCIL_OPS |
+        BFO_ENABLE_STENCIL_REF |
+        BFO_ENABLE_STENCIL_FUNCS |
+        BFO_ENABLE_STENCIL_TWO_SIDE;
    }
 
    {
@@ -976,6 +1033,13 @@ i915_init_packets(struct i915_context *i915)
       i915->state.Buffer[I915_DESTREG_SR2] = 0;
    }
 
+   i915->state.RasterRules[I915_RASTER_RULES] = _3DSTATE_RASTER_RULES_CMD |
+      ENABLE_POINT_RASTER_RULE |
+      OGL_POINT_RASTER_RULE |
+      ENABLE_LINE_STRIP_PROVOKE_VRTX |
+      ENABLE_TRI_FAN_PROVOKE_VRTX |
+      LINE_STRIP_PROVOKE_VRTX(1) |
+      TRI_FAN_PROVOKE_VRTX(2) | ENABLE_TEXKILL_3D_4D | TEXKILL_4D;
 
 #if 0
    {
@@ -996,7 +1060,33 @@ i915_init_packets(struct i915_context *i915)
    i915->state.active = (I915_UPLOAD_PROGRAM |
                          I915_UPLOAD_STIPPLE |
                          I915_UPLOAD_CTX |
-                         I915_UPLOAD_BUFFERS | I915_UPLOAD_INVARIENT);
+                         I915_UPLOAD_BUFFERS |
+                        I915_UPLOAD_INVARIENT |
+                        I915_UPLOAD_RASTER_RULES);
+}
+
+void
+i915_update_provoking_vertex(GLcontext * ctx)
+{
+   struct i915_context *i915 = I915_CONTEXT(ctx);
+
+   I915_STATECHANGE(i915, I915_UPLOAD_CTX);
+   i915->state.Ctx[I915_CTXREG_LIS6] &= ~(S6_TRISTRIP_PV_MASK);
+
+   I915_STATECHANGE(i915, I915_UPLOAD_RASTER_RULES);
+   i915->state.RasterRules[I915_RASTER_RULES] &= ~(LINE_STRIP_PROVOKE_VRTX_MASK |
+                                                  TRI_FAN_PROVOKE_VRTX_MASK);
+
+   /* _NEW_LIGHT */
+   if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION) {
+      i915->state.RasterRules[I915_RASTER_RULES] |= (LINE_STRIP_PROVOKE_VRTX(1) |
+                                                    TRI_FAN_PROVOKE_VRTX(2));
+      i915->state.Ctx[I915_CTXREG_LIS6] |= (2 << S6_TRISTRIP_PV_SHIFT);
+   } else {
+      i915->state.RasterRules[I915_RASTER_RULES] |= (LINE_STRIP_PROVOKE_VRTX(0) |
+                                                    TRI_FAN_PROVOKE_VRTX(1));
+      i915->state.Ctx[I915_CTXREG_LIS6] |= (0 << S6_TRISTRIP_PV_SHIFT);
+    }
 }
 
 void
index fe1be93..9a723d3 100644 (file)
@@ -176,7 +176,7 @@ i915_emit_invarient_state(struct intel_context *intel)
 {
    BATCH_LOCALS;
 
-   BEGIN_BATCH(20, IGNORE_CLIPRECTS);
+   BEGIN_BATCH(17, IGNORE_CLIPRECTS);
 
    OUT_BATCH(_3DSTATE_AA_CMD |
              AA_LINE_ECAAR_WIDTH_ENABLE |
@@ -200,14 +200,6 @@ i915_emit_invarient_state(struct intel_context *intel)
              CSB_TCB(3, 3) |
              CSB_TCB(4, 4) | CSB_TCB(5, 5) | CSB_TCB(6, 6) | CSB_TCB(7, 7));
 
-   OUT_BATCH(_3DSTATE_RASTER_RULES_CMD |
-             ENABLE_POINT_RASTER_RULE |
-             OGL_POINT_RASTER_RULE |
-             ENABLE_LINE_STRIP_PROVOKE_VRTX |
-             ENABLE_TRI_FAN_PROVOKE_VRTX |
-             LINE_STRIP_PROVOKE_VRTX(1) |
-             TRI_FAN_PROVOKE_VRTX(2) | ENABLE_TEXKILL_3D_4D | TEXKILL_4D);
-
    /* Need to initialize this to zero.
     */
    OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(3) | (0));
@@ -225,11 +217,6 @@ i915_emit_invarient_state(struct intel_context *intel)
    OUT_BATCH(_3DSTATE_LOAD_INDIRECT | 0);       /* disable indirect state */
    OUT_BATCH(0);
 
-
-   /* Don't support twosided stencil yet */
-   OUT_BATCH(_3DSTATE_BACKFACE_STENCIL_OPS | BFO_ENABLE_STENCIL_TWO_SIDE | 0);
-   OUT_BATCH(0);
-
    ADVANCE_BATCH();
 }
 
@@ -263,6 +250,9 @@ get_state_size(struct i915_hw_state *state)
    if (dirty & I915_UPLOAD_INVARIENT)
       sz += 30 * 4;
 
+   if (dirty & I915_UPLOAD_RASTER_RULES)
+      sz += sizeof(state->RasterRules);
+
    if (dirty & I915_UPLOAD_CTX)
       sz += sizeof(state->Ctx);
 
@@ -371,6 +361,12 @@ i915_emit_state(struct intel_context *intel)
       i915_emit_invarient_state(intel);
    }
 
+   if (dirty & I915_UPLOAD_RASTER_RULES) {
+      if (INTEL_DEBUG & DEBUG_STATE)
+         fprintf(stderr, "I915_UPLOAD_RASTER_RULES:\n");
+      emit(intel, state->RasterRules, sizeof(state->RasterRules));
+   }
+
    if (dirty & I915_UPLOAD_CTX) {
       if (INTEL_DEBUG & DEBUG_STATE)
          fprintf(stderr, "I915_UPLOAD_CTX:\n");
index 00a4211..128afb5 100644 (file)
@@ -43,6 +43,7 @@ DRIVER_SOURCES = \
        brw_clip_util.c \
        brw_context.c \
        brw_curbe.c \
+       brw_disasm.c \
        brw_draw.c \
        brw_draw_upload.c \
        brw_eu.c \
index 54d30a3..20a927c 100644 (file)
@@ -166,7 +166,8 @@ static void upload_clip_prog(struct brw_context *brw)
 
    /* _NEW_POLYGON */
    if (key.primitive == GL_TRIANGLES) {
-      if (ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK) 
+      if (ctx->Polygon.CullFlag &&
+         ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)
         key.clip_mode = BRW_CLIPMODE_REJECT_ALL;
       else {
         GLuint fill_front = CLIP_CULL;
index 12e8548..957df44 100644 (file)
@@ -100,6 +100,8 @@ struct brw_clip_compile {
       
       struct brw_reg fixed_planes;
       struct brw_reg plane_equation;
+       
+      struct brw_reg ff_sync;
    } reg;
 
    /* 3 different ways of expressing vertex size:
@@ -173,4 +175,5 @@ struct brw_reg get_tmp( struct brw_clip_compile *c );
 void brw_clip_project_position(struct brw_clip_compile *c,
              struct brw_reg pos );
 void brw_clip_ff_sync(struct brw_clip_compile *c);
+void brw_clip_init_ff_sync(struct brw_clip_compile *c);
 #endif
index 9abd064..048ca62 100644 (file)
@@ -85,6 +85,10 @@ static void brw_clip_line_alloc_regs( struct brw_clip_compile *c )
       i++;
    }
 
+   if (c->need_ff_sync) {
+      c->reg.ff_sync = retype(brw_vec1_grf(i, 0), BRW_REGISTER_TYPE_UD);
+      i++;
+   }
 
    c->first_tmp = i;
    c->last_tmp = i;
@@ -246,8 +250,6 @@ static void clip_and_emit_line( struct brw_clip_compile *c )
 
    brw_ADD(p, c->reg.t, c->reg.t0, c->reg.t1);
    brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_L, c->reg.t, brw_imm_f(1.0));
-   if (c->need_ff_sync)
-          brw_clip_ff_sync(c);      
    not_culled = brw_IF(p, BRW_EXECUTE_1);
    {
       brw_clip_interp_vertex(c, newvtx0, vtx0, vtx1, c->reg.t0, GL_FALSE);
@@ -265,6 +267,7 @@ static void clip_and_emit_line( struct brw_clip_compile *c )
 void brw_emit_line_clip( struct brw_clip_compile *c )
 {
    brw_clip_line_alloc_regs(c);
+   brw_clip_init_ff_sync(c);
 
    if (c->key.do_flat_shading)
       brw_clip_copy_colors(c, 0, 1);
index 9738299..8458f61 100644 (file)
@@ -50,7 +50,7 @@ void brw_emit_point_clip( struct brw_clip_compile *c )
    /* Send an empty message to kill the thread:
     */
    brw_clip_tri_alloc_regs(c, 0);
-   if (c->need_ff_sync)
-          brw_clip_ff_sync(c);      
+   brw_clip_init_ff_sync(c);
+
    brw_clip_kill_thread(c);
 }
index 4c2d655..0efd772 100644 (file)
@@ -119,6 +119,11 @@ void brw_clip_tri_alloc_regs( struct brw_clip_compile *c,
       i++;
    }
 
+   if (c->need_ff_sync) {
+      c->reg.ff_sync = retype(brw_vec1_grf(i, 0), BRW_REGISTER_TYPE_UD);
+      i++;
+   }
+
    c->first_tmp = i;
    c->last_tmp = i;
 
@@ -563,6 +568,7 @@ void brw_emit_tri_clip( struct brw_clip_compile *c )
    brw_clip_tri_alloc_regs(c, 3 + c->key.nr_userclip + 6);
    brw_clip_tri_init_vertices(c);
    brw_clip_init_clipmask(c);
+   brw_clip_init_ff_sync(c);
 
    /* if -ve rhw workaround bit is set, 
       do cliptest */
@@ -589,8 +595,6 @@ void brw_emit_tri_clip( struct brw_clip_compile *c )
    else 
       maybe_do_clip_tri(c);
 
-   if (c->need_ff_sync)
-          brw_clip_ff_sync(c);      
    brw_clip_tri_emit_polygon(c);
 
    /* Send an empty message to kill the thread:
index 2695038..ad1bfa4 100644 (file)
@@ -453,6 +453,7 @@ void brw_emit_unfilled_clip( struct brw_clip_compile *c )
 
    brw_clip_tri_alloc_regs(c, 3 + c->key.nr_userclip + 6);
    brw_clip_tri_init_vertices(c);
+   brw_clip_init_ff_sync(c);
 
    assert(c->offset[VERT_RESULT_EDGE]);
 
@@ -496,8 +497,6 @@ void brw_emit_unfilled_clip( struct brw_clip_compile *c )
    }
    brw_ENDIF(p, do_clip);
    
-   if (c->need_ff_sync)
-          brw_clip_ff_sync(c);      
    emit_unfilled_primitives(c);
    brw_clip_kill_thread(c);
 }
index e09efc0..5a73abd 100644 (file)
@@ -213,6 +213,8 @@ void brw_clip_emit_vue(struct brw_clip_compile *c,
    struct brw_compile *p = &c->func;
    GLuint start = c->last_mrf;
 
+   brw_clip_ff_sync(c);
+
    assert(!(allocate && eot));
    
    /* Cycle through mrf regs - probably futile as we have to wait for
@@ -263,6 +265,7 @@ void brw_clip_kill_thread(struct brw_clip_compile *c)
 {
    struct brw_compile *p = &c->func;
 
+   brw_clip_ff_sync(c);
    /* Send an empty message to kill the thread and release any
     * allocated urb entry:
     */
@@ -356,17 +359,38 @@ void brw_clip_init_clipmask( struct brw_clip_compile *c )
 
 void brw_clip_ff_sync(struct brw_clip_compile *c)
 {
+    if (c->need_ff_sync) {
+        struct brw_compile *p = &c->func;
+        struct brw_instruction *need_ff_sync;
+
+        brw_set_conditionalmod(p, BRW_CONDITIONAL_Z);
+        brw_AND(p, brw_null_reg(), c->reg.ff_sync, brw_imm_ud(0x1));
+        need_ff_sync = brw_IF(p, BRW_EXECUTE_1);
+        {
+            brw_OR(p, c->reg.ff_sync, c->reg.ff_sync, brw_imm_ud(0x1));
+            brw_ff_sync(p, 
+                    c->reg.R0,
+                    0,
+                    c->reg.R0,
+                    1, 
+                    1,         /* used */
+                    1,         /* msg length */
+                    1,         /* response length */
+                    0,         /* eot */
+                    1,         /* write compelete */
+                    0,         /* urb offset */
+                    BRW_URB_SWIZZLE_NONE);
+        }
+        brw_ENDIF(p, need_ff_sync);
+        brw_set_predicate_control(p, BRW_PREDICATE_NONE);
+    }
+}
+
+void brw_clip_init_ff_sync(struct brw_clip_compile *c)
+{
+    if (c->need_ff_sync) {
        struct brw_compile *p = &c->func;
-       brw_ff_sync(p, 
-                               c->reg.R0,
-                               0,
-                               c->reg.R0,
-                               1,      
-                               1,              /* used */
-                               1,      /* msg length */
-                               1,              /* response length */
-                               0,              /* eot */
-                               1,              /* write compelete */
-                               0,              /* urb offset */
-                               BRW_URB_SWIZZLE_NONE);
+        
+        brw_MOV(p, c->reg.ff_sync, brw_imm_ud(0));
+    }
 }
index 57ddf75..847c44e 100644 (file)
@@ -143,6 +143,7 @@ struct brw_context;
 #define BRW_NEW_DEPTH_BUFFER           0x20000
 #define BRW_NEW_NR_WM_SURFACES         0x40000
 #define BRW_NEW_NR_VS_SURFACES         0x80000
+#define BRW_NEW_INDEX_BUFFER           0x100000
 
 struct brw_state_flags {
    /** State update flags signalled by mesa internals */
@@ -438,9 +439,13 @@ struct brw_query_object {
    unsigned int count;
 };
 
+
+/**
+ * brw_context is derived from intel_context.
+ */
 struct brw_context 
 {
-   struct intel_context intel;
+   struct intel_context intel;  /**< base class, must be first field */
    GLuint primitive;
 
    GLboolean emit_state_always;
@@ -475,6 +480,9 @@ struct brw_context
    struct {
       struct brw_vertex_element inputs[VERT_ATTRIB_MAX];
 
+      struct brw_vertex_element *enabled[VERT_ATTRIB_MAX];
+      GLuint nr_enabled;
+
 #define BRW_NR_UPLOAD_BUFS 17
 #define BRW_UPLOAD_INIT_SIZE (128*1024)
 
@@ -498,8 +506,15 @@ struct brw_context
        */
       const struct _mesa_index_buffer *ib;
 
+      /* Updates to these fields are signaled by BRW_NEW_INDEX_BUFFER. */
       dri_bo *bo;
       unsigned int offset;
+      unsigned int size;
+      /* Offset to index buffer index to use in CMD_3D_PRIM so that we can
+       * avoid re-uploading the IB packet over and over if we're actually
+       * referencing the same index buffer.
+       */
+      unsigned int start_vertex_offset;
    } ib;
 
    /* Active vertex program: 
@@ -706,6 +721,8 @@ void brw_upload_urb_fence(struct brw_context *brw);
  */
 void brw_upload_cs_urb_state(struct brw_context *brw);
 
+/* brw_disasm.c */
+int brw_disasm (FILE *file, struct brw_instruction *inst);
 
 /*======================================================================
  * Inline conversion functions.  These are better-typed than the
index d166250..78d457a 100644 (file)
 #define BRW_CONDITIONAL_GE    4
 #define BRW_CONDITIONAL_L     5
 #define BRW_CONDITIONAL_LE    6
-#define BRW_CONDITIONAL_C     7
+#define BRW_CONDITIONAL_R     7
 #define BRW_CONDITIONAL_O     8
+#define BRW_CONDITIONAL_U     9
 
 #define BRW_DEBUG_NONE        0
 #define BRW_DEBUG_BREAKPOINT  1
 #define BRW_OPCODE_RSL        11
 #define BRW_OPCODE_ASR        12
 #define BRW_OPCODE_CMP        16
+#define BRW_OPCODE_CMPN       17
 #define BRW_OPCODE_JMPI       32
 #define BRW_OPCODE_IF         34
 #define BRW_OPCODE_IFF        35
diff --git a/src/mesa/drivers/dri/i965/brw_disasm.c b/src/mesa/drivers/dri/i965/brw_disasm.c
new file mode 100644 (file)
index 0000000..9fef230
--- /dev/null
@@ -0,0 +1,903 @@
+/*
+ * Copyright Â© 2008 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <stdarg.h>
+
+#include "main/mtypes.h"
+
+#include "brw_context.h"
+#include "brw_defines.h"
+
+struct {
+    char    *name;
+    int            nsrc;
+    int            ndst;
+} opcode[128] = {
+    [BRW_OPCODE_MOV] = { .name = "mov", .nsrc = 1, .ndst = 1 },
+    [BRW_OPCODE_FRC] = { .name = "frc", .nsrc = 1, .ndst = 1 },
+    [BRW_OPCODE_RNDU] = { .name = "rndu", .nsrc = 1, .ndst = 1 },
+    [BRW_OPCODE_RNDD] = { .name = "rndd", .nsrc = 1, .ndst = 1 },
+    [BRW_OPCODE_RNDE] = { .name = "rnde", .nsrc = 1, .ndst = 1 },
+    [BRW_OPCODE_RNDZ] = { .name = "rndz", .nsrc = 1, .ndst = 1 },
+    [BRW_OPCODE_NOT] = { .name = "not", .nsrc = 1, .ndst = 1 },
+    [BRW_OPCODE_LZD] = { .name = "lzd", .nsrc = 1, .ndst = 1 },
+
+    [BRW_OPCODE_MUL] = { .name = "mul", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_MAC] = { .name = "mac", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_MACH] = { .name = "mach", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_LINE] = { .name = "line", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_SAD2] = { .name = "sad2", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_SADA2] = { .name = "sada2", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_DP4] = { .name = "dp4", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_DPH] = { .name = "dph", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_DP3] = { .name = "dp3", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_DP2] = { .name = "dp2", .nsrc = 2, .ndst = 1 },
+
+    [BRW_OPCODE_AVG] = { .name = "avg", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_ADD] = { .name = "add", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_SEL] = { .name = "sel", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_AND] = { .name = "and", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_OR] = { .name = "or", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_XOR] = { .name = "xor", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_SHR] = { .name = "shr", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_SHL] = { .name = "shl", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_ASR] = { .name = "asr", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_CMP] = { .name = "cmp", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_CMPN] = { .name = "cmpn", .nsrc = 2, .ndst = 1 },
+
+    [BRW_OPCODE_SEND] = { .name = "send", .nsrc = 1, .ndst = 1 },
+    [BRW_OPCODE_NOP] = { .name = "nop", .nsrc = 0, .ndst = 0 },
+    [BRW_OPCODE_JMPI] = { .name = "jmpi", .nsrc = 1, .ndst = 0 },
+    [BRW_OPCODE_IF] = { .name = "if", .nsrc = 2, .ndst = 0 },
+    [BRW_OPCODE_IFF] = { .name = "iff", .nsrc = 1, .ndst = 01 },
+    [BRW_OPCODE_WHILE] = { .name = "while", .nsrc = 1, .ndst = 0 },
+    [BRW_OPCODE_ELSE] = { .name = "else", .nsrc = 2, .ndst = 0 },
+    [BRW_OPCODE_BREAK] = { .name = "break", .nsrc = 1, .ndst = 0 },
+    [BRW_OPCODE_CONTINUE] = { .name = "cont", .nsrc = 1, .ndst = 0 },
+    [BRW_OPCODE_HALT] = { .name = "halt", .nsrc = 1, .ndst = 0 },
+    [BRW_OPCODE_MSAVE] = { .name = "msave", .nsrc = 1, .ndst = 1 },
+    [BRW_OPCODE_PUSH] = { .name = "push", .nsrc = 1, .ndst = 1 },
+    [BRW_OPCODE_MRESTORE] = { .name = "mrest", .nsrc = 1, .ndst = 1 },
+    [BRW_OPCODE_POP] = { .name = "pop", .nsrc = 2, .ndst = 0 },
+    [BRW_OPCODE_WAIT] = { .name = "wait", .nsrc = 1, .ndst = 0 },
+    [BRW_OPCODE_DO] = { .name = "do", .nsrc = 0, .ndst = 0 },
+    [BRW_OPCODE_ENDIF] = { .name = "endif", .nsrc = 2, .ndst = 0 },
+};
+
+char *conditional_modifier[16] = {
+    [BRW_CONDITIONAL_NONE] = "",
+    [BRW_CONDITIONAL_Z] = ".e",
+    [BRW_CONDITIONAL_NZ] = ".ne",
+    [BRW_CONDITIONAL_G] = ".g",
+    [BRW_CONDITIONAL_GE] = ".ge",
+    [BRW_CONDITIONAL_L] = ".l",
+    [BRW_CONDITIONAL_LE] = ".le",
+    [BRW_CONDITIONAL_R] = ".r",
+    [BRW_CONDITIONAL_O] = ".o",
+    [BRW_CONDITIONAL_U] = ".u",
+};
+
+char *negate[2] = {
+    [0] = "",
+    [1] = "-",
+};
+
+char *_abs[2] = {
+    [0] = "",
+    [1] = "(abs)",
+};
+
+char *vert_stride[16] = {
+    [0] = "0",
+    [1] = "1",
+    [2] = "2",
+    [3] = "4",
+    [4] = "8",
+    [5] = "16",
+    [6] = "32",
+    [15] = "VxH",
+};
+
+char *width[8] = {
+    [0] = "1",
+    [1] = "2",
+    [2] = "4",
+    [3] = "8",
+    [4] = "16",
+};
+
+char *horiz_stride[4] = {
+    [0] = "0",
+    [1] = "1",
+    [2] = "2",
+    [3] = "4"
+};
+
+char *chan_sel[4] = {
+    [0] = "x",
+    [1] = "y",
+    [2] = "z",
+    [3] = "w",
+};
+
+char *dest_condmod[16] = {
+};
+
+char *debug_ctrl[2] = {
+    [0] = "",
+    [1] = ".breakpoint"
+};
+
+char *saturate[2] = {
+    [0] = "",
+    [1] = ".sat"
+};
+
+char *exec_size[8] = {
+    [0] = "1",
+    [1] = "2",
+    [2] = "4",
+    [3] = "8",
+    [4] = "16",
+    [5] = "32"
+};
+
+char *pred_inv[2] = {
+    [0] = "+",
+    [1] = "-"
+};
+
+char *pred_ctrl_align16[16] = {
+    [1] = "",
+    [2] = ".x",
+    [3] = ".y",
+    [4] = ".z",
+    [5] = ".w",
+    [6] = ".any4h",
+    [7] = ".all4h",
+};
+
+char *pred_ctrl_align1[16] = {
+    [1] = "",
+    [2] = ".anyv",
+    [3] = ".allv",
+    [4] = ".any2h",
+    [5] = ".all2h",
+    [6] = ".any4h",
+    [7] = ".all4h",
+    [8] = ".any8h",
+    [9] = ".all8h",
+    [10] = ".any16h",
+    [11] = ".all16h",
+};
+
+char *thread_ctrl[4] = {
+    [0] = "",
+    [2] = "switch"
+};
+
+char *compr_ctrl[4] = {
+    [0] = "",
+    [1] = "sechalf",
+    [2] = "compr",
+};
+
+char *dep_ctrl[4] = {
+    [0] = "",
+    [1] = "NoDDClr",
+    [2] = "NoDDChk",
+    [3] = "NoDDClr,NoDDChk",
+};
+
+char *mask_ctrl[4] = {
+    [0] = "",
+    [1] = "nomask",
+};
+
+char *access_mode[2] = {
+    [0] = "align1",
+    [1] = "align16",
+};
+
+char *reg_encoding[8] = {
+    [0] = "UD",
+    [1] = "D",
+    [2] = "UW",
+    [3] = "W",
+    [4] = "UB",
+    [5] = "B",
+    [7] = "F"
+};
+
+char *imm_encoding[8] = {
+    [0] = "UD",
+    [1] = "D",
+    [2] = "UW",
+    [3] = "W",
+    [5] = "VF",
+    [5] = "V",
+    [7] = "F"
+};
+
+char *reg_file[4] = {
+    [0] = "A",
+    [1] = "g",
+    [2] = "m",
+    [3] = "imm",
+};
+
+char *writemask[16] = {
+    [0x0] = ".",
+    [0x1] = ".x",
+    [0x2] = ".y",
+    [0x3] = ".xy",
+    [0x4] = ".z",
+    [0x5] = ".xz",
+    [0x6] = ".yz",
+    [0x7] = ".xyz",
+    [0x8] = ".w",
+    [0x9] = ".xw",
+    [0xa] = ".yw",
+    [0xb] = ".xyw",
+    [0xc] = ".zw",
+    [0xd] = ".xzw",
+    [0xe] = ".yzw",
+    [0xf] = "",
+};
+
+char *end_of_thread[2] = {
+    [0] = "",
+    [1] = "EOT"
+};
+
+char *target_function[16] = {
+    [BRW_MESSAGE_TARGET_NULL] = "null",
+    [BRW_MESSAGE_TARGET_MATH] = "math",
+    [BRW_MESSAGE_TARGET_SAMPLER] = "sampler",
+    [BRW_MESSAGE_TARGET_GATEWAY] = "gateway",
+    [BRW_MESSAGE_TARGET_DATAPORT_READ] = "read",
+    [BRW_MESSAGE_TARGET_DATAPORT_WRITE] = "write",
+    [BRW_MESSAGE_TARGET_URB] = "urb",
+    [BRW_MESSAGE_TARGET_THREAD_SPAWNER] = "thread_spawner"
+};
+
+char *math_function[16] = {
+    [BRW_MATH_FUNCTION_INV] = "inv",
+    [BRW_MATH_FUNCTION_LOG] = "log",
+    [BRW_MATH_FUNCTION_EXP] = "exp",
+    [BRW_MATH_FUNCTION_SQRT] = "sqrt",
+    [BRW_MATH_FUNCTION_RSQ] = "rsq",
+    [BRW_MATH_FUNCTION_SIN] = "sin",
+    [BRW_MATH_FUNCTION_COS] = "cos",
+    [BRW_MATH_FUNCTION_SINCOS] = "sincos",
+    [BRW_MATH_FUNCTION_TAN] = "tan",
+    [BRW_MATH_FUNCTION_POW] = "pow",
+    [BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER] = "intdivmod",
+    [BRW_MATH_FUNCTION_INT_DIV_QUOTIENT] = "intmod",
+    [BRW_MATH_FUNCTION_INT_DIV_REMAINDER] = "intdiv",
+};
+
+char *math_saturate[2] = {
+    [0] = "",
+    [1] = "sat"
+};
+
+char *math_signed[2] = {
+    [0] = "",
+    [1] = "signed"
+};
+
+char *math_scalar[2] = {
+    [0] = "",
+    [1] = "scalar"
+};
+
+char *math_precision[2] = {
+    [0] = "",
+    [1] = "partial_precision"
+};
+
+char *urb_swizzle[4] = {
+    [BRW_URB_SWIZZLE_NONE] = "",
+    [BRW_URB_SWIZZLE_INTERLEAVE] = "interleave",
+    [BRW_URB_SWIZZLE_TRANSPOSE] = "transpose",
+};
+
+char *urb_allocate[2] = {
+    [0] = "",
+    [1] = "allocate"
+};
+
+char *urb_used[2] = {
+    [0] = "",
+    [1] = "used"
+};
+
+char *urb_complete[2] = {
+    [0] = "",
+    [1] = "complete"
+};
+
+char *sampler_target_format[4] = {
+    [0] = "F",
+    [2] = "UD",
+    [3] = "D"
+};
+
+
+static int column;
+
+static int string (FILE *file, char *string)
+{
+    fputs (string, file);
+    column += strlen (string);
+    return 0;
+}
+
+static int format (FILE *f, char *format, ...)
+{
+    char    buf[1024];
+    va_list    args;
+    va_start (args, format);
+
+    vsnprintf (buf, sizeof (buf) - 1, format, args);
+    string (f, buf);
+    return 0;
+}
+
+static int newline (FILE *f)
+{
+    putc ('\n', f);
+    column = 0;
+    return 0;
+}
+
+static int pad (FILE *f, int c)
+{
+    do
+       string (f, " ");
+    while (column < c);
+    return 0;
+}
+
+static int control (FILE *file, char *name, char *ctrl[], GLuint id, int *space)
+{
+    if (!ctrl[id]) {
+       fprintf (file, "*** invalid %s value %d ",
+                name, id);
+       return 1;
+    }
+    if (ctrl[id][0])
+    {
+       if (space && *space)
+           string (file, " ");
+       string (file, ctrl[id]);
+       if (space)
+           *space = 1;
+    }
+    return 0;
+}
+
+static int print_opcode (FILE *file, int id)
+{
+    if (!opcode[id].name) {
+       format (file, "*** invalid opcode value %d ", id);
+       return 1;
+    }
+    string (file, opcode[id].name);
+    return 0;
+}
+
+static int reg (FILE *file, GLuint _reg_file, GLuint _reg_nr)
+{
+    int        err = 0;
+    if (_reg_file == BRW_ARCHITECTURE_REGISTER_FILE) {
+       switch (_reg_nr & 0xf0) {
+       case BRW_ARF_NULL:
+           string (file, "null");
+           return -1;
+       case BRW_ARF_ADDRESS:
+           format (file, "a%d", _reg_nr & 0x0f);
+           break;
+       case BRW_ARF_ACCUMULATOR:
+           format (file, "acc%d", _reg_nr & 0x0f);
+           break;
+       case BRW_ARF_MASK:
+           format (file, "mask%d", _reg_nr & 0x0f);
+           break;
+       case BRW_ARF_MASK_STACK:
+           format (file, "msd%d", _reg_nr & 0x0f);
+           break;
+       case BRW_ARF_STATE:
+           format (file, "sr%d", _reg_nr & 0x0f);
+           break;
+       case BRW_ARF_CONTROL:
+           format (file, "cr%d", _reg_nr & 0x0f);
+           break;
+       case BRW_ARF_NOTIFICATION_COUNT:
+           format (file, "n%d", _reg_nr & 0x0f);
+           break;
+       case BRW_ARF_IP:
+           string (file, "ip");
+           return -1;
+           break;
+       default:
+           format (file, "ARF%d", _reg_nr);
+           break;
+       }
+    } else {
+       err  |= control (file, "src reg file", reg_file, _reg_file, NULL);
+       format (file, "%d", _reg_nr);
+    }
+    return err;
+}
+
+static int dest (FILE *file, struct brw_instruction *inst)
+{
+    int        err = 0;
+
+    if (inst->header.access_mode == BRW_ALIGN_1)
+    {
+       if (inst->bits1.da1.dest_address_mode == BRW_ADDRESS_DIRECT)
+       {
+           err |= reg (file, inst->bits1.da1.dest_reg_file, inst->bits1.da1.dest_reg_nr);
+           if (err == -1)
+               return 0;
+           if (inst->bits1.da1.dest_subreg_nr)
+               format (file, ".%d", inst->bits1.da1.dest_subreg_nr);
+           format (file, "<%d>", inst->bits1.da1.dest_horiz_stride);
+           err |= control (file, "dest reg encoding", reg_encoding, inst->bits1.da1.dest_reg_type, NULL);
+       }
+       else
+       {
+           string (file, "g[a0");
+           if (inst->bits1.ia1.dest_subreg_nr)
+               format (file, ".%d", inst->bits1.ia1.dest_subreg_nr);
+           if (inst->bits1.ia1.dest_indirect_offset)
+               format (file, " %d", inst->bits1.ia1.dest_indirect_offset);
+           string (file, "]");
+           format (file, "<%d>", inst->bits1.ia1.dest_horiz_stride);
+           err |= control (file, "dest reg encoding", reg_encoding, inst->bits1.ia1.dest_reg_type, NULL);
+       }
+    }
+    else
+    {
+       if (inst->bits1.da16.dest_address_mode == BRW_ADDRESS_DIRECT)
+       {
+           err |= reg (file, inst->bits1.da16.dest_reg_file, inst->bits1.da16.dest_reg_nr);
+           if (err == -1)
+               return 0;
+           if (inst->bits1.da16.dest_subreg_nr)
+               format (file, ".%d", inst->bits1.da16.dest_subreg_nr);
+           string (file, "<1>");
+           err |= control (file, "writemask", writemask, inst->bits1.da16.dest_writemask, NULL);
+           err |= control (file, "dest reg encoding", reg_encoding, inst->bits1.da16.dest_reg_type, NULL);
+       }
+       else
+       {
+           err = 1;
+           string (file, "Indirect align16 address mode not supported");
+       }
+    }
+
+    return 0;
+}
+
+static int src_align1_region (FILE *file,
+                             GLuint _vert_stride, GLuint _width, GLuint _horiz_stride)
+{
+    int err = 0;
+    string (file, "<");
+    err |= control (file, "vert stride", vert_stride, _vert_stride, NULL);
+    string (file, ",");
+    err |= control (file, "width", width, _width, NULL);
+    string (file, ",");
+    err |= control (file, "horiz_stride", horiz_stride, _horiz_stride, NULL);
+    string (file, ">");
+    return err;
+}
+
+static int src_da1 (FILE *file, GLuint type, GLuint _reg_file,
+                   GLuint _vert_stride, GLuint _width, GLuint _horiz_stride,
+                   GLuint reg_num, GLuint sub_reg_num, GLuint __abs, GLuint _negate)
+{
+    int err = 0;
+    err |= control (file, "negate", negate, _negate, NULL);
+    err |= control (file, "abs", _abs, __abs, NULL);
+
+    err |= reg (file, _reg_file, reg_num);
+    if (err == -1)
+       return 0;
+    if (sub_reg_num)
+       format (file, ".%d", sub_reg_num);
+    src_align1_region (file, _vert_stride, _width, _horiz_stride);
+    err |= control (file, "src reg encoding", reg_encoding, type, NULL);
+    return err;
+}
+
+static int src_ia1 (FILE *file,
+                   GLuint type,
+                   GLuint _reg_file,
+                   GLint _addr_imm,
+                   GLuint _addr_subreg_nr,
+                   GLuint _negate,
+                   GLuint __abs,
+                   GLuint _addr_mode,
+                   GLuint _horiz_stride,
+                   GLuint _width,
+                   GLuint _vert_stride)
+{
+    int err = 0;
+    err |= control (file, "negate", negate, _negate, NULL);
+    err |= control (file, "abs", _abs, __abs, NULL);
+
+    string (file, "g[a0");
+    if (_addr_subreg_nr)
+       format (file, ".%d", _addr_subreg_nr);
+    if (_addr_imm)
+       format (file, " %d", _addr_imm);
+    string (file, "]");
+    src_align1_region (file, _vert_stride, _width, _horiz_stride);
+    err |= control (file, "src reg encoding", reg_encoding, type, NULL);
+    return err;
+}
+
+static int src_da16 (FILE *file,
+                    GLuint _reg_type,
+                    GLuint _reg_file,
+                    GLuint _vert_stride,
+                    GLuint _reg_nr,
+                    GLuint _subreg_nr,
+                    GLuint __abs,
+                    GLuint _negate,
+                    GLuint swz_x,
+                    GLuint swz_y,
+                    GLuint swz_z,
+                    GLuint swz_w)
+{
+    int err = 0;
+    err |= control (file, "negate", negate, _negate, NULL);
+    err |= control (file, "abs", _abs, __abs, NULL);
+
+    err |= reg (file, _reg_file, _reg_nr);
+    if (err == -1)
+       return 0;
+    if (_subreg_nr)
+       format (file, ".%d", _subreg_nr);
+    string (file, "<");
+    err |= control (file, "vert stride", vert_stride, _vert_stride, NULL);
+    string (file, ",1,1>");
+    err |= control (file, "src da16 reg type", reg_encoding, _reg_type, NULL);
+    /*
+     * Three kinds of swizzle display:
+     *  identity - nothing printed
+     *  1->all  - print the single channel
+     *  1->1     - print the mapping
+     */
+    if (swz_x == BRW_CHANNEL_X &&
+       swz_y == BRW_CHANNEL_Y &&
+       swz_z == BRW_CHANNEL_Z &&
+       swz_w == BRW_CHANNEL_W)
+    {
+       ;
+    }
+    else if (swz_x == swz_y && swz_x == swz_z && swz_x == swz_w)
+    {
+       string (file, ".");
+       err |= control (file, "channel select", chan_sel, swz_x, NULL);
+    }
+    else
+    {
+       string (file, ".");
+       err |= control (file, "channel select", chan_sel, swz_x, NULL);
+       err |= control (file, "channel select", chan_sel, swz_y, NULL);
+       err |= control (file, "channel select", chan_sel, swz_z, NULL);
+       err |= control (file, "channel select", chan_sel, swz_w, NULL);
+    }
+    return err;
+}
+
+
+static int imm (FILE *file, GLuint type, struct brw_instruction *inst) {
+    switch (type) {
+    case BRW_REGISTER_TYPE_UD:
+       format (file, "0x%08xUD", inst->bits3.ud);
+       break;
+    case BRW_REGISTER_TYPE_D:
+       format (file, "%dD", inst->bits3.d);
+       break;
+    case BRW_REGISTER_TYPE_UW:
+       format (file, "0x%04xUW", (uint16_t) inst->bits3.ud);
+       break;
+    case BRW_REGISTER_TYPE_W:
+       format (file, "%dW", (int16_t) inst->bits3.d);
+       break;
+    case BRW_REGISTER_TYPE_UB:
+       format (file, "0x%02xUB", (int8_t) inst->bits3.ud);
+       break;
+    case BRW_REGISTER_TYPE_VF:
+       format (file, "Vector Float");
+       break;
+    case BRW_REGISTER_TYPE_V:
+       format (file, "0x%08xV", inst->bits3.ud);
+       break;
+    case BRW_REGISTER_TYPE_F:
+       format (file, "%-gF", inst->bits3.f);
+    }
+    return 0;
+}
+
+static int src0 (FILE *file, struct brw_instruction *inst)
+{
+    if (inst->bits1.da1.src0_reg_file == BRW_IMMEDIATE_VALUE)
+       return imm (file, inst->bits1.da1.src0_reg_type,
+                   inst);
+    else if (inst->header.access_mode == BRW_ALIGN_1)
+    {
+       if (inst->bits2.da1.src0_address_mode == BRW_ADDRESS_DIRECT)
+       {
+           return src_da1 (file,
+                           inst->bits1.da1.src0_reg_type,
+                           inst->bits1.da1.src0_reg_file,
+                           inst->bits2.da1.src0_vert_stride,
+                           inst->bits2.da1.src0_width,
+                           inst->bits2.da1.src0_horiz_stride,
+                           inst->bits2.da1.src0_reg_nr,
+                           inst->bits2.da1.src0_subreg_nr,
+                           inst->bits2.da1.src0_abs,
+                           inst->bits2.da1.src0_negate);
+       }
+       else
+       {
+           return src_ia1 (file,
+                           inst->bits1.ia1.src0_reg_type,
+                           inst->bits1.ia1.src0_reg_file,
+                           inst->bits2.ia1.src0_indirect_offset,
+                           inst->bits2.ia1.src0_subreg_nr,
+                           inst->bits2.ia1.src0_negate,
+                           inst->bits2.ia1.src0_abs,
+                           inst->bits2.ia1.src0_address_mode,
+                           inst->bits2.ia1.src0_horiz_stride,
+                           inst->bits2.ia1.src0_width,
+                           inst->bits2.ia1.src0_vert_stride);
+       }
+    }
+    else
+    {
+       if (inst->bits2.da16.src0_address_mode == BRW_ADDRESS_DIRECT)
+       {
+           return src_da16 (file,
+                            inst->bits1.da16.src0_reg_type,
+                            inst->bits1.da16.src0_reg_file,
+                            inst->bits2.da16.src0_vert_stride,
+                            inst->bits2.da16.src0_reg_nr,
+                            inst->bits2.da16.src0_subreg_nr,
+                            inst->bits2.da16.src0_abs,
+                            inst->bits2.da16.src0_negate,
+                            inst->bits2.da16.src0_swz_x,
+                            inst->bits2.da16.src0_swz_y,
+                            inst->bits2.da16.src0_swz_z,
+                            inst->bits2.da16.src0_swz_w);
+       }
+       else
+       {
+           string (file, "Indirect align16 address mode not supported");
+           return 1;
+       }
+    }
+}
+
+static int src1 (FILE *file, struct brw_instruction *inst)
+{
+    if (inst->bits1.da1.src1_reg_file == BRW_IMMEDIATE_VALUE)
+       return imm (file, inst->bits1.da1.src1_reg_type,
+                   inst);
+    else if (inst->header.access_mode == BRW_ALIGN_1)
+    {
+       if (inst->bits3.da1.src1_address_mode == BRW_ADDRESS_DIRECT)
+       {
+           return src_da1 (file,
+                           inst->bits1.da1.src1_reg_type,
+                           inst->bits1.da1.src1_reg_file,
+                           inst->bits3.da1.src1_vert_stride,
+                           inst->bits3.da1.src1_width,
+                           inst->bits3.da1.src1_horiz_stride,
+                           inst->bits3.da1.src1_reg_nr,
+                           inst->bits3.da1.src1_subreg_nr,
+                           inst->bits3.da1.src1_abs,
+                           inst->bits3.da1.src1_negate);
+       }
+       else
+       {
+           return src_ia1 (file,
+                           inst->bits1.ia1.src1_reg_type,
+                           inst->bits1.ia1.src1_reg_file,
+                           inst->bits3.ia1.src1_indirect_offset,
+                           inst->bits3.ia1.src1_subreg_nr,
+                           inst->bits3.ia1.src1_negate,
+                           inst->bits3.ia1.src1_abs,
+                           inst->bits3.ia1.src1_address_mode,
+                           inst->bits3.ia1.src1_horiz_stride,
+                           inst->bits3.ia1.src1_width,
+                           inst->bits3.ia1.src1_vert_stride);
+       }
+    }
+    else
+    {
+       if (inst->bits3.da16.src1_address_mode == BRW_ADDRESS_DIRECT)
+       {
+           return src_da16 (file,
+                            inst->bits1.da16.src1_reg_type,
+                            inst->bits1.da16.src1_reg_file,
+                            inst->bits3.da16.src1_vert_stride,
+                            inst->bits3.da16.src1_reg_nr,
+                            inst->bits3.da16.src1_subreg_nr,
+                            inst->bits3.da16.src1_abs,
+                            inst->bits3.da16.src1_negate,
+                            inst->bits3.da16.src1_swz_x,
+                            inst->bits3.da16.src1_swz_y,
+                            inst->bits3.da16.src1_swz_z,
+                            inst->bits3.da16.src1_swz_w);
+       }
+       else
+       {
+           string (file, "Indirect align16 address mode not supported");
+           return 1;
+       }
+    }
+}
+
+int brw_disasm (FILE *file, struct brw_instruction *inst)
+{
+    int        err = 0;
+    int space = 0;
+
+    if (inst->header.predicate_control) {
+       string (file, "(");
+       err |= control (file, "predicate inverse", pred_inv, inst->header.predicate_inverse, NULL);
+       string (file, "f0");
+       if (inst->bits2.da1.flag_reg_nr)
+           format (file, ".%d", inst->bits2.da1.flag_reg_nr);
+       if (inst->header.access_mode == BRW_ALIGN_1)
+           err |= control (file, "predicate control align1", pred_ctrl_align1,
+                           inst->header.predicate_control, NULL);
+       else
+           err |= control (file, "predicate control align16", pred_ctrl_align16,
+                           inst->header.predicate_control, NULL);
+       string (file, ") ");
+    }
+
+    err |= print_opcode (file, inst->header.opcode);
+    err |= control (file, "saturate", saturate, inst->header.saturate, NULL);
+    err |= control (file, "debug control", debug_ctrl, inst->header.debug_control, NULL);
+
+    if (inst->header.opcode != BRW_OPCODE_SEND)
+       err |= control (file, "conditional modifier", conditional_modifier,
+                       inst->header.destreg__conditionalmod, NULL);
+
+    if (inst->header.opcode != BRW_OPCODE_NOP) {
+       string (file, "(");
+       err |= control (file, "execution size", exec_size, inst->header.execution_size, NULL);
+       string (file, ")");
+    }
+
+    if (inst->header.opcode == BRW_OPCODE_SEND)
+       format (file, " %d", inst->header.destreg__conditionalmod);
+
+    if (opcode[inst->header.opcode].ndst > 0) {
+       pad (file, 16);
+       err |= dest (file, inst);
+    }
+    if (opcode[inst->header.opcode].nsrc > 0) {
+       pad (file, 32);
+       err |= src0 (file, inst);
+    }
+    if (opcode[inst->header.opcode].nsrc > 1) {
+       pad (file, 48);
+       err |= src1 (file, inst);
+    }
+
+    if (inst->header.opcode == BRW_OPCODE_SEND) {
+       newline (file);
+       pad (file, 16);
+       space = 0;
+       err |= control (file, "target function", target_function,
+                       inst->bits3.generic.msg_target, &space);
+       switch (inst->bits3.generic.msg_target) {
+       case BRW_MESSAGE_TARGET_MATH:
+           err |= control (file, "math function", math_function,
+                           inst->bits3.math.function, &space);
+           err |= control (file, "math saturate", math_saturate,
+                           inst->bits3.math.saturate, &space);
+           err |= control (file, "math signed", math_signed,
+                           inst->bits3.math.int_type, &space);
+           err |= control (file, "math scalar", math_scalar,
+                           inst->bits3.math.data_type, &space);
+           err |= control (file, "math precision", math_precision,
+                           inst->bits3.math.precision, &space);
+           break;
+       case BRW_MESSAGE_TARGET_SAMPLER:
+           format (file, " (%d, %d, ",
+                   inst->bits3.sampler.binding_table_index,
+                   inst->bits3.sampler.sampler);
+           err |= control (file, "sampler target format", sampler_target_format,
+                           inst->bits3.sampler.return_format, NULL);
+           string (file, ")");
+           break;
+       case BRW_MESSAGE_TARGET_DATAPORT_WRITE:
+           format (file, " (%d, %d, %d, %d)",
+                   inst->bits3.dp_write.binding_table_index,
+                   (inst->bits3.dp_write.pixel_scoreboard_clear << 3) |
+                   inst->bits3.dp_write.msg_control,
+                   inst->bits3.dp_write.msg_type,
+                   inst->bits3.dp_write.send_commit_msg);
+           break;
+       case BRW_MESSAGE_TARGET_URB:
+           format (file, " %d", inst->bits3.urb.offset);
+           space = 1;
+           err |= control (file, "urb swizzle", urb_swizzle,
+                           inst->bits3.urb.swizzle_control, &space);
+           err |= control (file, "urb allocate", urb_allocate,
+                           inst->bits3.urb.allocate, &space);
+           err |= control (file, "urb used", urb_used,
+                           inst->bits3.urb.used, &space);
+           err |= control (file, "urb complete", urb_complete,
+                           inst->bits3.urb.complete, &space);
+           break;
+       case BRW_MESSAGE_TARGET_THREAD_SPAWNER:
+           break;
+       default:
+           format (file, "unsupported target %d", inst->bits3.generic.msg_target);
+           break;
+       }
+       if (space)
+           string (file, " ");
+       format (file, "mlen %d",
+               inst->bits3.generic.msg_length);
+       format (file, " rlen %d",
+               inst->bits3.generic.response_length);
+    }
+    pad (file, 64);
+    if (inst->header.opcode != BRW_OPCODE_NOP) {
+       string (file, "{");
+       space = 1;
+       err |= control(file, "access mode", access_mode, inst->header.access_mode, &space);
+       err |= control (file, "mask control", mask_ctrl, inst->header.mask_control, &space);
+       err |= control (file, "dependency control", dep_ctrl, inst->header.dependency_control, &space);
+       err |= control (file, "compression control", compr_ctrl, inst->header.compression_control, &space);
+       err |= control (file, "thread control", thread_ctrl, inst->header.thread_control, &space);
+       if (inst->header.opcode == BRW_OPCODE_SEND)
+           err |= control (file, "end of thread", end_of_thread,
+                           inst->bits3.generic.end_of_thread, &space);
+       if (space)
+           string (file, " ");
+       string (file, "}");
+    }
+    string (file, ";");
+    newline (file);
+    return err;
+}
index 5152c3f..682094f 100644 (file)
@@ -141,6 +141,8 @@ static void brw_emit_prim(struct brw_context *brw,
 
    prim_packet.verts_per_instance = trim(prim->mode, prim->count);
    prim_packet.start_vert_location = prim->start;
+   if (prim->indexed)
+      prim_packet.start_vert_location += brw->ib.start_vertex_offset;
    prim_packet.instance_count = 1;
    prim_packet.start_instance_location = 0;
    prim_packet.base_vert_location = 0;
@@ -422,54 +424,31 @@ static GLboolean brw_try_draw_prims( GLcontext *ctx,
    return retval;
 }
 
-static GLboolean brw_need_rebase( GLcontext *ctx,
-                                 const struct gl_client_array *arrays[],
-                                 const struct _mesa_index_buffer *ib,
-                                 GLuint min_index )
-{
-   if (min_index == 0) 
-      return GL_FALSE;
-
-   if (ib) {
-      if (!vbo_all_varyings_in_vbos(arrays))
-        return GL_TRUE;
-      else
-        return GL_FALSE;
-   }
-   else {
-      /* Hmm.  This isn't quite what I wanted.  BRW can actually
-       * handle the mixed case well enough that we shouldn't need to
-       * rebase.  However, it's probably not very common, nor hugely
-       * expensive to do it this way:
-       */
-      if (!vbo_all_varyings_in_vbos(arrays))
-        return GL_TRUE;
-      else
-        return GL_FALSE;
-   }
-}
-                                 
-
 void brw_draw_prims( GLcontext *ctx,
                     const struct gl_client_array *arrays[],
                     const struct _mesa_prim *prim,
                     GLuint nr_prims,
                     const struct _mesa_index_buffer *ib,
+                    GLboolean index_bounds_valid,
                     GLuint min_index,
                     GLuint max_index )
 {
    GLboolean retval;
 
-   /* Decide if we want to rebase.  If so we end up recursing once
-    * only into this function.
-    */
-   if (brw_need_rebase( ctx, arrays, ib, min_index )) {
-      vbo_rebase_prims( ctx, arrays, 
-                       prim, nr_prims, 
-                       ib, min_index, max_index, 
-                       brw_draw_prims );
-      
-      return;
+   if (!vbo_all_varyings_in_vbos(arrays)) {
+      if (!index_bounds_valid)
+        vbo_get_minmax_index(ctx, prim, ib, &min_index, &max_index);
+
+      /* Decide if we want to rebase.  If so we end up recursing once
+       * only into this function.
+       */
+      if (min_index != 0) {
+        vbo_rebase_prims(ctx, arrays,
+                         prim, nr_prims,
+                         ib, min_index, max_index,
+                         brw_draw_prims );
+        return;
+      }
    }
 
    /* Make a first attempt at drawing:
index 9aebbdb..2a14db2 100644 (file)
@@ -39,6 +39,7 @@ void brw_draw_prims( GLcontext *ctx,
                     const struct _mesa_prim *prims,
                     GLuint nr_prims,
                     const struct _mesa_index_buffer *ib,
+                    GLboolean index_bounds_valid,
                     GLuint min_index,
                     GLuint max_index );
 
index c29f1dd..d49fb0f 100644 (file)
@@ -350,9 +350,6 @@ static void brw_prepare_vertices(struct brw_context *brw)
    unsigned int min_index = brw->vb.min_index;
    unsigned int max_index = brw->vb.max_index;
 
-   struct brw_vertex_element *enabled[VERT_ATTRIB_MAX];
-   GLuint nr_enabled = 0;
-
    struct brw_vertex_element *upload[VERT_ATTRIB_MAX];
    GLuint nr_uploads = 0;
 
@@ -362,12 +359,13 @@ static void brw_prepare_vertices(struct brw_context *brw)
       _mesa_printf("%s %d..%d\n", __FUNCTION__, min_index, max_index);
 
    /* Accumulate the list of enabled arrays. */
+   brw->vb.nr_enabled = 0;
    while (vs_inputs) {
       GLuint i = _mesa_ffsll(vs_inputs) - 1;
       struct brw_vertex_element *input = &brw->vb.inputs[i];
 
       vs_inputs &= ~(1 << i);
-      enabled[nr_enabled++] = input;
+      brw->vb.enabled[brw->vb.nr_enabled++] = input;
    }
 
    /* XXX: In the rare cases where this happens we fallback all
@@ -376,16 +374,15 @@ static void brw_prepare_vertices(struct brw_context *brw)
     * cases with > 17 vertex attributes enabled, so it probably
     * isn't an issue at this point.
     */
-   if (nr_enabled >= BRW_VEP_MAX) {
+   if (brw->vb.nr_enabled >= BRW_VEP_MAX) {
       intel->Fallback = 1;
       return;
    }
 
-   for (i = 0; i < nr_enabled; i++) {
-      struct brw_vertex_element *input = enabled[i];
+   for (i = 0; i < brw->vb.nr_enabled; i++) {
+      struct brw_vertex_element *input = brw->vb.enabled[i];
 
       input->element_size = get_size(input->glarray->Type) * input->glarray->Size;
-      input->count = input->glarray->StrideB ? max_index + 1 - min_index : 1;
 
       if (input->glarray->BufferObj->Name != 0) {
         struct intel_buffer_object *intel_buffer =
@@ -398,7 +395,23 @@ static void brw_prepare_vertices(struct brw_context *brw)
         dri_bo_reference(input->bo);
         input->offset = (unsigned long)input->glarray->Ptr;
         input->stride = input->glarray->StrideB;
+        input->count = input->glarray->_MaxElement;
+
+        /* This is a common place to reach if the user mistakenly supplies
+         * a pointer in place of a VBO offset.  If we just let it go through,
+         * we may end up dereferencing a pointer beyond the bounds of the
+         * GTT.  We would hope that the VBO's max_index would save us, but
+         * Mesa appears to hand us min/max values not clipped to the
+         * array object's _MaxElement, and _MaxElement frequently appears
+         * to be wrong anyway.
+         *
+         * The VBO spec allows application termination in this case, and it's
+         * probably a service to the poor programmer to do so rather than
+         * trying to just not render.
+         */
+        assert(input->offset < input->bo->size);
       } else {
+        input->count = input->glarray->StrideB ? max_index + 1 - min_index : 1;
         if (input->bo != NULL) {
            /* Already-uploaded vertex data is present from a previous
             * prepare_vertices, but we had to re-validate state due to
@@ -466,8 +479,8 @@ static void brw_prepare_vertices(struct brw_context *brw)
 
    brw_prepare_query_begin(brw);
 
-   for (i = 0; i < nr_enabled; i++) {
-      struct brw_vertex_element *input = enabled[i];
+   for (i = 0; i < brw->vb.nr_enabled; i++) {
+      struct brw_vertex_element *input = brw->vb.enabled[i];
 
       brw_add_validated_bo(brw, input->bo);
    }
@@ -477,34 +490,44 @@ static void brw_emit_vertices(struct brw_context *brw)
 {
    GLcontext *ctx = &brw->intel.ctx;
    struct intel_context *intel = intel_context(ctx);
-   GLbitfield vs_inputs = brw->vs.prog_data->inputs_read;
-   struct brw_vertex_element *enabled[VERT_ATTRIB_MAX];
    GLuint i;
-   GLuint nr_enabled = 0;
 
-  /* Accumulate the list of enabled arrays. */
-   while (vs_inputs) {
-      i = _mesa_ffsll(vs_inputs) - 1;
-      struct brw_vertex_element *input = &brw->vb.inputs[i];
+   brw_emit_query_begin(brw);
 
-      vs_inputs &= ~(1 << i);
-      enabled[nr_enabled++] = input;
+   /* If the VS doesn't read any inputs (calculating vertex position from
+    * a state variable for some reason, for example), emit a single pad
+    * VERTEX_ELEMENT struct and bail.
+    *
+    * The stale VB state stays in place, but they don't do anything unless
+    * a VE loads from them.
+    */
+   if (brw->vb.nr_enabled == 0) {
+      BEGIN_BATCH(3, IGNORE_CLIPRECTS);
+      OUT_BATCH((CMD_VERTEX_ELEMENT << 16) | 1);
+      OUT_BATCH((0 << BRW_VE0_INDEX_SHIFT) |
+               BRW_VE0_VALID |
+               (BRW_SURFACEFORMAT_R32G32B32A32_FLOAT << BRW_VE0_FORMAT_SHIFT) |
+               (0 << BRW_VE0_SRC_OFFSET_SHIFT));
+      OUT_BATCH((BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_0_SHIFT) |
+               (BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_1_SHIFT) |
+               (BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_2_SHIFT) |
+               (BRW_VE1_COMPONENT_STORE_1_FLT << BRW_VE1_COMPONENT_3_SHIFT));
+      ADVANCE_BATCH();
+      return;
    }
 
-   brw_emit_query_begin(brw);
-
    /* Now emit VB and VEP state packets.
     *
     * This still defines a hardware VB for each input, even if they
     * are interleaved or from the same VBO.  TBD if this makes a
     * performance difference.
     */
-   BEGIN_BATCH(1 + nr_enabled * 4, IGNORE_CLIPRECTS);
+   BEGIN_BATCH(1 + brw->vb.nr_enabled * 4, IGNORE_CLIPRECTS);
    OUT_BATCH((CMD_VERTEX_BUFFER << 16) |
-            ((1 + nr_enabled * 4) - 2));
+            ((1 + brw->vb.nr_enabled * 4) - 2));
 
-   for (i = 0; i < nr_enabled; i++) {
-      struct brw_vertex_element *input = enabled[i];
+   for (i = 0; i < brw->vb.nr_enabled; i++) {
+      struct brw_vertex_element *input = brw->vb.enabled[i];
 
       OUT_BATCH((i << BRW_VB0_INDEX_SHIFT) |
                BRW_VB0_ACCESS_VERTEXDATA |
@@ -524,15 +547,15 @@ static void brw_emit_vertices(struct brw_context *brw)
                         input->offset + input->element_size);
           }
       } else
-          OUT_BATCH(brw->vb.max_index);
+          OUT_BATCH(input->stride ? input->count : 0);
       OUT_BATCH(0); /* Instance data step rate */
    }
    ADVANCE_BATCH();
 
-   BEGIN_BATCH(1 + nr_enabled * 2, IGNORE_CLIPRECTS);
-   OUT_BATCH((CMD_VERTEX_ELEMENT << 16) | ((1 + nr_enabled * 2) - 2));
-   for (i = 0; i < nr_enabled; i++) {
-      struct brw_vertex_element *input = enabled[i];
+   BEGIN_BATCH(1 + brw->vb.nr_enabled * 2, IGNORE_CLIPRECTS);
+   OUT_BATCH((CMD_VERTEX_ELEMENT << 16) | ((1 + brw->vb.nr_enabled * 2) - 2));
+   for (i = 0; i < brw->vb.nr_enabled; i++) {
+      struct brw_vertex_element *input = brw->vb.enabled[i];
       uint32_t format = get_surface_type(input->glarray->Type,
                                         input->glarray->Size,
                                         input->glarray->Format,
@@ -589,17 +612,20 @@ static void brw_prepare_indices(struct brw_context *brw)
    dri_bo *bo = NULL;
    struct gl_buffer_object *bufferobj;
    GLuint offset;
+   GLuint ib_type_size;
 
    if (index_buffer == NULL)
       return;
 
-   ib_size = get_size(index_buffer->type) * index_buffer->count;
+   ib_type_size = get_size(index_buffer->type);
+   ib_size = ib_type_size * index_buffer->count;
    bufferobj = index_buffer->obj;;
 
    /* Turn into a proper VBO:
     */
    if (!bufferobj->Name) {
-     
+      brw->ib.start_vertex_offset = 0;
+
       /* Get new bufferobj, offset:
        */
       get_space(brw, ib_size, &bo, &offset);
@@ -615,6 +641,7 @@ static void brw_prepare_indices(struct brw_context *brw)
       }
    } else {
       offset = (GLuint) (unsigned long) index_buffer->ptr;
+      brw->ib.start_vertex_offset = 0;
 
       /* If the index buffer isn't aligned to its element size, we have to
        * rebase it into a temporary.
@@ -635,39 +662,62 @@ static void brw_prepare_indices(struct brw_context *brw)
          bo = intel_bufferobj_buffer(intel, intel_buffer_object(bufferobj),
                                      INTEL_READ);
          dri_bo_reference(bo);
+
+         /* Use CMD_3D_PRIM's start_vertex_offset to avoid re-uploading
+          * the index buffer state when we're just moving the start index
+          * of our drawing.
+          */
+         brw->ib.start_vertex_offset = offset / ib_type_size;
+         offset = 0;
+         ib_size = bo->size;
        }
    }
 
-   dri_bo_unreference(brw->ib.bo);
-   brw->ib.bo = bo;
-   brw->ib.offset = offset;
+   if (brw->ib.bo != bo ||
+       brw->ib.offset != offset ||
+       brw->ib.size != ib_size)
+   {
+      drm_intel_bo_unreference(brw->ib.bo);
+      brw->ib.bo = bo;
+      brw->ib.offset = offset;
+      brw->ib.size = ib_size;
+
+      brw->state.dirty.brw |= BRW_NEW_INDEX_BUFFER;
+   } else {
+      drm_intel_bo_unreference(bo);
+   }
 
    brw_add_validated_bo(brw, brw->ib.bo);
 }
 
-static void brw_emit_indices(struct brw_context *brw)
+const struct brw_tracked_state brw_indices = {
+   .dirty = {
+      .mesa = 0,
+      .brw = BRW_NEW_INDICES,
+      .cache = 0,
+   },
+   .prepare = brw_prepare_indices,
+};
+
+static void brw_emit_index_buffer(struct brw_context *brw)
 {
    struct intel_context *intel = &brw->intel;
    const struct _mesa_index_buffer *index_buffer = brw->ib.ib;
-   GLuint ib_size;
 
    if (index_buffer == NULL)
       return;
 
-   ib_size = get_size(index_buffer->type) * index_buffer->count - 1;
-
    /* Emit the indexbuffer packet:
     */
    {
       struct brw_indexbuffer ib;
 
       memset(&ib, 0, sizeof(ib));
-   
+
       ib.header.bits.opcode = CMD_INDEX_BUFFER;
       ib.header.bits.length = sizeof(ib)/4 - 2;
       ib.header.bits.index_format = get_index_type(index_buffer->type);
       ib.header.bits.cut_index_enable = 0;
-   
 
       BEGIN_BATCH(4, IGNORE_CLIPRECTS);
       OUT_BATCH( ib.header.dword );
@@ -676,18 +726,17 @@ static void brw_emit_indices(struct brw_context *brw)
                brw->ib.offset);
       OUT_RELOC(brw->ib.bo,
                I915_GEM_DOMAIN_VERTEX, 0,
-               brw->ib.offset + ib_size);
+               brw->ib.offset + brw->ib.size);
       OUT_BATCH( 0 );
       ADVANCE_BATCH();
    }
 }
 
-const struct brw_tracked_state brw_indices = {
+const struct brw_tracked_state brw_index_buffer = {
    .dirty = {
       .mesa = 0,
-      .brw = BRW_NEW_BATCH | BRW_NEW_INDICES,
+      .brw = BRW_NEW_BATCH | BRW_NEW_INDEX_BUFFER,
       .cache = 0,
    },
-   .prepare = brw_prepare_indices,
-   .emit = brw_emit_indices,
+   .emit = brw_emit_index_buffer,
 };
index c53efba..1df5613 100644 (file)
@@ -62,7 +62,7 @@ void brw_set_predicate_control( struct brw_compile *p, GLuint pc )
 
 void brw_set_conditionalmod( struct brw_compile *p, GLuint conditional )
 {
-   p->current->header.destreg__conditonalmod = conditional;
+   p->current->header.destreg__conditionalmod = conditional;
 }
 
 void brw_set_access_mode( struct brw_compile *p, GLuint access_mode )
index 2412014..241cdc3 100644 (file)
@@ -481,8 +481,8 @@ static struct brw_instruction *next_insn( struct brw_compile *p,
    /* Reset this one-shot flag: 
     */
 
-   if (p->current->header.destreg__conditonalmod) {
-      p->current->header.destreg__conditonalmod = 0;   
+   if (p->current->header.destreg__conditionalmod) {
+      p->current->header.destreg__conditionalmod = 0;
       p->current->header.predicate_control = BRW_PREDICATE_NORMAL;
    }
 
@@ -679,7 +679,7 @@ struct brw_instruction *brw_ELSE(struct brw_compile *p,
       assert(if_insn->header.opcode == BRW_OPCODE_IF);
 
       if_insn->bits3.if_else.jump_count = br * (insn - if_insn);
-      if_insn->bits3.if_else.pop_count = 1;
+      if_insn->bits3.if_else.pop_count = 0;
       if_insn->bits3.if_else.pad0 = 0;
    }
 
@@ -871,7 +871,7 @@ void brw_CMP(struct brw_compile *p,
 {
    struct brw_instruction *insn = next_insn(p, BRW_OPCODE_CMP);
 
-   insn->header.destreg__conditonalmod = conditional;
+   insn->header.destreg__conditionalmod = conditional;
    brw_set_dest(insn, dest);
    brw_set_src0(insn, src0);
    brw_set_src1(insn, src1);
@@ -915,7 +915,7 @@ void brw_math( struct brw_compile *p,
     * instructions.
     */
    insn->header.predicate_control = 0; 
-   insn->header.destreg__conditonalmod = msg_reg_nr;
+   insn->header.destreg__conditionalmod = msg_reg_nr;
 
    brw_set_dest(insn, dest);
    brw_set_src0(insn, src);
@@ -952,7 +952,7 @@ void brw_math_16( struct brw_compile *p,
    brw_set_compression_control(p, BRW_COMPRESSION_NONE);
 
    insn = next_insn(p, BRW_OPCODE_SEND);
-   insn->header.destreg__conditonalmod = msg_reg_nr;
+   insn->header.destreg__conditionalmod = msg_reg_nr;
 
    brw_set_dest(insn, dest);
    brw_set_src0(insn, src);
@@ -969,7 +969,7 @@ void brw_math_16( struct brw_compile *p,
     */
    insn = next_insn(p, BRW_OPCODE_SEND);
    insn->header.compression_control = BRW_COMPRESSION_2NDHALF;
-   insn->header.destreg__conditonalmod = msg_reg_nr+1;
+   insn->header.destreg__conditionalmod = msg_reg_nr+1;
 
    brw_set_dest(insn, offset(dest,1));
    brw_set_src0(insn, src);
@@ -1016,7 +1016,7 @@ void brw_dp_WRITE_16( struct brw_compile *p,
    
       insn->header.predicate_control = 0; /* XXX */
       insn->header.compression_control = BRW_COMPRESSION_NONE; 
-      insn->header.destreg__conditonalmod = msg_reg_nr;
+      insn->header.destreg__conditionalmod = msg_reg_nr;
   
       brw_set_dest(insn, dest);
       brw_set_src0(insn, src);
@@ -1062,7 +1062,7 @@ void brw_dp_READ_16( struct brw_compile *p,
    
       insn->header.predicate_control = 0; /* XXX */
       insn->header.compression_control = BRW_COMPRESSION_NONE; 
-      insn->header.destreg__conditonalmod = msg_reg_nr;
+      insn->header.destreg__conditionalmod = msg_reg_nr;
   
       brw_set_dest(insn, dest);        /* UW? */
       brw_set_src0(insn, retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UW));
@@ -1116,7 +1116,7 @@ void brw_dp_READ_4( struct brw_compile *p,
    
       insn->header.predicate_control = BRW_PREDICATE_NONE;
       insn->header.compression_control = BRW_COMPRESSION_NONE; 
-      insn->header.destreg__conditonalmod = msg_reg_nr;
+      insn->header.destreg__conditionalmod = msg_reg_nr;
       insn->header.mask_control = BRW_MASK_DISABLE;
   
       /* cast dest to a uword[8] vector */
@@ -1190,7 +1190,7 @@ void brw_dp_READ_4_vs(struct brw_compile *p,
    
       insn->header.predicate_control = BRW_PREDICATE_NONE;
       insn->header.compression_control = BRW_COMPRESSION_NONE; 
-      insn->header.destreg__conditonalmod = msg_reg_nr;
+      insn->header.destreg__conditionalmod = msg_reg_nr;
       insn->header.mask_control = BRW_MASK_DISABLE;
       /*insn->header.access_mode = BRW_ALIGN_16;*/
   
@@ -1224,7 +1224,7 @@ void brw_fb_WRITE(struct brw_compile *p,
    
    insn->header.predicate_control = 0; /* XXX */
    insn->header.compression_control = BRW_COMPRESSION_NONE; 
-   insn->header.destreg__conditonalmod = msg_reg_nr;
+   insn->header.destreg__conditionalmod = msg_reg_nr;
   
    brw_set_dest(insn, dest);
    brw_set_src0(insn, src0);
@@ -1322,7 +1322,7 @@ void brw_SAMPLE(struct brw_compile *p,
    
       insn->header.predicate_control = 0; /* XXX */
       insn->header.compression_control = BRW_COMPRESSION_NONE;
-      insn->header.destreg__conditonalmod = msg_reg_nr;
+      insn->header.destreg__conditionalmod = msg_reg_nr;
 
       brw_set_dest(insn, dest);
       brw_set_src0(insn, src0);
@@ -1375,7 +1375,7 @@ void brw_urb_WRITE(struct brw_compile *p,
    brw_set_src0(insn, src0);
    brw_set_src1(insn, brw_imm_d(0));
 
-   insn->header.destreg__conditonalmod = msg_reg_nr;
+   insn->header.destreg__conditionalmod = msg_reg_nr;
 
    brw_set_urb_message(p->brw,
                       insn,
@@ -1410,7 +1410,7 @@ void brw_ff_sync(struct brw_compile *p,
    brw_set_src0(insn, src0);
    brw_set_src1(insn, brw_imm_d(0));
 
-   insn->header.destreg__conditonalmod = msg_reg_nr;
+   insn->header.destreg__conditionalmod = msg_reg_nr;
 
    brw_set_ff_sync_message(p->brw,
                       insn,
index 980eac7..a9b2aa2 100644 (file)
@@ -101,7 +101,7 @@ static void brw_gs_emit_vue(struct brw_gs_compile *c,
                 BRW_URB_SWIZZLE_NONE);
 }
 
-void brw_gs_ff_sync(struct brw_gs_compile *c, int num_prim)
+static void brw_gs_ff_sync(struct brw_gs_compile *c, int num_prim)
 {
        struct brw_compile *p = &c->func;
        brw_MOV(p, get_element_ud(c->reg.R0, 1), brw_imm_ud(num_prim));
index b5f6371..bc0f076 100644 (file)
@@ -113,7 +113,7 @@ struct brw_sf_unit_key {
 
    unsigned int nr_urb_entries, urb_size, sfsize;
 
-   GLenum front_face, cull_face;
+   GLenum front_face, cull_face, provoking_vertex;
    unsigned scissor:1;
    unsigned line_smooth:1;
    unsigned point_sprite:1;
@@ -153,6 +153,9 @@ sf_unit_populate_key(struct brw_context *brw, struct brw_sf_unit_key *key)
    key->point_size = CLAMP(ctx->Point.Size, ctx->Point.MinSize, ctx->Point.MaxSize);
    key->point_attenuated = ctx->Point._Attenuated;
 
+   /* _NEW_LIGHT */
+   key->provoking_vertex = ctx->Light.ProvokingVertex;
+
    key->render_to_fbo = brw->intel.ctx.DrawBuffer->Name != 0;
 }
 
@@ -284,9 +287,15 @@ sf_unit_create_from_key(struct brw_context *brw, struct brw_sf_unit_key *key,
 
    /* might be BRW_NEW_PRIMITIVE if we have to adjust pv for polygons:
     */
-   sf.sf7.trifan_pv = 2;
-   sf.sf7.linestrip_pv = 1;
-   sf.sf7.tristrip_pv = 2;
+   if (key->provoking_vertex == GL_LAST_VERTEX_CONVENTION) {
+      sf.sf7.trifan_pv = 2;
+      sf.sf7.linestrip_pv = 1;
+      sf.sf7.tristrip_pv = 2;
+   } else {
+      sf.sf7.trifan_pv = 1;
+      sf.sf7.linestrip_pv = 0;
+      sf.sf7.tristrip_pv = 0;
+   }
    sf.sf7.line_last_pixel_enable = 0;
 
    /* Set bias for OpenGL rasterization rules:
@@ -300,6 +309,9 @@ sf_unit_create_from_key(struct brw_context *brw, struct brw_sf_unit_key *key,
                         &sf, sizeof(sf),
                         NULL, NULL);
 
+   /* STATE_PREFETCH command description describes this state as being
+    * something loaded through the GPE (L2 ISC), so it's INSTRUCTION domain.
+    */
    /* Emit SF program relocation */
    dri_bo_emit_reloc(bo,
                     I915_GEM_DOMAIN_INSTRUCTION, 0,
@@ -340,6 +352,7 @@ static void upload_sf_unit( struct brw_context *brw )
 const struct brw_tracked_state brw_sf_unit = {
    .dirty = {
       .mesa  = (_NEW_POLYGON | 
+               _NEW_LIGHT |
                _NEW_LINE | 
                _NEW_POINT | 
                _NEW_SCISSOR |
index bf9f6ca..7857235 100644 (file)
@@ -92,6 +92,7 @@ const struct brw_tracked_state brw_clear_batch_cache;
 const struct brw_tracked_state brw_drawing_rect;
 const struct brw_tracked_state brw_indices;
 const struct brw_tracked_state brw_vertices;
+const struct brw_tracked_state brw_index_buffer;
 
 /**
  * Use same key for WM and VS surfaces.
index 38d9dd8..95d42d2 100644 (file)
@@ -94,6 +94,7 @@ const struct brw_tracked_state *atoms[] =
 
    &brw_drawing_rect,
    &brw_indices,
+   &brw_index_buffer,
    &brw_vertices,
 
    &brw_constant_buffer
@@ -208,6 +209,7 @@ static struct dirty_bit_map brw_bits[] = {
    DEFINE_BIT(BRW_NEW_PSP),
    DEFINE_BIT(BRW_NEW_FENCE),
    DEFINE_BIT(BRW_NEW_INDICES),
+   DEFINE_BIT(BRW_NEW_INDEX_BUFFER),
    DEFINE_BIT(BRW_NEW_VERTICES),
    DEFINE_BIT(BRW_NEW_BATCH),
    DEFINE_BIT(BRW_NEW_DEPTH_BUFFER),
index 8ba7eb2..a6de092 100644 (file)
@@ -1200,7 +1200,7 @@ struct brw_instruction
       GLuint predicate_control:4;
       GLuint predicate_inverse:1;
       GLuint execution_size:3;
-      GLuint destreg__conditonalmod:4; /* destreg - send, conditionalmod - others */
+      GLuint destreg__conditionalmod:4; /* destreg - send, conditionalmod - others */
       GLuint pad0:2;
       GLuint debug_control:1;
       GLuint saturate:1;
@@ -1228,7 +1228,9 @@ struct brw_instruction
         GLuint dest_reg_type:3;
         GLuint src0_reg_file:2;
         GLuint src0_reg_type:3;
-        GLuint pad:6;
+        GLuint src1_reg_file:2;        /* 0x00000c00 */
+        GLuint src1_reg_type:3;        /* 0x00007000 */
+        GLuint pad:1;
         GLint dest_indirect_offset:10; /* offset against the deref'd address reg */
         GLuint dest_subreg_nr:3; /* subnr for the address reg a0.x */
         GLuint dest_horiz_stride:2;
@@ -1243,7 +1245,7 @@ struct brw_instruction
         GLuint src0_reg_type:3;
         GLuint src1_reg_file:2;
         GLuint src1_reg_type:3;
-        GLuint pad0:1;
+        GLuint pad:1;
         GLuint dest_writemask:4;
         GLuint dest_subreg_nr:1;
         GLuint dest_reg_nr:8;
@@ -1348,7 +1350,7 @@ struct brw_instruction
         GLuint src1_reg_nr:8;
         GLuint src1_abs:1;
         GLuint src1_negate:1;
-        GLuint pad:1;
+        GLuint src1_address_mode:1;
         GLuint src1_horiz_stride:2;
         GLuint src1_width:3;
         GLuint src1_vert_stride:4;
@@ -1363,7 +1365,7 @@ struct brw_instruction
         GLuint src1_reg_nr:8;
         GLuint src1_abs:1;
         GLuint src1_negate:1;
-        GLuint pad0:1;
+        GLuint src1_address_mode:1;
         GLuint src1_swz_z:2;
         GLuint src1_swz_w:2;
         GLuint pad1:1;
@@ -1377,7 +1379,7 @@ struct brw_instruction
         GLuint src1_subreg_nr:3;
         GLuint src1_abs:1;
         GLuint src1_negate:1;
-        GLuint pad0:1;
+        GLuint src1_address_mode:1;
         GLuint src1_horiz_stride:2;
         GLuint src1_width:3;
         GLuint src1_vert_stride:4;
@@ -1565,6 +1567,7 @@ struct brw_instruction
 
       GLint d;
       GLuint ud;
+      float f;
    } bits3;
 };
 
index 7f9b253..1d2e953 100644 (file)
@@ -65,11 +65,6 @@ GLboolean brw_miptree_layout(struct intel_context *intel,
 
           if (mt->compressed) {
               mt->pitch = ALIGN(mt->width0, align_w);
-              qpitch = (y_pitch + ALIGN(minify(y_pitch), align_h) + 11 * align_h) / 4 * mt->pitch * mt->cpp;
-              mt->total_height = (y_pitch + ALIGN(minify(y_pitch), align_h) + 11 * align_h) / 4 * 6;
-          } else {
-              qpitch = (y_pitch + ALIGN(minify(y_pitch), align_h) + 11 * align_h) * mt->pitch * mt->cpp;
-              mt->total_height = (y_pitch + ALIGN(minify(y_pitch), align_h) + 11 * align_h) * 6;
           }
 
           if (mt->first_level != mt->last_level) {
@@ -90,6 +85,14 @@ GLboolean brw_miptree_layout(struct intel_context *intel,
 
           mt->pitch = intel_miptree_pitch_align(intel, mt, tiling, mt->pitch);
 
+          if (mt->compressed) {
+              qpitch = (y_pitch + ALIGN(minify(y_pitch), align_h) + 11 * align_h) / 4 * mt->pitch * mt->cpp;
+              mt->total_height = (y_pitch + ALIGN(minify(y_pitch), align_h) + 11 * align_h) / 4 * 6;
+          } else {
+              qpitch = (y_pitch + ALIGN(minify(y_pitch), align_h) + 11 * align_h) * mt->pitch * mt->cpp;
+              mt->total_height = (y_pitch + ALIGN(minify(y_pitch), align_h) + 11 * align_h) * 6;
+          }
+
           for (level = mt->first_level; level <= mt->last_level; level++) {
               GLuint img_height;
               GLuint nr_images = 6;
index 514f15d..83167b9 100644 (file)
@@ -68,6 +68,7 @@ static void release_tmps( struct brw_vs_compile *c )
 static void brw_vs_alloc_regs( struct brw_vs_compile *c )
 {
    GLuint i, reg = 0, mrf;
+   int attributes_in_vue;
 
    /* Determine whether to use a real constant buffer or use a block
     * of GRF registers for constants.  The later is faster but only
@@ -128,6 +129,11 @@ static void brw_vs_alloc_regs( struct brw_vs_compile *c )
         reg++;
       }
    }
+   /* If there are no inputs, we'll still be reading one attribute's worth
+    * because it's required -- see urb_read_length setting.
+    */
+   if (c->nr_inputs == 0)
+      reg++;
 
    /* Allocate outputs.  The non-position outputs go straight into message regs.
     */
@@ -220,11 +226,22 @@ static void brw_vs_alloc_regs( struct brw_vs_compile *c )
     * vertex urb, so is half the amount:
     */
    c->prog_data.urb_read_length = (c->nr_inputs + 1) / 2;
+   /* Setting this field to 0 leads to undefined behavior according to the
+    * the VS_STATE docs.  Our VUEs will always have at least one attribute
+    * sitting in them, even if it's padding.
+    */
+   if (c->prog_data.urb_read_length == 0)
+      c->prog_data.urb_read_length = 1;
+
+   /* The VS VUEs are shared by VF (outputting our inputs) and VS, so size
+    * them to fit the biggest thing they need to.
+    */
+   attributes_in_vue = MAX2(c->nr_outputs, c->nr_inputs);
 
    if (BRW_IS_IGDNG(c->func.brw))
-       c->prog_data.urb_entry_size = (c->nr_outputs + 6 + 3) / 4;
+       c->prog_data.urb_entry_size = (attributes_in_vue + 6 + 3) / 4;
    else
-       c->prog_data.urb_entry_size = (c->nr_outputs + 2 + 3) / 4;
+       c->prog_data.urb_entry_size = (attributes_in_vue + 2 + 3) / 4;
 
    c->prog_data.total_grf = reg;
 
@@ -1245,9 +1262,30 @@ post_vs_emit( struct brw_vs_compile *c,
 
    /* patch up the END code to jump past subroutines, etc */
    offset = last_inst - end_inst;
-   brw_set_src1(end_inst, brw_imm_d(offset * 16));
+   if (offset > 1) {
+      brw_set_src1(end_inst, brw_imm_d(offset * 16));
+   } else {
+      end_inst->header.opcode = BRW_OPCODE_NOP;
+   }
 }
 
+static uint32_t
+get_predicate(uint32_t swizzle)
+{
+   switch (swizzle) {
+   case SWIZZLE_XXXX:
+      return BRW_PREDICATE_ALIGN16_REPLICATE_X;
+   case SWIZZLE_YYYY:
+      return BRW_PREDICATE_ALIGN16_REPLICATE_Y;
+   case SWIZZLE_ZZZZ:
+      return BRW_PREDICATE_ALIGN16_REPLICATE_Z;
+   case SWIZZLE_WWWW:
+      return BRW_PREDICATE_ALIGN16_REPLICATE_W;
+   default:
+      _mesa_problem(NULL, "Unexpected predicate: 0x%08x\n", swizzle);
+      return BRW_PREDICATE_NORMAL;
+   }
+}
 
 /* Emit the vertex program instructions here.
  */
@@ -1266,7 +1304,7 @@ void brw_vs_emit(struct brw_vs_compile *c )
    GLuint file;
 
    if (INTEL_DEBUG & DEBUG_VS) {
-      _mesa_printf("vs-emit:\n");
+      _mesa_printf("vs-mesa:\n");
       _mesa_print_program(&c->vp->program.Base); 
       _mesa_printf("\n");
    }
@@ -1453,7 +1491,10 @@ void brw_vs_emit(struct brw_vs_compile *c )
         break;
       case OPCODE_IF:
         assert(if_depth < MAX_IF_DEPTH);
-         if_inst[if_depth++] = brw_IF(p, BRW_EXECUTE_8);
+        if_inst[if_depth] = brw_IF(p, BRW_EXECUTE_8);
+        if_inst[if_depth]->header.predicate_control =
+           get_predicate(inst->DstReg.CondSwizzle);
+        if_depth++;
         break;
       case OPCODE_ELSE:
         if_inst[if_depth-1] = brw_ELSE(p, if_inst[if_depth-1]);
@@ -1541,6 +1582,19 @@ void brw_vs_emit(struct brw_vs_compile *c )
                                    "unknown");
       }
 
+      /* Set the predication update on the last instruction of the native
+       * instruction sequence.
+       *
+       * This would be problematic if it was set on a math instruction,
+       * but that shouldn't be the case with the current GLSL compiler.
+       */
+      if (inst->CondUpdate) {
+        struct brw_instruction *hw_insn = &p->store[p->nr_insn - 1];
+
+        assert(hw_insn->header.destreg__conditionalmod == 0);
+        hw_insn->header.destreg__conditionalmod = BRW_CONDITIONAL_NZ;
+      }
+
       if ((inst->DstReg.File == PROGRAM_OUTPUT)
           && (inst->DstReg.Index != VERT_RESULT_HPOS)
           && c->output_regs[inst->DstReg.Index].used_in_src) {
@@ -1578,4 +1632,13 @@ void brw_vs_emit(struct brw_vs_compile *c )
    emit_vertex_write(c);
 
    post_vs_emit(c, end_inst, last_inst);
+
+   if (INTEL_DEBUG & DEBUG_VS) {
+      int i;
+
+      _mesa_printf("vs-native:\n");
+      for (i = 0; i < p->nr_insn; i++)
+        brw_disasm(stderr, &p->store[i]);
+      _mesa_printf("\n");
+   }
 }
index 14e05be..2292de9 100644 (file)
@@ -41,13 +41,13 @@ GLuint brw_wm_nr_args( GLuint opcode )
 {
    switch (opcode) {
    case WM_FRONTFACING:
-      return 0;
    case WM_PIXELXY:
+      return 0;
    case WM_CINTERP:
    case WM_WPOSXY:
+   case WM_DELTAXY:
       return 1;
    case WM_LINTERP:
-   case WM_DELTAXY:
    case WM_PIXELW:
       return 2;
    case WM_FB_WRITE:
@@ -171,9 +171,11 @@ static void do_wm_prog( struct brw_context *brw,
     * differently from "simple" shaders.
     */
    if (fp->isGLSL) {
+      c->dispatch_width = 8;
       brw_wm_glsl_emit(brw, c);
    }
    else {
+      c->dispatch_width = 16;
       brw_wm_non_glsl_emit(brw, c);
    }
 
@@ -202,6 +204,7 @@ static void brw_wm_populate_key( struct brw_context *brw,
    /* BRW_NEW_FRAGMENT_PROGRAM */
    const struct brw_fragment_program *fp = 
       (struct brw_fragment_program *)brw->fragment_program;
+   GLboolean uses_depth = (fp->program.Base.InputsRead & (1 << FRAG_ATTRIB_WPOS)) != 0;
    GLuint lookup = 0;
    GLuint line_aa;
    GLuint i;
@@ -263,6 +266,7 @@ static void brw_wm_populate_key( struct brw_context *brw,
         
    brw_wm_lookup_iz(line_aa,
                    lookup,
+                   uses_depth,
                    key);
 
 
index ba49743..ae98b54 100644 (file)
@@ -260,6 +260,7 @@ struct brw_wm_compile {
    GLuint tmp_index;
    GLuint tmp_max;
    GLuint subroutines[BRW_WM_MAX_SUBROUTINE];
+   GLuint dispatch_width;
 
    /** we may need up to 3 constants per instruction (if use_const_buffer) */
    struct {
@@ -292,6 +293,7 @@ void brw_wm_print_program( struct brw_wm_compile *c,
 
 void brw_wm_lookup_iz( GLuint line_aa,
                       GLuint lookup,
+                      GLboolean ps_uses_depth,
                       struct brw_wm_prog_key *key );
 
 GLboolean brw_wm_is_glsl(const struct gl_fragment_program *fp);
index 9f82916..b3cf524 100644 (file)
@@ -65,8 +65,7 @@ static INLINE struct brw_reg sechalf( struct brw_reg reg )
 
 static void emit_pixel_xy(struct brw_compile *p,
                          const struct brw_reg *dst,
-                         GLuint mask,
-                         const struct brw_reg *arg0)
+                         GLuint mask)
 {
    struct brw_reg r1 = brw_vec1_grf(1, 0);
    struct brw_reg r1_uw = retype(r1, BRW_REGISTER_TYPE_UW);
@@ -98,8 +97,7 @@ static void emit_pixel_xy(struct brw_compile *p,
 static void emit_delta_xy(struct brw_compile *p,
                          const struct brw_reg *dst,
                          GLuint mask,
-                         const struct brw_reg *arg0,
-                         const struct brw_reg *arg1)
+                         const struct brw_reg *arg0)
 {
    struct brw_reg r1 = brw_vec1_grf(1, 0);
 
@@ -545,16 +543,18 @@ static void emit_dp3( struct brw_compile *p,
                      const struct brw_reg *arg0,
                      const struct brw_reg *arg1 )
 {
+   int dst_chan = _mesa_ffs(mask & WRITEMASK_XYZW) - 1;
+
    if (!(mask & WRITEMASK_XYZW))
       return; /* Do not emit dead code */
 
-   assert((mask & WRITEMASK_XYZW) == WRITEMASK_X);
+   assert(is_power_of_two(mask & WRITEMASK_XYZW));
 
    brw_MUL(p, brw_null_reg(), arg0[0], arg1[0]);
    brw_MAC(p, brw_null_reg(), arg0[1], arg1[1]);
 
    brw_set_saturate(p, (mask & SATURATE) ? 1 : 0);
-   brw_MAC(p, dst[0], arg0[2], arg1[2]);
+   brw_MAC(p, dst[dst_chan], arg0[2], arg1[2]);
    brw_set_saturate(p, 0);
 }
 
@@ -565,17 +565,19 @@ static void emit_dp4( struct brw_compile *p,
                      const struct brw_reg *arg0,
                      const struct brw_reg *arg1 )
 {
+   int dst_chan = _mesa_ffs(mask & WRITEMASK_XYZW) - 1;
+
    if (!(mask & WRITEMASK_XYZW))
       return; /* Do not emit dead code */
 
-   assert((mask & WRITEMASK_XYZW) == WRITEMASK_X);
+   assert(is_power_of_two(mask & WRITEMASK_XYZW));
 
    brw_MUL(p, brw_null_reg(), arg0[0], arg1[0]);
    brw_MAC(p, brw_null_reg(), arg0[1], arg1[1]);
    brw_MAC(p, brw_null_reg(), arg0[2], arg1[2]);
 
    brw_set_saturate(p, (mask & SATURATE) ? 1 : 0);
-   brw_MAC(p, dst[0], arg0[3], arg1[3]);
+   brw_MAC(p, dst[dst_chan], arg0[3], arg1[3]);
    brw_set_saturate(p, 0);
 }
 
@@ -632,18 +634,19 @@ static void emit_math1( struct brw_compile *p,
                        GLuint mask,
                        const struct brw_reg *arg0 )
 {
+   int dst_chan = _mesa_ffs(mask & WRITEMASK_XYZW) - 1;
+
    if (!(mask & WRITEMASK_XYZW))
       return; /* Do not emit dead code */
 
-   //assert((mask & WRITEMASK_XYZW) == WRITEMASK_X ||
-   //    function == BRW_MATH_FUNCTION_SINCOS);
-   
+   assert(is_power_of_two(mask & WRITEMASK_XYZW));
+
    brw_MOV(p, brw_message_reg(2), arg0[0]);
 
    /* Send two messages to perform all 16 operations:
     */
    brw_math_16(p, 
-              dst[0],
+              dst[dst_chan],
               function,
               (mask & SATURATE) ? BRW_MATH_SATURATE_SATURATE : BRW_MATH_SATURATE_NONE,
               2,
@@ -659,10 +662,12 @@ static void emit_math2( struct brw_compile *p,
                        const struct brw_reg *arg0,
                        const struct brw_reg *arg1)
 {
+   int dst_chan = _mesa_ffs(mask & WRITEMASK_XYZW) - 1;
+
    if (!(mask & WRITEMASK_XYZW))
       return; /* Do not emit dead code */
 
-   assert((mask & WRITEMASK_XYZW) == WRITEMASK_X);
+   assert(is_power_of_two(mask & WRITEMASK_XYZW));
 
    brw_push_insn_state(p);
 
@@ -681,7 +686,7 @@ static void emit_math2( struct brw_compile *p,
     */
    brw_set_compression_control(p, BRW_COMPRESSION_NONE);
    brw_math(p, 
-           dst[0],
+           dst[dst_chan],
            function,
            (mask & SATURATE) ? BRW_MATH_SATURATE_SATURATE : BRW_MATH_SATURATE_NONE,
            2,
@@ -691,7 +696,7 @@ static void emit_math2( struct brw_compile *p,
 
    brw_set_compression_control(p, BRW_COMPRESSION_2NDHALF);
    brw_math(p, 
-           offset(dst[0],1),
+           offset(dst[dst_chan],1),
            function,
            (mask & SATURATE) ? BRW_MATH_SATURATE_SATURATE : BRW_MATH_SATURATE_NONE,
            4,
@@ -1194,11 +1199,11 @@ void brw_wm_emit( struct brw_wm_compile *c )
         /* Generated instructions for calculating triangle interpolants:
          */
       case WM_PIXELXY:
-        emit_pixel_xy(p, dst, dst_flags, args[0]);
+        emit_pixel_xy(p, dst, dst_flags);
         break;
 
       case WM_DELTAXY:
-        emit_delta_xy(p, dst, dst_flags, args[0], args[1]);
+        emit_delta_xy(p, dst, dst_flags, args[0]);
         break;
 
       case WM_WPOSXY:
@@ -1385,4 +1390,13 @@ void brw_wm_emit( struct brw_wm_compile *c )
                      inst->dst[i]->hw_reg, 
                      inst->dst[i]->spill_slot);
    }
+
+   if (INTEL_DEBUG & DEBUG_WM) {
+      int i;
+
+      _mesa_printf("wm-native:\n");
+      for (i = 0; i < p->nr_insn; i++)
+        brw_disasm(stderr, &p->store[i]);
+      _mesa_printf("\n");
+   }
 }
index b9e8dd2..5dc076a 100644 (file)
@@ -226,9 +226,42 @@ static struct prog_instruction * emit_op(struct brw_wm_compile *c,
                       0, 0, 0,  /* tex unit, target, shadow */
                       src0, src1, src2);
 }
-   
 
 
+/* Many Mesa opcodes produce the same value across all the result channels.
+ * We'd rather not have to support that splatting in the opcode implementations,
+ * and brw_wm_pass*.c wants to optimize them out by shuffling references around
+ * anyway.  We can easily get both by emitting the opcode to one channel, and
+ * then MOVing it to the others, which brw_wm_pass*.c already understands.
+ */
+static struct prog_instruction *emit_scalar_insn(struct brw_wm_compile *c,
+                                                const struct prog_instruction *inst0)
+{
+   struct prog_instruction *inst;
+   unsigned int dst_chan;
+   unsigned int other_channel_mask;
+
+   if (inst0->DstReg.WriteMask == 0)
+      return NULL;
+
+   dst_chan = _mesa_ffs(inst0->DstReg.WriteMask) - 1;
+   inst = get_fp_inst(c);
+   *inst = *inst0;
+   inst->DstReg.WriteMask = 1 << dst_chan;
+
+   other_channel_mask = inst0->DstReg.WriteMask & ~(1 << dst_chan);
+   if (other_channel_mask != 0) {
+      inst = emit_op(c,
+                    OPCODE_MOV,
+                    dst_mask(inst0->DstReg, other_channel_mask),
+                    0,
+                    src_swizzle1(src_reg_from_dst(inst0->DstReg), dst_chan),
+                    src_undef(),
+                    src_undef());
+   }
+   return inst;
+}
+
 
 /***********************************************************************
  * Special instructions for interpolation and other tasks
@@ -376,14 +409,6 @@ static void emit_interp( struct brw_wm_compile *c,
       }
       break;
    case FRAG_ATTRIB_FOGC:
-      /* The FOGC input is really special.  When a program uses glFogFragCoord,
-       * the results returned are supposed to be (f,0,0,1).  But for Mesa GLSL,
-       * the glFrontFacing and glPointCoord values are also stashed in FOGC.
-       * So, write the interpolated fog value to X, then either 0, 1, or the
-       * stashed values to Y, Z, W.  Note that this means that
-       * glFogFragCoord.yzw can be wrong in those cases!
-       */
-
       /* Interpolate the fog coordinate */
       emit_op(c,
              WM_PINTERP,
@@ -393,26 +418,40 @@ static void emit_interp( struct brw_wm_compile *c,
              deltas,
              get_pixel_w(c));
 
-      /* Move the front facing value into FOGC.y if it's needed. */
-      if (c->fp->program.UsesFrontFacing) {
-        emit_op(c,
-                WM_FRONTFACING,
-                dst_mask(dst, WRITEMASK_Y),
-                0,
-                src_undef(),
-                src_undef(),
-                src_undef());
-      } else {
-        emit_op(c,
-                OPCODE_MOV,
-                dst_mask(dst, WRITEMASK_Y),
-                0,
-                src_swizzle1(interp, SWIZZLE_ZERO),
-                src_undef(),
-                src_undef());
-      }
+      emit_op(c,
+             OPCODE_MOV,
+             dst_mask(dst, WRITEMASK_YZW),
+             0,
+             src_swizzle(interp,
+                         SWIZZLE_ZERO,
+                         SWIZZLE_ZERO,
+                         SWIZZLE_ZERO,
+                         SWIZZLE_ONE),
+             src_undef(),
+             src_undef());
+      break;
+
+   case FRAG_ATTRIB_FACE:
+      /* XXX review/test this case */
+      emit_op(c,
+              WM_FRONTFACING,
+              dst_mask(dst, WRITEMASK_X),
+              0,
+              src_undef(),
+              src_undef(),
+              src_undef());
+      break;
+
+   case FRAG_ATTRIB_PNTC:
+      /* XXX review/test this case */
+      emit_op(c,
+             WM_PINTERP,
+             dst_mask(dst, WRITEMASK_XY),
+             0,
+             interp,
+             deltas,
+             get_pixel_w(c));
 
-      /* Should do the PointCoord thing here. */
       emit_op(c,
              OPCODE_MOV,
              dst_mask(dst, WRITEMASK_ZW),
@@ -425,6 +464,7 @@ static void emit_interp( struct brw_wm_compile *c,
              src_undef(),
              src_undef());
       break;
+
    default:
       emit_op(c,
              WM_PINTERP,
@@ -683,7 +723,7 @@ static void precalc_tex( struct brw_wm_compile *c,
 
        /* tmp0 = 1 / tmp1 */
        emit_op(c, OPCODE_RCP,
-               tmp0,
+               dst_mask(tmp0, WRITEMASK_X),
                0,
                tmp1src,
                src_undef(),
@@ -694,7 +734,7 @@ static void precalc_tex( struct brw_wm_compile *c,
                tmpcoord,
                0,
                src0,
-               tmp0src,
+               src_swizzle1(tmp0src, SWIZZLE_X),
                src_undef());
 
        release_temp(c, tmp0);
@@ -717,7 +757,11 @@ static void precalc_tex( struct brw_wm_compile *c,
              tmpcoord,
              0,
              inst->SrcReg[0],
-             scale,
+             src_swizzle(scale,
+                         SWIZZLE_X,
+                         SWIZZLE_Y,
+                         SWIZZLE_ONE,
+                         SWIZZLE_ONE),
              src_undef());
 
       coord = src_reg_from_dst(tmpcoord);
@@ -1134,9 +1178,11 @@ void brw_wm_pass_fp( struct brw_wm_compile *c )
         break;
       case OPCODE_PRINT:
         break;
-        
       default:
-        emit_insn(c, inst);
+        if (brw_wm_is_scalar_result(inst->Opcode))
+           emit_scalar_insn(c, inst);
+        else
+           emit_insn(c, inst);
         break;
       }
    }
index 19f777f..a5b18ec 100644 (file)
@@ -10,6 +10,9 @@ enum _subroutine {
     SUB_NOISE1, SUB_NOISE2, SUB_NOISE3, SUB_NOISE4
 };
 
+static struct brw_reg get_dst_reg(struct brw_wm_compile *c,
+                                  const struct prog_instruction *inst,
+                                  GLuint component);
 
 /**
  * Determine if the given fragment program uses GLSL features such
@@ -22,6 +25,7 @@ GLboolean brw_wm_is_glsl(const struct gl_fragment_program *fp)
     for (i = 0; i < fp->Base.NumInstructions; i++) {
        const struct prog_instruction *inst = &fp->Base.Instructions[i];
        switch (inst->Opcode) {
+           case OPCODE_ARL:
            case OPCODE_IF:
            case OPCODE_ENDIF:
            case OPCODE_CAL:
@@ -130,19 +134,6 @@ static void set_reg(struct brw_wm_compile *c, int file, int index,
     c->wm_regs[file][index][component].inited = GL_TRUE;
 }
 
-/**
- * Examine instruction's write mask to find index of first component
- * enabled for writing.
- */
-static int get_scalar_dst_index(const struct prog_instruction *inst)
-{
-    int i;
-    for (i = 0; i < 4; i++)
-       if (inst->DstReg.WriteMask & (1<<i))
-           break;
-    return i;
-}
-
 static struct brw_reg alloc_tmp(struct brw_wm_compile *c)
 {
     struct brw_reg reg;
@@ -402,6 +393,27 @@ static void prealloc_reg(struct brw_wm_compile *c)
     prealloc_grf(c, 126);
     prealloc_grf(c, 127);
 
+    for (i = 0; i < c->nr_fp_insns; i++) {
+       const struct prog_instruction *inst = &c->prog_instructions[i];
+       struct brw_reg dst[4];
+
+       switch (inst->Opcode) {
+       case OPCODE_TEX:
+       case OPCODE_TXB:
+           /* Allocate the channels of texture results contiguously,
+            * since they are written out that way by the sampler unit.
+            */
+           for (j = 0; j < 4; j++) {
+               dst[j] = get_dst_reg(c, inst, j);
+               if (j != 0)
+                   assert(dst[j].nr == dst[j - 1].nr + 1);
+           }
+           break;
+       default:
+           break;
+       }
+    }
+
     /* An instruction may reference up to three constants.
      * They'll be found in these registers.
      * XXX alloc these on demand!
@@ -639,23 +651,6 @@ static void invoke_subroutine( struct brw_wm_compile *c,
     }
 }
 
-static void emit_abs( struct brw_wm_compile *c,
-                      const struct prog_instruction *inst)
-{
-    int i;
-    struct brw_compile *p = &c->func;
-    brw_set_saturate(p, inst->SaturateMode != SATURATE_OFF);
-    for (i = 0; i < 4; i++) {
-       if (inst->DstReg.WriteMask & (1<<i)) {
-           struct brw_reg src, dst;
-           dst = get_dst_reg(c, inst, i);
-           src = get_src_reg(c, inst, 0, i);
-           brw_MOV(p, dst, brw_abs(src));
-       }
-    }
-    brw_set_saturate(p, 0);
-}
-
 static void emit_trunc( struct brw_wm_compile *c,
                         const struct prog_instruction *inst)
 {
@@ -1031,12 +1026,20 @@ static void emit_dp3(struct brw_wm_compile *c,
     struct brw_reg src0[3], src1[3], dst;
     int i;
     struct brw_compile *p = &c->func;
+    GLuint mask = inst->DstReg.WriteMask;
+    int dst_chan = _mesa_ffs(mask & WRITEMASK_XYZW) - 1;
+
+    if (!(mask & WRITEMASK_XYZW))
+       return;
+
+    assert(is_power_of_two(mask & WRITEMASK_XYZW));
+
     for (i = 0; i < 3; i++) {
        src0[i] = get_src_reg(c, inst, 0, i);
        src1[i] = get_src_reg_imm(c, inst, 1, i);
     }
 
-    dst = get_dst_reg(c, inst, get_scalar_dst_index(inst));
+    dst = get_dst_reg(c, inst, dst_chan);
     brw_MUL(p, brw_null_reg(), src0[0], src1[0]);
     brw_MAC(p, brw_null_reg(), src0[1], src1[1]);
     brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);
@@ -1050,11 +1053,19 @@ static void emit_dp4(struct brw_wm_compile *c,
     struct brw_reg src0[4], src1[4], dst;
     int i;
     struct brw_compile *p = &c->func;
+    GLuint mask = inst->DstReg.WriteMask;
+    int dst_chan = _mesa_ffs(mask & WRITEMASK_XYZW) - 1;
+
+    if (!(mask & WRITEMASK_XYZW))
+       return;
+
+    assert(is_power_of_two(mask & WRITEMASK_XYZW));
+
     for (i = 0; i < 4; i++) {
        src0[i] = get_src_reg(c, inst, 0, i);
        src1[i] = get_src_reg_imm(c, inst, 1, i);
     }
-    dst = get_dst_reg(c, inst, get_scalar_dst_index(inst));
+    dst = get_dst_reg(c, inst, dst_chan);
     brw_MUL(p, brw_null_reg(), src0[0], src1[0]);
     brw_MAC(p, brw_null_reg(), src0[1], src1[1]);
     brw_MAC(p, brw_null_reg(), src0[2], src1[2]);
@@ -1069,11 +1080,19 @@ static void emit_dph(struct brw_wm_compile *c,
     struct brw_reg src0[4], src1[4], dst;
     int i;
     struct brw_compile *p = &c->func;
+    GLuint mask = inst->DstReg.WriteMask;
+    int dst_chan = _mesa_ffs(mask & WRITEMASK_XYZW) - 1;
+
+    if (!(mask & WRITEMASK_XYZW))
+       return;
+
+    assert(is_power_of_two(mask & WRITEMASK_XYZW));
+
     for (i = 0; i < 4; i++) {
        src0[i] = get_src_reg(c, inst, 0, i);
        src1[i] = get_src_reg_imm(c, inst, 1, i);
     }
-    dst = get_dst_reg(c, inst, get_scalar_dst_index(inst));
+    dst = get_dst_reg(c, inst, dst_chan);
     brw_MUL(p, brw_null_reg(), src0[0], src1[0]);
     brw_MAC(p, brw_null_reg(), src0[1], src1[1]);
     brw_MAC(p, dst, src0[2], src1[2]);
@@ -1091,37 +1110,28 @@ static void emit_math1(struct brw_wm_compile *c,
                        const struct prog_instruction *inst, GLuint func)
 {
     struct brw_compile *p = &c->func;
-    struct brw_reg src0, dst, tmp;
-    const int mark = mark_tmps( c );
-    int i;
+    struct brw_reg src0, dst;
+    GLuint mask = inst->DstReg.WriteMask;
+    int dst_chan = _mesa_ffs(mask & WRITEMASK_XYZW) - 1;
+
+    if (!(mask & WRITEMASK_XYZW))
+       return;
 
-    tmp = alloc_tmp(c);
+    assert(is_power_of_two(mask & WRITEMASK_XYZW));
 
     /* Get first component of source register */
+    dst = get_dst_reg(c, inst, dst_chan);
     src0 = get_src_reg(c, inst, 0, 0);
 
-    /* tmp = func(src0) */
     brw_MOV(p, brw_message_reg(2), src0);
     brw_math(p,
-             tmp,
+             dst,
              func,
              (inst->SaturateMode != SATURATE_OFF) ? BRW_MATH_SATURATE_SATURATE : BRW_MATH_SATURATE_NONE,
              2,
              brw_null_reg(),
              BRW_MATH_DATA_VECTOR,
              BRW_MATH_PRECISION_FULL);
-
-    /*tmp.dw1.bits.swizzle = SWIZZLE_XXXX;*/
-
-    /* replicate tmp value across enabled dest channels */
-    for (i = 0; i < 4; i++) {
-       if (inst->DstReg.WriteMask & (1 << i)) {
-          dst = get_dst_reg(c, inst, i);
-          brw_MOV(p, dst, tmp);
-       }
-    }
-
-    release_tmps(c, mark);
 }
 
 static void emit_rcp(struct brw_wm_compile *c,
@@ -1192,24 +1202,6 @@ static void emit_arl(struct brw_wm_compile *c,
     brw_set_saturate(p, 0);
 }
 
-static void emit_sub(struct brw_wm_compile *c,
-                     const struct prog_instruction *inst)
-{
-    struct brw_compile *p = &c->func;
-    struct brw_reg src0, src1, dst;
-    GLuint mask = inst->DstReg.WriteMask;
-    int i;
-    brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);
-    for (i = 0 ; i < 4; i++) {
-       if (mask & (1<<i)) {
-           dst = get_dst_reg(c, inst, i);
-           src0 = get_src_reg(c, inst, 0, i);
-           src1 = get_src_reg_imm(c, inst, 1, i);
-           brw_ADD(p, dst, src0, negate(src1));
-       }
-    }
-    brw_set_saturate(p, 0);
-}
 
 static void emit_mul(struct brw_wm_compile *c,
                      const struct prog_instruction *inst)
@@ -1321,7 +1313,15 @@ static void emit_pow(struct brw_wm_compile *c,
 {
     struct brw_compile *p = &c->func;
     struct brw_reg dst, src0, src1;
-    dst = get_dst_reg(c, inst, get_scalar_dst_index(inst));
+    GLuint mask = inst->DstReg.WriteMask;
+    int dst_chan = _mesa_ffs(mask & WRITEMASK_XYZW) - 1;
+
+    if (!(mask & WRITEMASK_XYZW))
+       return;
+
+    assert(is_power_of_two(mask & WRITEMASK_XYZW));
+
+    dst = get_dst_reg(c, inst, dst_chan);
     src0 = get_src_reg_imm(c, inst, 0, 0);
     src1 = get_src_reg_imm(c, inst, 1, 0);
 
@@ -2828,18 +2828,12 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)
            case WM_FRONTFACING:
                emit_frontfacing(c, inst);
                break;
-           case OPCODE_ABS:
-               emit_abs(c, inst);
-               break;
            case OPCODE_ADD:
                emit_add(c, inst);
                break;
            case OPCODE_ARL:
                emit_arl(c, inst);
                break;
-           case OPCODE_SUB:
-               emit_sub(c, inst);
-               break;
            case OPCODE_FRC:
                emit_frc(c, inst);
                break;
@@ -3007,7 +3001,7 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)
  
                   loop_depth--;
                   inst0 = inst1 = brw_WHILE(p, loop_inst[loop_depth]);
-                  /* patch all the BREAK/CONT instructions from last BEGINLOOP */
+                  /* patch all the BREAK/CONT instructions from last BGNLOOP */
                   while (inst0 > loop_inst[loop_depth]) {
                      inst0--;
                      if (inst0->header.opcode == BRW_OPCODE_BREAK) {
@@ -3032,8 +3026,14 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)
            brw_set_predicate_control(p, BRW_PREDICATE_NONE);
     }
     post_wm_emit(c);
-}
 
+    if (INTEL_DEBUG & DEBUG_WM) {
+      _mesa_printf("wm-native:\n");
+      for (i = 0; i < p->nr_insn; i++)
+        brw_disasm(stderr, &p->store[i]);
+      _mesa_printf("\n");
+    }
+}
 
 /**
  * Do GPU code generation for shaders that use GLSL features such as
index 8fd067a..5e399ac 100644 (file)
@@ -122,6 +122,7 @@ const struct {
  */
 void brw_wm_lookup_iz( GLuint line_aa,
                       GLuint lookup,
+                      GLboolean ps_uses_depth,
                       struct brw_wm_prog_key *key )
 {
    GLuint reg = 2;
@@ -131,7 +132,7 @@ void brw_wm_lookup_iz( GLuint line_aa,
    if (lookup & IZ_PS_COMPUTES_DEPTH_BIT)
       key->computes_depth = 1;
 
-   if (wm_iz_table[lookup].sd_present) {
+   if (wm_iz_table[lookup].sd_present || ps_uses_depth) {
       key->source_depth_reg = reg;
       reg += 2;
    }
index 9214276..6279258 100644 (file)
@@ -257,34 +257,6 @@ static void pass0_set_dst( struct brw_wm_compile *c,
 }
 
 
-static void pass0_set_dst_scalar( struct brw_wm_compile *c,
-                                 struct brw_wm_instruction *out,
-                                  const struct prog_instruction *inst,
-                                 GLuint writemask )
-{
-   if (writemask) {
-      const struct prog_dst_register *dst = &inst->DstReg;
-      GLuint i;
-
-      /* Compute only the first (X) value:
-       */
-      out->writemask = WRITEMASK_X;
-      out->dst[0] = get_value(c);
-
-      /* Update our tracking register file for all the components in
-       * writemask:
-       */
-      for (i = 0; i < 4; i++) {
-        if (writemask & (1<<i)) {
-           pass0_set_fpreg_value(c, dst->File, dst->Index, i, out->dst[0]);
-        }
-      }
-   }
-   else
-      out->writemask = 0;
-}
-
-
 static const struct brw_wm_ref *get_fp_src_reg_ref( struct brw_wm_compile *c,
                                                    struct prog_src_register src,
                                                    GLuint i )
@@ -363,10 +335,7 @@ translate_insn(struct brw_wm_compile *c,
 
    /* Dst:
     */
-   if (brw_wm_is_scalar_result(out->opcode)) 
-      pass0_set_dst_scalar(c, out, inst, writemask);
-   else 
-      pass0_set_dst(c, out, inst, writemask);
+   pass0_set_dst(c, out, inst, writemask);
 }
 
 
index 3fc18ff..dff4665 100644 (file)
@@ -103,6 +103,10 @@ struct wm_sampler_key {
       GLenum minfilter, magfilter;
       GLenum comparemode, comparefunc;
       dri_bo *sdc_bo;
+
+      /** If target is cubemap, take context setting.
+       */
+      GLboolean seamless_cube_map;
    } sampler[BRW_MAX_TEX_UNIT];
 };
 
@@ -169,30 +173,33 @@ static void brw_update_sampler_state(struct wm_sampler_entry *key,
       }  
    }
 
-   if (key->tex_target == GL_TEXTURE_CUBE_MAP &&
-       (key->minfilter != GL_NEAREST || key->magfilter != GL_NEAREST)) {
-      /* If we're using anything but nearest sampling for a cube map, we
-       * need to set this wrap mode to avoid GPU lock-ups.
-       */
-      sampler->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CUBE;
-      sampler->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CUBE;
-      sampler->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CUBE;
-   }
-   else if (key->tex_target == GL_TEXTURE_1D) {
+   sampler->ss1.r_wrap_mode = translate_wrap_mode(key->wrap_r);
+   sampler->ss1.s_wrap_mode = translate_wrap_mode(key->wrap_s);
+   sampler->ss1.t_wrap_mode = translate_wrap_mode(key->wrap_t);
+
+   /* Cube-maps on 965 and later must use the same wrap mode for all 3
+    * coordinate dimensions.  Futher, only CUBE and CLAMP are valid.
+    */
+   if (key->tex_target == GL_TEXTURE_CUBE_MAP) {
+      if (key->seamless_cube_map &&
+         (key->minfilter != GL_NEAREST || key->magfilter != GL_NEAREST)) {
+        sampler->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CUBE;
+        sampler->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CUBE;
+        sampler->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CUBE;
+      } else {
+        sampler->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
+        sampler->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
+        sampler->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
+      }
+   } else if (key->tex_target == GL_TEXTURE_1D) {
       /* There's a bug in 1D texture sampling - it actually pays
        * attention to the wrap_t value, though it should not.
        * Override the wrap_t value here to GL_REPEAT to keep
        * any nonexistent border pixels from floating in.
        */
-      sampler->ss1.r_wrap_mode = translate_wrap_mode(key->wrap_r);
-      sampler->ss1.s_wrap_mode = translate_wrap_mode(key->wrap_s);
       sampler->ss1.t_wrap_mode = BRW_TEXCOORDMODE_WRAP;
    }
-   else {
-      sampler->ss1.r_wrap_mode = translate_wrap_mode(key->wrap_r);
-      sampler->ss1.s_wrap_mode = translate_wrap_mode(key->wrap_s);
-      sampler->ss1.t_wrap_mode = translate_wrap_mode(key->wrap_t);
-   }
+
 
    /* Set shadow function: 
     */
@@ -249,6 +256,9 @@ brw_wm_sampler_populate_key(struct brw_context *brw,
 
          entry->tex_target = texObj->Target;
 
+        entry->seamless_cube_map = (texObj->Target == GL_TEXTURE_CUBE_MAP)
+           ? ctx->Texture.CubeMapSeamless : GL_FALSE;
+
         entry->wrap_r = texObj->WrapR;
         entry->wrap_s = texObj->WrapS;
         entry->wrap_t = texObj->WrapT;
index 0f87fc4..6aa36d1 100644 (file)
@@ -196,6 +196,16 @@ _intel_batchbuffer_flush(struct intel_batchbuffer *batch, const char *file,
    struct intel_context *intel = batch->intel;
    GLuint used = batch->ptr - batch->map;
 
+   if (intel->first_post_swapbuffers_batch == NULL) {
+      intel->first_post_swapbuffers_batch = intel->batch->buf;
+      drm_intel_bo_reference(intel->first_post_swapbuffers_batch);
+   }
+
+   if (intel->first_post_swapbuffers_batch == NULL) {
+      intel->first_post_swapbuffers_batch = intel->batch->buf;
+      drm_intel_bo_reference(intel->first_post_swapbuffers_batch);
+   }
+
    if (used == 0) {
       batch->cliprect_mode = IGNORE_CLIPRECTS;
       return;
index 2e95bd1..979f202 100644 (file)
@@ -477,6 +477,8 @@ intelClearWithBlit(GLcontext *ctx, GLbitfield mask)
                   BR13 |= BR13_565;
                }
 
+              assert(irb->region->tiling != I915_TILING_Y);
+
 #ifndef I915
               if (irb->region->tiling != I915_TILING_NONE) {
                  CMD |= XY_DST_TILED;
@@ -571,6 +573,7 @@ intelEmitImmediateColorExpandBlit(struct intel_context *intel,
 
    assert( logic_op - GL_CLEAR >= 0 );
    assert( logic_op - GL_CLEAR < 0x10 );
+   assert(dst_pitch > 0);
 
    if (w < 0 || h < 0)
       return GL_TRUE;
index 4abb525..46f1a7f 100644 (file)
@@ -38,6 +38,7 @@
 #include "swrast_setup/swrast_setup.h"
 #include "tnl/tnl.h"
 #include "drivers/common/driverfuncs.h"
+#include "drivers/common/meta.h"
 
 #include "i830_dri.h"
 
@@ -513,7 +514,7 @@ intel_flush(GLcontext *ctx, GLboolean needs_mi_flush)
          * each of N places that do rendering.  This has worse performances,
          * but it is much easier to get correct.
          */
-        if (intel->is_front_buffer_rendering) {
+        if (!intel->is_front_buffer_rendering) {
            intel->front_buffer_dirty = GL_FALSE;
         }
       }
@@ -529,7 +530,27 @@ intelFlush(GLcontext * ctx)
 static void
 intel_glFlush(GLcontext *ctx)
 {
+   struct intel_context *intel = intel_context(ctx);
+
    intel_flush(ctx, GL_TRUE);
+
+   /* We're using glFlush as an indicator that a frame is done, which is
+    * what DRI2 does before calling SwapBuffers (and means we should catch
+    * people doing front-buffer rendering, as well)..
+    *
+    * Wait for the swapbuffers before the one we just emitted, so we don't
+    * get too many swaps outstanding for apps that are GPU-heavy but not
+    * CPU-heavy.
+    *
+    * Unfortunately, we don't have a handle to the batch containing the swap,
+    * and getting our hands on that doesn't seem worth it, so we just us the
+    * first batch we emitted after the last swap.
+    */
+   if (intel->first_post_swapbuffers_batch != NULL) {
+      drm_intel_bo_wait_rendering(intel->first_post_swapbuffers_batch);
+      drm_intel_bo_unreference(intel->first_post_swapbuffers_batch);
+      intel->first_post_swapbuffers_batch = NULL;
+   }
 }
 
 void
@@ -692,6 +713,8 @@ intelInitContext(struct intel_context *intel,
    _swrast_allow_pixel_fog(ctx, GL_FALSE);
    _swrast_allow_vertex_fog(ctx, GL_TRUE);
 
+   _mesa_meta_init(ctx);
+
    intel->hw_stencil = mesaVis->stencilBits && mesaVis->depthBits == 24;
    intel->hw_stipple = 1;
 
@@ -752,7 +775,7 @@ intelInitContext(struct intel_context *intel,
    if (intel->use_texture_tiling &&
        !intel->intelScreen->kernel_exec_fencing) {
       fprintf(stderr, "No kernel support for execution fencing, "
-             "disabling texture tiling");
+             "disabling texture tiling\n");
       intel->use_texture_tiling = GL_FALSE;
    }
    intel->use_early_z = driQueryOptionb(&intel->optionCache, "early_z");
@@ -795,6 +818,8 @@ intelDestroyContext(__DRIcontextPrivate * driContextPriv)
 
       INTEL_FIREVERTICES(intel);
 
+      _mesa_meta_free(&intel->ctx);
+
       meta_destroy_metaops(&intel->meta);
 
       intel->vtbl.destroy(intel);
@@ -814,6 +839,8 @@ intelDestroyContext(__DRIcontextPrivate * driContextPriv)
       intel->prim.vb = NULL;
       dri_bo_unreference(intel->prim.vb_bo);
       intel->prim.vb_bo = NULL;
+      dri_bo_unreference(intel->first_post_swapbuffers_batch);
+      intel->first_post_swapbuffers_batch = NULL;
 
       if (release_texture_heaps) {
          /* Nothing is currently done here to free texture heaps;
index 08bea88..0d9db5e 100644 (file)
@@ -80,9 +80,13 @@ extern void intelFallback(struct intel_context *intel, GLuint bit,
 
 #define INTEL_MAX_FIXUP 64
 
+
+/**
+ * intel_context is derived from Mesa's context class: GLcontext.
+ */
 struct intel_context
 {
-   GLcontext ctx;               /* the parent class */
+   GLcontext ctx;  /**< base class, must be first field */
 
    struct
    {
@@ -178,6 +182,7 @@ struct intel_context
    GLboolean ttm;
 
    struct intel_batchbuffer *batch;
+   drm_intel_bo *first_post_swapbuffers_batch;
    GLboolean no_batch_wrap;
    unsigned batch_id;
 
@@ -307,7 +312,7 @@ struct intel_context
    __DRIdrawablePrivate *driReadDrawable;
    __DRIscreenPrivate *driScreen;
    intelScreenPrivate *intelScreen;
-   volatile struct drm_i915_sarea *sarea;
+   volatile drm_i915_sarea_t *sarea;
 
    GLuint lastStamp;
 
index 7742609..9f90ef0 100644 (file)
@@ -48,6 +48,7 @@
 #define need_GL_EXT_framebuffer_blit
 #define need_GL_EXT_gpu_program_parameters
 #define need_GL_EXT_point_parameters
+#define need_GL_EXT_provoking_vertex
 #define need_GL_EXT_secondary_color
 #define need_GL_EXT_stencil_two_side
 #define need_GL_APPLE_vertex_array_object
@@ -71,6 +72,7 @@ static const struct dri_extension card_extensions[] = {
    { "GL_ARB_half_float_pixel",           NULL },
    { "GL_ARB_multitexture",               NULL },
    { "GL_ARB_point_parameters",           GL_ARB_point_parameters_functions },
+   { "GL_ARB_point_sprite",               NULL },
    { "GL_ARB_texture_border_clamp",       NULL },
    { "GL_ARB_texture_cube_map",           NULL },
    { "GL_ARB_texture_env_add",            NULL },
@@ -92,6 +94,7 @@ static const struct dri_extension card_extensions[] = {
    { "GL_EXT_fog_coord",                  GL_EXT_fog_coord_functions },
    { "GL_EXT_gpu_program_parameters",     GL_EXT_gpu_program_parameters_functions },
    { "GL_EXT_packed_depth_stencil",       NULL },
+   { "GL_EXT_provoking_vertex",           GL_EXT_provoking_vertex_functions },
    { "GL_EXT_secondary_color",            GL_EXT_secondary_color_functions },
    { "GL_EXT_stencil_wrap",               NULL },
    { "GL_EXT_texture_edge_clamp",         NULL },
@@ -119,8 +122,10 @@ static const struct dri_extension i915_extensions[] = {
    { "GL_ARB_fragment_program",           NULL },
    { "GL_ARB_shadow",                     NULL },
    { "GL_ARB_texture_non_power_of_two",   NULL },
+   { "GL_ATI_separate_stencil",           GL_ATI_separate_stencil_functions },
    { "GL_ATI_texture_env_combine3",       NULL },
    { "GL_EXT_shadow_funcs",               NULL },
+   { "GL_EXT_stencil_two_side",           GL_EXT_stencil_two_side_functions },
    { "GL_NV_texture_env_combine4",        NULL },
    { NULL,                                NULL }
 };
@@ -135,6 +140,7 @@ static const struct dri_extension brw_extensions[] = {
    { "GL_ARB_framebuffer_object",         GL_ARB_framebuffer_object_functions},
    { "GL_ARB_occlusion_query",            GL_ARB_occlusion_query_functions },
    { "GL_ARB_point_sprite",              NULL },
+   { "GL_ARB_seamless_cube_map",          NULL },
    { "GL_ARB_shader_objects",             GL_ARB_shader_objects_functions },
    { "GL_ARB_shading_language_100",       GL_VERSION_2_0_functions },
    { "GL_ARB_shading_language_120",       GL_VERSION_2_1_functions },
index 6668935..804c034 100644 (file)
@@ -35,6 +35,7 @@
 #include "main/context.h"
 #include "main/texformat.h"
 #include "main/texrender.h"
+#include "drivers/common/meta.h"
 
 #include "intel_context.h"
 #include "intel_buffers.h"
@@ -700,74 +701,6 @@ intel_validate_framebuffer(GLcontext *ctx, struct gl_framebuffer *fb)
 
 
 /**
- * Called from glBlitFramebuffer().
- * For now, we're doing an approximation with glCopyPixels().
- * XXX we need to bypass all the per-fragment operations, except scissor.
- */
-static void
-intel_blit_framebuffer(GLcontext *ctx,
-                       GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
-                       GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
-                       GLbitfield mask, GLenum filter)
-{
-   const GLfloat xZoomSave = ctx->Pixel.ZoomX;
-   const GLfloat yZoomSave = ctx->Pixel.ZoomY;
-   GLsizei width, height;
-   GLfloat xFlip = 1.0F, yFlip = 1.0F;
-
-   if (srcX1 < srcX0) {
-      GLint tmp = srcX1;
-      srcX1 = srcX0;
-      srcX0 = tmp;
-      xFlip = -1.0F;
-   }
-
-   if (srcY1 < srcY0) {
-      GLint tmp = srcY1;
-      srcY1 = srcY0;
-      srcY0 = tmp;
-      yFlip = -1.0F;
-   }
-
-   width = srcX1 - srcX0;
-   height = srcY1 - srcY0;
-
-   ctx->Pixel.ZoomX = xFlip * (dstX1 - dstX0) / (srcX1 - srcY0);
-   ctx->Pixel.ZoomY = yFlip * (dstY1 - dstY0) / (srcY1 - srcY0);
-
-   if (ctx->Pixel.ZoomX < 0.0F) {
-      dstX0 = MAX2(dstX0, dstX1);
-   }
-   else {
-      dstX0 = MIN2(dstX0, dstX1);
-   }
-
-   if (ctx->Pixel.ZoomY < 0.0F) {
-      dstY0 = MAX2(dstY0, dstY1);
-   }
-   else {
-      dstY0 = MIN2(dstY0, dstY1);
-   }
-
-   if (mask & GL_COLOR_BUFFER_BIT) {
-      ctx->Driver.CopyPixels(ctx, srcX0, srcY0, width, height,
-                             dstX0, dstY0, GL_COLOR);
-   }
-   if (mask & GL_DEPTH_BUFFER_BIT) {
-      ctx->Driver.CopyPixels(ctx, srcX0, srcY0, width, height,
-                             dstX0, dstY0, GL_DEPTH);
-   }
-   if (mask & GL_STENCIL_BUFFER_BIT) {
-      ctx->Driver.CopyPixels(ctx, srcX0, srcY0, width, height,
-                             dstX0, dstY0, GL_STENCIL);
-   }
-      
-   ctx->Pixel.ZoomX = xZoomSave;
-   ctx->Pixel.ZoomY = yZoomSave;
-}
-
-
-/**
  * Do one-time context initializations related to GL_EXT_framebuffer_object.
  * Hook in device driver functions.
  */
@@ -782,5 +715,5 @@ intel_fbo_init(struct intel_context *intel)
    intel->ctx.Driver.FinishRenderTexture = intel_finish_render_texture;
    intel->ctx.Driver.ResizeBuffers = intel_resize_buffers;
    intel->ctx.Driver.ValidateFramebuffer = intel_validate_framebuffer;
-   intel->ctx.Driver.BlitFramebuffer = intel_blit_framebuffer;
+   intel->ctx.Driver.BlitFramebuffer = _mesa_meta_blit_framebuffer;
 }
index 5d52335..ca796b3 100644 (file)
@@ -31,7 +31,7 @@
 #include "main/state.h"
 #include "main/mtypes.h"
 #include "main/macros.h"
-#include "swrast/swrast.h"
+#include "drivers/common/meta.h"
 
 #include "intel_screen.h"
 #include "intel_context.h"
@@ -97,162 +97,6 @@ intel_check_copypixel_blit_fragment_ops(GLcontext * ctx)
            ctx->Color.BlendEnabled);
 }
 
-#ifdef I915
-/* Doesn't work for overlapping regions.  Could do a double copy or
- * just fallback.
- */
-static GLboolean
-do_texture_copypixels(GLcontext * ctx,
-                      GLint srcx, GLint srcy,
-                      GLsizei width, GLsizei height,
-                      GLint dstx, GLint dsty, GLenum type)
-{
-   struct intel_context *intel = intel_context(ctx);
-   struct intel_region *dst = intel_drawbuf_region(intel);
-   struct intel_region *src = copypix_src_region(intel, type);
-   GLenum src_format;
-   GLenum src_type;
-
-   DBG("%s %d,%d %dx%d --> %d,%d\n", __FUNCTION__, 
-       srcx, srcy, width, height, dstx, dsty);
-
-   if (!src || !dst || type != GL_COLOR)
-      return GL_FALSE;
-
-   if (ctx->_ImageTransferState) {
-      if (INTEL_DEBUG & DEBUG_PIXEL)
-         fprintf(stderr, "%s: check_color failed\n", __FUNCTION__);
-      return GL_FALSE;
-   }
-
-   /* Can't handle overlapping regions.  Don't have sufficient control
-    * over rasterization to pull it off in-place.  Punt on these for
-    * now.
-    * 
-    * XXX: do a copy to a temporary. 
-    */
-   if (src->buffer == dst->buffer) {
-      drm_clip_rect_t srcbox;
-      drm_clip_rect_t dstbox;
-      drm_clip_rect_t tmp;
-
-      srcbox.x1 = srcx;
-      srcbox.y1 = srcy;
-      srcbox.x2 = srcx + width;
-      srcbox.y2 = srcy + height;
-
-      if (ctx->Pixel.ZoomX > 0) {
-        dstbox.x1 = dstx;
-        dstbox.x2 = dstx + width * ctx->Pixel.ZoomX;
-      } else {
-        dstbox.x1 = dstx + width * ctx->Pixel.ZoomX;
-        dstbox.x2 = dstx;
-      }
-      if (ctx->Pixel.ZoomY > 0) {
-        dstbox.y1 = dsty;
-        dstbox.y2 = dsty + height * ctx->Pixel.ZoomY;
-      } else {
-        dstbox.y1 = dsty + height * ctx->Pixel.ZoomY;
-        dstbox.y2 = dsty;
-      }
-
-      DBG("src %d,%d %d,%d\n", srcbox.x1, srcbox.y1, srcbox.x2, srcbox.y2);
-      DBG("dst %d,%d %d,%d (%dx%d) (%f,%f)\n", dstbox.x1, dstbox.y1, dstbox.x2, dstbox.y2,
-         width, height, ctx->Pixel.ZoomX, ctx->Pixel.ZoomY);
-
-      if (intel_intersect_cliprects(&tmp, &srcbox, &dstbox)) {
-         DBG("%s: regions overlap\n", __FUNCTION__);
-         return GL_FALSE;
-      }
-   }
-
-   intelFlush(&intel->ctx);
-
-   intel->vtbl.install_meta_state(intel);
-
-   /* Is this true?  Also will need to turn depth testing on according
-    * to state:
-    */
-   intel->vtbl.meta_no_stencil_write(intel);
-   intel->vtbl.meta_no_depth_write(intel);
-
-   /* Set the 3d engine to draw into the destination region:
-    */
-   intel->vtbl.meta_draw_region(intel, dst, intel->depth_region);
-
-   intel->vtbl.meta_import_pixel_state(intel);
-
-   if (src->cpp == 2) {
-      src_format = GL_RGB;
-      src_type = GL_UNSIGNED_SHORT_5_6_5;
-   }
-   else {
-      src_format = GL_BGRA;
-      src_type = GL_UNSIGNED_BYTE;
-   }
-
-   /* Set the frontbuffer up as a large rectangular texture.
-    */
-   if (!intel->vtbl.meta_tex_rect_source(intel, src->buffer, 0,
-                                         src->pitch,
-                                         src->height, src_format, src_type)) {
-      intel->vtbl.leave_meta_state(intel);
-      return GL_FALSE;
-   }
-
-
-   intel->vtbl.meta_texture_blend_replace(intel);
-
-   LOCK_HARDWARE(intel);
-
-   if (intel->driDrawable->numClipRects) {
-      __DRIdrawablePrivate *dPriv = intel->driDrawable;
-
-
-      srcy = dPriv->h - srcy - height;  /* convert from gl to hardware coords */
-
-      srcx += dPriv->x;
-      srcy += dPriv->y;
-
-      /* Clip against the source region.  This is the only source
-       * clipping we do.  XXX: Just set the texcord wrap mode to clamp
-       * or similar.
-       *
-       */
-      if (0) {
-         GLint orig_x = srcx;
-         GLint orig_y = srcy;
-
-         if (!_mesa_clip_to_region(0, 0, src->pitch, src->height,
-                                   &srcx, &srcy, &width, &height))
-            goto out;
-
-         dstx += srcx - orig_x;
-         dsty += (srcy - orig_y) * ctx->Pixel.ZoomY;
-      }
-
-      /* Just use the regular cliprect mechanism...  Does this need to
-       * even hold the lock???
-       */
-      intel->vtbl.meta_draw_quad(intel,
-                                dstx,
-                                dstx + width * ctx->Pixel.ZoomX,
-                                dPriv->h - (dsty + height * ctx->Pixel.ZoomY),
-                                dPriv->h - (dsty), 0, /* XXX: what z value? */
-                                0x00ff00ff,
-                                srcx, srcx + width, srcy, srcy + height);
-
-    out:
-      intel->vtbl.leave_meta_state(intel);
-      intel_batchbuffer_emit_mi_flush(intel->batch);
-   }
-   UNLOCK_HARDWARE(intel);
-
-   DBG("%s: success\n", __FUNCTION__);
-   return GL_TRUE;
-}
-#endif /* I915 */
-
 
 /**
  * CopyPixels with the blitter.  Don't support zooming, pixel transfer, etc.
@@ -400,12 +244,5 @@ intelCopyPixels(GLcontext * ctx,
    if (do_blit_copypixels(ctx, srcx, srcy, width, height, destx, desty, type))
       return;
 
-#ifdef I915
-   if (do_texture_copypixels(ctx, srcx, srcy, width, height, destx, desty, type))
-      return;
-#endif
-
-   DBG("fallback to _swrast_CopyPixels\n");
-
-   _swrast_CopyPixels(ctx, srcx, srcy, width, height, destx, desty, type);
+   _mesa_meta_copy_pixels(ctx, srcx, srcy, width, height, destx, desty, type);
 }
index 7525cd9..497f796 100644 (file)
@@ -181,6 +181,11 @@ intel_region_alloc(struct intel_context *intel,
    dri_bo *buffer;
    struct intel_region *region;
 
+   if (tiling == I915_TILING_X)
+      height = ALIGN(height, 8);
+   else if (tiling == I915_TILING_Y)
+      height = ALIGN(height, 32);
+
    if (expect_accelerated_upload) {
       buffer = drm_intel_bo_alloc_for_render(intel->bufmgr, "region",
                                             pitch * cpp * height, 64);
@@ -452,6 +457,7 @@ void
 intel_region_cow(struct intel_context *intel, struct intel_region *region)
 {
    struct intel_buffer_object *pbo = region->pbo;
+   GLboolean ok;
 
    intel_region_release_pbo(intel, region);
 
@@ -463,13 +469,14 @@ intel_region_cow(struct intel_context *intel, struct intel_region *region)
     */
 
    LOCK_HARDWARE(intel);
-   assert(intelEmitCopyBlit(intel,
-                           region->cpp,
-                           region->pitch, pbo->buffer, 0, region->tiling,
-                           region->pitch, region->buffer, 0, region->tiling,
-                           0, 0, 0, 0,
-                           region->pitch, region->height,
-                           GL_COPY));
+   ok = intelEmitCopyBlit(intel,
+                          region->cpp,
+                          region->pitch, pbo->buffer, 0, region->tiling,
+                          region->pitch, region->buffer, 0, region->tiling,
+                          0, 0, 0, 0,
+                          region->pitch, region->height,
+                          GL_COPY);
+   assert(ok);
    UNLOCK_HARDWARE(intel);
 }
 
index 6bbc995..1b8c56e 100644 (file)
@@ -69,7 +69,11 @@ PUBLIC const char __driConfigOptions[] =
         DRI_CONF_DESC_END
       DRI_CONF_OPT_END
 
-      DRI_CONF_TEXTURE_TILING(false)
+#ifdef I915
+     DRI_CONF_TEXTURE_TILING(false)
+#else
+     DRI_CONF_TEXTURE_TILING(true)
+#endif
 
       DRI_CONF_OPT_BEGIN(early_z, bool, false)
         DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).")
@@ -628,10 +632,10 @@ intel_init_bufmgr(intelScreenPrivate *intelScreen)
    /* Otherwise, use the classic buffer manager. */
    if (intelScreen->bufmgr == NULL) {
       if (gem_disable) {
-        fprintf(stderr, "GEM disabled.  Using classic.\n");
+        _mesa_warning(NULL, "GEM disabled.  Using classic.");
       } else {
-        fprintf(stderr, "Failed to initialize GEM.  "
-                "Falling back to classic.\n");
+        _mesa_warning(NULL,
+                       "Failed to initialize GEM.  Falling back to classic.");
       }
 
       if (intelScreen->tex.size == 0) {
index 34b78eb..8df4990 100644 (file)
@@ -501,7 +501,7 @@ intel_map_unmap_buffers(struct intel_context *intel, GLboolean map)
 
 
 /**
- * Prepare for softare rendering.  Map current read/draw framebuffers'
+ * Prepare for software rendering.  Map current read/draw framebuffers'
  * renderbuffes and all currently bound texture objects.
  *
  * Old note: Moved locking out to get reasonable span performance.
@@ -526,7 +526,7 @@ intelSpanRenderStart(GLcontext * ctx)
 }
 
 /**
- * Called when done softare rendering.  Unmap the buffers we mapped in
+ * Called when done software rendering.  Unmap the buffers we mapped in
  * the above function.
  */
 void
index 1f27131..8903707 100644 (file)
@@ -44,10 +44,12 @@ intelTexSubimage(GLcontext * ctx,
                  GLenum target, GLint level,
                  GLint xoffset, GLint yoffset, GLint zoffset,
                  GLint width, GLint height, GLint depth,
+                 GLsizei imageSize,
                  GLenum format, GLenum type, const void *pixels,
                  const struct gl_pixelstore_attrib *packing,
                  struct gl_texture_object *texObj,
-                 struct gl_texture_image *texImage)
+                 struct gl_texture_image *texImage,
+                 GLboolean compressed)
 {
    struct intel_context *intel = intel_context(ctx);
    struct intel_texture_image *intelImage = intel_texture_image(texImage);
@@ -59,9 +61,14 @@ intelTexSubimage(GLcontext * ctx,
 
    intelFlush(ctx);
 
-   pixels =
-      _mesa_validate_pbo_teximage(ctx, dims, width, height, depth, format,
-                                  type, pixels, packing, "glTexSubImage2D");
+   if (compressed)
+      pixels = _mesa_validate_pbo_compressed_teximage(ctx, imageSize,
+                                                      pixels, packing,
+                                                      "glCompressedTexImage");
+   else
+      pixels = _mesa_validate_pbo_teximage(ctx, dims, width, height, depth,
+                                           format, type, pixels, packing,
+                                           "glTexSubImage");
    if (!pixels)
       return;
 
@@ -90,15 +97,28 @@ intelTexSubimage(GLcontext * ctx,
 
    assert(dstRowStride);
 
-   if (!texImage->TexFormat->StoreImage(ctx, dims, texImage->_BaseFormat,
-                                        texImage->TexFormat,
-                                        texImage->Data,
-                                        xoffset, yoffset, zoffset,
-                                        dstRowStride,
-                                        texImage->ImageOffsets,
-                                        width, height, depth,
-                                        format, type, pixels, packing)) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "intelTexSubImage");
+   if (compressed) {
+      if (intelImage->mt) {
+         struct intel_region *dst = intelImage->mt->region;
+         
+         _mesa_copy_rect(texImage->Data, dst->cpp, dst->pitch,
+                         xoffset, yoffset / 4,
+                         (width + 3)  & ~3, (height + 3) / 4,
+                         pixels, (width + 3) & ~3, 0, 0);
+      } else
+        memcpy(texImage->Data, pixels, imageSize);
+   }
+   else {
+      if (!texImage->TexFormat->StoreImage(ctx, dims, texImage->_BaseFormat,
+                                           texImage->TexFormat,
+                                           texImage->Data,
+                                           xoffset, yoffset, zoffset,
+                                           dstRowStride,
+                                           texImage->ImageOffsets,
+                                           width, height, depth,
+                                           format, type, pixels, packing)) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "intelTexSubImage");
+      }
    }
 
    _mesa_unmap_teximage_pbo(ctx, packing);
@@ -132,8 +152,8 @@ intelTexSubImage3D(GLcontext * ctx,
    intelTexSubimage(ctx, 3,
                     target, level,
                     xoffset, yoffset, zoffset,
-                    width, height, depth,
-                    format, type, pixels, packing, texObj, texImage);
+                    width, height, depth, 0,
+                    format, type, pixels, packing, texObj, texImage, GL_FALSE);
 }
 
 
@@ -152,8 +172,8 @@ intelTexSubImage2D(GLcontext * ctx,
    intelTexSubimage(ctx, 2,
                     target, level,
                     xoffset, yoffset, 0,
-                    width, height, 1,
-                    format, type, pixels, packing, texObj, texImage);
+                    width, height, 1, 0,
+                    format, type, pixels, packing, texObj, texImage, GL_FALSE);
 }
 
 
@@ -172,8 +192,8 @@ intelTexSubImage1D(GLcontext * ctx,
    intelTexSubimage(ctx, 1,
                     target, level,
                     xoffset, 0, 0,
-                    width, 1, 1,
-                    format, type, pixels, packing, texObj, texImage);
+                    width, 1, 1, 0,
+                    format, type, pixels, packing, texObj, texImage, GL_FALSE);
 }
 
 static void
@@ -187,8 +207,11 @@ intelCompressedTexSubImage2D(GLcontext * ctx,
                             struct gl_texture_object *texObj,
                             struct gl_texture_image *texImage)
 {
-   fprintf(stderr, "stubbed CompressedTexSubImage2D: %dx%d@%dx%d\n",
-          width, height, xoffset, yoffset);
+   intelTexSubimage(ctx, 2,
+                    target, level,
+                    xoffset, yoffset, 0,
+                    width, height, 1, imageSize,
+                    format, 0, pixels, &ctx->Unpack, texObj, texImage, GL_TRUE);
 }
 
 
diff --git a/src/mesa/drivers/dri/r200/.gitignore b/src/mesa/drivers/dri/r200/.gitignore
deleted file mode 100644 (file)
index 2f9cd1a..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-radeon_bocs_wrapper.h
-radeon_bo_legacy.[ch]
-radeon_chipset.h
-radeon_cmdbuf.h
-radeon_common.[ch]
-radeon_common_context.[ch]
-radeon_cs_legacy.[ch]
-radeon_dma.[ch]
-radeon_fbo.c
-radeon_lock.[ch]
-radeon_mipmap_tree.[ch]
-radeon_screen.[ch]
-radeon_span.[ch]
-radeon_texture.[ch]
-server
index 4686241..e81a1b3 100644 (file)
@@ -55,41 +55,6 @@ X86_SOURCES =
 
 DRIVER_DEFINES = -DRADEON_COMMON=1 -DRADEON_COMMON_FOR_R200
 
-SYMLINKS = \
-       server/radeon_egl.c  \
-       server/radeon_dri.c  \
-       server/radeon_dri.h \
-       server/radeon.h \
-       server/radeon_macros.h \
-       server/radeon_reg.h
-
-COMMON_SYMLINKS = \
-       radeon_chipset.h \
-       radeon_screen.c \
-       radeon_screen.h \
-       radeon_bo_legacy.c \
-       radeon_cs_legacy.c \
-       radeon_bo_legacy.h \
-       radeon_cs_legacy.h \
-       radeon_bocs_wrapper.h \
-       radeon_span.h \
-       radeon_span.c \
-       radeon_lock.c \
-       radeon_lock.h \
-       radeon_common.c \
-       radeon_common_context.c \
-       radeon_common_context.h \
-       radeon_common.h \
-       radeon_cmdbuf.h \
-       radeon_mipmap_tree.c \
-       radeon_mipmap_tree.h \
-       radeon_texture.c \
-       radeon_texture.h \
-       radeon_dma.c \
-       radeon_dma.h \
-       radeon_fbo.c \
-       $(CS_SOURCES)
-
 DRI_LIB_DEPS += $(RADEON_LDFLAGS)
 
 ##### TARGETS #####
@@ -99,15 +64,4 @@ include ../Makefile.template
 
 #INCLUDES += -I../radeon/server
 
-server:
-       mkdir -p server
-
-$(SYMLINKS): server
-       @[ -e $@ ] || ln -sf ../../radeon/$@ server/
-
-
-$(COMMON_SYMLINKS):
-       @[ -e $@ ] || ln -sf ../radeon/$@ ./
-
-symlinks: $(SYMLINKS) $(COMMON_SYMLINKS)
-
+symlinks:
index d49f4fa..14d6bc1 100644 (file)
@@ -107,31 +107,37 @@ void r200SetUpAtomList( r200ContextPtr rmesa )
 
 void r200EmitScissor(r200ContextPtr rmesa)
 {
+    unsigned x1, y1, x2, y2;
+    struct radeon_renderbuffer *rrb;
     BATCH_LOCALS(&rmesa->radeon);
     if (!rmesa->radeon.radeonScreen->kernel_mm) {
        return;
     }
+    rrb = radeon_get_colorbuffer(&rmesa->radeon);
+    if (!rrb || !rrb->bo)
+       return;
+
     if (rmesa->radeon.state.scissor.enabled) {
-        BEGIN_BATCH(8);
-        OUT_BATCH(CP_PACKET0(R200_RE_CNTL, 0));
-        OUT_BATCH(R200_SCISSOR_ENABLE | rmesa->hw.set.cmd[SET_RE_CNTL]);
-        OUT_BATCH(CP_PACKET0(R200_RE_AUX_SCISSOR_CNTL, 0));
-        OUT_BATCH(R200_SCISSOR_ENABLE_0);
-        OUT_BATCH(CP_PACKET0(R200_RE_SCISSOR_TL_0, 0));
-        OUT_BATCH((rmesa->radeon.state.scissor.rect.y1 << 16) |
-                  rmesa->radeon.state.scissor.rect.x1);
-        OUT_BATCH(CP_PACKET0(R200_RE_SCISSOR_BR_0, 0));
-        OUT_BATCH(((rmesa->radeon.state.scissor.rect.y2 - 1) << 16) |
-                  (rmesa->radeon.state.scissor.rect.x2 - 1));
-        END_BATCH();
+       x1 = rmesa->radeon.state.scissor.rect.x1;
+       y1 = rmesa->radeon.state.scissor.rect.y1;
+       x2 = rmesa->radeon.state.scissor.rect.x2 - 1;
+       y2 = rmesa->radeon.state.scissor.rect.y2 - 1;
     } else {
-        BEGIN_BATCH(4);
-        OUT_BATCH(CP_PACKET0(R200_RE_CNTL, 0));
-        OUT_BATCH(rmesa->hw.set.cmd[SET_RE_CNTL] & ~R200_SCISSOR_ENABLE);
-        OUT_BATCH(CP_PACKET0(R200_RE_AUX_SCISSOR_CNTL, 0));
-        OUT_BATCH(0);
-        END_BATCH();
+        x1 = 0;
+        y1 = 0;
+        x2 = rrb->base.Width - 1;
+        y2 = rrb->base.Height - 1;
     }
+    BEGIN_BATCH(8);
+    OUT_BATCH(CP_PACKET0(R200_RE_CNTL, 0));
+    OUT_BATCH(R200_SCISSOR_ENABLE | rmesa->hw.set.cmd[SET_RE_CNTL]);
+    OUT_BATCH(CP_PACKET0(R200_RE_AUX_SCISSOR_CNTL, 0));
+    OUT_BATCH(0);
+    OUT_BATCH(CP_PACKET0(R200_RE_TOP_LEFT, 0));
+    OUT_BATCH((y1 << 16) | x1);
+    OUT_BATCH(CP_PACKET0(R200_RE_WIDTH_HEIGHT, 0));
+    OUT_BATCH((y2 << 16) | x2);
+    END_BATCH();
 }
 
 /* Fire a section of the retained (indexed_verts) buffer as a regular
@@ -234,15 +240,9 @@ GLushort *r200AllocEltsOpenEnded( r200ContextPtr rmesa,
    
    radeonEmitState(&rmesa->radeon);
 
-#ifdef RADEON_DEBUG_BO
-   rmesa->radeon.tcl.elt_dma_bo = radeon_bo_open(rmesa->radeon.radeonScreen->bom,
-                                         0, R200_ELT_BUF_SZ, 4,
-                                                RADEON_GEM_DOMAIN_GTT, 0, "ELT");
-#else
    rmesa->radeon.tcl.elt_dma_bo = radeon_bo_open(rmesa->radeon.radeonScreen->bom,
                                          0, R200_ELT_BUF_SZ, 4,
                                          RADEON_GEM_DOMAIN_GTT, 0);
-#endif
    rmesa->radeon.tcl.elt_dma_offset = 0;
    rmesa->tcl.elt_used = min_nr * 2;
 
index 9a92a32..8cb287d 100644 (file)
@@ -500,3 +500,15 @@ GLboolean r200CreateContext( const __GLcontextModes *glVisual,
 }
 
 
+void r200DestroyContext( __DRIcontextPrivate *driContextPriv )
+{
+       int i;
+       r200ContextPtr rmesa = (r200ContextPtr)driContextPriv->driverPrivate;
+       if (rmesa)
+       {
+               for ( i = 0 ; i < R200_MAX_TEXTURE_UNITS ; i++ ) {
+                       _math_matrix_dtr( &rmesa->TexGenMatrix[i] );
+               }
+       }
+       radeonDestroyContext(driContextPriv);
+}
index bc871d9..78ad5ba 100644 (file)
@@ -515,7 +515,7 @@ static void ctx_emit_cs(GLcontext *ctx, struct radeon_state_atom *atom)
    if (drb)
      dwords += 6;
    if (rrb)
-     dwords += 6;
+     dwords += 8;
    if (atom->cmd_size == CTX_STATE_SIZE_NEWDRM)
      dwords += 4;
 
@@ -546,7 +546,7 @@ static void ctx_emit_cs(GLcontext *ctx, struct radeon_state_atom *atom)
      OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
 
      OUT_BATCH(CP_PACKET0(RADEON_RB3D_COLORPITCH, 0));
-     OUT_BATCH(cbpitch);
+     OUT_BATCH_RELOC(cbpitch, rrb->bo, cbpitch, 0, RADEON_GEM_DOMAIN_VRAM, 0);
    }
 
    if (atom->cmd_size == CTX_STATE_SIZE_NEWDRM) {
@@ -563,7 +563,6 @@ static void tex_emit(GLcontext *ctx, struct radeon_state_atom *atom)
    uint32_t dwords = atom->cmd_size;
    int i = atom->idx;
    radeonTexObj *t = r200->state.texture.unit[i].texobj;
-   radeon_mipmap_level *lvl;
 
    if (t && t->mt && !t->image_override)
      dwords += 2;
@@ -591,7 +590,6 @@ static void tex_emit_cs(GLcontext *ctx, struct radeon_state_atom *atom)
    uint32_t dwords = atom->cmd_size;
    int i = atom->idx;
    radeonTexObj *t = r200->state.texture.unit[i].texobj;
-   radeon_mipmap_level *lvl;
    int hastexture = 1;
 
    if (!r200->state.texture.unit[i].unitneeded)
@@ -774,7 +772,7 @@ void r200InitState( r200ContextPtr rmesa )
       ALLOC_STATE( afs[1], never, AFS_STATE_SIZE, "AFS/afsinst-1", 1 );
    }
 
-   for (i = 0; i < 5; i++)
+   for (i = 0; i < 6; i++)
       if (rmesa->radeon.radeonScreen->kernel_mm)
           rmesa->hw.tex[i].emit = tex_emit_cs;
       else
@@ -786,7 +784,7 @@ void r200InitState( r200ContextPtr rmesa )
       ALLOC_STATE( cube[3], tex_cube, CUBE_STATE_SIZE, "CUBE/tex-3", 3 );
       ALLOC_STATE( cube[4], tex_cube, CUBE_STATE_SIZE, "CUBE/tex-4", 4 );
       ALLOC_STATE( cube[5], tex_cube, CUBE_STATE_SIZE, "CUBE/tex-5", 5 );
-      for (i = 0; i < 5; i++)
+      for (i = 0; i < 6; i++)
           if (rmesa->radeon.radeonScreen->kernel_mm)
               rmesa->hw.cube[i].emit = cube_emit_cs;
           else
diff --git a/src/mesa/drivers/dri/r200/radeon_bo_legacy.c b/src/mesa/drivers/dri/r200/radeon_bo_legacy.c
new file mode 120000 (symlink)
index 0000000..79ad050
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_bo_legacy.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_bo_legacy.h b/src/mesa/drivers/dri/r200/radeon_bo_legacy.h
new file mode 120000 (symlink)
index 0000000..83b0f7f
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_bo_legacy.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_bocs_wrapper.h b/src/mesa/drivers/dri/r200/radeon_bocs_wrapper.h
new file mode 120000 (symlink)
index 0000000..ca894b2
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_bocs_wrapper.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_chipset.h b/src/mesa/drivers/dri/r200/radeon_chipset.h
new file mode 120000 (symlink)
index 0000000..eba9900
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_chipset.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_cmdbuf.h b/src/mesa/drivers/dri/r200/radeon_cmdbuf.h
new file mode 120000 (symlink)
index 0000000..a799e1d
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_cmdbuf.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_common.c b/src/mesa/drivers/dri/r200/radeon_common.c
new file mode 120000 (symlink)
index 0000000..67b19ba
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_common.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_common.h b/src/mesa/drivers/dri/r200/radeon_common.h
new file mode 120000 (symlink)
index 0000000..5bcb696
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_common.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_common_context.c b/src/mesa/drivers/dri/r200/radeon_common_context.c
new file mode 120000 (symlink)
index 0000000..86800f3
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_common_context.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_common_context.h b/src/mesa/drivers/dri/r200/radeon_common_context.h
new file mode 120000 (symlink)
index 0000000..4d66312
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_common_context.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_cs_legacy.c b/src/mesa/drivers/dri/r200/radeon_cs_legacy.c
new file mode 120000 (symlink)
index 0000000..006720f
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_cs_legacy.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_cs_legacy.h b/src/mesa/drivers/dri/r200/radeon_cs_legacy.h
new file mode 120000 (symlink)
index 0000000..a5f95e0
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_cs_legacy.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_cs_space_drm.c b/src/mesa/drivers/dri/r200/radeon_cs_space_drm.c
new file mode 120000 (symlink)
index 0000000..c248ea7
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_cs_space_drm.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_dma.c b/src/mesa/drivers/dri/r200/radeon_dma.c
new file mode 120000 (symlink)
index 0000000..43be000
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_dma.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_dma.h b/src/mesa/drivers/dri/r200/radeon_dma.h
new file mode 120000 (symlink)
index 0000000..82e5063
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_dma.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_fbo.c b/src/mesa/drivers/dri/r200/radeon_fbo.c
new file mode 120000 (symlink)
index 0000000..0d738d8
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_fbo.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_lock.c b/src/mesa/drivers/dri/r200/radeon_lock.c
new file mode 120000 (symlink)
index 0000000..af4108a
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_lock.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_lock.h b/src/mesa/drivers/dri/r200/radeon_lock.h
new file mode 120000 (symlink)
index 0000000..64bdf94
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_lock.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_mipmap_tree.c b/src/mesa/drivers/dri/r200/radeon_mipmap_tree.c
new file mode 120000 (symlink)
index 0000000..31c0cfb
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_mipmap_tree.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_mipmap_tree.h b/src/mesa/drivers/dri/r200/radeon_mipmap_tree.h
new file mode 120000 (symlink)
index 0000000..254d50c
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_mipmap_tree.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_screen.c b/src/mesa/drivers/dri/r200/radeon_screen.c
new file mode 120000 (symlink)
index 0000000..8616111
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_screen.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_screen.h b/src/mesa/drivers/dri/r200/radeon_screen.h
new file mode 120000 (symlink)
index 0000000..23bb6bd
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_screen.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_span.c b/src/mesa/drivers/dri/r200/radeon_span.c
new file mode 120000 (symlink)
index 0000000..232868c
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_span.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_span.h b/src/mesa/drivers/dri/r200/radeon_span.h
new file mode 120000 (symlink)
index 0000000..f9d6345
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_span.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_texture.c b/src/mesa/drivers/dri/r200/radeon_texture.c
new file mode 120000 (symlink)
index 0000000..a822710
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_texture.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/radeon_texture.h b/src/mesa/drivers/dri/r200/radeon_texture.h
new file mode 120000 (symlink)
index 0000000..17fac3d
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_texture.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/server/radeon.h b/src/mesa/drivers/dri/r200/server/radeon.h
new file mode 120000 (symlink)
index 0000000..81274a5
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/server/radeon_dri.c b/src/mesa/drivers/dri/r200/server/radeon_dri.c
new file mode 120000 (symlink)
index 0000000..d05847d
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon_dri.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/server/radeon_dri.h b/src/mesa/drivers/dri/r200/server/radeon_dri.h
new file mode 120000 (symlink)
index 0000000..27c591d
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon_dri.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/server/radeon_egl.c b/src/mesa/drivers/dri/r200/server/radeon_egl.c
new file mode 120000 (symlink)
index 0000000..d7735a7
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon_egl.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/server/radeon_macros.h b/src/mesa/drivers/dri/r200/server/radeon_macros.h
new file mode 120000 (symlink)
index 0000000..c56cd73
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon_macros.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r200/server/radeon_reg.h b/src/mesa/drivers/dri/r200/server/radeon_reg.h
new file mode 120000 (symlink)
index 0000000..e2349dc
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon_reg.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/.gitignore b/src/mesa/drivers/dri/r300/.gitignore
deleted file mode 100644 (file)
index 2f9cd1a..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-radeon_bocs_wrapper.h
-radeon_bo_legacy.[ch]
-radeon_chipset.h
-radeon_cmdbuf.h
-radeon_common.[ch]
-radeon_common_context.[ch]
-radeon_cs_legacy.[ch]
-radeon_dma.[ch]
-radeon_fbo.c
-radeon_lock.[ch]
-radeon_mipmap_tree.[ch]
-radeon_screen.[ch]
-radeon_span.[ch]
-radeon_texture.[ch]
-server
index a772090..77b3d16 100644 (file)
@@ -36,7 +36,8 @@ RADEON_COMMON_SOURCES = \
        radeon_cs_legacy.c \
        radeon_mipmap_tree.c \
        radeon_span.c \
-       radeon_fbo.c
+       radeon_fbo.c \
+       radeon_buffer_objects.c
 
 DRIVER_SOURCES = \
                 radeon_screen.c \
@@ -48,20 +49,12 @@ DRIVER_SOURCES = \
                 r300_render.c \
                 r300_tex.c \
                 r300_texstate.c \
-                radeon_program.c \
-                radeon_program_alu.c \
-                radeon_program_pair.c \
-                radeon_nqssadce.c \
                 r300_vertprog.c \
                 r300_fragprog_common.c \
-                r300_fragprog.c \
-                r300_fragprog_swizzle.c \
-                r300_fragprog_emit.c \
-                r500_fragprog.c \
-                r500_fragprog_emit.c \
                 r300_shader.c \
                 r300_emit.c \
                 r300_swtcl.c \
+                r300_queryobj.c \
                 $(RADEON_COMMON_SOURCES) \
                 $(EGL_SOURCES) \
                 $(CS_SOURCES)
@@ -73,54 +66,18 @@ DRIVER_DEFINES = -DCOMPILE_R300 -DR200_MERGED=0 \
 #      -DRADEON_BO_TRACK \
        -Wall
 
-SYMLINKS = \
-       server/radeon_dri.c \
-       server/radeon_dri.h \
-       server/radeon.h \
-       server/radeon_macros.h \
-       server/radeon_reg.h \
-       server/radeon_egl.c
-
-COMMON_SYMLINKS = \
-       radeon_chipset.h \
-       radeon_screen.c \
-       radeon_screen.h \
-       radeon_span.h \
-       radeon_span.c \
-       radeon_bo_legacy.c \
-       radeon_cs_legacy.c \
-       radeon_bo_legacy.h \
-       radeon_cs_legacy.h \
-       radeon_bocs_wrapper.h \
-       radeon_lock.c \
-       radeon_lock.h \
-       radeon_common.c \
-       radeon_common.h \
-       radeon_common_context.c \
-       radeon_common_context.h \
-       radeon_cmdbuf.h \
-       radeon_dma.c \
-       radeon_dma.h \
-       radeon_mipmap_tree.c \
-       radeon_mipmap_tree.h \
-       radeon_texture.c \
-       radeon_texture.h \
-       radeon_fbo.c \
-       $(CS_SOURCES)
-
 DRI_LIB_DEPS += $(RADEON_LDFLAGS)
 
+PIPE_DRIVERS =  compiler/libr300compiler.a
+
 ##### TARGETS #####
 
 include ../Makefile.template
 
-server:
-       mkdir -p server
-
-$(SYMLINKS): server
-       @[ -e $@ ] || ln -sf ../../radeon/$@ server/
+symlinks:
 
-$(COMMON_SYMLINKS):
-       @[ -e $@ ] || ln -sf ../radeon/$@ ./
+# Mark the archive phony so that we always check for recompilation
+.PHONY : compiler/libr300compiler.a
 
-symlinks: $(SYMLINKS) $(COMMON_SYMLINKS)
+compiler/libr300compiler.a:
+       cd compiler && $(MAKE)
diff --git a/src/mesa/drivers/dri/r300/compiler/Makefile b/src/mesa/drivers/dri/r300/compiler/Makefile
new file mode 100644 (file)
index 0000000..d973844
--- /dev/null
@@ -0,0 +1,75 @@
+# src/mesa/drivers/dri/r300/compiler/Makefile
+
+TOP = ../../../../../..
+include $(TOP)/configs/current
+
+LIBNAME = r300compiler
+
+C_SOURCES = \
+               radeon_code.c \
+               radeon_compiler.c \
+               radeon_nqssadce.c \
+               radeon_program.c \
+               radeon_program_alu.c \
+               radeon_program_pair.c \
+               r3xx_fragprog.c \
+               r300_fragprog.c \
+               r300_fragprog_swizzle.c \
+               r300_fragprog_emit.c \
+               r500_fragprog.c \
+               r500_fragprog_emit.c \
+               r3xx_vertprog.c \
+               r3xx_vertprog_dump.c \
+               \
+               memory_pool.c
+
+
+### Basic defines ###
+
+OBJECTS = $(C_SOURCES:.c=.o) \
+       $(CPP_SOURCES:.cpp=.o) \
+       $(ASM_SOURCES:.S=.o)
+
+INCLUDES = \
+       -I. \
+       -I$(TOP)/include \
+       -I$(TOP)/src/mesa \
+
+
+##### TARGETS #####
+
+default: depend lib$(LIBNAME).a
+
+lib$(LIBNAME).a: $(OBJECTS) Makefile $(TOP)/configs/current
+       $(MKLIB) -o $(LIBNAME) -static $(OBJECTS)
+
+depend: $(C_SOURCES) $(CPP_SOURCES) $(ASM_SOURCES) $(SYMLINKS)
+       rm -f depend
+       touch depend
+       $(MKDEP) $(MKDEP_OPTIONS) $(INCLUDES) $(C_SOURCES) $(CPP_SOURCES) $(ASM_SOURCES) 2> /dev/null
+
+# Emacs tags
+tags:
+       etags `find . -name \*.[ch]` `find ../include`
+
+# Remove .o and backup files
+clean:
+       rm -f $(OBJECTS) lib$(LIBNAME).a depend depend.bak
+
+# Dummy target
+install:
+       @echo -n ""
+
+##### RULES #####
+
+.c.o:
+       $(CC) -c $(INCLUDES) $(CFLAGS) $(LIBRARY_DEFINES) $< -o $@
+
+.cpp.o:
+       $(CXX) -c $(INCLUDES) $(CXXFLAGS) $(LIBRARY_DEFINES) $< -o $@
+
+.S.o:
+       $(CC) -c $(INCLUDES) $(CFLAGS) $(LIBRARY_DEFINES)  $< -o $@
+
+
+sinclude depend
diff --git a/src/mesa/drivers/dri/r300/compiler/memory_pool.c b/src/mesa/drivers/dri/r300/compiler/memory_pool.c
new file mode 100644 (file)
index 0000000..37aa2b6
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2009 Nicolai Hähnle <nhaehnle@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#include "memory_pool.h"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+#define POOL_LARGE_ALLOC 4096
+#define POOL_ALIGN 4
+
+
+struct memory_block {
+       struct memory_block * next;
+};
+
+void memory_pool_init(struct memory_pool * pool)
+{
+       memset(pool, 0, sizeof(struct memory_pool));
+}
+
+
+void memory_pool_destroy(struct memory_pool * pool)
+{
+       while(pool->blocks) {
+               struct memory_block * block = pool->blocks;
+               pool->blocks = block->next;
+               free(block);
+       }
+}
+
+static void refill_pool(struct memory_pool * pool)
+{
+       unsigned int blocksize = pool->total_allocated;
+       struct memory_block * newblock;
+
+       if (!blocksize)
+               blocksize = 2*POOL_LARGE_ALLOC;
+
+       newblock = (struct memory_block*)malloc(blocksize);
+       newblock->next = pool->blocks;
+       pool->blocks = newblock;
+
+       pool->head = (unsigned char*)(newblock + 1);
+       pool->end = ((unsigned char*)newblock) + blocksize;
+       pool->total_allocated += blocksize;
+}
+
+
+void * memory_pool_malloc(struct memory_pool * pool, unsigned int bytes)
+{
+       if (bytes < POOL_LARGE_ALLOC) {
+               if (pool->head + bytes > pool->end)
+                       refill_pool(pool);
+
+               assert(pool->head + bytes <= pool->end);
+
+               void * ptr = pool->head;
+
+               pool->head += bytes;
+               pool->head = (unsigned char*)(((unsigned long)pool->head + POOL_ALIGN - 1) & ~(POOL_ALIGN - 1));
+
+               return ptr;
+       } else {
+               struct memory_block * block = (struct memory_block*)malloc(bytes + sizeof(struct memory_block));
+
+               block->next = pool->blocks;
+               pool->blocks = block;
+
+               return (block + 1);
+       }
+}
+
+
diff --git a/src/mesa/drivers/dri/r300/compiler/memory_pool.h b/src/mesa/drivers/dri/r300/compiler/memory_pool.h
new file mode 100644 (file)
index 0000000..ce23c31
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2009 Nicolai Hähnle <nhaehnle@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#ifndef MEMORY_POOL_H
+#define MEMORY_POOL_H
+
+struct memory_block;
+
+/**
+ * Provides a pool of memory that can quickly be allocated from, at the
+ * cost of being unable to explicitly free one of the allocated blocks.
+ * Instead, the entire pool can be freed at once.
+ *
+ * The idea is to allow one to quickly allocate a flexible amount of
+ * memory during operations like shader compilation while avoiding
+ * reference counting headaches.
+ */
+struct memory_pool {
+       unsigned char * head;
+       unsigned char * end;
+       unsigned int total_allocated;
+       struct memory_block * blocks;
+};
+
+
+void memory_pool_init(struct memory_pool * pool);
+void memory_pool_destroy(struct memory_pool * pool);
+void * memory_pool_malloc(struct memory_pool * pool, unsigned int bytes);
+
+#endif /* MEMORY_POOL_H */
diff --git a/src/mesa/drivers/dri/r300/compiler/r300_fragprog.c b/src/mesa/drivers/dri/r300/compiler/r300_fragprog.c
new file mode 100644 (file)
index 0000000..6c9fba4
--- /dev/null
@@ -0,0 +1,416 @@
+/*
+ * Copyright (C) 2005 Ben Skeggs.
+ *
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include "r300_fragprog.h"
+
+#include "shader/prog_parameter.h"
+
+#include "../r300_reg.h"
+
+static struct prog_src_register shadow_ambient(struct radeon_compiler * c, int tmu)
+{
+       struct prog_src_register reg = { 0, };
+
+       reg.File = PROGRAM_STATE_VAR;
+       reg.Index = rc_constants_add_state(&c->Program.Constants, RC_STATE_SHADOW_AMBIENT, tmu);
+       reg.Swizzle = SWIZZLE_WWWW;
+       return reg;
+}
+
+/**
+ * Transform TEX, TXP, TXB, and KIL instructions in the following way:
+ *  - premultiply texture coordinates for RECT
+ *  - extract operand swizzles
+ *  - introduce a temporary register when write masks are needed
+ */
+GLboolean r300_transform_TEX(
+       struct radeon_compiler * c,
+       struct rc_instruction* inst,
+       void* data)
+{
+       struct r300_fragment_program_compiler *compiler =
+               (struct r300_fragment_program_compiler*)data;
+
+       if (inst->I.Opcode != OPCODE_TEX &&
+           inst->I.Opcode != OPCODE_TXB &&
+           inst->I.Opcode != OPCODE_TXP &&
+           inst->I.Opcode != OPCODE_KIL)
+               return GL_FALSE;
+
+       /* ARB_shadow & EXT_shadow_funcs */
+       if (inst->I.Opcode != OPCODE_KIL &&
+           c->Program.ShadowSamplers & (1 << inst->I.TexSrcUnit)) {
+               GLuint comparefunc = GL_NEVER + compiler->state.unit[inst->I.TexSrcUnit].texture_compare_func;
+
+               if (comparefunc == GL_NEVER || comparefunc == GL_ALWAYS) {
+                       inst->I.Opcode = OPCODE_MOV;
+
+                       if (comparefunc == GL_ALWAYS) {
+                               inst->I.SrcReg[0].File = PROGRAM_BUILTIN;
+                               inst->I.SrcReg[0].Swizzle = SWIZZLE_1111;
+                       } else {
+                               inst->I.SrcReg[0] = shadow_ambient(c, inst->I.TexSrcUnit);
+                       }
+
+                       return GL_TRUE;
+               } else {
+                       GLuint comparefunc = GL_NEVER + compiler->state.unit[inst->I.TexSrcUnit].texture_compare_func;
+                       GLuint depthmode = compiler->state.unit[inst->I.TexSrcUnit].depth_texture_mode;
+                       struct rc_instruction * inst_rcp = rc_insert_new_instruction(c, inst);
+                       struct rc_instruction * inst_mad = rc_insert_new_instruction(c, inst_rcp);
+                       struct rc_instruction * inst_cmp = rc_insert_new_instruction(c, inst_mad);
+                       int pass, fail;
+
+                       inst_rcp->I.Opcode = OPCODE_RCP;
+                       inst_rcp->I.DstReg.File = PROGRAM_TEMPORARY;
+                       inst_rcp->I.DstReg.Index = rc_find_free_temporary(c);
+                       inst_rcp->I.DstReg.WriteMask = WRITEMASK_W;
+                       inst_rcp->I.SrcReg[0] = inst->I.SrcReg[0];
+                       inst_rcp->I.SrcReg[0].Swizzle = SWIZZLE_WWWW;
+
+                       inst_cmp->I.DstReg = inst->I.DstReg;
+                       inst->I.DstReg.File = PROGRAM_TEMPORARY;
+                       inst->I.DstReg.Index = rc_find_free_temporary(c);
+                       inst->I.DstReg.WriteMask = WRITEMASK_XYZW;
+
+                       inst_mad->I.Opcode = OPCODE_MAD;
+                       inst_mad->I.DstReg.File = PROGRAM_TEMPORARY;
+                       inst_mad->I.DstReg.Index = rc_find_free_temporary(c);
+                       inst_mad->I.SrcReg[0] = inst->I.SrcReg[0];
+                       inst_mad->I.SrcReg[0].Swizzle = SWIZZLE_ZZZZ;
+                       inst_mad->I.SrcReg[1].File = PROGRAM_TEMPORARY;
+                       inst_mad->I.SrcReg[1].Index = inst_rcp->I.DstReg.Index;
+                       inst_mad->I.SrcReg[1].Swizzle = SWIZZLE_WWWW;
+                       inst_mad->I.SrcReg[2].File = PROGRAM_TEMPORARY;
+                       inst_mad->I.SrcReg[2].Index = inst->I.DstReg.Index;
+                       if (depthmode == 0) /* GL_LUMINANCE */
+                               inst_mad->I.SrcReg[2].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z);
+                       else if (depthmode == 2) /* GL_ALPHA */
+                               inst_mad->I.SrcReg[2].Swizzle = SWIZZLE_WWWW;
+
+                       /* Recall that SrcReg[0] is tex, SrcReg[2] is r and:
+                        *   r  < tex  <=>      -tex+r < 0
+                        *   r >= tex  <=> not (-tex+r < 0 */
+                       if (comparefunc == GL_LESS || comparefunc == GL_GEQUAL)
+                               inst_mad->I.SrcReg[2].Negate = inst_mad->I.SrcReg[2].Negate ^ NEGATE_XYZW;
+                       else
+                               inst_mad->I.SrcReg[0].Negate = inst_mad->I.SrcReg[0].Negate ^ NEGATE_XYZW;
+
+                       inst_cmp->I.Opcode = OPCODE_CMP;
+                       /* DstReg has been filled out above */
+                       inst_cmp->I.SrcReg[0].File = PROGRAM_TEMPORARY;
+                       inst_cmp->I.SrcReg[0].Index = inst_mad->I.DstReg.Index;
+
+                       if (comparefunc == GL_LESS || comparefunc == GL_GREATER) {
+                               pass = 1;
+                               fail = 2;
+                       } else {
+                               pass = 2;
+                               fail = 1;
+                       }
+
+                       inst_cmp->I.SrcReg[pass].File = PROGRAM_BUILTIN;
+                       inst_cmp->I.SrcReg[pass].Swizzle = SWIZZLE_1111;
+                       inst_cmp->I.SrcReg[fail] = shadow_ambient(c, inst->I.TexSrcUnit);
+               }
+       }
+
+       /* Hardware uses [0..1]x[0..1] range for rectangle textures
+        * instead of [0..Width]x[0..Height].
+        * Add a scaling instruction.
+        */
+       if (inst->I.Opcode != OPCODE_KIL && inst->I.TexSrcTarget == TEXTURE_RECT_INDEX) {
+               struct rc_instruction * inst_mul = rc_insert_new_instruction(c, inst->Prev);
+
+               inst_mul->I.Opcode = OPCODE_MUL;
+               inst_mul->I.DstReg.File = PROGRAM_TEMPORARY;
+               inst_mul->I.DstReg.Index = rc_find_free_temporary(c);
+               inst_mul->I.SrcReg[0] = inst->I.SrcReg[0];
+               inst_mul->I.SrcReg[1].File = PROGRAM_STATE_VAR;
+               inst_mul->I.SrcReg[1].Index = rc_constants_add_state(&c->Program.Constants, RC_STATE_R300_TEXRECT_FACTOR, inst->I.TexSrcUnit);
+
+               reset_srcreg(&inst->I.SrcReg[0]);
+               inst->I.SrcReg[0].File = PROGRAM_TEMPORARY;
+               inst->I.SrcReg[0].Index = inst_mul->I.DstReg.Index;
+       }
+
+       /* Cannot write texture to output registers or with masks */
+       if (inst->I.Opcode != OPCODE_KIL &&
+           (inst->I.DstReg.File != PROGRAM_TEMPORARY || inst->I.DstReg.WriteMask != WRITEMASK_XYZW)) {
+               struct rc_instruction * inst_mov = rc_insert_new_instruction(c, inst);
+
+               inst_mov->I.Opcode = OPCODE_MOV;
+               inst_mov->I.DstReg = inst->I.DstReg;
+               inst_mov->I.SrcReg[0].File = PROGRAM_TEMPORARY;
+               inst_mov->I.SrcReg[0].Index = rc_find_free_temporary(c);
+
+               inst->I.DstReg.File = PROGRAM_TEMPORARY;
+               inst->I.DstReg.Index = inst_mov->I.SrcReg[0].Index;
+               inst->I.DstReg.WriteMask = WRITEMASK_XYZW;
+       }
+
+
+       /* Cannot read texture coordinate from constants file */
+       if (inst->I.SrcReg[0].File != PROGRAM_TEMPORARY && inst->I.SrcReg[0].File != PROGRAM_INPUT) {
+               struct rc_instruction * inst_mov = rc_insert_new_instruction(c, inst->Prev);
+
+               inst_mov->I.Opcode = OPCODE_MOV;
+               inst_mov->I.DstReg.File = PROGRAM_TEMPORARY;
+               inst_mov->I.DstReg.Index = rc_find_free_temporary(c);
+               inst_mov->I.SrcReg[0] = inst->I.SrcReg[0];
+
+               reset_srcreg(&inst->I.SrcReg[0]);
+               inst->I.SrcReg[0].File = PROGRAM_TEMPORARY;
+               inst->I.SrcReg[0].Index = inst_mov->I.DstReg.Index;
+       }
+
+       return GL_TRUE;
+}
+
+/* just some random things... */
+void r300FragmentProgramDump(struct rX00_fragment_program_code *c)
+{
+       struct r300_fragment_program_code *code = &c->code.r300;
+       int n, i, j;
+       static int pc = 0;
+
+       fprintf(stderr, "pc=%d*************************************\n", pc++);
+
+       fprintf(stderr, "Hardware program\n");
+       fprintf(stderr, "----------------\n");
+
+       for (n = 0; n <= (code->config & 3); n++) {
+               uint32_t code_addr = code->code_addr[3 - (code->config & 3) + n];
+               int alu_offset = (code_addr & R300_ALU_START_MASK) >> R300_ALU_START_SHIFT;
+               int alu_end = (code_addr & R300_ALU_SIZE_MASK) >> R300_ALU_SIZE_SHIFT;
+               int tex_offset = (code_addr & R300_TEX_START_MASK) >> R300_TEX_START_SHIFT;
+               int tex_end = (code_addr & R300_TEX_SIZE_MASK) >> R300_TEX_SIZE_SHIFT;
+
+               fprintf(stderr, "NODE %d: alu_offset: %d, tex_offset: %d, "
+                       "alu_end: %d, tex_end: %d  (code_addr: %08x)\n", n,
+                       alu_offset, tex_offset, alu_end, tex_end, code_addr);
+
+               if (n > 0 || (code->config & R300_PFS_CNTL_FIRST_NODE_HAS_TEX)) {
+                       fprintf(stderr, "  TEX:\n");
+                       for (i = tex_offset;
+                            i <= tex_offset + tex_end;
+                            ++i) {
+                               const char *instr;
+
+                               switch ((code->tex.
+                                        inst[i] >> R300_TEX_INST_SHIFT) &
+                                       15) {
+                               case R300_TEX_OP_LD:
+                                       instr = "TEX";
+                                       break;
+                               case R300_TEX_OP_KIL:
+                                       instr = "KIL";
+                                       break;
+                               case R300_TEX_OP_TXP:
+                                       instr = "TXP";
+                                       break;
+                               case R300_TEX_OP_TXB:
+                                       instr = "TXB";
+                                       break;
+                               default:
+                                       instr = "UNKNOWN";
+                               }
+
+                               fprintf(stderr,
+                                       "    %s t%i, %c%i, texture[%i]   (%08x)\n",
+                                       instr,
+                                       (code->tex.
+                                        inst[i] >> R300_DST_ADDR_SHIFT) & 31,
+                                       't',
+                                       (code->tex.
+                                        inst[i] >> R300_SRC_ADDR_SHIFT) & 31,
+                                       (code->tex.
+                                        inst[i] & R300_TEX_ID_MASK) >>
+                                       R300_TEX_ID_SHIFT,
+                                       code->tex.inst[i]);
+                       }
+               }
+
+               for (i = alu_offset;
+                    i <= alu_offset + alu_end; ++i) {
+                       char srcc[3][10], dstc[20];
+                       char srca[3][10], dsta[20];
+                       char argc[3][20];
+                       char arga[3][20];
+                       char flags[5], tmp[10];
+
+                       for (j = 0; j < 3; ++j) {
+                               int regc = code->alu.inst[i].rgb_addr >> (j * 6);
+                               int rega = code->alu.inst[i].alpha_addr >> (j * 6);
+
+                               sprintf(srcc[j], "%c%i",
+                                       (regc & 32) ? 'c' : 't', regc & 31);
+                               sprintf(srca[j], "%c%i",
+                                       (rega & 32) ? 'c' : 't', rega & 31);
+                       }
+
+                       dstc[0] = 0;
+                       sprintf(flags, "%s%s%s",
+                               (code->alu.inst[i].
+                                rgb_addr & R300_ALU_DSTC_REG_X) ? "x" : "",
+                               (code->alu.inst[i].
+                                rgb_addr & R300_ALU_DSTC_REG_Y) ? "y" : "",
+                               (code->alu.inst[i].
+                                rgb_addr & R300_ALU_DSTC_REG_Z) ? "z" : "");
+                       if (flags[0] != 0) {
+                               sprintf(dstc, "t%i.%s ",
+                                       (code->alu.inst[i].
+                                        rgb_addr >> R300_ALU_DSTC_SHIFT) & 31,
+                                       flags);
+                       }
+                       sprintf(flags, "%s%s%s",
+                               (code->alu.inst[i].
+                                rgb_addr & R300_ALU_DSTC_OUTPUT_X) ? "x" : "",
+                               (code->alu.inst[i].
+                                rgb_addr & R300_ALU_DSTC_OUTPUT_Y) ? "y" : "",
+                               (code->alu.inst[i].
+                                rgb_addr & R300_ALU_DSTC_OUTPUT_Z) ? "z" : "");
+                       if (flags[0] != 0) {
+                               sprintf(tmp, "o%i.%s",
+                                       (code->alu.inst[i].
+                                        rgb_addr >> R300_ALU_DSTC_SHIFT) & 31,
+                                       flags);
+                               strcat(dstc, tmp);
+                       }
+
+                       dsta[0] = 0;
+                       if (code->alu.inst[i].alpha_addr & R300_ALU_DSTA_REG) {
+                               sprintf(dsta, "t%i.w ",
+                                       (code->alu.inst[i].
+                                        alpha_addr >> R300_ALU_DSTA_SHIFT) & 31);
+                       }
+                       if (code->alu.inst[i].alpha_addr & R300_ALU_DSTA_OUTPUT) {
+                               sprintf(tmp, "o%i.w ",
+                                       (code->alu.inst[i].
+                                        alpha_addr >> R300_ALU_DSTA_SHIFT) & 31);
+                               strcat(dsta, tmp);
+                       }
+                       if (code->alu.inst[i].alpha_addr & R300_ALU_DSTA_DEPTH) {
+                               strcat(dsta, "Z");
+                       }
+
+                       fprintf(stderr,
+                               "%3i: xyz: %3s %3s %3s -> %-20s (%08x)\n"
+                               "       w: %3s %3s %3s -> %-20s (%08x)\n", i,
+                               srcc[0], srcc[1], srcc[2], dstc,
+                               code->alu.inst[i].rgb_addr, srca[0], srca[1],
+                               srca[2], dsta, code->alu.inst[i].alpha_addr);
+
+                       for (j = 0; j < 3; ++j) {
+                               int regc = code->alu.inst[i].rgb_inst >> (j * 7);
+                               int rega = code->alu.inst[i].alpha_inst >> (j * 7);
+                               int d;
+                               char buf[20];
+
+                               d = regc & 31;
+                               if (d < 12) {
+                                       switch (d % 4) {
+                                       case R300_ALU_ARGC_SRC0C_XYZ:
+                                               sprintf(buf, "%s.xyz",
+                                                       srcc[d / 4]);
+                                               break;
+                                       case R300_ALU_ARGC_SRC0C_XXX:
+                                               sprintf(buf, "%s.xxx",
+                                                       srcc[d / 4]);
+                                               break;
+                                       case R300_ALU_ARGC_SRC0C_YYY:
+                                               sprintf(buf, "%s.yyy",
+                                                       srcc[d / 4]);
+                                               break;
+                                       case R300_ALU_ARGC_SRC0C_ZZZ:
+                                               sprintf(buf, "%s.zzz",
+                                                       srcc[d / 4]);
+                                               break;
+                                       }
+                               } else if (d < 15) {
+                                       sprintf(buf, "%s.www", srca[d - 12]);
+                               } else if (d == 20) {
+                                       sprintf(buf, "0.0");
+                               } else if (d == 21) {
+                                       sprintf(buf, "1.0");
+                               } else if (d == 22) {
+                                       sprintf(buf, "0.5");
+                               } else if (d >= 23 && d < 32) {
+                                       d -= 23;
+                                       switch (d / 3) {
+                                       case 0:
+                                               sprintf(buf, "%s.yzx",
+                                                       srcc[d % 3]);
+                                               break;
+                                       case 1:
+                                               sprintf(buf, "%s.zxy",
+                                                       srcc[d % 3]);
+                                               break;
+                                       case 2:
+                                               sprintf(buf, "%s.Wzy",
+                                                       srcc[d % 3]);
+                                               break;
+                                       }
+                               } else {
+                                       sprintf(buf, "%i", d);
+                               }
+
+                               sprintf(argc[j], "%s%s%s%s",
+                                       (regc & 32) ? "-" : "",
+                                       (regc & 64) ? "|" : "",
+                                       buf, (regc & 64) ? "|" : "");
+
+                               d = rega & 31;
+                               if (d < 9) {
+                                       sprintf(buf, "%s.%c", srcc[d / 3],
+                                               'x' + (char)(d % 3));
+                               } else if (d < 12) {
+                                       sprintf(buf, "%s.w", srca[d - 9]);
+                               } else if (d == 16) {
+                                       sprintf(buf, "0.0");
+                               } else if (d == 17) {
+                                       sprintf(buf, "1.0");
+                               } else if (d == 18) {
+                                       sprintf(buf, "0.5");
+                               } else {
+                                       sprintf(buf, "%i", d);
+                               }
+
+                               sprintf(arga[j], "%s%s%s%s",
+                                       (rega & 32) ? "-" : "",
+                                       (rega & 64) ? "|" : "",
+                                       buf, (rega & 64) ? "|" : "");
+                       }
+
+                       fprintf(stderr, "     xyz: %8s %8s %8s    op: %08x\n"
+                               "       w: %8s %8s %8s    op: %08x\n",
+                               argc[0], argc[1], argc[2],
+                               code->alu.inst[i].rgb_inst, arga[0], arga[1],
+                               arga[2], code->alu.inst[i].alpha_inst);
+               }
+       }
+}
diff --git a/src/mesa/drivers/dri/r300/compiler/r300_fragprog.h b/src/mesa/drivers/dri/r300/compiler/r300_fragprog.h
new file mode 100644 (file)
index 0000000..0ac46db
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2005 Ben Skeggs.
+ *
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * Authors:
+ *   Ben Skeggs <darktama@iinet.net.au>
+ *   Jerome Glisse <j.glisse@gmail.com>
+ */
+#ifndef __R300_FRAGPROG_H_
+#define __R300_FRAGPROG_H_
+
+#include "shader/program.h"
+#include "shader/prog_instruction.h"
+
+#include "radeon_compiler.h"
+#include "radeon_program.h"
+
+
+extern void r300BuildFragmentProgramHwCode(struct r300_fragment_program_compiler *compiler);
+
+extern void r300FragmentProgramDump(struct rX00_fragment_program_code *c);
+
+extern GLboolean r300_transform_TEX(struct radeon_compiler * c, struct rc_instruction* inst, void* data);
+
+#endif
 
 #include "r300_fragprog.h"
 
+#include "../r300_reg.h"
+
 #include "radeon_program_pair.h"
 #include "r300_fragprog_swizzle.h"
-#include "r300_reg.h"
 
 
+struct r300_emit_state {
+       struct r300_fragment_program_compiler * compiler;
+
+       unsigned current_node : 2;
+       unsigned node_first_tex : 8;
+       unsigned node_first_alu : 8;
+       uint32_t node_flags;
+};
+
 #define PROG_CODE \
-       struct r300_fragment_program_compiler *c = (struct r300_fragment_program_compiler*)data; \
-       struct r300_fragment_program_code *code = &c->code->r300
+       struct r300_emit_state * emit = (struct r300_emit_state*)data; \
+       struct r300_fragment_program_compiler *c = emit->compiler; \
+       struct r300_fragment_program_code *code = &c->code->code.r300
 
 #define error(fmt, args...) do {                       \
-               fprintf(stderr, "%s::%s(): " fmt "\n",  \
+               rc_error(&c->Base, "%s::%s(): " fmt "\n",       \
                        __FILE__, __FUNCTION__, ##args);        \
        } while(0)
 
 
-static GLboolean emit_const(void* data, GLuint file, GLuint index, GLuint *hwindex)
-{
-       PROG_CODE;
-
-       for (*hwindex = 0; *hwindex < code->const_nr; ++*hwindex) {
-               if (code->constant[*hwindex].File == file &&
-                   code->constant[*hwindex].Index == index)
-                       break;
-       }
-
-       if (*hwindex >= code->const_nr) {
-               if (*hwindex >= R300_PFS_NUM_CONST_REGS) {
-                       error("Out of hw constants!\n");
-                       return GL_FALSE;
-               }
-
-               code->const_nr++;
-               code->constant[*hwindex].File = file;
-               code->constant[*hwindex].Index = index;
-       }
-
-       return GL_TRUE;
-}
-
-
 /**
  * Mark a temporary register as used.
  */
 static void use_temporary(struct r300_fragment_program_code *code, GLuint index)
 {
-       if (index > code->max_temp_idx)
-               code->max_temp_idx = index;
+       if (index > code->pixsize)
+               code->pixsize = index;
 }
 
 
-static GLuint translate_rgb_opcode(GLuint opcode)
+static GLuint translate_rgb_opcode(struct r300_fragment_program_compiler * c, GLuint opcode)
 {
        switch(opcode) {
        case OPCODE_CMP: return R300_ALU_OUTC_CMP;
@@ -109,7 +95,7 @@ static GLuint translate_rgb_opcode(GLuint opcode)
        }
 }
 
-static GLuint translate_alpha_opcode(GLuint opcode)
+static GLuint translate_alpha_opcode(struct r300_fragment_program_compiler * c, GLuint opcode)
 {
        switch(opcode) {
        case OPCODE_CMP: return R300_ALU_OUTA_CMP;
@@ -145,63 +131,62 @@ static GLboolean emit_alu(void* data, struct radeon_pair_instruction* inst)
 
        int ip = code->alu.length++;
        int j;
-       code->node[code->cur_node].alu_end++;
 
-       code->alu.inst[ip].inst0 = translate_rgb_opcode(inst->RGB.Opcode);
-       code->alu.inst[ip].inst2 = translate_alpha_opcode(inst->Alpha.Opcode);
+       code->alu.inst[ip].rgb_inst = translate_rgb_opcode(c, inst->RGB.Opcode);
+       code->alu.inst[ip].alpha_inst = translate_alpha_opcode(c, inst->Alpha.Opcode);
 
        for(j = 0; j < 3; ++j) {
                GLuint src = inst->RGB.Src[j].Index | (inst->RGB.Src[j].Constant << 5);
                if (!inst->RGB.Src[j].Constant)
                        use_temporary(code, inst->RGB.Src[j].Index);
-               code->alu.inst[ip].inst1 |= src << (6*j);
+               code->alu.inst[ip].rgb_addr |= src << (6*j);
 
                src = inst->Alpha.Src[j].Index | (inst->Alpha.Src[j].Constant << 5);
                if (!inst->Alpha.Src[j].Constant)
                        use_temporary(code, inst->Alpha.Src[j].Index);
-               code->alu.inst[ip].inst3 |= src << (6*j);
+               code->alu.inst[ip].alpha_addr |= src << (6*j);
 
                GLuint arg = r300FPTranslateRGBSwizzle(inst->RGB.Arg[j].Source, inst->RGB.Arg[j].Swizzle);
                arg |= inst->RGB.Arg[j].Abs << 6;
                arg |= inst->RGB.Arg[j].Negate << 5;
-               code->alu.inst[ip].inst0 |= arg << (7*j);
+               code->alu.inst[ip].rgb_inst |= arg << (7*j);
 
                arg = r300FPTranslateAlphaSwizzle(inst->Alpha.Arg[j].Source, inst->Alpha.Arg[j].Swizzle);
                arg |= inst->Alpha.Arg[j].Abs << 6;
                arg |= inst->Alpha.Arg[j].Negate << 5;
-               code->alu.inst[ip].inst2 |= arg << (7*j);
+               code->alu.inst[ip].alpha_inst |= arg << (7*j);
        }
 
        if (inst->RGB.Saturate)
-               code->alu.inst[ip].inst0 |= R300_ALU_OUTC_CLAMP;
+               code->alu.inst[ip].rgb_inst |= R300_ALU_OUTC_CLAMP;
        if (inst->Alpha.Saturate)
-               code->alu.inst[ip].inst2 |= R300_ALU_OUTA_CLAMP;
+               code->alu.inst[ip].alpha_inst |= R300_ALU_OUTA_CLAMP;
 
        if (inst->RGB.WriteMask) {
                use_temporary(code, inst->RGB.DestIndex);
-               code->alu.inst[ip].inst1 |=
+               code->alu.inst[ip].rgb_addr |=
                        (inst->RGB.DestIndex << R300_ALU_DSTC_SHIFT) |
                        (inst->RGB.WriteMask << R300_ALU_DSTC_REG_MASK_SHIFT);
        }
        if (inst->RGB.OutputWriteMask) {
-               code->alu.inst[ip].inst1 |= (inst->RGB.OutputWriteMask << R300_ALU_DSTC_OUTPUT_MASK_SHIFT);
-               code->node[code->cur_node].flags |= R300_RGBA_OUT;
+               code->alu.inst[ip].rgb_addr |= (inst->RGB.OutputWriteMask << R300_ALU_DSTC_OUTPUT_MASK_SHIFT);
+               emit->node_flags |= R300_RGBA_OUT;
        }
 
        if (inst->Alpha.WriteMask) {
                use_temporary(code, inst->Alpha.DestIndex);
-               code->alu.inst[ip].inst3 |=
+               code->alu.inst[ip].alpha_addr |=
                        (inst->Alpha.DestIndex << R300_ALU_DSTA_SHIFT) |
                        R300_ALU_DSTA_REG;
        }
        if (inst->Alpha.OutputWriteMask) {
-               code->alu.inst[ip].inst3 |= R300_ALU_DSTA_OUTPUT;
-               code->node[code->cur_node].flags |= R300_RGBA_OUT;
+               code->alu.inst[ip].alpha_addr |= R300_ALU_DSTA_OUTPUT;
+               emit->node_flags |= R300_RGBA_OUT;
        }
        if (inst->Alpha.DepthWriteMask) {
-               code->alu.inst[ip].inst3 |= R300_ALU_DSTA_DEPTH;
-               code->node[code->cur_node].flags |= R300_W_OUT;
-               c->fp->writes_depth = GL_TRUE;
+               code->alu.inst[ip].alpha_addr |= R300_ALU_DSTA_DEPTH;
+               emit->node_flags |= R300_W_OUT;
+               c->code->writes_depth = GL_TRUE;
        }
 
        return GL_TRUE;
@@ -211,31 +196,50 @@ static GLboolean emit_alu(void* data, struct radeon_pair_instruction* inst)
 /**
  * Finish the current node without advancing to the next one.
  */
-static GLboolean finish_node(struct r300_fragment_program_compiler *c)
+static GLboolean finish_node(struct r300_emit_state * emit)
 {
-       struct r300_fragment_program_code *code = &c->code->r300;
-       struct r300_fragment_program_node *node = &code->node[code->cur_node];
+       struct r300_fragment_program_compiler * c = emit->compiler;
+       struct r300_fragment_program_code *code = &emit->compiler->code->code.r300;
 
-       if (node->alu_end < 0) {
+       if (code->alu.length == emit->node_first_alu) {
                /* Generate a single NOP for this node */
                struct radeon_pair_instruction inst;
                _mesa_bzero(&inst, sizeof(inst));
-               if (!emit_alu(c, &inst))
+               if (!emit_alu(emit, &inst))
                        return GL_FALSE;
        }
 
-       if (node->tex_end < 0) {
-               if (code->cur_node == 0) {
-                       node->tex_end = 0;
-               } else {
-                       error("Node %i has no TEX instructions", code->cur_node);
+       unsigned alu_offset = emit->node_first_alu;
+       unsigned alu_end = code->alu.length - alu_offset - 1;
+       unsigned tex_offset = emit->node_first_tex;
+       unsigned tex_end = code->tex.length - tex_offset - 1;
+
+       if (code->tex.length == emit->node_first_tex) {
+               if (emit->current_node > 0) {
+                       error("Node %i has no TEX instructions", emit->current_node);
                        return GL_FALSE;
                }
+
+               tex_end = 0;
        } else {
-               if (code->cur_node == 0)
-                       code->first_node_has_tex = 1;
+               if (emit->current_node == 0)
+                       code->config |= R300_PFS_CNTL_FIRST_NODE_HAS_TEX;
        }
 
+       /* Write the config register.
+        * Note: The order in which the words for each node are written
+        * is not correct here and needs to be fixed up once we're entirely
+        * done
+        *
+        * Also note that the register specification from AMD is slightly
+        * incorrect in its description of this register. */
+       code->code_addr[emit->current_node] =
+                       (alu_offset << R300_ALU_START_SHIFT) |
+                       (alu_end << R300_ALU_SIZE_SHIFT) |
+                       (tex_offset << R300_TEX_START_SHIFT) |
+                       (tex_end << R300_TEX_SIZE_SHIFT) |
+                       emit->node_flags;
+
        return GL_TRUE;
 }
 
@@ -248,30 +252,28 @@ static GLboolean begin_tex(void* data)
 {
        PROG_CODE;
 
-       if (code->cur_node == 0) {
-               if (code->node[0].alu_end < 0 &&
-                   code->node[0].tex_end < 0)
-                       return GL_TRUE;
+       if (code->alu.length == emit->node_first_alu &&
+           code->tex.length == emit->node_first_tex) {
+               return GL_TRUE;
        }
 
-       if (code->cur_node == 3) {
+       if (emit->current_node == 3) {
                error("Too many texture indirections");
                return GL_FALSE;
        }
 
-       if (!finish_node(c))
+       if (!finish_node(emit))
                return GL_FALSE;
 
-       struct r300_fragment_program_node *node = &code->node[++code->cur_node];
-       node->alu_offset = code->alu.length;
-       node->alu_end = -1;
-       node->tex_offset = code->tex.length;
-       node->tex_end = -1;
+       emit->current_node++;
+       emit->node_first_tex = code->tex.length;
+       emit->node_first_alu = code->alu.length;
+       emit->node_flags = 0;
        return GL_TRUE;
 }
 
 
-static GLboolean emit_tex(void* data, struct prog_instruction* inst)
+static GLboolean emit_tex(void* data, struct radeon_pair_texture_instruction* inst)
 {
        PROG_CODE;
 
@@ -281,31 +283,30 @@ static GLboolean emit_tex(void* data, struct prog_instruction* inst)
        }
 
        GLuint unit = inst->TexSrcUnit;
-       GLuint dest = inst->DstReg.Index;
+       GLuint dest = inst->DestIndex;
        GLuint opcode;
 
        switch(inst->Opcode) {
-       case OPCODE_KIL: opcode = R300_TEX_OP_KIL; break;
-       case OPCODE_TEX: opcode = R300_TEX_OP_LD; break;
-       case OPCODE_TXB: opcode = R300_TEX_OP_TXB; break;
-       case OPCODE_TXP: opcode = R300_TEX_OP_TXP; break;
+       case RADEON_OPCODE_KIL: opcode = R300_TEX_OP_KIL; break;
+       case RADEON_OPCODE_TEX: opcode = R300_TEX_OP_LD; break;
+       case RADEON_OPCODE_TXB: opcode = R300_TEX_OP_TXB; break;
+       case RADEON_OPCODE_TXP: opcode = R300_TEX_OP_TXP; break;
        default:
                error("Unknown texture opcode %i", inst->Opcode);
                return GL_FALSE;
        }
 
-       if (inst->Opcode == OPCODE_KIL) {
+       if (inst->Opcode == RADEON_OPCODE_KIL) {
                unit = 0;
                dest = 0;
        } else {
                use_temporary(code, dest);
        }
 
-       use_temporary(code, inst->SrcReg[0].Index);
+       use_temporary(code, inst->SrcIndex);
 
-       code->node[code->cur_node].tex_end++;
        code->tex.inst[code->tex.length++] =
-               (inst->SrcReg[0].Index << R300_SRC_ADDR_SHIFT) |
+               (inst->SrcIndex << R300_SRC_ADDR_SHIFT) |
                (dest << R300_DST_ADDR_SHIFT) |
                (unit << R300_TEX_ID_SHIFT) |
                (opcode << R300_TEX_INST_SHIFT);
@@ -314,7 +315,6 @@ static GLboolean emit_tex(void* data, struct prog_instruction* inst)
 
 
 static const struct radeon_pair_handler pair_handler = {
-       .EmitConst = &emit_const,
        .EmitPaired = &emit_alu,
        .EmitTex = &emit_tex,
        .BeginTexBlock = &begin_tex,
@@ -325,20 +325,36 @@ static const struct radeon_pair_handler pair_handler = {
  * Final compilation step: Turn the intermediate radeon_program into
  * machine-readable instructions.
  */
-GLboolean r300BuildFragmentProgramHwCode(struct r300_fragment_program_compiler *compiler)
+void r300BuildFragmentProgramHwCode(struct r300_fragment_program_compiler *compiler)
 {
-       struct r300_fragment_program_code *code = &compiler->code->r300;
-
-       _mesa_bzero(code, sizeof(struct r300_fragment_program_code));
-       code->node[0].alu_end = -1;
-       code->node[0].tex_end = -1;
+       struct r300_emit_state emit;
+       struct r300_fragment_program_code *code = &compiler->code->code.r300;
 
-       if (!radeonPairProgram(compiler->r300->radeon.glCtx, compiler->program, &pair_handler, compiler))
-               return GL_FALSE;
+       memset(&emit, 0, sizeof(emit));
+       emit.compiler = compiler;
 
-       if (!finish_node(compiler))
-               return GL_FALSE;
+       _mesa_bzero(code, sizeof(struct r300_fragment_program_code));
 
-       return GL_TRUE;
+       radeonPairProgram(compiler, &pair_handler, &emit);
+       if (compiler->Base.Error)
+               return;
+
+       /* Finish the program */
+       finish_node(&emit);
+
+       code->config |= emit.current_node; /* FIRST_NODE_HAS_TEX set by finish_node */
+       code->code_offset =
+               (0 << R300_PFS_CNTL_ALU_OFFSET_SHIFT) |
+               ((code->alu.length-1) << R300_PFS_CNTL_ALU_END_SHIFT) |
+               (0 << R300_PFS_CNTL_TEX_OFFSET_SHIFT) |
+               ((code->tex.length ? code->tex.length-1 : 0) << R300_PFS_CNTL_TEX_END_SHIFT);
+
+       if (emit.current_node < 3) {
+               int shift = 3 - emit.current_node;
+               int i;
+               for(i = 0; i <= emit.current_node; ++i)
+                       code->code_addr[shift + i] = code->code_addr[i];
+               for(i = 0; i < shift; ++i)
+                       code->code_addr[i] = 0;
+       }
 }
-
@@ -33,8 +33,9 @@
 
 #include "r300_fragprog_swizzle.h"
 
-#include "r300_reg.h"
+#include "../r300_reg.h"
 #include "radeon_nqssadce.h"
+#include "radeon_compiler.h"
 
 #define MAKE_SWZ3(x, y, z) (MAKE_SWIZZLE4(SWIZZLE_##x, SWIZZLE_##y, SWIZZLE_##z, SWIZZLE_ZERO))
 
@@ -174,18 +175,15 @@ void r300FPBuildSwizzle(struct nqssadce_state *s, struct prog_dst_register dst,
                        }
                }
 
-               struct prog_instruction *inst;
-
-               _mesa_insert_instructions(s->Program, s->IP, 1);
-               inst = s->Program->Instructions + s->IP++;
-               inst->Opcode = OPCODE_MOV;
-               inst->DstReg = dst;
-               inst->DstReg.WriteMask &= (best_matchmask | WRITEMASK_W);
-               inst->SrcReg[0] = src;
-               inst->SrcReg[0].Negate = (best_matchmask & src.Negate) ? NEGATE_XYZW : NEGATE_NONE;
+               struct rc_instruction *inst = rc_insert_new_instruction(s->Compiler, s->IP->Prev);
+               inst->I.Opcode = OPCODE_MOV;
+               inst->I.DstReg = dst;
+               inst->I.DstReg.WriteMask &= (best_matchmask | WRITEMASK_W);
+               inst->I.SrcReg[0] = src;
+               inst->I.SrcReg[0].Negate = (best_matchmask & src.Negate) ? NEGATE_XYZW : NEGATE_NONE;
                /* Note: We rely on NqSSA/DCE to set unused swizzle components to NIL */
 
-               dst.WriteMask &= ~inst->DstReg.WriteMask;
+               dst.WriteMask &= ~inst->I.DstReg.WriteMask;
        }
 }
 
diff --git a/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c b/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c
new file mode 100644 (file)
index 0000000..d39b82b
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2009 Nicolai Hähnle <nhaehnle@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#include "radeon_compiler.h"
+
+#include "shader/prog_parameter.h"
+#include "shader/prog_print.h"
+#include "shader/prog_statevars.h"
+
+#include "radeon_nqssadce.h"
+#include "radeon_program_alu.h"
+#include "r300_fragprog.h"
+#include "r300_fragprog_swizzle.h"
+#include "r500_fragprog.h"
+
+
+static void nqssadce_init(struct nqssadce_state* s)
+{
+       struct r300_fragment_program_compiler * c = s->UserData;
+       s->Outputs[c->OutputColor].Sourced = WRITEMASK_XYZW;
+       s->Outputs[c->OutputDepth].Sourced = WRITEMASK_W;
+}
+
+static void rewrite_depth_out(struct r300_fragment_program_compiler * c)
+{
+       struct rc_instruction *rci;
+
+       for (rci = c->Base.Program.Instructions.Next; rci != &c->Base.Program.Instructions; rci = rci->Next) {
+               struct prog_instruction * inst = &rci->I;
+
+               if (inst->DstReg.File != PROGRAM_OUTPUT || inst->DstReg.Index != c->OutputDepth)
+                       continue;
+
+               if (inst->DstReg.WriteMask & WRITEMASK_Z) {
+                       inst->DstReg.WriteMask = WRITEMASK_W;
+               } else {
+                       inst->DstReg.WriteMask = 0;
+                       continue;
+               }
+
+               switch (inst->Opcode) {
+                       case OPCODE_FRC:
+                       case OPCODE_MOV:
+                               inst->SrcReg[0] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[0]);
+                               break;
+                       case OPCODE_ADD:
+                       case OPCODE_MAX:
+                       case OPCODE_MIN:
+                       case OPCODE_MUL:
+                               inst->SrcReg[0] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[0]);
+                               inst->SrcReg[1] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[1]);
+                               break;
+                       case OPCODE_CMP:
+                       case OPCODE_MAD:
+                               inst->SrcReg[0] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[0]);
+                               inst->SrcReg[1] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[1]);
+                               inst->SrcReg[2] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[2]);
+                               break;
+                       default:
+                               // Scalar instructions needn't be reswizzled
+                               break;
+               }
+       }
+}
+
+void r3xx_compile_fragment_program(struct r300_fragment_program_compiler* c)
+{
+       rewrite_depth_out(c);
+
+       if (c->is_r500) {
+               struct radeon_program_transformation transformations[] = {
+                       { &r500_transform_TEX, c },
+                       { &radeonTransformALU, 0 },
+                       { &radeonTransformDeriv, 0 },
+                       { &radeonTransformTrigScale, 0 }
+               };
+               radeonLocalTransform(&c->Base, 4, transformations);
+       } else {
+               struct radeon_program_transformation transformations[] = {
+                       { &r300_transform_TEX, c },
+                       { &radeonTransformALU, 0 },
+                       { &radeonTransformTrigSimple, 0 }
+               };
+               radeonLocalTransform(&c->Base, 3, transformations);
+       }
+
+       if (c->Base.Debug) {
+               _mesa_printf("Fragment Program: After native rewrite:\n");
+               rc_print_program(&c->Base.Program);
+               fflush(stdout);
+       }
+
+       if (c->is_r500) {
+               struct radeon_nqssadce_descr nqssadce = {
+                       .Init = &nqssadce_init,
+                       .IsNativeSwizzle = &r500FPIsNativeSwizzle,
+                       .BuildSwizzle = &r500FPBuildSwizzle
+               };
+               radeonNqssaDce(&c->Base, &nqssadce, c);
+       } else {
+               struct radeon_nqssadce_descr nqssadce = {
+                       .Init = &nqssadce_init,
+                       .IsNativeSwizzle = &r300FPIsNativeSwizzle,
+                       .BuildSwizzle = &r300FPBuildSwizzle
+               };
+               radeonNqssaDce(&c->Base, &nqssadce, c);
+       }
+
+       if (c->Base.Debug) {
+               _mesa_printf("Compiler: after NqSSA-DCE:\n");
+               rc_print_program(&c->Base.Program);
+               fflush(stdout);
+       }
+
+       if (c->is_r500) {
+               r500BuildFragmentProgramHwCode(c);
+       } else {
+               r300BuildFragmentProgramHwCode(c);
+       }
+
+       rc_constants_copy(&c->code->constants, &c->Base.Program.Constants);
+
+       if (c->Base.Debug) {
+               if (c->is_r500) {
+                       r500FragmentProgramDump(c->code);
+               } else {
+                       r300FragmentProgramDump(c->code);
+               }
+       }
+}
diff --git a/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c b/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c
new file mode 100644 (file)
index 0000000..fc9c8f8
--- /dev/null
@@ -0,0 +1,615 @@
+/*
+ * Copyright 2009 Nicolai Hähnle <nhaehnle@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#include "radeon_compiler.h"
+
+#include "../r300_reg.h"
+
+#include "radeon_nqssadce.h"
+#include "radeon_program.h"
+#include "radeon_program_alu.h"
+
+#include "shader/prog_print.h"
+
+
+/*
+ * Take an already-setup and valid source then swizzle it appropriately to
+ * obtain a constant ZERO or ONE source.
+ */
+#define __CONST(x, y)  \
+       (PVS_SRC_OPERAND(t_src_index(vp, &vpi->SrcReg[x]),      \
+                          t_swizzle(y),        \
+                          t_swizzle(y),        \
+                          t_swizzle(y),        \
+                          t_swizzle(y),        \
+                          t_src_class(vpi->SrcReg[x].File), \
+                          NEGATE_NONE) | (vpi->SrcReg[x].RelAddr << 4))
+
+
+static unsigned long t_dst_mask(GLuint mask)
+{
+       /* WRITEMASK_* is equivalent to VSF_FLAG_* */
+       return mask & WRITEMASK_XYZW;
+}
+
+static unsigned long t_dst_class(gl_register_file file)
+{
+
+       switch (file) {
+       case PROGRAM_TEMPORARY:
+               return PVS_DST_REG_TEMPORARY;
+       case PROGRAM_OUTPUT:
+               return PVS_DST_REG_OUT;
+       case PROGRAM_ADDRESS:
+               return PVS_DST_REG_A0;
+               /*
+                  case PROGRAM_INPUT:
+                  case PROGRAM_LOCAL_PARAM:
+                  case PROGRAM_ENV_PARAM:
+                  case PROGRAM_NAMED_PARAM:
+                  case PROGRAM_STATE_VAR:
+                  case PROGRAM_WRITE_ONLY:
+                  case PROGRAM_ADDRESS:
+                */
+       default:
+               fprintf(stderr, "problem in %s", __FUNCTION__);
+               _mesa_exit(-1);
+               return -1;
+       }
+}
+
+static unsigned long t_dst_index(struct r300_vertex_program_code *vp,
+                                struct prog_dst_register *dst)
+{
+       if (dst->File == PROGRAM_OUTPUT)
+               return vp->outputs[dst->Index];
+
+       return dst->Index;
+}
+
+static unsigned long t_src_class(gl_register_file file)
+{
+       switch (file) {
+       case PROGRAM_TEMPORARY:
+               return PVS_SRC_REG_TEMPORARY;
+       case PROGRAM_INPUT:
+               return PVS_SRC_REG_INPUT;
+       case PROGRAM_LOCAL_PARAM:
+       case PROGRAM_ENV_PARAM:
+       case PROGRAM_NAMED_PARAM:
+       case PROGRAM_CONSTANT:
+       case PROGRAM_STATE_VAR:
+               return PVS_SRC_REG_CONSTANT;
+               /*
+                  case PROGRAM_OUTPUT:
+                  case PROGRAM_WRITE_ONLY:
+                  case PROGRAM_ADDRESS:
+                */
+       default:
+               fprintf(stderr, "problem in %s", __FUNCTION__);
+               _mesa_exit(-1);
+               return -1;
+       }
+}
+
+static GLboolean t_src_conflict(struct prog_src_register a, struct prog_src_register b)
+{
+       unsigned long aclass = t_src_class(a.File);
+       unsigned long bclass = t_src_class(b.File);
+
+       if (aclass != bclass)
+               return GL_FALSE;
+       if (aclass == PVS_SRC_REG_TEMPORARY)
+               return GL_FALSE;
+
+       if (a.RelAddr || b.RelAddr)
+               return GL_TRUE;
+       if (a.Index != b.Index)
+               return GL_TRUE;
+
+       return GL_FALSE;
+}
+
+static INLINE unsigned long t_swizzle(GLubyte swizzle)
+{
+       /* this is in fact a NOP as the Mesa SWIZZLE_* are all identical to VSF_IN_COMPONENT_* */
+       return swizzle;
+}
+
+static unsigned long t_src_index(struct r300_vertex_program_code *vp,
+                                struct prog_src_register *src)
+{
+       if (src->File == PROGRAM_INPUT) {
+               assert(vp->inputs[src->Index] != -1);
+               return vp->inputs[src->Index];
+       } else {
+               if (src->Index < 0) {
+                       fprintf(stderr,
+                               "negative offsets for indirect addressing do not work.\n");
+                       return 0;
+               }
+               return src->Index;
+       }
+}
+
+/* these two functions should probably be merged... */
+
+static unsigned long t_src(struct r300_vertex_program_code *vp,
+                          struct prog_src_register *src)
+{
+       /* src->Negate uses the NEGATE_ flags from program_instruction.h,
+        * which equal our VSF_FLAGS_ values, so it's safe to just pass it here.
+        */
+       return PVS_SRC_OPERAND(t_src_index(vp, src),
+                              t_swizzle(GET_SWZ(src->Swizzle, 0)),
+                              t_swizzle(GET_SWZ(src->Swizzle, 1)),
+                              t_swizzle(GET_SWZ(src->Swizzle, 2)),
+                              t_swizzle(GET_SWZ(src->Swizzle, 3)),
+                              t_src_class(src->File),
+                              src->Negate) | (src->RelAddr << 4);
+}
+
+static unsigned long t_src_scalar(struct r300_vertex_program_code *vp,
+                                 struct prog_src_register *src)
+{
+       /* src->Negate uses the NEGATE_ flags from program_instruction.h,
+        * which equal our VSF_FLAGS_ values, so it's safe to just pass it here.
+        */
+       return PVS_SRC_OPERAND(t_src_index(vp, src),
+                              t_swizzle(GET_SWZ(src->Swizzle, 0)),
+                              t_swizzle(GET_SWZ(src->Swizzle, 0)),
+                              t_swizzle(GET_SWZ(src->Swizzle, 0)),
+                              t_swizzle(GET_SWZ(src->Swizzle, 0)),
+                              t_src_class(src->File),
+                              src->Negate ? NEGATE_XYZW : NEGATE_NONE) |
+           (src->RelAddr << 4);
+}
+
+static GLboolean valid_dst(struct r300_vertex_program_code *vp,
+                          struct prog_dst_register *dst)
+{
+       if (dst->File == PROGRAM_OUTPUT && vp->outputs[dst->Index] == -1) {
+               return GL_FALSE;
+       } else if (dst->File == PROGRAM_ADDRESS) {
+               assert(dst->Index == 0);
+       }
+
+       return GL_TRUE;
+}
+
+static void ei_vector1(struct r300_vertex_program_code *vp,
+                               GLuint hw_opcode,
+                               struct prog_instruction *vpi,
+                               GLuint * inst)
+{
+       inst[0] = PVS_OP_DST_OPERAND(hw_opcode,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
+       inst[1] = t_src(vp, &vpi->SrcReg[0]);
+       inst[2] = __CONST(0, SWIZZLE_ZERO);
+       inst[3] = __CONST(0, SWIZZLE_ZERO);
+}
+
+static void ei_vector2(struct r300_vertex_program_code *vp,
+                               GLuint hw_opcode,
+                               struct prog_instruction *vpi,
+                               GLuint * inst)
+{
+       inst[0] = PVS_OP_DST_OPERAND(hw_opcode,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
+       inst[1] = t_src(vp, &vpi->SrcReg[0]);
+       inst[2] = t_src(vp, &vpi->SrcReg[1]);
+       inst[3] = __CONST(1, SWIZZLE_ZERO);
+}
+
+static void ei_math1(struct r300_vertex_program_code *vp,
+                               GLuint hw_opcode,
+                               struct prog_instruction *vpi,
+                               GLuint * inst)
+{
+       inst[0] = PVS_OP_DST_OPERAND(hw_opcode,
+                                    GL_TRUE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
+       inst[1] = t_src_scalar(vp, &vpi->SrcReg[0]);
+       inst[2] = __CONST(0, SWIZZLE_ZERO);
+       inst[3] = __CONST(0, SWIZZLE_ZERO);
+}
+
+static void ei_lit(struct r300_vertex_program_code *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst)
+{
+       //LIT TMP 1.Y Z TMP 1{} {X W Z Y} TMP 1{} {Y W Z X} TMP 1{} {Y X Z W}
+
+       inst[0] = PVS_OP_DST_OPERAND(ME_LIGHT_COEFF_DX,
+                                    GL_TRUE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
+       /* NOTE: Users swizzling might not work. */
+       inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &vpi->SrcReg[0]), t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 0)),      // X
+                                 t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 3)),        // W
+                                 PVS_SRC_SELECT_FORCE_0,       // Z
+                                 t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 1)),        // Y
+                                 t_src_class(vpi->SrcReg[0].File),
+                                 vpi->SrcReg[0].Negate ? NEGATE_XYZW : NEGATE_NONE) |
+           (vpi->SrcReg[0].RelAddr << 4);
+       inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &vpi->SrcReg[0]), t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 1)),      // Y
+                                 t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 3)),        // W
+                                 PVS_SRC_SELECT_FORCE_0,       // Z
+                                 t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 0)),        // X
+                                 t_src_class(vpi->SrcReg[0].File),
+                                 vpi->SrcReg[0].Negate ? NEGATE_XYZW : NEGATE_NONE) |
+           (vpi->SrcReg[0].RelAddr << 4);
+       inst[3] = PVS_SRC_OPERAND(t_src_index(vp, &vpi->SrcReg[0]), t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 1)),      // Y
+                                 t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 0)),        // X
+                                 PVS_SRC_SELECT_FORCE_0,       // Z
+                                 t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 3)),        // W
+                                 t_src_class(vpi->SrcReg[0].File),
+                                 vpi->SrcReg[0].Negate ? NEGATE_XYZW : NEGATE_NONE) |
+           (vpi->SrcReg[0].RelAddr << 4);
+}
+
+static void ei_mad(struct r300_vertex_program_code *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst)
+{
+       inst[0] = PVS_OP_DST_OPERAND(PVS_MACRO_OP_2CLK_MADD,
+                                    GL_FALSE,
+                                    GL_TRUE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
+       inst[1] = t_src(vp, &vpi->SrcReg[0]);
+       inst[2] = t_src(vp, &vpi->SrcReg[1]);
+       inst[3] = t_src(vp, &vpi->SrcReg[2]);
+}
+
+static void ei_pow(struct r300_vertex_program_code *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst)
+{
+       inst[0] = PVS_OP_DST_OPERAND(ME_POWER_FUNC_FF,
+                                    GL_TRUE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
+       inst[1] = t_src_scalar(vp, &vpi->SrcReg[0]);
+       inst[2] = __CONST(0, SWIZZLE_ZERO);
+       inst[3] = t_src_scalar(vp, &vpi->SrcReg[1]);
+}
+
+
+static void translate_vertex_program(struct r300_vertex_program_compiler * compiler)
+{
+       struct rc_instruction *rci;
+
+       compiler->code->pos_end = 0;    /* Not supported yet */
+       compiler->code->length = 0;
+
+       compiler->SetHwInputOutput(compiler);
+
+       for(rci = compiler->Base.Program.Instructions.Next; rci != &compiler->Base.Program.Instructions; rci = rci->Next) {
+               struct prog_instruction *vpi = &rci->I;
+               GLuint *inst = compiler->code->body.d + compiler->code->length;
+
+               /* Skip instructions writing to non-existing destination */
+               if (!valid_dst(compiler->code, &vpi->DstReg))
+                       continue;
+
+               if (compiler->code->length >= VSF_MAX_FRAGMENT_LENGTH) {
+                       rc_error(&compiler->Base, "Vertex program has too many instructions\n");
+                       return;
+               }
+
+               switch (vpi->Opcode) {
+               case OPCODE_ADD: ei_vector2(compiler->code, VE_ADD, vpi, inst); break;
+               case OPCODE_ARL: ei_vector1(compiler->code, VE_FLT2FIX_DX, vpi, inst); break;
+               case OPCODE_DP4: ei_vector2(compiler->code, VE_DOT_PRODUCT, vpi, inst); break;
+               case OPCODE_DST: ei_vector2(compiler->code, VE_DISTANCE_VECTOR, vpi, inst); break;
+               case OPCODE_EX2: ei_math1(compiler->code, ME_EXP_BASE2_FULL_DX, vpi, inst); break;
+               case OPCODE_EXP: ei_math1(compiler->code, ME_EXP_BASE2_DX, vpi, inst); break;
+               case OPCODE_FRC: ei_vector1(compiler->code, VE_FRACTION, vpi, inst); break;
+               case OPCODE_LG2: ei_math1(compiler->code, ME_LOG_BASE2_FULL_DX, vpi, inst); break;
+               case OPCODE_LIT: ei_lit(compiler->code, vpi, inst); break;
+               case OPCODE_LOG: ei_math1(compiler->code, ME_LOG_BASE2_DX, vpi, inst); break;
+               case OPCODE_MAD: ei_mad(compiler->code, vpi, inst); break;
+               case OPCODE_MAX: ei_vector2(compiler->code, VE_MAXIMUM, vpi, inst); break;
+               case OPCODE_MIN: ei_vector2(compiler->code, VE_MINIMUM, vpi, inst); break;
+               case OPCODE_MOV: ei_vector1(compiler->code, VE_ADD, vpi, inst); break;
+               case OPCODE_MUL: ei_vector2(compiler->code, VE_MULTIPLY, vpi, inst); break;
+               case OPCODE_POW: ei_pow(compiler->code, vpi, inst); break;
+               case OPCODE_RCP: ei_math1(compiler->code, ME_RECIP_DX, vpi, inst); break;
+               case OPCODE_RSQ: ei_math1(compiler->code, ME_RECIP_SQRT_DX, vpi, inst); break;
+               case OPCODE_SGE: ei_vector2(compiler->code, VE_SET_GREATER_THAN_EQUAL, vpi, inst); break;
+               case OPCODE_SLT: ei_vector2(compiler->code, VE_SET_LESS_THAN, vpi, inst); break;
+               default:
+                       rc_error(&compiler->Base, "Unknown opcode %i\n", vpi->Opcode);
+                       return;
+               }
+
+               compiler->code->length += 4;
+
+               if (compiler->Base.Error)
+                       return;
+       }
+}
+
+struct temporary_allocation {
+       GLuint Allocated:1;
+       GLuint HwTemp:15;
+       struct rc_instruction * LastRead;
+};
+
+static void allocate_temporary_registers(struct r300_vertex_program_compiler * compiler)
+{
+       struct rc_instruction *inst;
+       GLuint num_orig_temps = 0;
+       GLboolean hwtemps[VSF_MAX_FRAGMENT_TEMPS];
+       struct temporary_allocation * ta;
+       GLuint i, j;
+
+       compiler->code->num_temporaries = 0;
+       memset(hwtemps, 0, sizeof(hwtemps));
+
+       /* Pass 1: Count original temporaries and allocate structures */
+       for(inst = compiler->Base.Program.Instructions.Next; inst != &compiler->Base.Program.Instructions; inst = inst->Next) {
+               GLuint numsrcs = _mesa_num_inst_src_regs(inst->I.Opcode);
+               GLuint numdsts = _mesa_num_inst_dst_regs(inst->I.Opcode);
+
+               for (i = 0; i < numsrcs; ++i) {
+                       if (inst->I.SrcReg[i].File == PROGRAM_TEMPORARY) {
+                               if (inst->I.SrcReg[i].Index >= num_orig_temps)
+                                       num_orig_temps = inst->I.SrcReg[i].Index + 1;
+                       }
+               }
+
+               if (numdsts) {
+                       if (inst->I.DstReg.File == PROGRAM_TEMPORARY) {
+                               if (inst->I.DstReg.Index >= num_orig_temps)
+                                       num_orig_temps = inst->I.DstReg.Index + 1;
+                       }
+               }
+       }
+
+       ta = (struct temporary_allocation*)memory_pool_malloc(&compiler->Base.Pool,
+                       sizeof(struct temporary_allocation) * num_orig_temps);
+       memset(ta, 0, sizeof(struct temporary_allocation) * num_orig_temps);
+
+       /* Pass 2: Determine original temporary lifetimes */
+       for(inst = compiler->Base.Program.Instructions.Next; inst != &compiler->Base.Program.Instructions; inst = inst->Next) {
+               GLuint numsrcs = _mesa_num_inst_src_regs(inst->I.Opcode);
+
+               for (i = 0; i < numsrcs; ++i) {
+                       if (inst->I.SrcReg[i].File == PROGRAM_TEMPORARY)
+                               ta[inst->I.SrcReg[i].Index].LastRead = inst;
+               }
+       }
+
+       /* Pass 3: Register allocation */
+       for(inst = compiler->Base.Program.Instructions.Next; inst != &compiler->Base.Program.Instructions; inst = inst->Next) {
+               GLuint numsrcs = _mesa_num_inst_src_regs(inst->I.Opcode);
+               GLuint numdsts = _mesa_num_inst_dst_regs(inst->I.Opcode);
+
+               for (i = 0; i < numsrcs; ++i) {
+                       if (inst->I.SrcReg[i].File == PROGRAM_TEMPORARY) {
+                               GLuint orig = inst->I.SrcReg[i].Index;
+                               inst->I.SrcReg[i].Index = ta[orig].HwTemp;
+
+                               if (ta[orig].Allocated && inst == ta[orig].LastRead)
+                                       hwtemps[ta[orig].HwTemp] = GL_FALSE;
+                       }
+               }
+
+               if (numdsts) {
+                       if (inst->I.DstReg.File == PROGRAM_TEMPORARY) {
+                               GLuint orig = inst->I.DstReg.Index;
+
+                               if (!ta[orig].Allocated) {
+                                       for(j = 0; j < VSF_MAX_FRAGMENT_TEMPS; ++j) {
+                                               if (!hwtemps[j])
+                                                       break;
+                                       }
+                                       if (j >= VSF_MAX_FRAGMENT_TEMPS) {
+                                               fprintf(stderr, "Out of hw temporaries\n");
+                                       } else {
+                                               ta[orig].Allocated = GL_TRUE;
+                                               ta[orig].HwTemp = j;
+                                               hwtemps[j] = GL_TRUE;
+
+                                               if (j >= compiler->code->num_temporaries)
+                                                       compiler->code->num_temporaries = j + 1;
+                                       }
+                               }
+
+                               inst->I.DstReg.Index = ta[orig].HwTemp;
+                       }
+               }
+       }
+}
+
+
+/**
+ * Vertex engine cannot read two inputs or two constants at the same time.
+ * Introduce intermediate MOVs to temporary registers to account for this.
+ */
+static GLboolean transform_source_conflicts(
+       struct radeon_compiler *c,
+       struct rc_instruction* inst,
+       void* unused)
+{
+       GLuint num_operands = _mesa_num_inst_src_regs(inst->I.Opcode);
+
+       if (num_operands == 3) {
+               if (t_src_conflict(inst->I.SrcReg[1], inst->I.SrcReg[2])
+                   || t_src_conflict(inst->I.SrcReg[0], inst->I.SrcReg[2])) {
+                       int tmpreg = rc_find_free_temporary(c);
+                       struct rc_instruction * inst_mov = rc_insert_new_instruction(c, inst->Prev);
+                       inst_mov->I.Opcode = OPCODE_MOV;
+                       inst_mov->I.DstReg.File = PROGRAM_TEMPORARY;
+                       inst_mov->I.DstReg.Index = tmpreg;
+                       inst_mov->I.SrcReg[0] = inst->I.SrcReg[2];
+
+                       reset_srcreg(&inst->I.SrcReg[2]);
+                       inst->I.SrcReg[2].File = PROGRAM_TEMPORARY;
+                       inst->I.SrcReg[2].Index = tmpreg;
+               }
+       }
+
+       if (num_operands >= 2) {
+               if (t_src_conflict(inst->I.SrcReg[1], inst->I.SrcReg[0])) {
+                       int tmpreg = rc_find_free_temporary(c);
+                       struct rc_instruction * inst_mov = rc_insert_new_instruction(c, inst->Prev);
+                       inst_mov->I.Opcode = OPCODE_MOV;
+                       inst_mov->I.DstReg.File = PROGRAM_TEMPORARY;
+                       inst_mov->I.DstReg.Index = tmpreg;
+                       inst_mov->I.SrcReg[0] = inst->I.SrcReg[1];
+
+                       reset_srcreg(&inst->I.SrcReg[1]);
+                       inst->I.SrcReg[1].File = PROGRAM_TEMPORARY;
+                       inst->I.SrcReg[1].Index = tmpreg;
+               }
+       }
+
+       return GL_TRUE;
+}
+
+static void addArtificialOutputs(struct r300_vertex_program_compiler * compiler)
+{
+       int i;
+
+       for(i = 0; i < 32; ++i) {
+               if ((compiler->RequiredOutputs & (1 << i)) &&
+                   !(compiler->Base.Program.OutputsWritten & (1 << i))) {
+                       struct rc_instruction * inst = rc_insert_new_instruction(&compiler->Base, compiler->Base.Program.Instructions.Prev);
+                       inst->I.Opcode = OPCODE_MOV;
+
+                       inst->I.DstReg.File = PROGRAM_OUTPUT;
+                       inst->I.DstReg.Index = i;
+                       inst->I.DstReg.WriteMask = WRITEMASK_XYZW;
+
+                       inst->I.SrcReg[0].File = PROGRAM_CONSTANT;
+                       inst->I.SrcReg[0].Index = 0;
+                       inst->I.SrcReg[0].Swizzle = SWIZZLE_XYZW;
+
+                       compiler->Base.Program.OutputsWritten |= 1 << i;
+               }
+       }
+}
+
+static void nqssadceInit(struct nqssadce_state* s)
+{
+       struct r300_vertex_program_compiler * compiler = s->UserData;
+       int i;
+
+       for(i = 0; i < VERT_RESULT_MAX; ++i) {
+               if (compiler->RequiredOutputs & (1 << i))
+                       s->Outputs[i].Sourced = WRITEMASK_XYZW;
+       }
+}
+
+static GLboolean swizzleIsNative(GLuint opcode, struct prog_src_register reg)
+{
+       (void) opcode;
+       (void) reg;
+
+       return GL_TRUE;
+}
+
+
+
+void r3xx_compile_vertex_program(struct r300_vertex_program_compiler* compiler)
+{
+       addArtificialOutputs(compiler);
+
+       {
+               struct radeon_program_transformation transformations[] = {
+                       { &r300_transform_vertex_alu, 0 },
+               };
+               radeonLocalTransform(&compiler->Base, 1, transformations);
+       }
+
+       if (compiler->Base.Debug) {
+               fprintf(stderr, "Vertex program after native rewrite:\n");
+               rc_print_program(&compiler->Base.Program);
+               fflush(stdout);
+       }
+
+       {
+               /* Note: This pass has to be done seperately from ALU rewrite,
+                * otherwise non-native ALU instructions with source conflits
+                * will not be treated properly.
+                */
+               struct radeon_program_transformation transformations[] = {
+                       { &transform_source_conflicts, 0 },
+               };
+               radeonLocalTransform(&compiler->Base, 1, transformations);
+       }
+
+       if (compiler->Base.Debug) {
+               fprintf(stderr, "Vertex program after source conflict resolve:\n");
+               rc_print_program(&compiler->Base.Program);
+               fflush(stdout);
+       }
+
+       {
+               struct radeon_nqssadce_descr nqssadce = {
+                       .Init = &nqssadceInit,
+                       .IsNativeSwizzle = &swizzleIsNative,
+                       .BuildSwizzle = NULL
+               };
+               radeonNqssaDce(&compiler->Base, &nqssadce, compiler);
+
+               /* We need this step for reusing temporary registers */
+               allocate_temporary_registers(compiler);
+
+               if (compiler->Base.Debug) {
+                       fprintf(stderr, "Vertex program after NQSSADCE:\n");
+                       rc_print_program(&compiler->Base.Program);
+                       fflush(stdout);
+               }
+       }
+
+       translate_vertex_program(compiler);
+
+       rc_constants_copy(&compiler->code->constants, &compiler->Base.Program.Constants);
+
+       compiler->code->InputsRead = compiler->Base.Program.InputsRead;
+       compiler->code->OutputsWritten = compiler->Base.Program.OutputsWritten;
+
+       if (compiler->Base.Debug) {
+               printf("Final vertex program code:\n");
+               r300_vertex_program_dump(compiler->code);
+       }
+}
diff --git a/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog_dump.c b/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog_dump.c
new file mode 100644 (file)
index 0000000..39cc695
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2009 Nicolai Hähnle <nhaehnle@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#include "radeon_code.h"
+
+#include <stdio.h>
+
+static char* r300_vs_ve_ops[] = {
+       /* R300 vector ops */
+       "                 VE_NO_OP",
+       "           VE_DOT_PRODUCT",
+       "              VE_MULTIPLY",
+       "                   VE_ADD",
+       "          VE_MULTIPLY_ADD",
+       "       VE_DISTANCE_FACTOR",
+       "              VE_FRACTION",
+       "               VE_MAXIMUM",
+       "               VE_MINIMUM",
+       "VE_SET_GREATER_THAN_EQUAL",
+       "         VE_SET_LESS_THAN",
+       "        VE_MULTIPLYX2_ADD",
+       "        VE_MULTIPLY_CLAMP",
+       "            VE_FLT2FIX_DX",
+       "        VE_FLT2FIX_DX_RND",
+       /* R500 vector ops */
+       "      VE_PRED_SET_EQ_PUSH",
+       "      VE_PRED_SET_GT_PUSH",
+       "     VE_PRED_SET_GTE_PUSH",
+       "     VE_PRED_SET_NEQ_PUSH",
+       "         VE_COND_WRITE_EQ",
+       "         VE_COND_WRITE_GT",
+       "        VE_COND_WRITE_GTE",
+       "        VE_COND_WRITE_NEQ",
+       "      VE_SET_GREATER_THAN",
+       "             VE_SET_EQUAL",
+       "         VE_SET_NOT_EQUAL",
+       "               (reserved)",
+       "               (reserved)",
+       "               (reserved)",
+};
+
+static char* r300_vs_me_ops[] = {
+       /* R300 math ops */
+       "                 ME_NO_OP",
+       "          ME_EXP_BASE2_DX",
+       "          ME_LOG_BASE2_DX",
+       "          ME_EXP_BASEE_FF",
+       "        ME_LIGHT_COEFF_DX",
+       "         ME_POWER_FUNC_FF",
+       "              ME_RECIP_DX",
+       "              ME_RECIP_FF",
+       "         ME_RECIP_SQRT_DX",
+       "         ME_RECIP_SQRT_FF",
+       "              ME_MULTIPLY",
+       "     ME_EXP_BASE2_FULL_DX",
+       "     ME_LOG_BASE2_FULL_DX",
+       " ME_POWER_FUNC_FF_CLAMP_B",
+       "ME_POWER_FUNC_FF_CLAMP_B1",
+       "ME_POWER_FUNC_FF_CLAMP_01",
+       "                   ME_SIN",
+       "                   ME_COS",
+       /* R500 math ops */
+       "        ME_LOG_BASE2_IEEE",
+       "            ME_RECIP_IEEE",
+       "       ME_RECIP_SQRT_IEEE",
+       "           ME_PRED_SET_EQ",
+       "           ME_PRED_SET_GT",
+       "          ME_PRED_SET_GTE",
+       "          ME_PRED_SET_NEQ",
+       "          ME_PRED_SET_CLR",
+       "          ME_PRED_SET_INV",
+       "          ME_PRED_SET_POP",
+       "      ME_PRED_SET_RESTORE",
+       "               (reserved)",
+       "               (reserved)",
+       "               (reserved)",
+};
+
+/* XXX refactor to avoid clashing symbols */
+static char* r300_vs_src_debug[] = {
+       "t",
+       "i",
+       "c",
+       "a",
+};
+
+static char* r300_vs_dst_debug[] = {
+       "t",
+       "a0",
+       "o",
+       "ox",
+       "a",
+       "i",
+       "u",
+       "u",
+};
+
+static char* r300_vs_swiz_debug[] = {
+       "X",
+       "Y",
+       "Z",
+       "W",
+       "0",
+       "1",
+       "U",
+       "U",
+};
+
+
+static void r300_vs_op_dump(uint32_t op)
+{
+       printf(" dst: %d%s op: ",
+                       (op >> 13) & 0x7f, r300_vs_dst_debug[(op >> 8) & 0x7]);
+       if (op & 0x80) {
+               if (op & 0x1) {
+                       printf("PVS_MACRO_OP_2CLK_M2X_ADD\n");
+               } else {
+                       printf("   PVS_MACRO_OP_2CLK_MADD\n");
+               }
+       } else if (op & 0x40) {
+               printf("%s\n", r300_vs_me_ops[op & 0x1f]);
+       } else {
+               printf("%s\n", r300_vs_ve_ops[op & 0x1f]);
+       }
+}
+
+static void r300_vs_src_dump(uint32_t src)
+{
+       printf(" reg: %d%s swiz: %s%s/%s%s/%s%s/%s%s\n",
+                       (src >> 5) & 0x7f, r300_vs_src_debug[src & 0x3],
+                       src & (1 << 25) ? "-" : " ",
+                       r300_vs_swiz_debug[(src >> 13) & 0x7],
+                       src & (1 << 26) ? "-" : " ",
+                       r300_vs_swiz_debug[(src >> 16) & 0x7],
+                       src & (1 << 27) ? "-" : " ",
+                       r300_vs_swiz_debug[(src >> 19) & 0x7],
+                       src & (1 << 28) ? "-" : " ",
+                       r300_vs_swiz_debug[(src >> 22) & 0x7]);
+}
+
+void r300_vertex_program_dump(struct r300_vertex_program_code * vs)
+{
+       unsigned instrcount = vs->length / 4;
+       unsigned i;
+
+       for(i = 0; i < instrcount; i++) {
+               unsigned offset = i*4;
+               unsigned src;
+
+               printf("%d: op: 0x%08x", i, vs->body.d[offset]);
+               r300_vs_op_dump(vs->body.d[offset]);
+
+               for(src = 0; src < 3; ++src) {
+                       printf(" src%i: 0x%08x", src, vs->body.d[offset+1+src]);
+                       r300_vs_src_dump(vs->body.d[offset+1+src]);
+               }
+       }
+}
 
 #include "r500_fragprog.h"
 
-static void reset_srcreg(struct prog_src_register* reg)
-{
-       _mesa_bzero(reg, sizeof(*reg));
-       reg->Swizzle = SWIZZLE_NOOP;
-}
+#include "../r300_reg.h"
 
-static struct prog_src_register shadow_ambient(struct gl_program *program, int tmu)
+static struct prog_src_register shadow_ambient(struct radeon_compiler * c, int tmu)
 {
-       gl_state_index fail_value_tokens[STATE_LENGTH] = {
-               STATE_INTERNAL, STATE_SHADOW_AMBIENT, 0, 0, 0
-       };
        struct prog_src_register reg = { 0, };
 
-       fail_value_tokens[2] = tmu;
        reg.File = PROGRAM_STATE_VAR;
-       reg.Index = _mesa_add_state_reference(program->Parameters, fail_value_tokens);
+       reg.Index = rc_constants_add_state(&c->Program.Constants, RC_STATE_SHADOW_AMBIENT, tmu);
        reg.Swizzle = SWIZZLE_WWWW;
        return reg;
 }
 
 /**
  * Transform TEX, TXP, TXB, and KIL instructions in the following way:
- *  - premultiply texture coordinates for RECT
- *  - extract operand swizzles
- *  - introduce a temporary register when write masks are needed
- *
+ *  - implement texture compare (shadow extensions)
+ *  - extract non-native source / destination operands
  */
 GLboolean r500_transform_TEX(
-       struct radeon_transform_context *t,
-       struct prog_instruction* orig_inst, void* data)
+       struct radeon_compiler * c,
+       struct rc_instruction * inst,
+       void* data)
 {
        struct r300_fragment_program_compiler *compiler =
                (struct r300_fragment_program_compiler*)data;
-       struct prog_instruction inst = *orig_inst;
-       struct prog_instruction* tgt;
-       GLboolean destredirect = GL_FALSE;
-
-       if (inst.Opcode != OPCODE_TEX &&
-           inst.Opcode != OPCODE_TXB &&
-           inst.Opcode != OPCODE_TXP &&
-           inst.Opcode != OPCODE_KIL)
+
+       if (inst->I.Opcode != OPCODE_TEX &&
+           inst->I.Opcode != OPCODE_TXB &&
+           inst->I.Opcode != OPCODE_TXP &&
+           inst->I.Opcode != OPCODE_KIL)
                return GL_FALSE;
 
        /* ARB_shadow & EXT_shadow_funcs */
-       if (inst.Opcode != OPCODE_KIL &&
-           t->Program->ShadowSamplers & (1 << inst.TexSrcUnit)) {
-               GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func;
+       if (inst->I.Opcode != OPCODE_KIL &&
+           c->Program.ShadowSamplers & (1 << inst->I.TexSrcUnit)) {
+               GLuint comparefunc = GL_NEVER + compiler->state.unit[inst->I.TexSrcUnit].texture_compare_func;
 
                if (comparefunc == GL_NEVER || comparefunc == GL_ALWAYS) {
-                       tgt = radeonAppendInstructions(t->Program, 1);
+                       inst->I.Opcode = OPCODE_MOV;
 
-                       tgt->Opcode = OPCODE_MOV;
-                       tgt->DstReg = inst.DstReg;
                        if (comparefunc == GL_ALWAYS) {
-                               tgt->SrcReg[0].File = PROGRAM_BUILTIN;
-                               tgt->SrcReg[0].Swizzle = SWIZZLE_1111;
+                               inst->I.SrcReg[0].File = PROGRAM_BUILTIN;
+                               inst->I.SrcReg[0].Swizzle = SWIZZLE_1111;
                        } else {
-                               tgt->SrcReg[0] = shadow_ambient(t->Program, inst.TexSrcUnit);
+                               inst->I.SrcReg[0] = shadow_ambient(c, inst->I.TexSrcUnit);
                        }
+
                        return GL_TRUE;
+               } else {
+                       GLuint comparefunc = GL_NEVER + compiler->state.unit[inst->I.TexSrcUnit].texture_compare_func;
+                       GLuint depthmode = compiler->state.unit[inst->I.TexSrcUnit].depth_texture_mode;
+                       struct rc_instruction * inst_rcp = rc_insert_new_instruction(c, inst);
+                       struct rc_instruction * inst_mad = rc_insert_new_instruction(c, inst_rcp);
+                       struct rc_instruction * inst_cmp = rc_insert_new_instruction(c, inst_mad);
+                       int pass, fail;
+
+                       inst_rcp->I.Opcode = OPCODE_RCP;
+                       inst_rcp->I.DstReg.File = PROGRAM_TEMPORARY;
+                       inst_rcp->I.DstReg.Index = rc_find_free_temporary(c);
+                       inst_rcp->I.DstReg.WriteMask = WRITEMASK_W;
+                       inst_rcp->I.SrcReg[0] = inst->I.SrcReg[0];
+                       inst_rcp->I.SrcReg[0].Swizzle = SWIZZLE_WWWW;
+
+                       inst_cmp->I.DstReg = inst->I.DstReg;
+                       inst->I.DstReg.File = PROGRAM_TEMPORARY;
+                       inst->I.DstReg.Index = rc_find_free_temporary(c);
+                       inst->I.DstReg.WriteMask = WRITEMASK_XYZW;
+
+                       inst_mad->I.Opcode = OPCODE_MAD;
+                       inst_mad->I.DstReg.File = PROGRAM_TEMPORARY;
+                       inst_mad->I.DstReg.Index = rc_find_free_temporary(c);
+                       inst_mad->I.SrcReg[0] = inst->I.SrcReg[0];
+                       inst_mad->I.SrcReg[0].Swizzle = SWIZZLE_ZZZZ;
+                       inst_mad->I.SrcReg[1].File = PROGRAM_TEMPORARY;
+                       inst_mad->I.SrcReg[1].Index = inst_rcp->I.DstReg.Index;
+                       inst_mad->I.SrcReg[1].Swizzle = SWIZZLE_WWWW;
+                       inst_mad->I.SrcReg[2].File = PROGRAM_TEMPORARY;
+                       inst_mad->I.SrcReg[2].Index = inst->I.DstReg.Index;
+                       if (depthmode == 0) /* GL_LUMINANCE */
+                               inst_mad->I.SrcReg[2].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z);
+                       else if (depthmode == 2) /* GL_ALPHA */
+                               inst_mad->I.SrcReg[2].Swizzle = SWIZZLE_WWWW;
+
+                       /* Recall that SrcReg[0] is tex, SrcReg[2] is r and:
+                        *   r  < tex  <=>      -tex+r < 0
+                        *   r >= tex  <=> not (-tex+r < 0 */
+                       if (comparefunc == GL_LESS || comparefunc == GL_GEQUAL)
+                               inst_mad->I.SrcReg[2].Negate = inst_mad->I.SrcReg[2].Negate ^ NEGATE_XYZW;
+                       else
+                               inst_mad->I.SrcReg[0].Negate = inst_mad->I.SrcReg[0].Negate ^ NEGATE_XYZW;
+
+                       inst_cmp->I.Opcode = OPCODE_CMP;
+                       /* DstReg has been filled out above */
+                       inst_cmp->I.SrcReg[0].File = PROGRAM_TEMPORARY;
+                       inst_cmp->I.SrcReg[0].Index = inst_mad->I.DstReg.Index;
+
+                       if (comparefunc == GL_LESS || comparefunc == GL_GREATER) {
+                               pass = 1;
+                               fail = 2;
+                       } else {
+                               pass = 2;
+                               fail = 1;
+                       }
+
+                       inst_cmp->I.SrcReg[pass].File = PROGRAM_BUILTIN;
+                       inst_cmp->I.SrcReg[pass].Swizzle = SWIZZLE_1111;
+                       inst_cmp->I.SrcReg[fail] = shadow_ambient(c, inst->I.TexSrcUnit);
                }
+       }
 
-               inst.DstReg.File = PROGRAM_TEMPORARY;
-               inst.DstReg.Index = radeonFindFreeTemporary(t);
-               inst.DstReg.WriteMask = WRITEMASK_XYZW;
-       } else if (inst.Opcode != OPCODE_KIL && inst.DstReg.File != PROGRAM_TEMPORARY) {
-               int tempreg = radeonFindFreeTemporary(t);
+       /* Cannot write texture to output registers */
+       if (inst->I.Opcode != OPCODE_KIL && inst->I.DstReg.File != PROGRAM_TEMPORARY) {
+               struct rc_instruction * inst_mov = rc_insert_new_instruction(c, inst);
 
-               inst.DstReg.File = PROGRAM_TEMPORARY;
-               inst.DstReg.Index = tempreg;
-               inst.DstReg.WriteMask = WRITEMASK_XYZW;
-               destredirect = GL_TRUE;
-       }
+               inst_mov->I.Opcode = OPCODE_MOV;
+               inst_mov->I.DstReg = inst->I.DstReg;
+               inst_mov->I.SrcReg[0].File = PROGRAM_TEMPORARY;
+               inst_mov->I.SrcReg[0].Index = rc_find_free_temporary(c);
 
-       if (inst.SrcReg[0].File != PROGRAM_TEMPORARY && inst.SrcReg[0].File != PROGRAM_INPUT) {
-               int tmpreg = radeonFindFreeTemporary(t);
-               tgt = radeonAppendInstructions(t->Program, 1);
-               tgt->Opcode = OPCODE_MOV;
-               tgt->DstReg.File = PROGRAM_TEMPORARY;
-               tgt->DstReg.Index = tmpreg;
-               tgt->SrcReg[0] = inst.SrcReg[0];
-
-               reset_srcreg(&inst.SrcReg[0]);
-               inst.SrcReg[0].File = PROGRAM_TEMPORARY;
-               inst.SrcReg[0].Index = tmpreg;
+               inst->I.DstReg.File = PROGRAM_TEMPORARY;
+               inst->I.DstReg.Index = inst_mov->I.SrcReg[0].Index;
+               inst->I.DstReg.WriteMask = WRITEMASK_XYZW;
        }
 
-       tgt = radeonAppendInstructions(t->Program, 1);
-       _mesa_copy_instructions(tgt, &inst, 1);
-
-       if (inst.Opcode != OPCODE_KIL &&
-           t->Program->ShadowSamplers & (1 << inst.TexSrcUnit)) {
-               GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func;
-               GLuint depthmode = compiler->fp->state.unit[inst.TexSrcUnit].depth_texture_mode;
-               int rcptemp = radeonFindFreeTemporary(t);
-               int pass, fail;
-
-               tgt = radeonAppendInstructions(t->Program, 3);
-
-               tgt[0].Opcode = OPCODE_RCP;
-               tgt[0].DstReg.File = PROGRAM_TEMPORARY;
-               tgt[0].DstReg.Index = rcptemp;
-               tgt[0].DstReg.WriteMask = WRITEMASK_W;
-               tgt[0].SrcReg[0] = inst.SrcReg[0];
-               tgt[0].SrcReg[0].Swizzle = SWIZZLE_WWWW;
-
-               tgt[1].Opcode = OPCODE_MAD;
-               tgt[1].DstReg = inst.DstReg;
-               tgt[1].DstReg.WriteMask = orig_inst->DstReg.WriteMask;
-               tgt[1].SrcReg[0] = inst.SrcReg[0];
-               tgt[1].SrcReg[0].Swizzle = SWIZZLE_ZZZZ;
-               tgt[1].SrcReg[1].File = PROGRAM_TEMPORARY;
-               tgt[1].SrcReg[1].Index = rcptemp;
-               tgt[1].SrcReg[1].Swizzle = SWIZZLE_WWWW;
-               tgt[1].SrcReg[2].File = PROGRAM_TEMPORARY;
-               tgt[1].SrcReg[2].Index = inst.DstReg.Index;
-               if (depthmode == 0) /* GL_LUMINANCE */
-                       tgt[1].SrcReg[2].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z);
-               else if (depthmode == 2) /* GL_ALPHA */
-                       tgt[1].SrcReg[2].Swizzle = SWIZZLE_WWWW;
-
-               /* Recall that SrcReg[0] is tex, SrcReg[2] is r and:
-                *   r  < tex  <=>      -tex+r < 0
-                *   r >= tex  <=> not (-tex+r < 0 */
-               if (comparefunc == GL_LESS || comparefunc == GL_GEQUAL)
-                       tgt[1].SrcReg[2].Negate = tgt[0].SrcReg[2].Negate ^ NEGATE_XYZW;
-               else
-                       tgt[1].SrcReg[0].Negate = tgt[0].SrcReg[0].Negate ^ NEGATE_XYZW;
-
-               tgt[2].Opcode = OPCODE_CMP;
-               tgt[2].DstReg = orig_inst->DstReg;
-               tgt[2].SrcReg[0].File = PROGRAM_TEMPORARY;
-               tgt[2].SrcReg[0].Index = tgt[1].DstReg.Index;
-
-               if (comparefunc == GL_LESS || comparefunc == GL_GREATER) {
-                       pass = 1;
-                       fail = 2;
-               } else {
-                       pass = 2;
-                       fail = 1;
-               }
+       /* Cannot read texture coordinate from constants file */
+       if (inst->I.SrcReg[0].File != PROGRAM_TEMPORARY && inst->I.SrcReg[0].File != PROGRAM_INPUT) {
+               struct rc_instruction * inst_mov = rc_insert_new_instruction(c, inst->Prev);
 
-               tgt[2].SrcReg[pass].File = PROGRAM_BUILTIN;
-               tgt[2].SrcReg[pass].Swizzle = SWIZZLE_1111;
-               tgt[2].SrcReg[fail] = shadow_ambient(t->Program, inst.TexSrcUnit);
-       } else if (destredirect) {
-               tgt = radeonAppendInstructions(t->Program, 1);
+               inst_mov->I.Opcode = OPCODE_MOV;
+               inst_mov->I.DstReg.File = PROGRAM_TEMPORARY;
+               inst_mov->I.DstReg.Index = rc_find_free_temporary(c);
+               inst_mov->I.SrcReg[0] = inst->I.SrcReg[0];
 
-               tgt->Opcode = OPCODE_MOV;
-               tgt->DstReg = orig_inst->DstReg;
-               tgt->SrcReg[0].File = PROGRAM_TEMPORARY;
-               tgt->SrcReg[0].Index = inst.DstReg.Index;
+               reset_srcreg(&inst->I.SrcReg[0]);
+               inst->I.SrcReg[0].File = PROGRAM_TEMPORARY;
+               inst->I.SrcReg[0].Index = inst_mov->I.DstReg.Index;
        }
 
        return GL_TRUE;
@@ -249,7 +232,6 @@ GLboolean r500FPIsNativeSwizzle(GLuint opcode, struct prog_src_register reg)
  */
 void r500FPBuildSwizzle(struct nqssadce_state *s, struct prog_dst_register dst, struct prog_src_register src)
 {
-       struct prog_instruction *inst;
        GLuint negatebase[2] = { 0, 0 };
        int i;
 
@@ -260,20 +242,16 @@ void r500FPBuildSwizzle(struct nqssadce_state *s, struct prog_dst_register dst,
                negatebase[GET_BIT(src.Negate, i)] |= 1 << i;
        }
 
-       _mesa_insert_instructions(s->Program, s->IP, (negatebase[0] ? 1 : 0) + (negatebase[1] ? 1 : 0));
-       inst = s->Program->Instructions + s->IP;
-
        for(i = 0; i <= 1; ++i) {
                if (!negatebase[i])
                        continue;
 
-               inst->Opcode = OPCODE_MOV;
-               inst->DstReg = dst;
-               inst->DstReg.WriteMask = negatebase[i];
-               inst->SrcReg[0] = src;
-               inst->SrcReg[0].Negate = (i == 0) ? NEGATE_NONE : NEGATE_XYZW;
-               inst++;
-               s->IP++;
+               struct rc_instruction *inst = rc_insert_new_instruction(s->Compiler, s->IP->Prev);
+               inst->I.Opcode = OPCODE_MOV;
+               inst->I.DstReg = dst;
+               inst->I.DstReg.WriteMask = negatebase[i];
+               inst->I.SrcReg[0] = src;
+               inst->I.SrcReg[0].Negate = (i == 0) ? NEGATE_NONE : NEGATE_XYZW;
        }
 }
 
@@ -375,9 +353,9 @@ static char *to_texop(int val)
   return NULL;
 }
 
-void r500FragmentProgramDump(union rX00_fragment_program_code *c)
+void r500FragmentProgramDump(struct rX00_fragment_program_code *c)
 {
-  struct r500_fragment_program_code *code = &c->r500;
+  struct r500_fragment_program_code *code = &c->code.r500;
   fprintf(stderr, "R500 Fragment Program:\n--------\n");
 
   int n;
@@ -385,15 +363,6 @@ void r500FragmentProgramDump(union rX00_fragment_program_code *c)
   uint32_t inst0;
   char *str = NULL;
 
-  if (code->const_nr) {
-    fprintf(stderr, "--------\nConstants:\n");
-    for (n = 0; n < code->const_nr; n++) {
-      fprintf(stderr, "Constant %d: %i[%i]\n", n,
-        code->constant[n].File, code->constant[n].Index);
-    }
-    fprintf(stderr, "--------\n");
-  }
-
   for (n = 0; n < code->inst_end+1; n++) {
     inst0 = inst = code->inst[n].inst0;
     fprintf(stderr,"%d\t0:CMN_INST   0x%08x:", n, inst);
 #include "shader/prog_parameter.h"
 #include "shader/prog_instruction.h"
 
-#include "r300_context.h"
+#include "radeon_compiler.h"
 #include "radeon_nqssadce.h"
 
-extern GLboolean r500BuildFragmentProgramHwCode(struct r300_fragment_program_compiler *compiler);
+extern void r500BuildFragmentProgramHwCode(struct r300_fragment_program_compiler *compiler);
 
-extern void r500FragmentProgramDump(union rX00_fragment_program_code *c);
+extern void r500FragmentProgramDump(struct rX00_fragment_program_code *c);
 
 extern GLboolean r500FPIsNativeSwizzle(GLuint opcode, struct prog_src_register reg);
 
 extern void r500FPBuildSwizzle(struct nqssadce_state *s, struct prog_dst_register dst, struct prog_src_register src);
 
-extern GLboolean r500_transform_TEX(struct radeon_transform_context *t, struct prog_instruction* orig_inst, void* data);
+extern GLboolean r500_transform_TEX(
+       struct radeon_compiler * c,
+       struct rc_instruction * inst,
+       void* data);
 
 #endif
 
 #include "r500_fragprog.h"
 
+#include "../r300_reg.h"
+
 #include "radeon_program_pair.h"
 
 
 #define PROG_CODE \
        struct r300_fragment_program_compiler *c = (struct r300_fragment_program_compiler*)data; \
-       struct r500_fragment_program_code *code = &c->code->r500
+       struct r500_fragment_program_code *code = &c->code->code.r500
 
 #define error(fmt, args...) do {                       \
-               fprintf(stderr, "%s::%s(): " fmt "\n",  \
+               rc_error(&c->Base, "%s::%s(): " fmt "\n",       \
                        __FILE__, __FUNCTION__, ##args);        \
        } while(0)
 
 
-/**
- * Callback to register hardware constants.
- */
-static GLboolean emit_const(void *data, GLuint file, GLuint idx, GLuint *hwindex)
-{
-       PROG_CODE;
-
-       for (*hwindex = 0; *hwindex < code->const_nr; ++*hwindex) {
-               if (code->constant[*hwindex].File == file &&
-                   code->constant[*hwindex].Index == idx)
-                       break;
-       }
-
-       if (*hwindex >= code->const_nr) {
-               if (*hwindex >= R500_PFS_NUM_CONST_REGS) {
-                       error("Out of hw constants!\n");
-                       return GL_FALSE;
-               }
-
-               code->const_nr++;
-               code->constant[*hwindex].File = file;
-               code->constant[*hwindex].Index = idx;
-       }
-
-       return GL_TRUE;
-}
-
-static GLuint translate_rgb_op(GLuint opcode)
+static GLuint translate_rgb_op(struct r300_fragment_program_compiler *c, GLuint opcode)
 {
        switch(opcode) {
        case OPCODE_CMP: return R500_ALU_RGBA_OP_CMP;
@@ -106,7 +81,7 @@ static GLuint translate_rgb_op(GLuint opcode)
        }
 }
 
-static GLuint translate_alpha_op(GLuint opcode)
+static GLuint translate_alpha_op(struct r300_fragment_program_compiler *c, GLuint opcode)
 {
        switch(opcode) {
        case OPCODE_CMP: return R500_ALPHA_OP_CMP;
@@ -189,8 +164,8 @@ static GLboolean emit_paired(void *data, struct radeon_pair_instruction *inst)
 
        int ip = ++code->inst_end;
 
-       code->inst[ip].inst5 = translate_rgb_op(inst->RGB.Opcode);
-       code->inst[ip].inst4 = translate_alpha_op(inst->Alpha.Opcode);
+       code->inst[ip].inst5 = translate_rgb_op(c, inst->RGB.Opcode);
+       code->inst[ip].inst4 = translate_alpha_op(c, inst->Alpha.Opcode);
 
        if (inst->RGB.OutputWriteMask || inst->Alpha.OutputWriteMask || inst->Alpha.DepthWriteMask)
                code->inst[ip].inst0 = R500_INST_TYPE_OUT;
@@ -202,7 +177,7 @@ static GLboolean emit_paired(void *data, struct radeon_pair_instruction *inst)
        code->inst[ip].inst0 |= (inst->RGB.OutputWriteMask << 15) | (inst->Alpha.OutputWriteMask << 18);
        if (inst->Alpha.DepthWriteMask) {
                code->inst[ip].inst4 |= R500_ALPHA_W_OMASK;
-               c->fp->writes_depth = GL_TRUE;
+               c->code->writes_depth = GL_TRUE;
        }
 
        code->inst[ip].inst4 |= R500_ALPHA_ADDRD(inst->Alpha.DestIndex);
@@ -234,19 +209,19 @@ static GLboolean emit_paired(void *data, struct radeon_pair_instruction *inst)
        return GL_TRUE;
 }
 
-static GLuint translate_strq_swizzle(struct prog_src_register src)
+static GLuint translate_strq_swizzle(GLuint swizzle)
 {
        GLuint swiz = 0;
        int i;
        for (i = 0; i < 4; i++)
-               swiz |= (GET_SWZ(src.Swizzle, i) & 0x3) << i*2;
+               swiz |= (GET_SWZ(swizzle, i) & 0x3) << i*2;
        return swiz;
 }
 
 /**
  * Emit a single TEX instruction
  */
-static GLboolean emit_tex(void *data, struct prog_instruction *inst)
+static GLboolean emit_tex(void *data, struct radeon_pair_texture_instruction *inst)
 {
        PROG_CODE;
 
@@ -258,7 +233,7 @@ static GLboolean emit_tex(void *data, struct prog_instruction *inst)
        int ip = ++code->inst_end;
 
        code->inst[ip].inst0 = R500_INST_TYPE_TEX
-               | (inst->DstReg.WriteMask << 11)
+               | (inst->WriteMask << 11)
                | R500_INST_TEX_SEM_WAIT;
        code->inst[ip].inst1 = R500_TEX_ID(inst->TexSrcUnit)
                | R500_TEX_SEM_ACQUIRE | R500_TEX_IGNORE_UNCOVERED;
@@ -267,25 +242,25 @@ static GLboolean emit_tex(void *data, struct prog_instruction *inst)
                code->inst[ip].inst1 |= R500_TEX_UNSCALED;
 
        switch (inst->Opcode) {
-       case OPCODE_KIL:
+       case RADEON_OPCODE_KIL:
                code->inst[ip].inst1 |= R500_TEX_INST_TEXKILL;
                break;
-       case OPCODE_TEX:
+       case RADEON_OPCODE_TEX:
                code->inst[ip].inst1 |= R500_TEX_INST_LD;
                break;
-       case OPCODE_TXB:
+       case RADEON_OPCODE_TXB:
                code->inst[ip].inst1 |= R500_TEX_INST_LODBIAS;
                break;
-       case OPCODE_TXP:
+       case RADEON_OPCODE_TXP:
                code->inst[ip].inst1 |= R500_TEX_INST_PROJ;
                break;
        default:
                error("emit_tex can't handle opcode %x\n", inst->Opcode);
        }
 
-       code->inst[ip].inst2 = R500_TEX_SRC_ADDR(inst->SrcReg[0].Index)
-               | (translate_strq_swizzle(inst->SrcReg[0]) << 8)
-               | R500_TEX_DST_ADDR(inst->DstReg.Index)
+       code->inst[ip].inst2 = R500_TEX_SRC_ADDR(inst->SrcIndex)
+               | (translate_strq_swizzle(inst->SrcSwizzle) << 8)
+               | R500_TEX_DST_ADDR(inst->DestIndex)
                | R500_TEX_DST_R_SWIZ_R | R500_TEX_DST_G_SWIZ_G
                | R500_TEX_DST_B_SWIZ_B | R500_TEX_DST_A_SWIZ_A;
 
@@ -293,35 +268,32 @@ static GLboolean emit_tex(void *data, struct prog_instruction *inst)
 }
 
 static const struct radeon_pair_handler pair_handler = {
-       .EmitConst = emit_const,
        .EmitPaired = emit_paired,
        .EmitTex = emit_tex,
        .MaxHwTemps = 128
 };
 
-GLboolean r500BuildFragmentProgramHwCode(struct r300_fragment_program_compiler *compiler)
+void r500BuildFragmentProgramHwCode(struct r300_fragment_program_compiler *compiler)
 {
-       struct r500_fragment_program_code *code = &compiler->code->r500;
+       struct r500_fragment_program_code *code = &compiler->code->code.r500;
 
        _mesa_bzero(code, sizeof(*code));
        code->max_temp_idx = 1;
-       code->inst_offset = 0;
        code->inst_end = -1;
 
-       if (!radeonPairProgram(compiler->r300->radeon.glCtx, compiler->program, &pair_handler, compiler))
-               return GL_FALSE;
+       radeonPairProgram(compiler, &pair_handler, compiler);
+       if (compiler->Base.Error)
+               return;
 
        if ((code->inst[code->inst_end].inst0 & R500_INST_TYPE_MASK) != R500_INST_TYPE_OUT) {
                /* This may happen when dead-code elimination is disabled or
                 * when most of the fragment program logic is leading to a KIL */
                if (code->inst_end >= 511) {
-                       error("Introducing fake OUT: Too many instructions");
-                       return GL_FALSE;
+                       rc_error(&compiler->Base, "Introducing fake OUT: Too many instructions");
+                       return;
                }
 
                int ip = ++code->inst_end;
                code->inst[ip].inst0 = R500_INST_TYPE_OUT | R500_INST_TEX_SEM_WAIT;
        }
-
-       return GL_TRUE;
 }
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_code.c b/src/mesa/drivers/dri/r300/compiler/radeon_code.c
new file mode 100644 (file)
index 0000000..c792300
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2009 Nicolai Haehnle.
+ *
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include "main/mtypes.h"
+#include "shader/prog_instruction.h"
+
+#include "radeon_code.h"
+
+void rc_constants_init(struct rc_constant_list * c)
+{
+       memset(c, 0, sizeof(*c));
+}
+
+/**
+ * Copy a constants structure, assuming that the destination structure
+ * is not initialized.
+ */
+void rc_constants_copy(struct rc_constant_list * dst, struct rc_constant_list * src)
+{
+       dst->Constants = malloc(sizeof(struct rc_constant) * src->Count);
+       memcpy(dst->Constants, src->Constants, sizeof(struct rc_constant) * src->Count);
+       dst->Count = src->Count;
+       dst->_Reserved = src->Count;
+}
+
+void rc_constants_destroy(struct rc_constant_list * c)
+{
+       free(c->Constants);
+       memset(c, 0, sizeof(*c));
+}
+
+unsigned rc_constants_add(struct rc_constant_list * c, struct rc_constant * constant)
+{
+       unsigned index = c->Count;
+
+       if (c->Count >= c->_Reserved) {
+               struct rc_constant * newlist;
+
+               c->_Reserved = c->_Reserved * 2;
+               if (!c->_Reserved)
+                       c->_Reserved = 16;
+
+               newlist = malloc(sizeof(struct rc_constant) * c->_Reserved);
+               memcpy(newlist, c->Constants, sizeof(struct rc_constant) * c->Count);
+
+               free(c->Constants);
+               c->Constants = newlist;
+       }
+
+       c->Constants[index] = *constant;
+       c->Count++;
+
+       return index;
+}
+
+
+/**
+ * Add a state vector to the constant list, while trying to avoid duplicates.
+ */
+unsigned rc_constants_add_state(struct rc_constant_list * c, unsigned state0, unsigned state1)
+{
+       unsigned index;
+       struct rc_constant constant;
+
+       for(index = 0; index < c->Count; ++index) {
+               if (c->Constants[index].Type == RC_CONSTANT_STATE) {
+                       if (c->Constants[index].u.State[0] == state0 &&
+                           c->Constants[index].u.State[1] == state1)
+                               return index;
+               }
+       }
+
+       memset(&constant, 0, sizeof(constant));
+       constant.Type = RC_CONSTANT_STATE;
+       constant.Size = 4;
+       constant.u.State[0] = state0;
+       constant.u.State[1] = state1;
+
+       return rc_constants_add(c, &constant);
+}
+
+
+/**
+ * Add an immediate vector to the constant list, while trying to avoid
+ * duplicates.
+ */
+unsigned rc_constants_add_immediate_vec4(struct rc_constant_list * c, const float * data)
+{
+       unsigned index;
+       struct rc_constant constant;
+
+       for(index = 0; index < c->Count; ++index) {
+               if (c->Constants[index].Type == RC_CONSTANT_IMMEDIATE) {
+                       if (!memcmp(c->Constants[index].u.Immediate, data, sizeof(float)*4))
+                               return index;
+               }
+       }
+
+       memset(&constant, 0, sizeof(constant));
+       constant.Type = RC_CONSTANT_IMMEDIATE;
+       constant.Size = 4;
+       memcpy(constant.u.Immediate, data, sizeof(float) * 4);
+
+       return rc_constants_add(c, &constant);
+}
+
+
+/**
+ * Add an immediate scalar to the constant list, while trying to avoid
+ * duplicates.
+ */
+unsigned rc_constants_add_immediate_scalar(struct rc_constant_list * c, float data, unsigned * swizzle)
+{
+       unsigned index;
+       int free_index = -1;
+       struct rc_constant constant;
+
+       for(index = 0; index < c->Count; ++index) {
+               if (c->Constants[index].Type == RC_CONSTANT_IMMEDIATE) {
+                       for(unsigned comp = 0; comp < c->Constants[index].Size; ++comp) {
+                               if (c->Constants[index].u.Immediate[comp] == data) {
+                                       *swizzle = MAKE_SWIZZLE4(comp, comp, comp, comp);
+                                       return index;
+                               }
+                       }
+
+                       if (c->Constants[index].Size < 4)
+                               free_index = index;
+               }
+       }
+
+       if (free_index >= 0) {
+               unsigned comp = c->Constants[free_index].Size++;
+               c->Constants[free_index].u.Immediate[comp] = data;
+               *swizzle = MAKE_SWIZZLE4(comp, comp, comp, comp);
+               return free_index;
+       }
+
+       memset(&constant, 0, sizeof(constant));
+       constant.Type = RC_CONSTANT_IMMEDIATE;
+       constant.Size = 1;
+       constant.u.Immediate[0] = data;
+       *swizzle = SWIZZLE_XXXX;
+
+       return rc_constants_add(c, &constant);
+}
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_code.h b/src/mesa/drivers/dri/r300/compiler/radeon_code.h
new file mode 100644 (file)
index 0000000..0806fb1
--- /dev/null
@@ -0,0 +1,206 @@
+/*
+ * Copyright 2009 Nicolai Hähnle <nhaehnle@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#ifndef RADEON_CODE_H
+#define RADEON_CODE_H
+
+#include <stdint.h>
+
+#define R300_PFS_MAX_ALU_INST     64
+#define R300_PFS_MAX_TEX_INST     32
+#define R300_PFS_MAX_TEX_INDIRECT 4
+#define R300_PFS_NUM_TEMP_REGS    32
+#define R300_PFS_NUM_CONST_REGS   32
+
+#define R500_PFS_MAX_INST         512
+#define R500_PFS_NUM_TEMP_REGS    128
+#define R500_PFS_NUM_CONST_REGS   256
+
+
+#define STATE_R300_WINDOW_DIMENSION (STATE_INTERNAL_DRIVER+0)
+
+enum {
+       /**
+        * External constants are constants whose meaning is unknown to this
+        * compiler. For example, a Mesa gl_program's constants are turned
+        * into external constants.
+        */
+       RC_CONSTANT_EXTERNAL = 0,
+
+       RC_CONSTANT_IMMEDIATE,
+
+       /**
+        * Constant referring to state that is known by this compiler,
+        * see RC_STATE_xxx, i.e. *not* arbitrary Mesa (or other) state.
+        */
+       RC_CONSTANT_STATE
+};
+
+enum {
+       RC_STATE_SHADOW_AMBIENT = 0,
+
+       RC_STATE_R300_WINDOW_DIMENSION,
+       RC_STATE_R300_TEXRECT_FACTOR
+};
+
+struct rc_constant {
+       unsigned Type:2; /**< RC_CONSTANT_xxx */
+       unsigned Size:3;
+
+       union {
+               unsigned External;
+               float Immediate[4];
+               unsigned State[2];
+       } u;
+};
+
+struct rc_constant_list {
+       struct rc_constant * Constants;
+       unsigned Count;
+
+       unsigned _Reserved;
+};
+
+void rc_constants_init(struct rc_constant_list * c);
+void rc_constants_copy(struct rc_constant_list * dst, struct rc_constant_list * src);
+void rc_constants_destroy(struct rc_constant_list * c);
+unsigned rc_constants_add(struct rc_constant_list * c, struct rc_constant * constant);
+unsigned rc_constants_add_state(struct rc_constant_list * c, unsigned state1, unsigned state2);
+unsigned rc_constants_add_immediate_vec4(struct rc_constant_list * c, const float * data);
+unsigned rc_constants_add_immediate_scalar(struct rc_constant_list * c, float data, unsigned * swizzle);
+
+/**
+ * Stores state that influences the compilation of a fragment program.
+ */
+struct r300_fragment_program_external_state {
+       struct {
+               /**
+                * If the sampler is used as a shadow sampler,
+                * this field is:
+                *  0 - GL_LUMINANCE
+                *  1 - GL_INTENSITY
+                *  2 - GL_ALPHA
+                * depending on the depth texture mode.
+                */
+               unsigned depth_texture_mode : 2;
+
+               /**
+                * If the sampler is used as a shadow sampler,
+                * this field is (texture_compare_func - GL_NEVER).
+                * [e.g. if compare function is GL_LEQUAL, this field is 3]
+                *
+                * Otherwise, this field is 0.
+                */
+               unsigned texture_compare_func : 3;
+       } unit[16];
+};
+
+
+
+struct r300_fragment_program_node {
+       int tex_offset; /**< first tex instruction */
+       int tex_end; /**< last tex instruction, relative to tex_offset */
+       int alu_offset; /**< first ALU instruction */
+       int alu_end; /**< last ALU instruction, relative to alu_offset */
+       int flags;
+};
+
+/**
+ * Stores an R300 fragment program in its compiled-to-hardware form.
+ */
+struct r300_fragment_program_code {
+       struct {
+               int length; /**< total # of texture instructions used */
+               uint32_t inst[R300_PFS_MAX_TEX_INST];
+       } tex;
+
+       struct {
+               int length; /**< total # of ALU instructions used */
+               struct {
+                       uint32_t rgb_inst;
+                       uint32_t rgb_addr;
+                       uint32_t alpha_inst;
+                       uint32_t alpha_addr;
+               } inst[R300_PFS_MAX_ALU_INST];
+       } alu;
+
+       uint32_t config; /* US_CONFIG */
+       uint32_t pixsize; /* US_PIXSIZE */
+       uint32_t code_offset; /* US_CODE_OFFSET */
+       uint32_t code_addr[4]; /* US_CODE_ADDR */
+};
+
+
+struct r500_fragment_program_code {
+       struct {
+               uint32_t inst0;
+               uint32_t inst1;
+               uint32_t inst2;
+               uint32_t inst3;
+               uint32_t inst4;
+               uint32_t inst5;
+       } inst[R500_PFS_MAX_INST];
+
+       int inst_end; /* Number of instructions - 1; also, last instruction to be executed */
+
+       int max_temp_idx;
+};
+
+struct rX00_fragment_program_code {
+       union {
+               struct r300_fragment_program_code r300;
+               struct r500_fragment_program_code r500;
+       } code;
+
+       unsigned writes_depth:1;
+
+       struct rc_constant_list constants;
+};
+
+
+#define VSF_MAX_FRAGMENT_LENGTH (255*4)
+#define VSF_MAX_FRAGMENT_TEMPS (14)
+
+#define VSF_MAX_INPUTS 32
+#define VSF_MAX_OUTPUTS 32
+
+struct r300_vertex_program_code {
+       int length;
+       union {
+               uint32_t d[VSF_MAX_FRAGMENT_LENGTH];
+               float f[VSF_MAX_FRAGMENT_LENGTH];
+       } body;
+
+       int pos_end;
+       int num_temporaries;    /* Number of temp vars used by program */
+       int inputs[VSF_MAX_INPUTS];
+       int outputs[VSF_MAX_OUTPUTS];
+
+       struct rc_constant_list constants;
+
+       uint32_t InputsRead;
+       uint32_t OutputsWritten;
+};
+
+void r300_vertex_program_dump(struct r300_vertex_program_code * vs);
+
+#endif /* RADEON_CODE_H */
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_compiler.c b/src/mesa/drivers/dri/r300/compiler/radeon_compiler.c
new file mode 100644 (file)
index 0000000..da950d5
--- /dev/null
@@ -0,0 +1,262 @@
+/*
+ * Copyright 2009 Nicolai Hähnle <nhaehnle@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#include "radeon_compiler.h"
+
+#include <stdarg.h>
+
+#include "radeon_program.h"
+
+
+void rc_init(struct radeon_compiler * c)
+{
+       memset(c, 0, sizeof(*c));
+
+       memory_pool_init(&c->Pool);
+       c->Program.Instructions.Prev = &c->Program.Instructions;
+       c->Program.Instructions.Next = &c->Program.Instructions;
+       c->Program.Instructions.I.Opcode = OPCODE_END;
+}
+
+void rc_destroy(struct radeon_compiler * c)
+{
+       rc_constants_destroy(&c->Program.Constants);
+       memory_pool_destroy(&c->Pool);
+       free(c->ErrorMsg);
+}
+
+void rc_debug(struct radeon_compiler * c, const char * fmt, ...)
+{
+       va_list ap;
+
+       if (!c->Debug)
+               return;
+
+       va_start(ap, fmt);
+       vfprintf(stderr, fmt, ap);
+       va_end(ap);
+}
+
+void rc_error(struct radeon_compiler * c, const char * fmt, ...)
+{
+       va_list ap;
+
+       c->Error = GL_TRUE;
+
+       if (!c->ErrorMsg) {
+               /* Only remember the first error */
+               char buf[1024];
+               int written;
+
+               va_start(ap, fmt);
+               written = vsnprintf(buf, sizeof(buf), fmt, ap);
+               va_end(ap);
+
+               if (written < sizeof(buf)) {
+                       c->ErrorMsg = strdup(buf);
+               } else {
+                       c->ErrorMsg = malloc(written + 1);
+
+                       va_start(ap, fmt);
+                       vsnprintf(c->ErrorMsg, written + 1, fmt, ap);
+                       va_end(ap);
+               }
+       }
+
+       if (c->Debug) {
+               fprintf(stderr, "r300compiler error: ");
+
+               va_start(ap, fmt);
+               vfprintf(stderr, fmt, ap);
+               va_end(ap);
+       }
+}
+
+/**
+ * Rewrite the program such that everything that source the given input
+ * register will source new_input instead.
+ */
+void rc_move_input(struct radeon_compiler * c, unsigned input, struct prog_src_register new_input)
+{
+       struct rc_instruction * inst;
+
+       c->Program.InputsRead &= ~(1 << input);
+
+       for(inst = c->Program.Instructions.Next; inst != &c->Program.Instructions; inst = inst->Next) {
+               const unsigned numsrcs = _mesa_num_inst_src_regs(inst->I.Opcode);
+               unsigned i;
+
+               for(i = 0; i < numsrcs; ++i) {
+                       if (inst->I.SrcReg[i].File == PROGRAM_INPUT && inst->I.SrcReg[i].Index == input) {
+                               inst->I.SrcReg[i].File = new_input.File;
+                               inst->I.SrcReg[i].Index = new_input.Index;
+                               inst->I.SrcReg[i].Swizzle = combine_swizzles(new_input.Swizzle, inst->I.SrcReg[i].Swizzle);
+                               if (!inst->I.SrcReg[i].Abs) {
+                                       inst->I.SrcReg[i].Negate ^= new_input.Negate;
+                                       inst->I.SrcReg[i].Abs = new_input.Abs;
+                               }
+
+                               c->Program.InputsRead |= 1 << new_input.Index;
+                       }
+               }
+       }
+}
+
+
+/**
+ * Rewrite the program such that everything that writes into the given
+ * output register will instead write to new_output. The new_output
+ * writemask is honoured.
+ */
+void rc_move_output(struct radeon_compiler * c, unsigned output, unsigned new_output, unsigned writemask)
+{
+       struct rc_instruction * inst;
+
+       c->Program.OutputsWritten &= ~(1 << output);
+
+       for(inst = c->Program.Instructions.Next; inst != &c->Program.Instructions; inst = inst->Next) {
+               const unsigned numdsts = _mesa_num_inst_dst_regs(inst->I.Opcode);
+
+               if (numdsts) {
+                       if (inst->I.DstReg.File == PROGRAM_OUTPUT && inst->I.DstReg.Index == output) {
+                               inst->I.DstReg.Index = new_output;
+                               inst->I.DstReg.WriteMask &= writemask;
+
+                               c->Program.OutputsWritten |= 1 << new_output;
+                       }
+               }
+       }
+}
+
+
+/**
+ * Rewrite the program such that a given output is duplicated.
+ */
+void rc_copy_output(struct radeon_compiler * c, unsigned output, unsigned dup_output)
+{
+       unsigned tempreg = rc_find_free_temporary(c);
+       struct rc_instruction * inst;
+
+       for(inst = c->Program.Instructions.Next; inst != &c->Program.Instructions; inst = inst->Next) {
+               const unsigned numdsts = _mesa_num_inst_dst_regs(inst->I.Opcode);
+
+               if (numdsts) {
+                       if (inst->I.DstReg.File == PROGRAM_OUTPUT && inst->I.DstReg.Index == output) {
+                               inst->I.DstReg.File = PROGRAM_TEMPORARY;
+                               inst->I.DstReg.Index = tempreg;
+                       }
+               }
+       }
+
+       inst = rc_insert_new_instruction(c, c->Program.Instructions.Prev);
+       inst->I.Opcode = OPCODE_MOV;
+       inst->I.DstReg.File = PROGRAM_OUTPUT;
+       inst->I.DstReg.Index = output;
+
+       inst->I.SrcReg[0].File = PROGRAM_TEMPORARY;
+       inst->I.SrcReg[0].Index = tempreg;
+       inst->I.SrcReg[0].Swizzle = SWIZZLE_XYZW;
+
+       inst = rc_insert_new_instruction(c, c->Program.Instructions.Prev);
+       inst->I.Opcode = OPCODE_MOV;
+       inst->I.DstReg.File = PROGRAM_OUTPUT;
+       inst->I.DstReg.Index = dup_output;
+
+       inst->I.SrcReg[0].File = PROGRAM_TEMPORARY;
+       inst->I.SrcReg[0].Index = tempreg;
+       inst->I.SrcReg[0].Swizzle = SWIZZLE_XYZW;
+
+       c->Program.OutputsWritten |= 1 << dup_output;
+}
+
+
+/**
+ * Introduce standard code fragment to deal with fragment.position.
+ */
+void rc_transform_fragment_wpos(struct radeon_compiler * c, unsigned wpos, unsigned new_input)
+{
+       unsigned tempregi = rc_find_free_temporary(c);
+
+       c->Program.InputsRead &= ~(1 << wpos);
+       c->Program.InputsRead |= 1 << new_input;
+
+       /* perspective divide */
+       struct rc_instruction * inst_rcp = rc_insert_new_instruction(c, &c->Program.Instructions);
+       inst_rcp->I.Opcode = OPCODE_RCP;
+
+       inst_rcp->I.DstReg.File = PROGRAM_TEMPORARY;
+       inst_rcp->I.DstReg.Index = tempregi;
+       inst_rcp->I.DstReg.WriteMask = WRITEMASK_W;
+
+       inst_rcp->I.SrcReg[0].File = PROGRAM_INPUT;
+       inst_rcp->I.SrcReg[0].Index = new_input;
+       inst_rcp->I.SrcReg[0].Swizzle = SWIZZLE_WWWW;
+
+       struct rc_instruction * inst_mul = rc_insert_new_instruction(c, inst_rcp);
+       inst_mul->I.Opcode = OPCODE_MUL;
+
+       inst_mul->I.DstReg.File = PROGRAM_TEMPORARY;
+       inst_mul->I.DstReg.Index = tempregi;
+       inst_mul->I.DstReg.WriteMask = WRITEMASK_XYZ;
+
+       inst_mul->I.SrcReg[0].File = PROGRAM_INPUT;
+       inst_mul->I.SrcReg[0].Index = new_input;
+
+       inst_mul->I.SrcReg[1].File = PROGRAM_TEMPORARY;
+       inst_mul->I.SrcReg[1].Index = tempregi;
+       inst_mul->I.SrcReg[1].Swizzle = SWIZZLE_WWWW;
+
+       /* viewport transformation */
+       struct rc_instruction * inst_mad = rc_insert_new_instruction(c, inst_mul);
+       inst_mad->I.Opcode = OPCODE_MAD;
+
+       inst_mad->I.DstReg.File = PROGRAM_TEMPORARY;
+       inst_mad->I.DstReg.Index = tempregi;
+       inst_mad->I.DstReg.WriteMask = WRITEMASK_XYZ;
+
+       inst_mad->I.SrcReg[0].File = PROGRAM_TEMPORARY;
+       inst_mad->I.SrcReg[0].Index = tempregi;
+       inst_mad->I.SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO);
+
+       inst_mad->I.SrcReg[1].File = PROGRAM_STATE_VAR;
+       inst_mad->I.SrcReg[1].Index = rc_constants_add_state(&c->Program.Constants, RC_STATE_R300_WINDOW_DIMENSION, 0);
+       inst_mad->I.SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO);
+
+       inst_mad->I.SrcReg[2].File = PROGRAM_STATE_VAR;
+       inst_mad->I.SrcReg[2].Index = inst_mad->I.SrcReg[1].Index;
+       inst_mad->I.SrcReg[2].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO);
+
+       struct rc_instruction * inst;
+       for (inst = inst_mad->Next; inst != &c->Program.Instructions; inst = inst->Next) {
+               const unsigned numsrcs = _mesa_num_inst_src_regs(inst->I.Opcode);
+               unsigned i;
+
+               for(i = 0; i < numsrcs; i++) {
+                       if (inst->I.SrcReg[i].File == PROGRAM_INPUT &&
+                           inst->I.SrcReg[i].Index == wpos) {
+                               inst->I.SrcReg[i].File = PROGRAM_TEMPORARY;
+                               inst->I.SrcReg[i].Index = tempregi;
+                       }
+               }
+       }
+}
+
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_compiler.h b/src/mesa/drivers/dri/r300/compiler/radeon_compiler.h
new file mode 100644 (file)
index 0000000..e63ab88
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2009 Nicolai Hähnle <nhaehnle@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#ifndef RADEON_COMPILER_H
+#define RADEON_COMPILER_H
+
+#include "main/mtypes.h"
+#include "shader/prog_instruction.h"
+
+#include "memory_pool.h"
+#include "radeon_code.h"
+
+
+struct rc_instruction {
+       struct rc_instruction * Prev;
+       struct rc_instruction * Next;
+       struct prog_instruction I;
+};
+
+struct rc_program {
+       /**
+        * Instructions.Next points to the first instruction,
+        * Instructions.Prev points to the last instruction.
+        */
+       struct rc_instruction Instructions;
+
+       /* Long term, we should probably remove InputsRead & OutputsWritten,
+        * since updating dependent state can be fragile, and they aren't
+        * actually used very often. */
+       uint32_t InputsRead;
+       uint32_t OutputsWritten;
+       uint32_t ShadowSamplers; /**< Texture units used for shadow sampling. */
+
+       struct rc_constant_list Constants;
+};
+
+struct radeon_compiler {
+       struct memory_pool Pool;
+       struct rc_program Program;
+       unsigned Debug:1;
+       unsigned Error:1;
+       char * ErrorMsg;
+};
+
+void rc_init(struct radeon_compiler * c);
+void rc_destroy(struct radeon_compiler * c);
+
+void rc_debug(struct radeon_compiler * c, const char * fmt, ...);
+void rc_error(struct radeon_compiler * c, const char * fmt, ...);
+
+void rc_mesa_to_rc_program(struct radeon_compiler * c, struct gl_program * program);
+
+void rc_calculate_inputs_outputs(struct radeon_compiler * c);
+
+void rc_move_input(struct radeon_compiler * c, unsigned input, struct prog_src_register new_input);
+void rc_move_output(struct radeon_compiler * c, unsigned output, unsigned new_output, unsigned writemask);
+void rc_copy_output(struct radeon_compiler * c, unsigned output, unsigned dup_output);
+void rc_transform_fragment_wpos(struct radeon_compiler * c, unsigned wpos, unsigned new_input);
+
+struct r300_fragment_program_compiler {
+       struct radeon_compiler Base;
+       struct rX00_fragment_program_code *code;
+       struct r300_fragment_program_external_state state;
+       unsigned is_r500;
+       unsigned OutputDepth;
+       unsigned OutputColor;
+
+       void * UserData;
+       void (*AllocateHwInputs)(
+               struct r300_fragment_program_compiler * c,
+               void (*allocate)(void * data, unsigned input, unsigned hwreg),
+               void * mydata);
+};
+
+void r3xx_compile_fragment_program(struct r300_fragment_program_compiler* c);
+
+
+struct r300_vertex_program_compiler {
+       struct radeon_compiler Base;
+       struct r300_vertex_program_code *code;
+       GLbitfield RequiredOutputs;
+
+       void * UserData;
+       void (*SetHwInputOutput)(struct r300_vertex_program_compiler * c);
+};
+
+void r3xx_compile_vertex_program(struct r300_vertex_program_compiler* c);
+
+#endif /* RADEON_COMPILER_H */
@@ -36,6 +36,8 @@
 
 #include "radeon_nqssadce.h"
 
+#include "radeon_compiler.h"
+
 
 /**
  * Return the @ref register_state for the given register (or 0 for untracked
@@ -76,9 +78,10 @@ struct prog_src_register lmul_swizzle(GLuint swizzle, struct prog_src_register s
 }
 
 
-static struct prog_instruction* track_used_srcreg(struct nqssadce_state* s,
-       struct prog_instruction *inst, GLint src, GLuint sourced)
+static void track_used_srcreg(struct nqssadce_state* s,
+       GLint src, GLuint sourced)
 {
+       struct prog_instruction * inst = &s->IP->I;
        int i;
        GLuint deswz_source = 0;
 
@@ -95,12 +98,11 @@ static struct prog_instruction* track_used_srcreg(struct nqssadce_state* s,
        if (!s->Descr->IsNativeSwizzle(inst->Opcode, inst->SrcReg[src])) {
                struct prog_dst_register dstreg = inst->DstReg;
                dstreg.File = PROGRAM_TEMPORARY;
-               dstreg.Index = _mesa_find_free_register(s->Program, PROGRAM_TEMPORARY);
+               dstreg.Index = rc_find_free_temporary(s->Compiler);
                dstreg.WriteMask = sourced;
 
                s->Descr->BuildSwizzle(s, dstreg, inst->SrcReg[src]);
 
-               inst = s->Program->Instructions + s->IP;
                inst->SrcReg[src].File = PROGRAM_TEMPORARY;
                inst->SrcReg[src].Index = dstreg.Index;
                inst->SrcReg[src].Swizzle = 0;
@@ -117,37 +119,36 @@ static struct prog_instruction* track_used_srcreg(struct nqssadce_state* s,
 
        struct register_state *regstate;
 
-       if (inst->SrcReg[src].RelAddr)
+       if (inst->SrcReg[src].RelAddr) {
                regstate = get_reg_state(s, PROGRAM_ADDRESS, 0);
-       else
+               if (regstate)
+                       regstate->Sourced |= WRITEMASK_X;
+       } else {
                regstate = get_reg_state(s, inst->SrcReg[src].File, inst->SrcReg[src].Index);
-
-       if (regstate)
-               regstate->Sourced |= deswz_source & 0xf;
-
-       return inst;
+               if (regstate)
+                       regstate->Sourced |= deswz_source & 0xf;
+       }
 }
 
-static void unalias_srcregs(struct prog_instruction *inst, GLuint oldindex, GLuint newindex)
+static void unalias_srcregs(struct rc_instruction *inst, GLuint oldindex, GLuint newindex)
 {
-       int nsrc = _mesa_num_inst_src_regs(inst->Opcode);
+       int nsrc = _mesa_num_inst_src_regs(inst->I.Opcode);
        int i;
        for(i = 0; i < nsrc; ++i)
-               if (inst->SrcReg[i].File == PROGRAM_TEMPORARY && inst->SrcReg[i].Index == oldindex)
-                       inst->SrcReg[i].Index = newindex;
+               if (inst->I.SrcReg[i].File == PROGRAM_TEMPORARY && inst->I.SrcReg[i].Index == oldindex)
+                       inst->I.SrcReg[i].Index = newindex;
 }
 
 static void unalias_temporary(struct nqssadce_state* s, GLuint oldindex)
 {
-       GLuint newindex = _mesa_find_free_register(s->Program, PROGRAM_TEMPORARY);
-       int ip;
-       for(ip = 0; ip < s->IP; ++ip) {
-               struct prog_instruction* inst = s->Program->Instructions + ip;
-               if (inst->DstReg.File == PROGRAM_TEMPORARY && inst->DstReg.Index == oldindex)
-                       inst->DstReg.Index = newindex;
+       GLuint newindex = rc_find_free_temporary(s->Compiler);
+       struct rc_instruction * inst;
+       for(inst = s->Compiler->Program.Instructions.Next; inst != s->IP; inst = inst->Next) {
+               if (inst->I.DstReg.File == PROGRAM_TEMPORARY && inst->I.DstReg.Index == oldindex)
+                       inst->I.DstReg.Index = newindex;
                unalias_srcregs(inst, oldindex, newindex);
        }
-       unalias_srcregs(s->Program->Instructions + s->IP, oldindex, newindex);
+       unalias_srcregs(s->IP, oldindex, newindex);
 }
 
 
@@ -156,7 +157,8 @@ static void unalias_temporary(struct nqssadce_state* s, GLuint oldindex)
  */
 static void process_instruction(struct nqssadce_state* s)
 {
-       struct prog_instruction *inst = s->Program->Instructions + s->IP;
+       struct prog_instruction *inst = &s->IP->I;
+       GLuint WriteMask;
 
        if (inst->Opcode == OPCODE_END)
                return;
@@ -164,7 +166,7 @@ static void process_instruction(struct nqssadce_state* s)
        if (inst->Opcode != OPCODE_KIL) {
                struct register_state *regstate = get_reg_state(s, inst->DstReg.File, inst->DstReg.Index);
                if (!regstate) {
-                       _mesa_problem(s->Ctx, "NqssaDce: bad destination register (%i[%i])\n",
+                       rc_error(s->Compiler, "NqssaDce: bad destination register (%i[%i])\n",
                                inst->DstReg.File, inst->DstReg.Index);
                        return;
                }
@@ -173,7 +175,9 @@ static void process_instruction(struct nqssadce_state* s)
                regstate->Sourced &= ~inst->DstReg.WriteMask;
 
                if (inst->DstReg.WriteMask == 0) {
-                       _mesa_delete_instructions(s->Program, s->IP, 1);
+                       struct rc_instruction * inst_remove = s->IP;
+                       s->IP = s->IP->Prev;
+                       rc_remove_instruction(inst_remove);
                        return;
                }
 
@@ -181,16 +185,15 @@ static void process_instruction(struct nqssadce_state* s)
                        unalias_temporary(s, inst->DstReg.Index);
        }
 
-       /* Attention: Due to swizzle emulation code, the following
-        * might change the instruction stream under us, so we have
-        * to be careful with the inst pointer. */
+       WriteMask = inst->DstReg.WriteMask;
+
        switch (inst->Opcode) {
        case OPCODE_ARL:
        case OPCODE_DDX:
        case OPCODE_DDY:
        case OPCODE_FRC:
        case OPCODE_MOV:
-               inst = track_used_srcreg(s, inst, 0, inst->DstReg.WriteMask);
+               track_used_srcreg(s, 0, WriteMask);
                break;
        case OPCODE_ADD:
        case OPCODE_MAX:
@@ -198,14 +201,14 @@ static void process_instruction(struct nqssadce_state* s)
        case OPCODE_MUL:
        case OPCODE_SGE:
        case OPCODE_SLT:
-               inst = track_used_srcreg(s, inst, 0, inst->DstReg.WriteMask);
-               inst = track_used_srcreg(s, inst, 1, inst->DstReg.WriteMask);
+               track_used_srcreg(s, 0, WriteMask);
+               track_used_srcreg(s, 1, WriteMask);
                break;
        case OPCODE_CMP:
        case OPCODE_MAD:
-               inst = track_used_srcreg(s, inst, 0, inst->DstReg.WriteMask);
-               inst = track_used_srcreg(s, inst, 1, inst->DstReg.WriteMask);
-               inst = track_used_srcreg(s, inst, 2, inst->DstReg.WriteMask);
+               track_used_srcreg(s, 0, WriteMask);
+               track_used_srcreg(s, 1, WriteMask);
+               track_used_srcreg(s, 2, WriteMask);
                break;
        case OPCODE_COS:
        case OPCODE_EX2:
@@ -213,83 +216,79 @@ static void process_instruction(struct nqssadce_state* s)
        case OPCODE_RCP:
        case OPCODE_RSQ:
        case OPCODE_SIN:
-               inst = track_used_srcreg(s, inst, 0, 0x1);
+               track_used_srcreg(s, 0, 0x1);
                break;
        case OPCODE_DP3:
-               inst = track_used_srcreg(s, inst, 0, 0x7);
-               inst = track_used_srcreg(s, inst, 1, 0x7);
+               track_used_srcreg(s, 0, 0x7);
+               track_used_srcreg(s, 1, 0x7);
                break;
        case OPCODE_DP4:
-               inst = track_used_srcreg(s, inst, 0, 0xf);
-               inst = track_used_srcreg(s, inst, 1, 0xf);
+               track_used_srcreg(s, 0, 0xf);
+               track_used_srcreg(s, 1, 0xf);
                break;
        case OPCODE_KIL:
        case OPCODE_TEX:
        case OPCODE_TXB:
        case OPCODE_TXP:
-               inst = track_used_srcreg(s, inst, 0, 0xf);
+               track_used_srcreg(s, 0, 0xf);
                break;
        case OPCODE_DST:
-               inst = track_used_srcreg(s, inst, 0, 0x6);
-               inst = track_used_srcreg(s, inst, 1, 0xa);
+               track_used_srcreg(s, 0, 0x6);
+               track_used_srcreg(s, 1, 0xa);
                break;
        case OPCODE_EXP:
        case OPCODE_LOG:
        case OPCODE_POW:
-               inst = track_used_srcreg(s, inst, 0, 0x3);
+               track_used_srcreg(s, 0, 0x3);
                break;
        case OPCODE_LIT:
-               inst = track_used_srcreg(s, inst, 0, 0xb);
+               track_used_srcreg(s, 0, 0xb);
                break;
        default:
-               _mesa_problem(s->Ctx, "NqssaDce: Unknown opcode %d\n", inst->Opcode);
+               rc_error(s->Compiler, "NqssaDce: Unknown opcode %d\n", inst->Opcode);
                return;
        }
+
+       s->IP = s->IP->Prev;
 }
 
-static void calculateInputsOutputs(struct gl_program *p)
+void rc_calculate_inputs_outputs(struct radeon_compiler * c)
 {
-       struct prog_instruction *inst;
-       GLuint InputsRead, OutputsWritten;
+       struct rc_instruction *inst;
 
-       inst = p->Instructions;
-       InputsRead = 0;
-       OutputsWritten = 0;
-       while (inst->Opcode != OPCODE_END)
+       c->Program.InputsRead = 0;
+       c->Program.OutputsWritten = 0;
+
+       for(inst = c->Program.Instructions.Next; inst != &c->Program.Instructions; inst = inst->Next)
        {
-               int i, num_src_regs;
+               int i;
+               int num_src_regs = _mesa_num_inst_src_regs(inst->I.Opcode);
 
-               num_src_regs = _mesa_num_inst_src_regs(inst->Opcode);
                for (i = 0; i < num_src_regs; ++i) {
-                       if (inst->SrcReg[i].File == PROGRAM_INPUT)
-                               InputsRead |= 1 << inst->SrcReg[i].Index;
+                       if (inst->I.SrcReg[i].File == PROGRAM_INPUT)
+                               c->Program.InputsRead |= 1 << inst->I.SrcReg[i].Index;
                }
 
-               if (inst->DstReg.File == PROGRAM_OUTPUT)
-                       OutputsWritten |= 1 << inst->DstReg.Index;
-
-               ++inst;
+               if (_mesa_num_inst_dst_regs(inst->I.Opcode)) {
+                       if (inst->I.DstReg.File == PROGRAM_OUTPUT)
+                               c->Program.OutputsWritten |= 1 << inst->I.DstReg.Index;
+               }
        }
-
-       p->InputsRead = InputsRead;
-       p->OutputsWritten = OutputsWritten;
 }
 
-void radeonNqssaDce(GLcontext *ctx, struct gl_program *p, struct radeon_nqssadce_descr* descr)
+void radeonNqssaDce(struct radeon_compiler * c, struct radeon_nqssadce_descr* descr, void * data)
 {
        struct nqssadce_state s;
 
        _mesa_bzero(&s, sizeof(s));
-       s.Ctx = ctx;
-       s.Program = p;
+       s.Compiler = c;
        s.Descr = descr;
+       s.UserData = data;
        s.Descr->Init(&s);
-       s.IP = p->NumInstructions;
+       s.IP = c->Program.Instructions.Prev;
 
-       while(s.IP > 0) {
-               s.IP--;
+       while(s.IP != &c->Program.Instructions && !c->Error)
                process_instruction(&s);
-       }
 
-       calculateInputsOutputs(p);
+       rc_calculate_inputs_outputs(c);
 }
@@ -30,7 +30,6 @@
 
 #include "radeon_program.h"
 
-
 struct register_state {
        /**
         * Bitmask indicating which components of the register are sourced
@@ -44,14 +43,13 @@ struct register_state {
  * read from, etc.
  */
 struct nqssadce_state {
-       GLcontext *Ctx;
-       struct gl_program *Program;
+       struct radeon_compiler *Compiler;
        struct radeon_nqssadce_descr *Descr;
 
        /**
         * All instructions after this instruction pointer have been dealt with.
         */
-       int IP;
+       struct rc_instruction * IP;
 
        /**
         * Which registers are read by subsequent instructions?
@@ -59,6 +57,8 @@ struct nqssadce_state {
        struct register_state Temps[MAX_PROGRAM_TEMPS];
        struct register_state Outputs[VERT_RESULT_MAX];
        struct register_state Address;
+
+       void * UserData;
 };
 
 
@@ -83,11 +83,9 @@ struct radeon_nqssadce_descr {
         * The transformation will work recursively on the emitted instruction(s).
         */
        void (*BuildSwizzle)(struct nqssadce_state*, struct prog_dst_register dst, struct prog_src_register src);
-
-       void *Data;
 };
 
-void radeonNqssaDce(GLcontext *ctx, struct gl_program *p, struct radeon_nqssadce_descr* descr);
+void radeonNqssaDce(struct radeon_compiler * c, struct radeon_nqssadce_descr* descr, void * data);
 struct prog_src_register lmul_swizzle(GLuint swizzle, struct prog_src_register srcreg);
 
 #endif /* __RADEON_PROGRAM_NQSSADCE_H_ */
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_program.c b/src/mesa/drivers/dri/r300/compiler/radeon_program.c
new file mode 100644 (file)
index 0000000..208d3b9
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2008 Nicolai Haehnle.
+ *
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include "radeon_program.h"
+
+#include "radeon_compiler.h"
+#include "shader/prog_parameter.h"
+#include "shader/prog_print.h"
+
+
+/**
+ * Transform the given clause in the following way:
+ *  1. Replace it with an empty clause
+ *  2. For every instruction in the original clause, try the given
+ *     transformations in order.
+ *  3. If one of the transformations returns GL_TRUE, assume that it
+ *     has emitted the appropriate instruction(s) into the new clause;
+ *     otherwise, copy the instruction verbatim.
+ *
+ * \note The transformation is currently not recursive; in other words,
+ * instructions emitted by transformations are not transformed.
+ *
+ * \note The transform is called 'local' because it can only look at
+ * one instruction at a time.
+ */
+void radeonLocalTransform(
+       struct radeon_compiler * c,
+       int num_transformations,
+       struct radeon_program_transformation* transformations)
+{
+       struct rc_instruction * inst = c->Program.Instructions.Next;
+
+       while(inst != &c->Program.Instructions) {
+               struct rc_instruction * current = inst;
+               int i;
+
+               inst = inst->Next;
+
+               for(i = 0; i < num_transformations; ++i) {
+                       struct radeon_program_transformation* t = transformations + i;
+
+                       if (t->function(c, current, t->userData))
+                               break;
+               }
+       }
+}
+
+
+GLint rc_find_free_temporary(struct radeon_compiler * c)
+{
+       GLboolean used[MAX_PROGRAM_TEMPS];
+       GLuint i;
+
+       memset(used, 0, sizeof(used));
+
+       for (struct rc_instruction * rcinst = c->Program.Instructions.Next; rcinst != &c->Program.Instructions; rcinst = rcinst->Next) {
+               const struct prog_instruction *inst = &rcinst->I;
+               const GLuint n = _mesa_num_inst_src_regs(inst->Opcode);
+               GLuint k;
+
+               for (k = 0; k < n; k++) {
+                       if (inst->SrcReg[k].File == PROGRAM_TEMPORARY)
+                               used[inst->SrcReg[k].Index] = GL_TRUE;
+               }
+       }
+
+       for (i = 0; i < MAX_PROGRAM_TEMPS; i++) {
+               if (!used[i])
+                       return i;
+       }
+
+       return -1;
+}
+
+
+struct rc_instruction *rc_alloc_instruction(struct radeon_compiler * c)
+{
+       struct rc_instruction * inst = memory_pool_malloc(&c->Pool, sizeof(struct rc_instruction));
+
+       inst->Prev = 0;
+       inst->Next = 0;
+
+       _mesa_init_instructions(&inst->I, 1);
+
+       return inst;
+}
+
+
+struct rc_instruction *rc_insert_new_instruction(struct radeon_compiler * c, struct rc_instruction * after)
+{
+       struct rc_instruction * inst = rc_alloc_instruction(c);
+
+       inst->Prev = after;
+       inst->Next = after->Next;
+
+       inst->Prev->Next = inst;
+       inst->Next->Prev = inst;
+
+       return inst;
+}
+
+void rc_remove_instruction(struct rc_instruction * inst)
+{
+       inst->Prev->Next = inst->Next;
+       inst->Next->Prev = inst->Prev;
+}
+
+
+void rc_mesa_to_rc_program(struct radeon_compiler * c, struct gl_program * program)
+{
+       struct prog_instruction *source;
+       unsigned int i;
+
+       for(source = program->Instructions; source->Opcode != OPCODE_END; ++source) {
+               struct rc_instruction * dest = rc_insert_new_instruction(c, c->Program.Instructions.Prev);
+               dest->I = *source;
+       }
+
+       c->Program.ShadowSamplers = program->ShadowSamplers;
+       c->Program.InputsRead = program->InputsRead;
+       c->Program.OutputsWritten = program->OutputsWritten;
+
+       for(i = 0; i < program->Parameters->NumParameters; ++i) {
+               struct rc_constant constant;
+
+               constant.Type = RC_CONSTANT_EXTERNAL;
+               constant.Size = 4;
+               constant.u.External = i;
+
+               rc_constants_add(&c->Program.Constants, &constant);
+       }
+}
+
+
+/**
+ * Print program to stderr, default options.
+ */
+void rc_print_program(const struct rc_program *prog)
+{
+       GLuint indent = 0;
+       GLuint linenum = 1;
+       struct rc_instruction *inst;
+
+       fprintf(stderr, "# Radeon Compiler Program\n");
+
+       for(inst = prog->Instructions.Next; inst != &prog->Instructions; inst = inst->Next) {
+               fprintf(stderr, "%3d: ", linenum);
+
+               /* Massive hack: We rely on the fact that the printers do not actually
+                * use the gl_program argument (last argument) in debug mode */
+               indent = _mesa_fprint_instruction_opt(
+                               stderr, &inst->I,
+                               indent, PROG_PRINT_DEBUG, 0);
+
+               linenum++;
+       }
+}
 #include "shader/program.h"
 #include "shader/prog_instruction.h"
 
-
-enum {
-       CLAUSE_MIXED = 0,
-       CLAUSE_ALU,
-       CLAUSE_TEX
-};
+struct radeon_compiler;
+struct rc_instruction;
+struct rc_program;
 
 enum {
        PROGRAM_BUILTIN = PROGRAM_FILE_MAX /**< not a real register, but a special swizzle constant */
@@ -83,19 +80,12 @@ static inline GLuint combine_swizzles(GLuint src, GLuint swz)
        return ret;
 }
 
+static INLINE void reset_srcreg(struct prog_src_register* reg)
+{
+       _mesa_bzero(reg, sizeof(*reg));
+       reg->Swizzle = SWIZZLE_NOOP;
+}
 
-/**
- * Transformation context that is passed to local transformations.
- *
- * Care must be taken with some operations during transformation,
- * e.g. finding new temporary registers must use @ref radeonFindFreeTemporary
- */
-struct radeon_transform_context {
-       GLcontext *Ctx;
-       struct gl_program *Program;
-       struct prog_instruction *OldInstructions;
-       GLuint OldNumInstructions;
-};
 
 /**
  * A transformation that can be passed to \ref radeonLocalTransform.
@@ -109,23 +99,23 @@ struct radeon_transform_context {
  */
 struct radeon_program_transformation {
        GLboolean (*function)(
-               struct radeon_transform_context*,
-               struct prog_instruction*,
+               struct radeon_compiler*,
+               struct rc_instruction*,
                void*);
        void *userData;
 };
 
 void radeonLocalTransform(
-       GLcontext* ctx,
-       struct gl_program *program,
+       struct radeon_compiler *c,
        int num_transformations,
        struct radeon_program_transformation* transformations);
 
-/**
- * Find a usable free temporary register during program transformation
- */
-GLint radeonFindFreeTemporary(struct radeon_transform_context *ctx);
+GLint rc_find_free_temporary(struct radeon_compiler * c);
+
+struct rc_instruction *rc_alloc_instruction(struct radeon_compiler * c);
+struct rc_instruction *rc_insert_new_instruction(struct radeon_compiler * c, struct rc_instruction * after);
+void rc_remove_instruction(struct rc_instruction * inst);
 
-struct prog_instruction *radeonAppendInstructions(struct gl_program *program, int count);
+void rc_print_program(const struct rc_program *prog);
 
 #endif
 
 #include "radeon_program_alu.h"
 
-#include "shader/prog_parameter.h"
+#include "radeon_compiler.h"
 
 
-static struct prog_instruction *emit1(struct gl_program* p,
+static struct rc_instruction *emit1(
+       struct radeon_compiler * c, struct rc_instruction * after,
        gl_inst_opcode Opcode, GLuint Saturate, struct prog_dst_register DstReg,
        struct prog_src_register SrcReg)
 {
-       struct prog_instruction *fpi = radeonAppendInstructions(p, 1);
+       struct rc_instruction *fpi = rc_insert_new_instruction(c, after);
 
-       fpi->Opcode = Opcode;
-       fpi->SaturateMode = Saturate;
-       fpi->DstReg = DstReg;
-       fpi->SrcReg[0] = SrcReg;
+       fpi->I.Opcode = Opcode;
+       fpi->I.SaturateMode = Saturate;
+       fpi->I.DstReg = DstReg;
+       fpi->I.SrcReg[0] = SrcReg;
        return fpi;
 }
 
-static struct prog_instruction *emit2(struct gl_program* p,
+static struct rc_instruction *emit2(
+       struct radeon_compiler * c, struct rc_instruction * after,
        gl_inst_opcode Opcode, GLuint Saturate, struct prog_dst_register DstReg,
        struct prog_src_register SrcReg0, struct prog_src_register SrcReg1)
 {
-       struct prog_instruction *fpi = radeonAppendInstructions(p, 1);
+       struct rc_instruction *fpi = rc_insert_new_instruction(c, after);
 
-       fpi->Opcode = Opcode;
-       fpi->SaturateMode = Saturate;
-       fpi->DstReg = DstReg;
-       fpi->SrcReg[0] = SrcReg0;
-       fpi->SrcReg[1] = SrcReg1;
+       fpi->I.Opcode = Opcode;
+       fpi->I.SaturateMode = Saturate;
+       fpi->I.DstReg = DstReg;
+       fpi->I.SrcReg[0] = SrcReg0;
+       fpi->I.SrcReg[1] = SrcReg1;
        return fpi;
 }
 
-static struct prog_instruction *emit3(struct gl_program* p,
+static struct rc_instruction *emit3(
+       struct radeon_compiler * c, struct rc_instruction * after,
        gl_inst_opcode Opcode, GLuint Saturate, struct prog_dst_register DstReg,
        struct prog_src_register SrcReg0, struct prog_src_register SrcReg1,
        struct prog_src_register SrcReg2)
 {
-       struct prog_instruction *fpi = radeonAppendInstructions(p, 1);
-
-       fpi->Opcode = Opcode;
-       fpi->SaturateMode = Saturate;
-       fpi->DstReg = DstReg;
-       fpi->SrcReg[0] = SrcReg0;
-       fpi->SrcReg[1] = SrcReg1;
-       fpi->SrcReg[2] = SrcReg2;
+       struct rc_instruction *fpi = rc_insert_new_instruction(c, after);
+
+       fpi->I.Opcode = Opcode;
+       fpi->I.SaturateMode = Saturate;
+       fpi->I.DstReg = DstReg;
+       fpi->I.SrcReg[0] = SrcReg0;
+       fpi->I.SrcReg[1] = SrcReg1;
+       fpi->I.SrcReg[2] = SrcReg2;
        return fpi;
 }
 
@@ -171,44 +174,63 @@ static struct prog_src_register scalar(struct prog_src_register reg)
        return swizzle(reg, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X);
 }
 
-static void transform_ABS(struct radeon_transform_context* t,
-       struct prog_instruction* inst)
+static void transform_ABS(struct radeon_compiler* c,
+       struct rc_instruction* inst)
 {
-       struct prog_src_register src = inst->SrcReg[0];
+       struct prog_src_register src = inst->I.SrcReg[0];
        src.Abs = 1;
        src.Negate = NEGATE_NONE;
-       emit1(t->Program, OPCODE_MOV, inst->SaturateMode, inst->DstReg, src);
+       emit1(c, inst->Prev, OPCODE_MOV, inst->I.SaturateMode, inst->I.DstReg, src);
+       rc_remove_instruction(inst);
 }
 
-static void transform_DPH(struct radeon_transform_context* t,
-       struct prog_instruction* inst)
+static void transform_DP3(struct radeon_compiler* c,
+       struct rc_instruction* inst)
 {
-       struct prog_src_register src0 = inst->SrcReg[0];
+       struct prog_src_register src0 = inst->I.SrcReg[0];
+       struct prog_src_register src1 = inst->I.SrcReg[1];
+       src0.Negate &= ~NEGATE_W;
+       src0.Swizzle &= ~(7 << (3 * 3));
+       src0.Swizzle |= SWIZZLE_ZERO << (3 * 3);
+       src1.Negate &= ~NEGATE_W;
+       src1.Swizzle &= ~(7 << (3 * 3));
+       src1.Swizzle |= SWIZZLE_ZERO << (3 * 3);
+       emit2(c, inst->Prev, OPCODE_DP4, inst->I.SaturateMode, inst->I.DstReg, src0, src1);
+       rc_remove_instruction(inst);
+}
+
+static void transform_DPH(struct radeon_compiler* c,
+       struct rc_instruction* inst)
+{
+       struct prog_src_register src0 = inst->I.SrcReg[0];
        src0.Negate &= ~NEGATE_W;
        src0.Swizzle &= ~(7 << (3 * 3));
        src0.Swizzle |= SWIZZLE_ONE << (3 * 3);
-       emit2(t->Program, OPCODE_DP4, inst->SaturateMode, inst->DstReg, src0, inst->SrcReg[1]);
+       emit2(c, inst->Prev, OPCODE_DP4, inst->I.SaturateMode, inst->I.DstReg, src0, inst->I.SrcReg[1]);
+       rc_remove_instruction(inst);
 }
 
 /**
  * [1, src0.y*src1.y, src0.z, src1.w]
  * So basically MUL with lotsa swizzling.
  */
-static void transform_DST(struct radeon_transform_context* t,
-       struct prog_instruction* inst)
+static void transform_DST(struct radeon_compiler* c,
+       struct rc_instruction* inst)
 {
-       emit2(t->Program, OPCODE_MUL, inst->SaturateMode, inst->DstReg,
-               swizzle(inst->SrcReg[0], SWIZZLE_ONE, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ONE),
-               swizzle(inst->SrcReg[1], SWIZZLE_ONE, SWIZZLE_Y, SWIZZLE_ONE, SWIZZLE_W));
+       emit2(c, inst->Prev, OPCODE_MUL, inst->I.SaturateMode, inst->I.DstReg,
+               swizzle(inst->I.SrcReg[0], SWIZZLE_ONE, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ONE),
+               swizzle(inst->I.SrcReg[1], SWIZZLE_ONE, SWIZZLE_Y, SWIZZLE_ONE, SWIZZLE_W));
+       rc_remove_instruction(inst);
 }
 
-static void transform_FLR(struct radeon_transform_context* t,
-       struct prog_instruction* inst)
+static void transform_FLR(struct radeon_compiler* c,
+       struct rc_instruction* inst)
 {
-       int tempreg = radeonFindFreeTemporary(t);
-       emit1(t->Program, OPCODE_FRC, 0, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0]);
-       emit2(t->Program, OPCODE_ADD, inst->SaturateMode, inst->DstReg,
-               inst->SrcReg[0], negate(srcreg(PROGRAM_TEMPORARY, tempreg)));
+       int tempreg = rc_find_free_temporary(c);
+       emit1(c, inst->Prev, OPCODE_FRC, 0, dstreg(PROGRAM_TEMPORARY, tempreg), inst->I.SrcReg[0]);
+       emit2(c, inst->Prev, OPCODE_ADD, inst->I.SaturateMode, inst->I.DstReg,
+               inst->I.SrcReg[0], negate(srcreg(PROGRAM_TEMPORARY, tempreg)));
+       rc_remove_instruction(inst);
 }
 
 /**
@@ -229,152 +251,159 @@ static void transform_FLR(struct radeon_transform_context* t,
  * 5 slots, if the subsequent optimization passes are clever enough
  * to pair instructions correctly.
  */
-static void transform_LIT(struct radeon_transform_context* t,
-       struct prog_instruction* inst)
+static void transform_LIT(struct radeon_compiler* c,
+       struct rc_instruction* inst)
 {
-       static const GLfloat LitConst[4] = { -127.999999 };
-
        GLuint constant;
        GLuint constant_swizzle;
        GLuint temp;
-       int needTemporary = 0;
        struct prog_src_register srctemp;
 
-       constant = _mesa_add_unnamed_constant(t->Program->Parameters, LitConst, 1, &constant_swizzle);
+       constant = rc_constants_add_immediate_scalar(&c->Program.Constants, -127.999999, &constant_swizzle);
 
-       if (inst->DstReg.WriteMask != WRITEMASK_XYZW) {
-               needTemporary = 1;
-       } else if (inst->DstReg.File != PROGRAM_TEMPORARY) {
-               // LIT is typically followed by DP3/DP4, so there's no point
-               // in creating special code for this case
-               needTemporary = 1;
-       }
+       if (inst->I.DstReg.WriteMask != WRITEMASK_XYZW || inst->I.DstReg.File != PROGRAM_TEMPORARY) {
+               struct rc_instruction * inst_mov;
 
-       if (needTemporary) {
-               temp = radeonFindFreeTemporary(t);
-       } else {
-               temp = inst->DstReg.Index;
+               inst_mov = emit1(c, inst,
+                       OPCODE_MOV, 0, inst->I.DstReg,
+                       srcreg(PROGRAM_TEMPORARY, rc_find_free_temporary(c)));
+
+               inst->I.DstReg.File = PROGRAM_TEMPORARY;
+               inst->I.DstReg.Index = inst_mov->I.SrcReg[0].Index;
+               inst->I.DstReg.WriteMask = WRITEMASK_XYZW;
        }
+
+       temp = inst->I.DstReg.Index;
        srctemp = srcreg(PROGRAM_TEMPORARY, temp);
 
        // tmp.x = max(0.0, Src.x);
        // tmp.y = max(0.0, Src.y);
        // tmp.w = clamp(Src.z, -128+eps, 128-eps);
-       emit2(t->Program, OPCODE_MAX, 0,
+       emit2(c, inst->Prev, OPCODE_MAX, 0,
                dstregtmpmask(temp, WRITEMASK_XYW),
-               inst->SrcReg[0],
+               inst->I.SrcReg[0],
                swizzle(srcreg(PROGRAM_CONSTANT, constant),
                        SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ZERO, constant_swizzle&3));
-       emit2(t->Program, OPCODE_MIN, 0,
+       emit2(c, inst->Prev, OPCODE_MIN, 0,
                dstregtmpmask(temp, WRITEMASK_Z),
                swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
                negate(srcregswz(PROGRAM_CONSTANT, constant, constant_swizzle)));
 
        // tmp.w = Pow(tmp.y, tmp.w)
-       emit1(t->Program, OPCODE_LG2, 0,
+       emit1(c, inst->Prev, OPCODE_LG2, 0,
                dstregtmpmask(temp, WRITEMASK_W),
                swizzle(srctemp, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y));
-       emit2(t->Program, OPCODE_MUL, 0,
+       emit2(c, inst->Prev, OPCODE_MUL, 0,
                dstregtmpmask(temp, WRITEMASK_W),
                swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
                swizzle(srctemp, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z));
-       emit1(t->Program, OPCODE_EX2, 0,
+       emit1(c, inst->Prev, OPCODE_EX2, 0,
                dstregtmpmask(temp, WRITEMASK_W),
                swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W));
 
        // tmp.z = (tmp.x > 0) ? tmp.w : 0.0
-       emit3(t->Program, OPCODE_CMP, inst->SaturateMode,
+       emit3(c, inst->Prev, OPCODE_CMP, inst->I.SaturateMode,
                dstregtmpmask(temp, WRITEMASK_Z),
                negate(swizzle(srctemp, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)),
                swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
                builtin_zero);
 
        // tmp.x, tmp.y, tmp.w = 1.0, tmp.x, 1.0
-       emit1(t->Program, OPCODE_MOV, inst->SaturateMode,
+       emit1(c, inst->Prev, OPCODE_MOV, inst->I.SaturateMode,
                dstregtmpmask(temp, WRITEMASK_XYW),
                swizzle(srctemp, SWIZZLE_ONE, SWIZZLE_X, SWIZZLE_ONE, SWIZZLE_ONE));
 
-       if (needTemporary)
-               emit1(t->Program, OPCODE_MOV, 0, inst->DstReg, srctemp);
+       rc_remove_instruction(inst);
 }
 
-static void transform_LRP(struct radeon_transform_context* t,
-       struct prog_instruction* inst)
+static void transform_LRP(struct radeon_compiler* c,
+       struct rc_instruction* inst)
 {
-       int tempreg = radeonFindFreeTemporary(t);
+       int tempreg = rc_find_free_temporary(c);
 
-       emit2(t->Program, OPCODE_ADD, 0,
+       emit2(c, inst->Prev, OPCODE_ADD, 0,
                dstreg(PROGRAM_TEMPORARY, tempreg),
-               inst->SrcReg[1], negate(inst->SrcReg[2]));
-       emit3(t->Program, OPCODE_MAD, inst->SaturateMode,
-               inst->DstReg,
-               inst->SrcReg[0], srcreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[2]);
+               inst->I.SrcReg[1], negate(inst->I.SrcReg[2]));
+       emit3(c, inst->Prev, OPCODE_MAD, inst->I.SaturateMode,
+               inst->I.DstReg,
+               inst->I.SrcReg[0], srcreg(PROGRAM_TEMPORARY, tempreg), inst->I.SrcReg[2]);
+
+       rc_remove_instruction(inst);
 }
 
-static void transform_POW(struct radeon_transform_context* t,
-       struct prog_instruction* inst)
+static void transform_POW(struct radeon_compiler* c,
+       struct rc_instruction* inst)
 {
-       int tempreg = radeonFindFreeTemporary(t);
+       int tempreg = rc_find_free_temporary(c);
        struct prog_dst_register tempdst = dstreg(PROGRAM_TEMPORARY, tempreg);
        struct prog_src_register tempsrc = srcreg(PROGRAM_TEMPORARY, tempreg);
        tempdst.WriteMask = WRITEMASK_W;
        tempsrc.Swizzle = SWIZZLE_WWWW;
 
-       emit1(t->Program, OPCODE_LG2, 0, tempdst, scalar(inst->SrcReg[0]));
-       emit2(t->Program, OPCODE_MUL, 0, tempdst, tempsrc, scalar(inst->SrcReg[1]));
-       emit1(t->Program, OPCODE_EX2, inst->SaturateMode, inst->DstReg, tempsrc);
+       emit1(c, inst->Prev, OPCODE_LG2, 0, tempdst, scalar(inst->I.SrcReg[0]));
+       emit2(c, inst->Prev, OPCODE_MUL, 0, tempdst, tempsrc, scalar(inst->I.SrcReg[1]));
+       emit1(c, inst->Prev, OPCODE_EX2, inst->I.SaturateMode, inst->I.DstReg, tempsrc);
+
+       rc_remove_instruction(inst);
 }
 
-static void transform_RSQ(struct radeon_transform_context* t,
-       struct prog_instruction* inst)
+static void transform_RSQ(struct radeon_compiler* c,
+       struct rc_instruction* inst)
 {
-       emit1(t->Program, OPCODE_RSQ, inst->SaturateMode, inst->DstReg, absolute(inst->SrcReg[0]));
+       inst->I.SrcReg[0] = absolute(inst->I.SrcReg[0]);
 }
 
-static void transform_SGE(struct radeon_transform_context* t,
-       struct prog_instruction* inst)
+static void transform_SGE(struct radeon_compiler* c,
+       struct rc_instruction* inst)
 {
-       int tempreg = radeonFindFreeTemporary(t);
+       int tempreg = rc_find_free_temporary(c);
 
-       emit2(t->Program, OPCODE_ADD, 0, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0], negate(inst->SrcReg[1]));
-       emit3(t->Program, OPCODE_CMP, inst->SaturateMode, inst->DstReg,
+       emit2(c, inst->Prev, OPCODE_ADD, 0, dstreg(PROGRAM_TEMPORARY, tempreg), inst->I.SrcReg[0], negate(inst->I.SrcReg[1]));
+       emit3(c, inst->Prev, OPCODE_CMP, inst->I.SaturateMode, inst->I.DstReg,
                srcreg(PROGRAM_TEMPORARY, tempreg), builtin_zero, builtin_one);
+
+       rc_remove_instruction(inst);
 }
 
-static void transform_SLT(struct radeon_transform_context* t,
-       struct prog_instruction* inst)
+static void transform_SLT(struct radeon_compiler* c,
+       struct rc_instruction* inst)
 {
-       int tempreg = radeonFindFreeTemporary(t);
+       int tempreg = rc_find_free_temporary(c);
 
-       emit2(t->Program, OPCODE_ADD, 0, dstreg(PROGRAM_TEMPORARY, tempreg), inst->SrcReg[0], negate(inst->SrcReg[1]));
-       emit3(t->Program, OPCODE_CMP, inst->SaturateMode, inst->DstReg,
+       emit2(c, inst->Prev, OPCODE_ADD, 0, dstreg(PROGRAM_TEMPORARY, tempreg), inst->I.SrcReg[0], negate(inst->I.SrcReg[1]));
+       emit3(c, inst->Prev, OPCODE_CMP, inst->I.SaturateMode, inst->I.DstReg,
                srcreg(PROGRAM_TEMPORARY, tempreg), builtin_one, builtin_zero);
+
+       rc_remove_instruction(inst);
 }
 
-static void transform_SUB(struct radeon_transform_context* t,
-       struct prog_instruction* inst)
+static void transform_SUB(struct radeon_compiler* c,
+       struct rc_instruction* inst)
 {
-       emit2(t->Program, OPCODE_ADD, inst->SaturateMode, inst->DstReg, inst->SrcReg[0], negate(inst->SrcReg[1]));
+       inst->I.Opcode = OPCODE_ADD;
+       inst->I.SrcReg[1] = negate(inst->I.SrcReg[1]);
 }
 
-static void transform_SWZ(struct radeon_transform_context* t,
-       struct prog_instruction* inst)
+static void transform_SWZ(struct radeon_compiler* c,
+       struct rc_instruction* inst)
 {
-       emit1(t->Program, OPCODE_MOV, inst->SaturateMode, inst->DstReg, inst->SrcReg[0]);
+       inst->I.Opcode = OPCODE_MOV;
 }
 
-static void transform_XPD(struct radeon_transform_context* t,
-       struct prog_instruction* inst)
+static void transform_XPD(struct radeon_compiler* c,
+       struct rc_instruction* inst)
 {
-       int tempreg = radeonFindFreeTemporary(t);
-
-       emit2(t->Program, OPCODE_MUL, 0, dstreg(PROGRAM_TEMPORARY, tempreg),
-               swizzle(inst->SrcReg[0], SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_W),
-               swizzle(inst->SrcReg[1], SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_W));
-       emit3(t->Program, OPCODE_MAD, inst->SaturateMode, inst->DstReg,
-               swizzle(inst->SrcReg[0], SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_W),
-               swizzle(inst->SrcReg[1], SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_W),
+       int tempreg = rc_find_free_temporary(c);
+
+       emit2(c, inst->Prev, OPCODE_MUL, 0, dstreg(PROGRAM_TEMPORARY, tempreg),
+               swizzle(inst->I.SrcReg[0], SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_W),
+               swizzle(inst->I.SrcReg[1], SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_W));
+       emit3(c, inst->Prev, OPCODE_MAD, inst->I.SaturateMode, inst->I.DstReg,
+               swizzle(inst->I.SrcReg[0], SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_W),
+               swizzle(inst->I.SrcReg[1], SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_W),
                negate(srcreg(PROGRAM_TEMPORARY, tempreg)));
+
+       rc_remove_instruction(inst);
 }
 
 
@@ -392,31 +421,64 @@ static void transform_XPD(struct radeon_transform_context* t,
  *
  * @note should be applicable to R300 and R500 fragment programs.
  */
-GLboolean radeonTransformALU(struct radeon_transform_context* t,
-       struct prog_instruction* inst,
+GLboolean radeonTransformALU(
+       struct radeon_compiler * c,
+       struct rc_instruction* inst,
        void* unused)
 {
-       switch(inst->Opcode) {
-       case OPCODE_ABS: transform_ABS(t, inst); return GL_TRUE;
-       case OPCODE_DPH: transform_DPH(t, inst); return GL_TRUE;
-       case OPCODE_DST: transform_DST(t, inst); return GL_TRUE;
-       case OPCODE_FLR: transform_FLR(t, inst); return GL_TRUE;
-       case OPCODE_LIT: transform_LIT(t, inst); return GL_TRUE;
-       case OPCODE_LRP: transform_LRP(t, inst); return GL_TRUE;
-       case OPCODE_POW: transform_POW(t, inst); return GL_TRUE;
-       case OPCODE_RSQ: transform_RSQ(t, inst); return GL_TRUE;
-       case OPCODE_SGE: transform_SGE(t, inst); return GL_TRUE;
-       case OPCODE_SLT: transform_SLT(t, inst); return GL_TRUE;
-       case OPCODE_SUB: transform_SUB(t, inst); return GL_TRUE;
-       case OPCODE_SWZ: transform_SWZ(t, inst); return GL_TRUE;
-       case OPCODE_XPD: transform_XPD(t, inst); return GL_TRUE;
+       switch(inst->I.Opcode) {
+       case OPCODE_ABS: transform_ABS(c, inst); return GL_TRUE;
+       case OPCODE_DPH: transform_DPH(c, inst); return GL_TRUE;
+       case OPCODE_DST: transform_DST(c, inst); return GL_TRUE;
+       case OPCODE_FLR: transform_FLR(c, inst); return GL_TRUE;
+       case OPCODE_LIT: transform_LIT(c, inst); return GL_TRUE;
+       case OPCODE_LRP: transform_LRP(c, inst); return GL_TRUE;
+       case OPCODE_POW: transform_POW(c, inst); return GL_TRUE;
+       case OPCODE_RSQ: transform_RSQ(c, inst); return GL_TRUE;
+       case OPCODE_SGE: transform_SGE(c, inst); return GL_TRUE;
+       case OPCODE_SLT: transform_SLT(c, inst); return GL_TRUE;
+       case OPCODE_SUB: transform_SUB(c, inst); return GL_TRUE;
+       case OPCODE_SWZ: transform_SWZ(c, inst); return GL_TRUE;
+       case OPCODE_XPD: transform_XPD(c, inst); return GL_TRUE;
        default:
                return GL_FALSE;
        }
 }
 
 
-static void sincos_constants(struct radeon_transform_context* t, GLuint *constants)
+static void transform_r300_vertex_ABS(struct radeon_compiler* c,
+       struct rc_instruction* inst)
+{
+       /* Note: r500 can take absolute values, but r300 cannot. */
+       inst->I.Opcode = OPCODE_MAX;
+       inst->I.SrcReg[1] = inst->I.SrcReg[0];
+       inst->I.SrcReg[1].Negate ^= NEGATE_XYZW;
+}
+
+/**
+ * For use with radeonLocalTransform, this transforms non-native ALU
+ * instructions of the r300 up to r500 vertex engine.
+ */
+GLboolean r300_transform_vertex_alu(
+       struct radeon_compiler * c,
+       struct rc_instruction* inst,
+       void* unused)
+{
+       switch(inst->I.Opcode) {
+       case OPCODE_ABS: transform_r300_vertex_ABS(c, inst); return GL_TRUE;
+       case OPCODE_DP3: transform_DP3(c, inst); return GL_TRUE;
+       case OPCODE_DPH: transform_DPH(c, inst); return GL_TRUE;
+       case OPCODE_FLR: transform_FLR(c, inst); return GL_TRUE;
+       case OPCODE_LRP: transform_LRP(c, inst); return GL_TRUE;
+       case OPCODE_SUB: transform_SUB(c, inst); return GL_TRUE;
+       case OPCODE_SWZ: transform_SWZ(c, inst); return GL_TRUE;
+       case OPCODE_XPD: transform_XPD(c, inst); return GL_TRUE;
+       default:
+               return GL_FALSE;
+       }
+}
+
+static void sincos_constants(struct radeon_compiler* c, GLuint *constants)
 {
        static const GLfloat SinCosConsts[2][4] = {
                {
@@ -434,11 +496,8 @@ static void sincos_constants(struct radeon_transform_context* t, GLuint *constan
        };
        int i;
 
-       for(i = 0; i < 2; ++i) {
-               GLuint swz;
-               constants[i] = _mesa_add_unnamed_constant(t->Program->Parameters, SinCosConsts[i], 4, &swz);
-               ASSERT(swz == SWIZZLE_NOOP);
-       }
+       for(i = 0; i < 2; ++i)
+               constants[i] = rc_constants_add_immediate_vec4(&c->Program.Constants, SinCosConsts[i]);
 }
 
 /**
@@ -449,23 +508,24 @@ static void sincos_constants(struct radeon_transform_context* t, GLuint *constan
  * MAD tmp.y, tmp.x, |tmp.x|, -tmp.x
  * MAD dest, tmp.y, weight, tmp.x
  */
-static void sin_approx(struct radeon_transform_context* t,
+static void sin_approx(
+       struct radeon_compiler* c, struct rc_instruction * after,
        struct prog_dst_register dst, struct prog_src_register src, const GLuint* constants)
 {
-       GLuint tempreg = radeonFindFreeTemporary(t);
+       GLuint tempreg = rc_find_free_temporary(c);
 
-       emit2(t->Program, OPCODE_MUL, 0, dstregtmpmask(tempreg, WRITEMASK_XY),
+       emit2(c, after->Prev, OPCODE_MUL, 0, dstregtmpmask(tempreg, WRITEMASK_XY),
                swizzle(src, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
                srcreg(PROGRAM_CONSTANT, constants[0]));
-       emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_X),
+       emit3(c, after->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_X),
                swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y),
                absolute(swizzle(src, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)),
                swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X));
-       emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_Y),
+       emit3(c, after->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_Y),
                swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
                absolute(swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)),
                negate(swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)));
-       emit3(t->Program, OPCODE_MAD, 0, dst,
+       emit3(c, after->Prev, OPCODE_MAD, 0, dst,
                swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y),
                swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
                swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X));
@@ -476,78 +536,80 @@ static void sin_approx(struct radeon_transform_context* t,
  * using only the basic instructions
  *  MOV, ADD, MUL, MAD, FRC
  */
-GLboolean radeonTransformTrigSimple(struct radeon_transform_context* t,
-       struct prog_instruction* inst,
+GLboolean radeonTransformTrigSimple(struct radeon_compiler* c,
+       struct rc_instruction* inst,
        void* unused)
 {
-       if (inst->Opcode != OPCODE_COS &&
-           inst->Opcode != OPCODE_SIN &&
-           inst->Opcode != OPCODE_SCS)
+       if (inst->I.Opcode != OPCODE_COS &&
+           inst->I.Opcode != OPCODE_SIN &&
+           inst->I.Opcode != OPCODE_SCS)
                return GL_FALSE;
 
        GLuint constants[2];
-       GLuint tempreg = radeonFindFreeTemporary(t);
+       GLuint tempreg = rc_find_free_temporary(c);
 
-       sincos_constants(t, constants);
+       sincos_constants(c, constants);
 
-       if (inst->Opcode == OPCODE_COS) {
+       if (inst->I.Opcode == OPCODE_COS) {
                // MAD tmp.x, src, 1/(2*PI), 0.75
                // FRC tmp.x, tmp.x
                // MAD tmp.z, tmp.x, 2*PI, -PI
-               emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W),
-                       swizzle(inst->SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
+               emit3(c, inst->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W),
+                       swizzle(inst->I.SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
                        swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z),
                        swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X));
-               emit1(t->Program, OPCODE_FRC, 0, dstregtmpmask(tempreg, WRITEMASK_W),
+               emit1(c, inst->Prev, OPCODE_FRC, 0, dstregtmpmask(tempreg, WRITEMASK_W),
                        swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W));
-               emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W),
+               emit3(c, inst->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W),
                        swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
                        swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
                        negate(swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z)));
 
-               sin_approx(t, inst->DstReg,
+               sin_approx(c, inst->Prev, inst->I.DstReg,
                        swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
                        constants);
-       } else if (inst->Opcode == OPCODE_SIN) {
-               emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W),
-                       swizzle(inst->SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
+       } else if (inst->I.Opcode == OPCODE_SIN) {
+               emit3(c, inst->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W),
+                       swizzle(inst->I.SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
                        swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z),
                        swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y));
-               emit1(t->Program, OPCODE_FRC, 0, dstregtmpmask(tempreg, WRITEMASK_W),
+               emit1(c, inst->Prev, OPCODE_FRC, 0, dstregtmpmask(tempreg, WRITEMASK_W),
                        swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W));
-               emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W),
+               emit3(c, inst->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W),
                        swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
                        swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
                        negate(swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z)));
 
-               sin_approx(t, inst->DstReg,
+               sin_approx(c, inst->Prev, inst->I.DstReg,
                        swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
                        constants);
        } else {
-               emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_XY),
-                       swizzle(inst->SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
+               emit3(c, inst->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_XY),
+                       swizzle(inst->I.SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
                        swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z),
                        swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W));
-               emit1(t->Program, OPCODE_FRC, 0, dstregtmpmask(tempreg, WRITEMASK_XY),
+               emit1(c, inst->Prev, OPCODE_FRC, 0, dstregtmpmask(tempreg, WRITEMASK_XY),
                        srcreg(PROGRAM_TEMPORARY, tempreg));
-               emit3(t->Program, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_XY),
+               emit3(c, inst->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_XY),
                        srcreg(PROGRAM_TEMPORARY, tempreg),
                        swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
                        negate(swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z)));
 
-               struct prog_dst_register dst = inst->DstReg;
+               struct prog_dst_register dst = inst->I.DstReg;
 
-               dst.WriteMask = inst->DstReg.WriteMask & WRITEMASK_X;
-               sin_approx(t, dst,
+               dst.WriteMask = inst->I.DstReg.WriteMask & WRITEMASK_X;
+               sin_approx(c, inst->Prev, dst,
                        swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
                        constants);
 
-               dst.WriteMask = inst->DstReg.WriteMask & WRITEMASK_Y;
-               sin_approx(t, dst,
+               dst.WriteMask = inst->I.DstReg.WriteMask & WRITEMASK_Y;
+               sin_approx(c, inst->Prev, dst,
                        swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y),
                        constants);
        }
 
+       rc_remove_instruction(inst);
+
        return GL_TRUE;
 }
 
@@ -560,50 +622,52 @@ GLboolean radeonTransformTrigSimple(struct radeon_transform_context* t,
  *
  * @warning This transformation implicitly changes the semantics of SIN and COS!
  */
-GLboolean radeonTransformTrigScale(struct radeon_transform_context* t,
-       struct prog_instruction* inst,
+GLboolean radeonTransformTrigScale(struct radeon_compiler* c,
+       struct rc_instruction* inst,
        void* unused)
 {
-       if (inst->Opcode != OPCODE_COS &&
-           inst->Opcode != OPCODE_SIN &&
-           inst->Opcode != OPCODE_SCS)
+       if (inst->I.Opcode != OPCODE_COS &&
+           inst->I.Opcode != OPCODE_SIN &&
+           inst->I.Opcode != OPCODE_SCS)
                return GL_FALSE;
 
-       static const GLfloat RCP_2PI[] = { 0.15915494309189535 };
+       static const GLfloat RCP_2PI = 0.15915494309189535;
        GLuint temp;
        GLuint constant;
        GLuint constant_swizzle;
 
-       temp = radeonFindFreeTemporary(t);
-       constant = _mesa_add_unnamed_constant(t->Program->Parameters, RCP_2PI, 1, &constant_swizzle);
+       temp = rc_find_free_temporary(c);
+       constant = rc_constants_add_immediate_scalar(&c->Program.Constants, RCP_2PI, &constant_swizzle);
 
-       emit2(t->Program, OPCODE_MUL, 0, dstregtmpmask(temp, WRITEMASK_W),
-               swizzle(inst->SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
+       emit2(c, inst->Prev, OPCODE_MUL, 0, dstregtmpmask(temp, WRITEMASK_W),
+               swizzle(inst->I.SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
                srcregswz(PROGRAM_CONSTANT, constant, constant_swizzle));
-       emit1(t->Program, OPCODE_FRC, 0, dstregtmpmask(temp, WRITEMASK_W),
+       emit1(c, inst->Prev, OPCODE_FRC, 0, dstregtmpmask(temp, WRITEMASK_W),
                srcreg(PROGRAM_TEMPORARY, temp));
 
-       if (inst->Opcode == OPCODE_COS) {
-               emit1(t->Program, OPCODE_COS, inst->SaturateMode, inst->DstReg,
+       if (inst->I.Opcode == OPCODE_COS) {
+               emit1(c, inst->Prev, OPCODE_COS, inst->I.SaturateMode, inst->I.DstReg,
                        srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW));
-       } else if (inst->Opcode == OPCODE_SIN) {
-               emit1(t->Program, OPCODE_SIN, inst->SaturateMode,
-                       inst->DstReg, srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW));
-       } else if (inst->Opcode == OPCODE_SCS) {
-               struct prog_dst_register moddst = inst->DstReg;
+       } else if (inst->I.Opcode == OPCODE_SIN) {
+               emit1(c, inst->Prev, OPCODE_SIN, inst->I.SaturateMode,
+                       inst->I.DstReg, srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW));
+       } else if (inst->I.Opcode == OPCODE_SCS) {
+               struct prog_dst_register moddst = inst->I.DstReg;
 
-               if (inst->DstReg.WriteMask & WRITEMASK_X) {
+               if (inst->I.DstReg.WriteMask & WRITEMASK_X) {
                        moddst.WriteMask = WRITEMASK_X;
-                       emit1(t->Program, OPCODE_COS, inst->SaturateMode, moddst,
+                       emit1(c, inst->Prev, OPCODE_COS, inst->I.SaturateMode, moddst,
                                srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW));
                }
-               if (inst->DstReg.WriteMask & WRITEMASK_Y) {
+               if (inst->I.DstReg.WriteMask & WRITEMASK_Y) {
                        moddst.WriteMask = WRITEMASK_Y;
-                       emit1(t->Program, OPCODE_SIN, inst->SaturateMode, moddst,
+                       emit1(c, inst->Prev, OPCODE_SIN, inst->I.SaturateMode, moddst,
                                srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW));
                }
        }
 
+       rc_remove_instruction(inst);
+
        return GL_TRUE;
 }
 
@@ -615,21 +679,15 @@ GLboolean radeonTransformTrigScale(struct radeon_transform_context* t,
  * @warning This explicitly changes the form of DDX and DDY!
  */
 
-GLboolean radeonTransformDeriv(struct radeon_transform_context* t,
-       struct prog_instruction* inst,
+GLboolean radeonTransformDeriv(struct radeon_compiler* c,
+       struct rc_instruction* inst,
        void* unused)
 {
-       if (inst->Opcode != OPCODE_DDX && inst->Opcode != OPCODE_DDY)
+       if (inst->I.Opcode != OPCODE_DDX && inst->I.Opcode != OPCODE_DDY)
                return GL_FALSE;
 
-       struct prog_src_register B = inst->SrcReg[1];
-
-       B.Swizzle = MAKE_SWIZZLE4(SWIZZLE_ONE, SWIZZLE_ONE,
-                                               SWIZZLE_ONE, SWIZZLE_ONE);
-       B.Negate = NEGATE_XYZW;
-
-       emit2(t->Program, inst->Opcode, inst->SaturateMode, inst->DstReg,
-               inst->SrcReg[0], B);
+       inst->I.SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_ONE, SWIZZLE_ONE, SWIZZLE_ONE, SWIZZLE_ONE);
+       inst->I.SrcReg[1].Negate = NEGATE_XYZW;
 
        return GL_TRUE;
 }
 #include "radeon_program.h"
 
 GLboolean radeonTransformALU(
-       struct radeon_transform_context *t,
-       struct prog_instruction*,
+       struct radeon_compiler * c,
+       struct rc_instruction * inst,
+       void*);
+
+GLboolean r300_transform_vertex_alu(
+       struct radeon_compiler * c,
+       struct rc_instruction * inst,
        void*);
 
 GLboolean radeonTransformTrigSimple(
-       struct radeon_transform_context *t,
-       struct prog_instruction*,
+       struct radeon_compiler * c,
+       struct rc_instruction * inst,
        void*);
 
 GLboolean radeonTransformTrigScale(
-       struct radeon_transform_context *t,
-       struct prog_instruction*,
+       struct radeon_compiler * c,
+       struct rc_instruction * inst,
        void*);
 
 GLboolean radeonTransformDeriv(
-       struct radeon_transform_context *t,
-       struct prog_instruction*,
+       struct radeon_compiler * c,
+       struct rc_instruction * inst,
        void*);
 
 #endif /* __RADEON_PROGRAM_ALU_H_ */
 
 #include "radeon_program_pair.h"
 
-#include "radeon_common.h"
-
+#include "memory_pool.h"
+#include "radeon_compiler.h"
 #include "shader/prog_print.h"
 
 #define error(fmt, args...) do { \
-       _mesa_problem(s->Ctx, "%s::%s(): " fmt "\n",    \
+       rc_error(&s->Compiler->Base, "%s::%s(): " fmt "\n",     \
                __FILE__, __FUNCTION__, ##args);        \
-       s->Error = GL_TRUE;                             \
 } while(0)
 
 struct pair_state_instruction {
+       struct prog_instruction Instruction;
+       GLuint IP; /**< Position of this instruction in original program */
+
        GLuint IsTex:1; /**< Is a texture instruction */
        GLuint NeedRGB:1; /**< Needs the RGB ALU */
        GLuint NeedAlpha:1; /**< Needs the Alpha ALU */
@@ -73,7 +75,7 @@ struct pair_state_instruction {
  * Used to keep track of which instructions read a value.
  */
 struct reg_value_reader {
-       GLuint IP; /**< IP of the instruction that performs this access */
+       struct pair_state_instruction *Reader;
        struct reg_value_reader *Next;
 };
 
@@ -82,7 +84,7 @@ struct reg_value_reader {
  * PROGRAM_TEMPORARY.
  */
 struct reg_value {
-       GLuint IP; /**< IP of the instruction that writes this value */
+       struct pair_state_instruction *Writer;
        struct reg_value *Next; /**< Pointer to the next value to be written to the same PROGRAM_TEMPORARY component */
 
        /**
@@ -116,11 +118,8 @@ struct pair_register_translation {
 };
 
 struct pair_state {
-       GLcontext *Ctx;
-       struct gl_program *Program;
+       struct r300_fragment_program_compiler * Compiler;
        const struct radeon_pair_handler *Handler;
-       GLboolean Error;
-       GLboolean Debug;
        GLboolean Verbose;
        void *UserData;
 
@@ -130,11 +129,6 @@ struct pair_state {
        struct pair_register_translation Inputs[FRAG_ATTRIB_MAX];
        struct pair_register_translation Temps[MAX_PROGRAM_TEMPS];
 
-       /**
-        * Derived information about program instructions.
-        */
-       struct pair_state_instruction *Instructions;
-
        struct {
                GLuint RefCount; /**< # of times this occurs in an unscheduled SrcReg or DstReg */
        } HwTemps[128];
@@ -147,14 +141,6 @@ struct pair_state {
        struct pair_state_instruction *ReadyRGB;
        struct pair_state_instruction *ReadyAlpha;
        struct pair_state_instruction *ReadyTEX;
-
-       /**
-        * Pool of @ref reg_value structures for fast allocation.
-        */
-       struct reg_value *ValuePool;
-       GLuint ValuePoolUsed;
-       struct reg_value_reader *ReaderPool;
-       GLuint ReaderPoolUsed;
 };
 
 
@@ -183,7 +169,7 @@ static GLuint get_hw_reg(struct pair_state *s, GLuint file, GLuint index)
 
        struct pair_register_translation *t = get_register(s, file, index);
        if (!t) {
-               _mesa_problem(s->Ctx, "get_hw_reg: %i[%i]\n", file, index);
+               error("get_hw_reg: %i[%i]\n", file, index);
                return 0;
        }
 
@@ -221,15 +207,13 @@ static void add_pairinst_to_list(struct pair_state_instruction **list, struct pa
 }
 
 /**
- * The instruction at the given IP has become ready. Link it into the ready
+ * The given instruction has become ready. Link it into the ready
  * instructions.
  */
-static void instruction_ready(struct pair_state *s, int ip)
+static void instruction_ready(struct pair_state *s, struct pair_state_instruction *pairinst)
 {
-       struct pair_state_instruction *pairinst = s->Instructions + ip;
-
        if (s->Verbose)
-               _mesa_printf("instruction_ready(%i)\n", ip);
+               _mesa_printf("instruction_ready(%i)\n", pairinst->IP);
 
        if (pairinst->IsTex)
                add_pairinst_to_list(&s->ReadyTEX, pairinst);
@@ -296,12 +280,12 @@ static void final_rewrite(struct pair_state *s, struct prog_instruction *inst)
  * Classify an instruction according to which ALUs etc. it needs
  */
 static void classify_instruction(struct pair_state *s,
-       struct prog_instruction *inst, struct pair_state_instruction *pairinst)
+       struct pair_state_instruction *psi)
 {
-       pairinst->NeedRGB = (inst->DstReg.WriteMask & WRITEMASK_XYZ) ? 1 : 0;
-       pairinst->NeedAlpha = (inst->DstReg.WriteMask & WRITEMASK_W) ? 1 : 0;
+       psi->NeedRGB = (psi->Instruction.DstReg.WriteMask & WRITEMASK_XYZ) ? 1 : 0;
+       psi->NeedAlpha = (psi->Instruction.DstReg.WriteMask & WRITEMASK_W) ? 1 : 0;
 
-       switch(inst->Opcode) {
+       switch(psi->Instruction.Opcode) {
        case OPCODE_ADD:
        case OPCODE_CMP:
        case OPCODE_DDX:
@@ -319,24 +303,24 @@ static void classify_instruction(struct pair_state *s,
        case OPCODE_RCP:
        case OPCODE_RSQ:
        case OPCODE_SIN:
-               pairinst->IsTranscendent = 1;
-               pairinst->NeedAlpha = 1;
+               psi->IsTranscendent = 1;
+               psi->NeedAlpha = 1;
                break;
        case OPCODE_DP4:
-               pairinst->NeedAlpha = 1;
+               psi->NeedAlpha = 1;
                /* fall through */
        case OPCODE_DP3:
-               pairinst->NeedRGB = 1;
+               psi->NeedRGB = 1;
                break;
        case OPCODE_KIL:
        case OPCODE_TEX:
        case OPCODE_TXB:
        case OPCODE_TXP:
        case OPCODE_END:
-               pairinst->IsTex = 1;
+               psi->IsTex = 1;
                break;
        default:
-               error("Unknown opcode %d\n", inst->Opcode);
+               error("Unknown opcode %d\n", psi->Instruction.Opcode);
                break;
        }
 }
@@ -348,30 +332,34 @@ static void classify_instruction(struct pair_state *s,
  */
 static void scan_instructions(struct pair_state *s)
 {
-       struct prog_instruction *inst;
-       struct pair_state_instruction *pairinst;
+       struct rc_instruction *source;
        GLuint ip;
 
-       for(inst = s->Program->Instructions, pairinst = s->Instructions, ip = 0;
-           inst->Opcode != OPCODE_END;
-           ++inst, ++pairinst, ++ip) {
-               final_rewrite(s, inst);
-               classify_instruction(s, inst, pairinst);
+       for(source = s->Compiler->Base.Program.Instructions.Next, ip = 0;
+           source != &s->Compiler->Base.Program.Instructions;
+           source = source->Next, ++ip) {
+               struct pair_state_instruction *pairinst = memory_pool_malloc(&s->Compiler->Base.Pool, sizeof(*pairinst));
+               memset(pairinst, 0, sizeof(struct pair_state_instruction));
+
+               pairinst->Instruction = source->I;
+               pairinst->IP = ip;
+               final_rewrite(s, &pairinst->Instruction);
+               classify_instruction(s, pairinst);
 
-               int nsrc = _mesa_num_inst_src_regs(inst->Opcode);
+               int nsrc = _mesa_num_inst_src_regs(pairinst->Instruction.Opcode);
                int j;
                for(j = 0; j < nsrc; j++) {
                        struct pair_register_translation *t =
-                               get_register(s, inst->SrcReg[j].File, inst->SrcReg[j].Index);
+                               get_register(s, pairinst->Instruction.SrcReg[j].File, pairinst->Instruction.SrcReg[j].Index);
                        if (!t)
                                continue;
 
                        t->RefCount++;
 
-                       if (inst->SrcReg[j].File == PROGRAM_TEMPORARY) {
+                       if (pairinst->Instruction.SrcReg[j].File == PROGRAM_TEMPORARY) {
                                int i;
                                for(i = 0; i < 4; ++i) {
-                                       GLuint swz = GET_SWZ(inst->SrcReg[j].Swizzle, i);
+                                       GLuint swz = GET_SWZ(pairinst->Instruction.SrcReg[j].Swizzle, i);
                                        if (swz >= 4)
                                                continue; /* constant or NIL swizzle */
                                        if (!t->Value[swz])
@@ -381,36 +369,37 @@ static void scan_instructions(struct pair_state *s)
                                         * also rewrites the value. The code below adds
                                         * a dependency for the DstReg, which is a superset
                                         * of the SrcReg dependency. */
-                                       if (inst->DstReg.File == PROGRAM_TEMPORARY &&
-                                           inst->DstReg.Index == inst->SrcReg[j].Index &&
-                                           GET_BIT(inst->DstReg.WriteMask, swz))
+                                       if (pairinst->Instruction.DstReg.File == PROGRAM_TEMPORARY &&
+                                           pairinst->Instruction.DstReg.Index == pairinst->Instruction.SrcReg[j].Index &&
+                                           GET_BIT(pairinst->Instruction.DstReg.WriteMask, swz))
                                                continue;
 
-                                       struct reg_value_reader* r = &s->ReaderPool[s->ReaderPoolUsed++];
+                                       struct reg_value_reader* r = memory_pool_malloc(&s->Compiler->Base.Pool, sizeof(*r));
                                        pairinst->NumDependencies++;
                                        t->Value[swz]->NumReaders++;
-                                       r->IP = ip;
+                                       r->Reader = pairinst;
                                        r->Next = t->Value[swz]->Readers;
                                        t->Value[swz]->Readers = r;
                                }
                        }
                }
 
-               int ndst = _mesa_num_inst_dst_regs(inst->Opcode);
+               int ndst = _mesa_num_inst_dst_regs(pairinst->Instruction.Opcode);
                if (ndst) {
                        struct pair_register_translation *t =
-                               get_register(s, inst->DstReg.File, inst->DstReg.Index);
+                               get_register(s, pairinst->Instruction.DstReg.File, pairinst->Instruction.DstReg.Index);
                        if (t) {
                                t->RefCount++;
 
-                               if (inst->DstReg.File == PROGRAM_TEMPORARY) {
+                               if (pairinst->Instruction.DstReg.File == PROGRAM_TEMPORARY) {
                                        int j;
                                        for(j = 0; j < 4; ++j) {
-                                               if (!GET_BIT(inst->DstReg.WriteMask, j))
+                                               if (!GET_BIT(pairinst->Instruction.DstReg.WriteMask, j))
                                                        continue;
 
-                                               struct reg_value* v = &s->ValuePool[s->ValuePoolUsed++];
-                                               v->IP = ip;
+                                               struct reg_value* v = memory_pool_malloc(&s->Compiler->Base.Pool, sizeof(*v));
+                                               memset(v, 0, sizeof(struct reg_value));
+                                               v->Writer = pairinst;
                                                if (t->Value[j]) {
                                                        pairinst->NumDependencies++;
                                                        t->Value[j]->Next = v;
@@ -426,7 +415,7 @@ static void scan_instructions(struct pair_state *s)
                        _mesa_printf("scan(%i): NumDeps = %i\n", ip, pairinst->NumDependencies);
 
                if (!pairinst->NumDependencies)
-                       instruction_ready(s, ip);
+                       instruction_ready(s, pairinst);
        }
 
        /* Clear the PROGRAM_TEMPORARY state */
@@ -438,70 +427,23 @@ static void scan_instructions(struct pair_state *s)
 }
 
 
-/**
- * Reserve hardware temporary registers for the program inputs.
- *
- * @note This allocation is performed explicitly, because the order of inputs
- * is determined by the RS hardware.
- */
-static void allocate_input_registers(struct pair_state *s)
-{
-       GLuint InputsRead = s->Program->InputsRead;
-       int i;
-       GLuint hwindex = 0;
-
-       /* Primary colour */
-       if (InputsRead & FRAG_BIT_COL0)
-               alloc_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_COL0, hwindex++);
-       InputsRead &= ~FRAG_BIT_COL0;
-
-       /* Secondary color */
-       if (InputsRead & FRAG_BIT_COL1)
-               alloc_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_COL1, hwindex++);
-       InputsRead &= ~FRAG_BIT_COL1;
-
-       /* Texcoords */
-       for (i = 0; i < s->Ctx->Const.MaxTextureUnits; i++) {
-               if (InputsRead & (FRAG_BIT_TEX0 << i))
-                       alloc_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_TEX0+i, hwindex++);
-       }
-       InputsRead &= ~FRAG_BITS_TEX_ANY;
-
-       /* Fogcoords treated as a texcoord */
-       if (InputsRead & FRAG_BIT_FOGC)
-               alloc_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_FOGC, hwindex++);
-       InputsRead &= ~FRAG_BIT_FOGC;
-
-       /* fragment position treated as a texcoord */
-       if (InputsRead & FRAG_BIT_WPOS)
-               alloc_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_WPOS, hwindex++);
-       InputsRead &= ~FRAG_BIT_WPOS;
-
-       /* Anything else */
-       if (InputsRead)
-               error("Don't know how to handle inputs 0x%x\n", InputsRead);
-}
-
-
-static void decrement_dependencies(struct pair_state *s, int ip)
+static void decrement_dependencies(struct pair_state *s, struct pair_state_instruction *pairinst)
 {
-       struct pair_state_instruction *pairinst = s->Instructions + ip;
        ASSERT(pairinst->NumDependencies > 0);
        if (!--pairinst->NumDependencies)
-               instruction_ready(s, ip);
+               instruction_ready(s, pairinst);
 }
 
 /**
  * Update the dependency tracking state based on what the instruction
  * at the given IP does.
  */
-static void commit_instruction(struct pair_state *s, int ip)
+static void commit_instruction(struct pair_state *s, struct pair_state_instruction *pairinst)
 {
-       struct prog_instruction *inst = s->Program->Instructions + ip;
-       struct pair_state_instruction *pairinst = s->Instructions + ip;
+       struct prog_instruction *inst = &pairinst->Instruction;
 
        if (s->Verbose)
-               _mesa_printf("commit_instruction(%i)\n", ip);
+               _mesa_printf("commit_instruction(%i)\n", pairinst->IP);
 
        if (inst->DstReg.File == PROGRAM_TEMPORARY) {
                struct pair_register_translation *t = &s->Temps[inst->DstReg.Index];
@@ -516,11 +458,11 @@ static void commit_instruction(struct pair_state *s, int ip)
                        if (t->Value[i]->NumReaders) {
                                struct reg_value_reader *r;
                                for(r = pairinst->Values[i]->Readers; r; r = r->Next)
-                                       decrement_dependencies(s, r->IP);
+                                       decrement_dependencies(s, r->Reader);
                        } else if (t->Value[i]->Next) {
                                /* This happens when the only reader writes
                                 * the register at the same time */
-                               decrement_dependencies(s, t->Value[i]->Next->IP);
+                               decrement_dependencies(s, t->Value[i]->Next->Writer);
                        }
                }
        }
@@ -554,7 +496,7 @@ static void commit_instruction(struct pair_state *s, int ip)
 
                        if (!--t->Value[swz]->NumReaders) {
                                if (t->Value[swz]->Next)
-                                       decrement_dependencies(s, t->Value[swz]->Next->IP);
+                                       decrement_dependencies(s, t->Value[swz]->Next->Writer);
                        }
                }
        }
@@ -585,36 +527,52 @@ static void emit_all_tex(struct pair_state *s)
 
        // Allocate destination hardware registers in one block to avoid conflicts.
        for(pairinst = readytex; pairinst; pairinst = pairinst->NextReady) {
-               int ip = pairinst - s->Instructions;
-               struct prog_instruction *inst = s->Program->Instructions + ip;
+               struct prog_instruction *inst = &pairinst->Instruction;
                if (inst->Opcode != OPCODE_KIL)
                        get_hw_reg(s, inst->DstReg.File, inst->DstReg.Index);
        }
 
-       if (s->Debug)
+       if (s->Compiler->Base.Debug)
                _mesa_printf(" BEGIN_TEX\n");
 
        if (s->Handler->BeginTexBlock)
-               s->Error = s->Error || !s->Handler->BeginTexBlock(s->UserData);
+               s->Compiler->Base.Error = s->Compiler->Base.Error || !s->Handler->BeginTexBlock(s->UserData);
 
        for(pairinst = readytex; pairinst; pairinst = pairinst->NextReady) {
-               int ip = pairinst - s->Instructions;
-               struct prog_instruction *inst = s->Program->Instructions + ip;
-               commit_instruction(s, ip);
+               struct prog_instruction *inst = &pairinst->Instruction;
+               commit_instruction(s, pairinst);
 
                if (inst->Opcode != OPCODE_KIL)
                        inst->DstReg.Index = get_hw_reg(s, inst->DstReg.File, inst->DstReg.Index);
                inst->SrcReg[0].Index = get_hw_reg(s, inst->SrcReg[0].File, inst->SrcReg[0].Index);
 
-               if (s->Debug) {
+               if (s->Compiler->Base.Debug) {
                        _mesa_printf("   ");
                        _mesa_print_instruction(inst);
                        fflush(stdout);
                }
-               s->Error = s->Error || !s->Handler->EmitTex(s->UserData, inst);
+
+               struct radeon_pair_texture_instruction rpti;
+
+               switch(inst->Opcode) {
+               case OPCODE_TEX: rpti.Opcode = RADEON_OPCODE_TEX; break;
+               case OPCODE_TXB: rpti.Opcode = RADEON_OPCODE_TXB; break;
+               case OPCODE_TXP: rpti.Opcode = RADEON_OPCODE_TXP; break;
+               default:
+               case OPCODE_KIL: rpti.Opcode = RADEON_OPCODE_KIL; break;
+               }
+
+               rpti.DestIndex = inst->DstReg.Index;
+               rpti.WriteMask = inst->DstReg.WriteMask;
+               rpti.TexSrcUnit = inst->TexSrcUnit;
+               rpti.TexSrcTarget = inst->TexSrcTarget;
+               rpti.SrcIndex = inst->SrcReg[0].Index;
+               rpti.SrcSwizzle = inst->SrcReg[0].Swizzle;
+
+               s->Compiler->Base.Error = s->Compiler->Base.Error || !s->Handler->EmitTex(s->UserData, &rpti);
        }
 
-       if (s->Debug)
+       if (s->Compiler->Base.Debug)
                _mesa_printf(" END_TEX\n");
 }
 
@@ -637,7 +595,7 @@ static int alloc_pair_source(struct pair_state *s, struct radeon_pair_instructio
                index = get_hw_reg(s, src.File, src.Index);
        } else {
                constant = 1;
-               s->Error |= !s->Handler->EmitConst(s->UserData, src.File, src.Index, &index);
+               index = src.Index;
        }
 
        for(i = 0; i < 3; ++i) {
@@ -684,10 +642,12 @@ static int alloc_pair_source(struct pair_state *s, struct radeon_pair_instructio
  * Fill the given ALU instruction's opcodes and source operands into the given pair,
  * if possible.
  */
-static GLboolean fill_instruction_into_pair(struct pair_state *s, struct radeon_pair_instruction *pair, int ip)
+static GLboolean fill_instruction_into_pair(
+       struct pair_state *s,
+       struct radeon_pair_instruction *pair,
+       struct pair_state_instruction *pairinst)
 {
-       struct pair_state_instruction *pairinst = s->Instructions + ip;
-       struct prog_instruction *inst = s->Program->Instructions + ip;
+       struct prog_instruction *inst = &pairinst->Instruction;
 
        ASSERT(!pairinst->NeedRGB || pair->RGB.Opcode == OPCODE_NOP);
        ASSERT(!pairinst->NeedAlpha || pair->Alpha.Opcode == OPCODE_NOP);
@@ -768,16 +728,18 @@ static GLboolean fill_instruction_into_pair(struct pair_state *s, struct radeon_
  * we are absolutely certain that we're going to emit a certain
  * instruction pairing.
  */
-static void fill_dest_into_pair(struct pair_state *s, struct radeon_pair_instruction *pair, int ip)
+static void fill_dest_into_pair(
+       struct pair_state *s,
+       struct radeon_pair_instruction *pair,
+       struct pair_state_instruction *pairinst)
 {
-       struct pair_state_instruction *pairinst = s->Instructions + ip;
-       struct prog_instruction *inst = s->Program->Instructions + ip;
+       struct prog_instruction *inst = &pairinst->Instruction;
 
        if (inst->DstReg.File == PROGRAM_OUTPUT) {
-               if (inst->DstReg.Index == FRAG_RESULT_COLOR) {
+               if (inst->DstReg.Index == s->Compiler->OutputColor) {
                        pair->RGB.OutputWriteMask |= inst->DstReg.WriteMask & WRITEMASK_XYZ;
                        pair->Alpha.OutputWriteMask |= GET_BIT(inst->DstReg.WriteMask, 3);
-               } else if (inst->DstReg.Index == FRAG_RESULT_DEPTH) {
+               } else if (inst->DstReg.Index == s->Compiler->OutputDepth) {
                        pair->Alpha.DepthWriteMask |= GET_BIT(inst->DstReg.WriteMask, 3);
                }
        } else {
@@ -804,24 +766,24 @@ static void fill_dest_into_pair(struct pair_state *s, struct radeon_pair_instruc
 static void emit_alu(struct pair_state *s)
 {
        struct radeon_pair_instruction pair;
+       struct pair_state_instruction *psi;
 
        if (s->ReadyFullALU || !(s->ReadyRGB && s->ReadyAlpha)) {
-               int ip;
                if (s->ReadyFullALU) {
-                       ip = s->ReadyFullALU - s->Instructions;
+                       psi = s->ReadyFullALU;
                        s->ReadyFullALU = s->ReadyFullALU->NextReady;
                } else if (s->ReadyRGB) {
-                       ip = s->ReadyRGB - s->Instructions;
+                       psi = s->ReadyRGB;
                        s->ReadyRGB = s->ReadyRGB->NextReady;
                } else {
-                       ip = s->ReadyAlpha - s->Instructions;
+                       psi = s->ReadyAlpha;
                        s->ReadyAlpha = s->ReadyAlpha->NextReady;
                }
 
                _mesa_bzero(&pair, sizeof(pair));
-               fill_instruction_into_pair(s, &pair, ip);
-               fill_dest_into_pair(s, &pair, ip);
-               commit_instruction(s, ip);
+               fill_instruction_into_pair(s, &pair, psi);
+               fill_dest_into_pair(s, &pair, psi);
+               commit_instruction(s, psi);
        } else {
                struct pair_state_instruction **prgb;
                struct pair_state_instruction **palpha;
@@ -830,65 +792,65 @@ static void emit_alu(struct pair_state *s)
                 * many source slots; try all possible pairings if necessary */
                for(prgb = &s->ReadyRGB; *prgb; prgb = &(*prgb)->NextReady) {
                        for(palpha = &s->ReadyAlpha; *palpha; palpha = &(*palpha)->NextReady) {
-                               int rgbip = *prgb - s->Instructions;
-                               int alphaip = *palpha - s->Instructions;
+                               struct pair_state_instruction * psirgb = *prgb;
+                               struct pair_state_instruction * psialpha = *palpha;
                                _mesa_bzero(&pair, sizeof(pair));
-                               fill_instruction_into_pair(s, &pair, rgbip);
-                               if (!fill_instruction_into_pair(s, &pair, alphaip))
+                               fill_instruction_into_pair(s, &pair, psirgb);
+                               if (!fill_instruction_into_pair(s, &pair, psialpha))
                                        continue;
                                *prgb = (*prgb)->NextReady;
                                *palpha = (*palpha)->NextReady;
-                               fill_dest_into_pair(s, &pair, rgbip);
-                               fill_dest_into_pair(s, &pair, alphaip);
-                               commit_instruction(s, rgbip);
-                               commit_instruction(s, alphaip);
+                               fill_dest_into_pair(s, &pair, psirgb);
+                               fill_dest_into_pair(s, &pair, psialpha);
+                               commit_instruction(s, psirgb);
+                               commit_instruction(s, psialpha);
                                goto success;
                        }
                }
 
                /* No success in pairing; just take the first RGB instruction */
-               int ip = s->ReadyRGB - s->Instructions;
+               psi = s->ReadyRGB;
                s->ReadyRGB = s->ReadyRGB->NextReady;
+
                _mesa_bzero(&pair, sizeof(pair));
-               fill_instruction_into_pair(s, &pair, ip);
-               fill_dest_into_pair(s, &pair, ip);
-               commit_instruction(s, ip);
+               fill_instruction_into_pair(s, &pair, psi);
+               fill_dest_into_pair(s, &pair, psi);
+               commit_instruction(s, psi);
        success: ;
        }
 
-       if (s->Debug)
+       if (s->Compiler->Base.Debug)
                radeonPrintPairInstruction(&pair);
 
-       s->Error = s->Error || !s->Handler->EmitPaired(s->UserData, &pair);
+       s->Compiler->Base.Error = s->Compiler->Base.Error || !s->Handler->EmitPaired(s->UserData, &pair);
 }
 
+/* Callback function for assigning input registers to hardware registers */
+static void alloc_helper(void * data, unsigned input, unsigned hwreg)
+{
+       struct pair_state * s = data;
+       alloc_hw_reg(s, PROGRAM_INPUT, input, hwreg);
+}
 
-GLboolean radeonPairProgram(GLcontext *ctx, struct gl_program *program,
+void radeonPairProgram(
+       struct r300_fragment_program_compiler * compiler,
        const struct radeon_pair_handler* handler, void *userdata)
 {
        struct pair_state s;
 
        _mesa_bzero(&s, sizeof(s));
-       s.Ctx = ctx;
-       s.Program = _mesa_clone_program(ctx, program);
+       s.Compiler = compiler;
        s.Handler = handler;
        s.UserData = userdata;
-       s.Debug = (RADEON_DEBUG & DEBUG_PIXEL) ? GL_TRUE : GL_FALSE;
-       s.Verbose = GL_FALSE && s.Debug;
+       s.Verbose = GL_FALSE && s.Compiler->Base.Debug;
 
-       s.Instructions = (struct pair_state_instruction*)_mesa_calloc(
-               sizeof(struct pair_state_instruction)*s.Program->NumInstructions);
-       s.ValuePool = (struct reg_value*)_mesa_calloc(sizeof(struct reg_value)*s.Program->NumInstructions*4);
-       s.ReaderPool = (struct reg_value_reader*)_mesa_calloc(
-               sizeof(struct reg_value_reader)*s.Program->NumInstructions*12);
-
-       if (s.Debug)
+       if (s.Compiler->Base.Debug)
                _mesa_printf("Emit paired program\n");
 
        scan_instructions(&s);
-       allocate_input_registers(&s);
+       s.Compiler->AllocateHwInputs(s.Compiler, &alloc_helper, &s);
 
-       while(!s.Error &&
+       while(!s.Compiler->Base.Error &&
              (s.ReadyTEX || s.ReadyRGB || s.ReadyAlpha || s.ReadyFullALU)) {
                if (s.ReadyTEX)
                        emit_all_tex(&s);
@@ -897,16 +859,8 @@ GLboolean radeonPairProgram(GLcontext *ctx, struct gl_program *program,
                        emit_alu(&s);
        }
 
-       if (s.Debug)
+       if (s.Compiler->Base.Debug)
                _mesa_printf(" END\n");
-
-       _mesa_free(s.Instructions);
-       _mesa_free(s.ValuePool);
-       _mesa_free(s.ReaderPool);
-
-       _mesa_reference_program(ctx, &s.Program, NULL);
-
-       return !s.Error;
 }
 
 
@@ -30,6 +30,8 @@
 
 #include "radeon_program.h"
 
+struct r300_fragment_program_compiler;
+
 
 /**
  * Represents a paired instruction, as found in R300 and R500
@@ -82,18 +84,32 @@ struct radeon_pair_instruction {
 };
 
 
+enum {
+       RADEON_OPCODE_TEX = 0,
+       RADEON_OPCODE_TXB,
+       RADEON_OPCODE_TXP,
+       RADEON_OPCODE_KIL
+};
+
+struct radeon_pair_texture_instruction {
+       GLuint Opcode:2; /**< one of RADEON_OPCODE_xxx */
+
+       GLuint DestIndex:8;
+       GLuint WriteMask:4;
+
+       GLuint TexSrcUnit:5;
+       GLuint TexSrcTarget:3;
+
+       GLuint SrcIndex:8;
+       GLuint SrcSwizzle:12;
+};
+
+
 /**
  *
  */
 struct radeon_pair_handler {
        /**
-        * Fill in the proper hardware index for the given constant register.
-        *
-        * @return GL_FALSE on error.
-        */
-       GLboolean (*EmitConst)(void*, GLuint file, GLuint index, GLuint *hwindex);
-
-       /**
         * Write a paired instruction to the hardware.
         *
         * @return GL_FALSE on error.
@@ -107,7 +123,7 @@ struct radeon_pair_handler {
         *
         * @return GL_FALSE on error.
         */
-       GLboolean (*EmitTex)(void*, struct prog_instruction*);
+       GLboolean (*EmitTex)(void*, struct radeon_pair_texture_instruction*);
 
        /**
         * Called before a block of contiguous, independent texture
@@ -115,10 +131,11 @@ struct radeon_pair_handler {
         */
        GLboolean (*BeginTexBlock)(void*);
 
-       GLuint MaxHwTemps;
+       unsigned MaxHwTemps;
 };
 
-GLboolean radeonPairProgram(GLcontext *ctx, struct gl_program *program,
+void radeonPairProgram(
+       struct r300_fragment_program_compiler * compiler,
        const struct radeon_pair_handler*, void *userdata);
 
 void radeonPrintPairInstruction(struct radeon_pair_instruction *inst);
index af53503..bd46f9a 100644 (file)
@@ -164,47 +164,46 @@ static void emit_tex_offsets(GLcontext *ctx, struct radeon_state_atom * atom)
        r300ContextPtr r300 = R300_CONTEXT(ctx);
        BATCH_LOCALS(&r300->radeon);
        int numtmus = packet0_count(r300, r300->hw.tex.offset.cmd);
-       int notexture = 0;
-
-       if (numtmus) {
-               int i;
-
-               for(i = 0; i < numtmus; ++i) {
-                   radeonTexObj *t = r300->hw.textures[i];
-
-                   if (!t)
-                       notexture = 1;
-               }
-
-               if (r300->radeon.radeonScreen->kernel_mm && notexture) {
-                       return;
-               }
-               for(i = 0; i < numtmus; ++i) {
-                   radeonTexObj *t = r300->hw.textures[i];
-                   if (t && !t->image_override) {
-                BEGIN_BATCH_NO_AUTOSTATE(4);
-                OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
-                           OUT_BATCH_RELOC(t->tile_bits, t->mt->bo, 0,
-                                           RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
-                END_BATCH();
-                   } else if (!t) {
-                /* Texture unit hasn't a texture bound nothings to do */
-                   } else { /* override cases */
-                           if (t->bo) {
-                    BEGIN_BATCH_NO_AUTOSTATE(4);
-                    OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
-                                   OUT_BATCH_RELOC(t->tile_bits, t->bo, 0,
-                                                   RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
-                    END_BATCH();
-                           } else if (!r300->radeon.radeonScreen->kernel_mm) {
-                    BEGIN_BATCH_NO_AUTOSTATE(2);
-                    OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
-                                   OUT_BATCH(t->override_offset);
-                    END_BATCH();
-                           } else {
-                    /* Texture unit hasn't a texture bound nothings to do */
-                }
-                   }
+       int i;
+
+       for(i = 0; i < numtmus; ++i) {
+               radeonTexObj *t = r300->hw.textures[i];
+               if (t && !t->image_override) {
+                       BEGIN_BATCH_NO_AUTOSTATE(4);
+                       OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
+                       OUT_BATCH_RELOC(t->tile_bits, t->mt->bo, 0,
+                                       RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
+                       END_BATCH();
+               } else if (!t) {
+                       /* Texture unit hasn't a texture bound.
+                        * We assign the current color buffer as a fakery to make
+                        * KIL work on KMS (without it, the CS checker will complain).
+                        */
+                       if (r300->radeon.radeonScreen->kernel_mm) {
+                               struct radeon_renderbuffer *rrb = radeon_get_colorbuffer(&r300->radeon);
+                               if (rrb && rrb->bo) {
+                                       BEGIN_BATCH_NO_AUTOSTATE(4);
+                                       OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
+                                       OUT_BATCH_RELOC(0, rrb->bo, 0,
+                                                       RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
+                                       END_BATCH();
+                               }
+                       }
+               } else { /* override cases */
+                       if (t->bo) {
+                               BEGIN_BATCH_NO_AUTOSTATE(4);
+                               OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
+                               OUT_BATCH_RELOC(t->tile_bits, t->bo, 0,
+                                               RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
+                               END_BATCH();
+                       } else if (!r300->radeon.radeonScreen->kernel_mm) {
+                               BEGIN_BATCH_NO_AUTOSTATE(2);
+                               OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
+                               OUT_BATCH(t->override_offset);
+                               END_BATCH();
+                       } else {
+                               /* Texture unit hasn't a texture bound nothings to do */
+                       }
                }
        }
 }
index 6f3aab9..91fa77a 100644 (file)
@@ -64,9 +64,10 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r300_ioctl.h"
 #include "r300_tex.h"
 #include "r300_emit.h"
-#include "r300_render.h"
+#include "r300_queryobj.h"
 #include "r300_swtcl.h"
 #include "radeon_bocs_wrapper.h"
+#include "radeon_buffer_objects.h"
 
 
 #include "vblank.h"
@@ -74,6 +75,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "xmlpool.h"           /* for symbolic values of enum-type options */
 
 #define need_GL_VERSION_2_0
+#define need_GL_ARB_occlusion_query
 #define need_GL_ARB_point_parameters
 #define need_GL_ARB_vertex_program
 #define need_GL_EXT_blend_equation_separate
@@ -94,6 +96,7 @@ const struct dri_extension card_extensions[] = {
   /* *INDENT-OFF* */
   {"GL_ARB_depth_texture",             NULL},
   {"GL_ARB_fragment_program",          NULL},
+  {"GL_ARB_occlusion_query",           GL_ARB_occlusion_query_functions},
   {"GL_ARB_multitexture",              NULL},
   {"GL_ARB_point_parameters",          GL_ARB_point_parameters_functions},
   {"GL_ARB_shadow",                    NULL},
@@ -154,7 +157,6 @@ const struct dri_extension gl_20_extension[] = {
 };
 
 static const struct tnl_pipeline_stage *r300_pipeline[] = {
-
        /* Catch any t&l fallbacks
         */
        &_tnl_vertex_transform_stage,
@@ -165,21 +167,7 @@ static const struct tnl_pipeline_stage *r300_pipeline[] = {
        &_tnl_texture_transform_stage,
        &_tnl_point_attenuation_stage,
        &_tnl_vertex_program_stage,
-
-       /* Try again to go to tcl?
-        *     - no good for asymmetric-twoside (do with multipass)
-        *     - no good for asymmetric-unfilled (do with multipass)
-        *     - good for material
-        *     - good for texgen
-        *     - need to manipulate a bit of state
-        *
-        * - worth it/not worth it?
-        */
-
-       /* Else do them here.
-        */
-       &_r300_render_stage,
-       &_tnl_render_stage,     /* FALLBACK  */
+       &_tnl_render_stage,
        0,
 };
 
@@ -325,6 +313,11 @@ static void r300InitConstValues(GLcontext *ctx, radeonScreenPtr screen)
                ctx->Const.FragmentProgram.MaxNativeTexIndirections = R300_PFS_MAX_TEX_INDIRECT;
                ctx->Const.FragmentProgram.MaxNativeAddressRegs = 0;
        }
+
+       if (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV530)
+               r300->num_z_pipes = 2;
+       else
+               r300->num_z_pipes = r300->radeon.radeonScreen->num_gb_pipes;
 }
 
 static void r300ParseOptions(r300ContextPtr r300, radeonScreenPtr screen)
@@ -367,6 +360,11 @@ static void r300InitGLExtensions(GLcontext *ctx)
        } else if (r300->options.s3tc_force_disabled) {
                _mesa_disable_extension(ctx, "GL_EXT_texture_compression_s3tc");
        }
+
+       if (!r300->radeon.radeonScreen->drmSupportsOcclusionQueries ||
+               !r300->options.hw_tcl_enabled) {
+               _mesa_disable_extension(ctx, "GL_ARB_occlusion_query");
+       }
 }
 
 /* Create the device specific rendering context.
@@ -398,6 +396,8 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
        r300InitStateFuncs(&functions);
        r300InitTextureFuncs(&functions);
        r300InitShaderFuncs(&functions);
+       r300InitQueryObjFunctions(&functions);
+       radeonInitBufferObjectFuncs(&functions);
 
        if (!radeonInitContext(&r300->radeon, &functions,
                               glVisual, driContextPriv,
@@ -451,13 +451,10 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
        r300InitState(r300);
        r300InitShaderFunctions(r300);
 
-       if (screen->chip_family == CHIP_FAMILY_RS600 || screen->chip_family == CHIP_FAMILY_RS690 ||
-               screen->chip_family == CHIP_FAMILY_RS740) {
-               r300->radeon.texture_row_align = 64;
-       }
-
        r300InitGLExtensions(ctx);
 
+       make_empty_list(&r300->query.not_flushed_head);
+
        return GL_TRUE;
 }
 
index f7af7d4..3ba3426 100644 (file)
@@ -44,6 +44,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include "main/mtypes.h"
 #include "shader/prog_instruction.h"
+#include "compiler/radeon_code.h"
 
 struct r300_context;
 typedef struct r300_context r300ContextRec;
@@ -389,46 +390,25 @@ struct r300_hw_state {
 
 /* Vertex shader state */
 
-/* Perhaps more if we store programs in vmem? */
-/* drm_r300_cmd_header_t->vpu->count is unsigned char */
-#define VSF_MAX_FRAGMENT_LENGTH (255*4)
-
-/* Can be tested with colormat currently. */
-#define VSF_MAX_FRAGMENT_TEMPS (14)
-
-#define STATE_R300_WINDOW_DIMENSION (STATE_INTERNAL_DRIVER+0)
-#define STATE_R300_TEXRECT_FACTOR (STATE_INTERNAL_DRIVER+1)
-
 #define COLOR_IS_RGBA
 #define TAG(x) r300##x
 #include "tnl_dd/t_dd_vertex.h"
 #undef TAG
 
+struct r300_vertex_program_key {
+       GLbitfield FpReads;
+       GLuint FogAttr;
+       GLuint WPosAttr;
+};
+
 struct r300_vertex_program {
        struct gl_vertex_program *Base;
        struct r300_vertex_program *next;
 
-       struct r300_vertex_program_key {
-               GLuint FpReads;
-               GLuint FogAttr;
-               GLuint WPosAttr;
-       } key;
-       
-       struct r300_vertex_shader_hw_code {
-               int length;
-               union {
-                       GLuint d[VSF_MAX_FRAGMENT_LENGTH];
-                       float f[VSF_MAX_FRAGMENT_LENGTH];
-               } body;
-       } hw_code;
-
-       GLboolean translated;
-       GLboolean error;
+       struct r300_vertex_program_key key;
+       struct r300_vertex_program_code code;
 
-       int pos_end;
-       int num_temporaries;    /* Number of temp vars used by program */
-       int inputs[VERT_ATTRIB_MAX];
-       int outputs[VERT_RESULT_MAX];
+       GLboolean error;
 };
 
 struct r300_vertex_program_cont {
@@ -441,131 +421,18 @@ struct r300_vertex_program_cont {
        struct r300_vertex_program *progs;
 };
 
-#define R300_PFS_MAX_ALU_INST  64
-#define R300_PFS_MAX_TEX_INST  32
-#define R300_PFS_MAX_TEX_INDIRECT 4
-#define R300_PFS_NUM_TEMP_REGS 32
-#define R300_PFS_NUM_CONST_REGS        32
-
-#define R500_PFS_MAX_INST 512
-#define R500_PFS_NUM_TEMP_REGS 128
-#define R500_PFS_NUM_CONST_REGS 256
-
-struct r300_pfs_compile_state;
-struct r500_pfs_compile_state;
-
-/**
- * Stores state that influences the compilation of a fragment program.
- */
-struct r300_fragment_program_external_state {
-       struct {
-               /**
-                * If the sampler is used as a shadow sampler,
-                * this field is:
-                *  0 - GL_LUMINANCE
-                *  1 - GL_INTENSITY
-                *  2 - GL_ALPHA
-                * depending on the depth texture mode.
-                */
-               GLuint depth_texture_mode : 2;
-
-               /**
-                * If the sampler is used as a shadow sampler,
-                * this field is (texture_compare_func - GL_NEVER).
-                * [e.g. if compare function is GL_LEQUAL, this field is 3]
-                *
-                * Otherwise, this field is 0.
-                */
-               GLuint texture_compare_func : 3;
-       } unit[16];
-};
-
-
-struct r300_fragment_program_node {
-       int tex_offset; /**< first tex instruction */
-       int tex_end; /**< last tex instruction, relative to tex_offset */
-       int alu_offset; /**< first ALU instruction */
-       int alu_end; /**< last ALU instruction, relative to alu_offset */
-       int flags;
-};
-
-/**
- * Stores an R300 fragment program in its compiled-to-hardware form.
- */
-struct r300_fragment_program_code {
-       struct {
-               int length; /**< total # of texture instructions used */
-               GLuint inst[R300_PFS_MAX_TEX_INST];
-       } tex;
-
-       struct {
-               int length; /**< total # of ALU instructions used */
-               struct {
-                       GLuint inst0;
-                       GLuint inst1;
-                       GLuint inst2;
-                       GLuint inst3;
-               } inst[R300_PFS_MAX_ALU_INST];
-       } alu;
-
-       struct r300_fragment_program_node node[4];
-       int cur_node;
-       int first_node_has_tex;
-
-       /**
-        * Remember which program register a given hardware constant
-        * belongs to.
-        */
-       struct prog_src_register constant[R300_PFS_NUM_CONST_REGS];
-       int const_nr;
-
-       int max_temp_idx;
-};
-
-
-struct r500_fragment_program_code {
-       struct {
-               GLuint inst0;
-               GLuint inst1;
-               GLuint inst2;
-               GLuint inst3;
-               GLuint inst4;
-               GLuint inst5;
-       } inst[R500_PFS_MAX_INST];
-
-       int inst_offset;
-       int inst_end;
-
-       /**
-        * Remember which program register a given hardware constant
-        * belongs to.
-        */
-       struct prog_src_register constant[R500_PFS_NUM_CONST_REGS];
-       int const_nr;
-
-       int max_temp_idx;
-};
 
 /**
 * Store everything about a fragment program that is needed
 * to render with that program.
 */
 struct r300_fragment_program {
-       struct gl_program *Base;
-
-       GLboolean translated;
        GLboolean error;
-
+       struct r300_fragment_program *next;
        struct r300_fragment_program_external_state state;
-       union rX00_fragment_program_code {
-               struct r300_fragment_program_code r300;
-               struct r500_fragment_program_code r500;
-       } code;
 
-       GLboolean writes_depth;
-       GLuint optimization;
-
-       struct r300_fragment_program *next;
+       struct rX00_fragment_program_code code;
+       GLbitfield InputsRead;
 
        /* attribute that we are sending the WPOS in */
        gl_frag_attrib wpos_attr;
@@ -583,12 +450,6 @@ struct r300_fragment_program_cont {
        struct r300_fragment_program *progs;
 };
 
-struct r300_fragment_program_compiler {
-       r300ContextPtr r300;
-       struct r300_fragment_program *fp;
-       union rX00_fragment_program_code *code;
-       struct gl_program *program;
-};
 
 #define R300_MAX_AOS_ARRAYS            16
 
@@ -610,8 +471,6 @@ struct r300_swtcl_info {
 struct r300_vtable {
        void (* SetupRSUnit)(GLcontext *ctx);
        void (* SetupFragmentShaderTextures)(GLcontext *ctx, int *tmu_mappings);
-       GLboolean (* BuildFragmentProgramHwCode)(struct r300_fragment_program_compiler *compiler);
-       void (* FragmentProgramDump)(union rX00_fragment_program_code *code);
        void (* SetupPixelShader)(GLcontext *ctx);
 };
 
@@ -619,11 +478,12 @@ struct r300_vertex_buffer {
        struct vertex_attribute {
                /* generic */
                GLubyte element;
-               GLvoid *data;
-               GLboolean free_needed;
                GLuint stride;
                GLuint dwords;
                GLubyte size; /* number of components */
+               GLboolean is_named_bo;
+               struct radeon_bo *bo;
+               GLint bo_offset;
 
                /* hw specific */
                uint32_t data_type:4;
@@ -638,12 +498,23 @@ struct r300_vertex_buffer {
 };
 
 struct r300_index_buffer {
-       GLvoid *ptr;
+       struct radeon_bo *bo;
+       int bo_offset;
+
        GLboolean is_32bit;
-       GLboolean free_needed;
        GLuint count;
 };
 
+struct r300_query_object {
+       struct gl_query_object Base;
+       struct radeon_bo *bo;
+       int curr_offset;
+       GLboolean emitted_begin;
+
+       /* Double linked list of not flushed query objects */
+       struct r300_query_object *prev, *next;
+};
+
 /**
  * \brief R300 context structure.
  */
@@ -669,7 +540,7 @@ struct r300_context {
                uint32_t s3tc_force_disabled:1;
                uint32_t stencil_two_side_disabled:1;
        } options;
-       
+
        struct r300_swtcl_info swtcl;
        struct r300_vertex_buffer vbuf;
        struct r300_index_buffer ind_buf;
@@ -678,6 +549,13 @@ struct r300_context {
        uint32_t fallback;
 
        DECLARE_RENDERINPUTS(render_inputs_bitset);
+
+       struct {
+               struct r300_query_object *current;
+               struct r300_query_object not_flushed_head;
+       } query;
+
+       int num_z_pipes;
 };
 
 #define R300_CONTEXT(ctx)              ((r300ContextPtr)(ctx->DriverCtx))
index 9769ff5..d524d60 100644 (file)
 #include "r300_context.h"
 #include "r300_emit.h"
 #include "r300_render.h"
+#include "r300_queryobj.h"
 #include "r300_state.h"
 #include "r300_tex.h"
 
+#include "radeon_buffer_objects.h"
+
 #include "tnl/tnl.h"
 #include "tnl/t_vp_build.h"
 #include "vbo/vbo_context.h"
 #include "swrast/swrast.h"
 #include "swrast_setup/swrast_setup.h"
 
-static void r300FixupIndexBuffer(GLcontext *ctx, const struct _mesa_index_buffer *mesa_ind_buf, struct gl_buffer_object **bo, GLuint *nr_bo)
+
+static int getTypeSize(GLenum type)
+{
+       switch (type) {
+               case GL_DOUBLE:
+                       return sizeof(GLdouble);
+               case GL_FLOAT:
+                       return sizeof(GLfloat);
+               case GL_INT:
+                       return sizeof(GLint);
+               case GL_UNSIGNED_INT:
+                       return sizeof(GLuint);
+               case GL_SHORT:
+                       return sizeof(GLshort);
+               case GL_UNSIGNED_SHORT:
+                       return sizeof(GLushort);
+               case GL_BYTE:
+                       return sizeof(GLbyte);
+               case GL_UNSIGNED_BYTE:
+                       return sizeof(GLubyte);
+               default:
+                       assert(0);
+                       return 0;
+       }
+}
+
+static void r300FixupIndexBuffer(GLcontext *ctx, const struct _mesa_index_buffer *mesa_ind_buf)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
-       struct r300_index_buffer *ind_buf = &r300->ind_buf;
        GLvoid *src_ptr;
+       GLuint *out;
+       int i;
+       GLboolean mapped_named_bo = GL_FALSE;
 
-       if (!mesa_ind_buf) {
-               ind_buf->ptr = NULL;
-               return;
-       }
-
-       ind_buf->count = mesa_ind_buf->count;
        if (mesa_ind_buf->obj->Name && !mesa_ind_buf->obj->Pointer) {
-               bo[*nr_bo] = mesa_ind_buf->obj;
-               (*nr_bo)++;
                ctx->Driver.MapBuffer(ctx, GL_ELEMENT_ARRAY_BUFFER, GL_READ_ONLY_ARB, mesa_ind_buf->obj);
+               mapped_named_bo = GL_TRUE;
                assert(mesa_ind_buf->obj->Pointer != NULL);
        }
        src_ptr = ADD_POINTERS(mesa_ind_buf->obj->Pointer, mesa_ind_buf->ptr);
 
        if (mesa_ind_buf->type == GL_UNSIGNED_BYTE) {
+               GLuint size = sizeof(GLushort) * ((mesa_ind_buf->count + 1) & ~1);
                GLubyte *in = (GLubyte *)src_ptr;
-               GLuint *out = _mesa_malloc(sizeof(GLushort) * ((mesa_ind_buf->count + 1) & ~1));
-               int i;
 
-               ind_buf->ptr = out;
+               radeonAllocDmaRegion(&r300->radeon, &r300->ind_buf.bo, &r300->ind_buf.bo_offset, size, 4);
+
+               assert(r300->ind_buf.bo->ptr != NULL);
+               out = (GLuint *)ADD_POINTERS(r300->ind_buf.bo->ptr, r300->ind_buf.bo_offset);
 
                for (i = 0; i + 1 < mesa_ind_buf->count; i += 2) {
                        *out++ = in[i] | in[i + 1] << 16;
@@ -80,16 +106,16 @@ static void r300FixupIndexBuffer(GLcontext *ctx, const struct _mesa_index_buffer
                        *out++ = in[i];
                }
 
-               ind_buf->free_needed = GL_TRUE;
-               ind_buf->is_32bit = GL_FALSE;
-       } else if (mesa_ind_buf->type == GL_UNSIGNED_SHORT) {
 #if MESA_BIG_ENDIAN
+       } else { /* if (mesa_ind_buf->type == GL_UNSIGNED_SHORT) */
+               GLuint size;
                GLushort *in = (GLushort *)src_ptr;
-               GLuint *out = _mesa_malloc(sizeof(GLushort) *
-                                          ((mesa_ind_buf->count + 1) & ~1));
-               int i;
+               size = sizeof(GLushort) * ((mesa_ind_buf->count + 1) & ~1);
+
+               radeonAllocDmaRegion(&r300->radeon, &r300->ind_buf.bo, &r300->ind_buf.bo_offet, size, 4);
 
-               ind_buf->ptr = out;
+               assert(r300->ind_buf.bo->ptr != NULL)
+               out = (GLuint *)ADD_POINTERS(r300->ind_buf.bo->ptr, r300->ind_buf.bo_offset);
 
                for (i = 0; i + 1 < mesa_ind_buf->count; i += 2) {
                        *out++ = in[i] | in[i + 1] << 16;
@@ -98,42 +124,60 @@ static void r300FixupIndexBuffer(GLcontext *ctx, const struct _mesa_index_buffer
                if (i < mesa_ind_buf->count) {
                        *out++ = in[i];
                }
-
-               ind_buf->free_needed = GL_TRUE;
-#else
-               ind_buf->ptr = src_ptr;
-               ind_buf->free_needed = GL_FALSE;
 #endif
-               ind_buf->is_32bit = GL_FALSE;
-       } else {
-               ind_buf->ptr = src_ptr;
-               ind_buf->free_needed = GL_FALSE;
-               ind_buf->is_32bit = GL_TRUE;
+       }
+
+       r300->ind_buf.is_32bit = GL_FALSE;
+       r300->ind_buf.count = mesa_ind_buf->count;
+
+       if (mapped_named_bo) {
+               ctx->Driver.UnmapBuffer(ctx, GL_ELEMENT_ARRAY_BUFFER, mesa_ind_buf->obj);
        }
 }
 
-static int getTypeSize(GLenum type)
+
+static void r300SetupIndexBuffer(GLcontext *ctx, const struct _mesa_index_buffer *mesa_ind_buf)
 {
-       switch (type) {
-               case GL_DOUBLE:
-                       return sizeof(GLdouble);
-               case GL_FLOAT:
-                       return sizeof(GLfloat);
-               case GL_INT:
-                       return sizeof(GLint);
-               case GL_UNSIGNED_INT:
-                       return sizeof(GLuint);
-               case GL_SHORT:
-                       return sizeof(GLshort);
-               case GL_UNSIGNED_SHORT:
-                       return sizeof(GLushort);
-               case GL_BYTE:
-                       return sizeof(GLbyte);
-               case GL_UNSIGNED_BYTE:
-                       return sizeof(GLubyte);
-               default:
-                       assert(0);
-                       return 0;
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+
+       if (!mesa_ind_buf) {
+               r300->ind_buf.bo = NULL;
+               return;
+       }
+
+#if MESA_BIG_ENDIAN
+       if (mesa_ind_buf->type == GL_UNSIGNED_INT) {
+#else
+       if (mesa_ind_buf->type != GL_UNSIGNED_BYTE) {
+#endif
+               const GLvoid *src_ptr;
+               GLvoid *dst_ptr;
+               GLboolean mapped_named_bo = GL_FALSE;
+
+               if (mesa_ind_buf->obj->Name && !mesa_ind_buf->obj->Pointer) {
+                       ctx->Driver.MapBuffer(ctx, GL_ELEMENT_ARRAY_BUFFER, GL_READ_ONLY_ARB, mesa_ind_buf->obj);
+                       assert(mesa_ind_buf->obj->Pointer != NULL);
+                       mapped_named_bo = GL_TRUE;
+               }
+
+               src_ptr = ADD_POINTERS(mesa_ind_buf->obj->Pointer, mesa_ind_buf->ptr);
+
+               const GLuint size = mesa_ind_buf->count * getTypeSize(mesa_ind_buf->type);
+
+               radeonAllocDmaRegion(&r300->radeon, &r300->ind_buf.bo, &r300->ind_buf.bo_offset, size, 4);
+
+               assert(r300->ind_buf.bo->ptr != NULL);
+               dst_ptr = ADD_POINTERS(r300->ind_buf.bo->ptr, r300->ind_buf.bo_offset);
+               _mesa_memcpy(dst_ptr, src_ptr, size);
+
+               r300->ind_buf.is_32bit = (mesa_ind_buf->type == GL_UNSIGNED_INT);
+               r300->ind_buf.count = mesa_ind_buf->count;
+
+               if (mapped_named_bo) {
+                       ctx->Driver.UnmapBuffer(ctx, GL_ELEMENT_ARRAY_BUFFER, mesa_ind_buf->obj);
+               }
+       } else {
+               r300FixupIndexBuffer(ctx, mesa_ind_buf);
        }
 }
 
@@ -161,26 +205,118 @@ static int getTypeSize(GLenum type)
        }                                               \
 } while (0)
 
-static void r300TranslateAttrib(GLcontext *ctx, GLuint attr, int count, const struct gl_client_array *input, struct gl_buffer_object **bo, GLuint *nr_bo)
+/**
+ * Convert attribute data type to float
+ * If the attribute uses named buffer object replace the bo with newly allocated bo
+ */
+static void r300ConvertAttrib(GLcontext *ctx, int count, const struct gl_client_array *input, struct vertex_attribute *attr)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
-       struct r300_vertex_buffer *vbuf = &r300->vbuf;
-       struct vertex_attribute r300_attr;
-       const void *src_ptr;
-       GLenum type;
+       const GLvoid *src_ptr;
+       GLboolean mapped_named_bo = GL_FALSE;
+       GLfloat *dst_ptr;
        GLuint stride;
 
+       stride = (input->StrideB == 0) ? getTypeSize(input->Type) * input->Size : input->StrideB;
+
+       /* Convert value for first element only */
+       if (input->StrideB == 0)
+               count = 1;
+
        if (input->BufferObj->Name) {
                if (!input->BufferObj->Pointer) {
-                       bo[*nr_bo] = input->BufferObj;
-                       (*nr_bo)++;
                        ctx->Driver.MapBuffer(ctx, GL_ARRAY_BUFFER, GL_READ_ONLY_ARB, input->BufferObj);
-                       assert(input->BufferObj->Pointer != NULL);
+                       mapped_named_bo = GL_TRUE;
                }
 
                src_ptr = ADD_POINTERS(input->BufferObj->Pointer, input->Ptr);
-       } else
+       } else {
                src_ptr = input->Ptr;
+       }
+
+       radeonAllocDmaRegion(&r300->radeon, &attr->bo, &attr->bo_offset, sizeof(GLfloat) * input->Size * count, 32);
+       dst_ptr = (GLfloat *)ADD_POINTERS(attr->bo->ptr, attr->bo_offset);
+
+       if (RADEON_DEBUG & DEBUG_FALLBACKS) {
+               fprintf(stderr, "%s: Converting vertex attributes, attribute data format %x,", __FUNCTION__, input->Type);
+               fprintf(stderr, "stride %d, components %d\n", stride, input->Size);
+       }
+
+       assert(src_ptr != NULL);
+
+       switch (input->Type) {
+               case GL_DOUBLE:
+                       CONVERT(GLdouble, (GLfloat));
+                       break;
+               case GL_UNSIGNED_INT:
+                       CONVERT(GLuint, UINT_TO_FLOAT);
+                       break;
+               case GL_INT:
+                       CONVERT(GLint, INT_TO_FLOAT);
+                       break;
+               case GL_UNSIGNED_SHORT:
+                       CONVERT(GLushort, USHORT_TO_FLOAT);
+                       break;
+               case GL_SHORT:
+                       CONVERT(GLshort, SHORT_TO_FLOAT);
+                       break;
+               case GL_UNSIGNED_BYTE:
+                       assert(input->Format != GL_BGRA);
+                       CONVERT(GLubyte, UBYTE_TO_FLOAT);
+                       break;
+               case GL_BYTE:
+                       CONVERT(GLbyte, BYTE_TO_FLOAT);
+                       break;
+               default:
+                       assert(0);
+                       break;
+       }
+
+       if (mapped_named_bo) {
+               ctx->Driver.UnmapBuffer(ctx, GL_ARRAY_BUFFER, input->BufferObj);
+       }
+}
+
+static void r300AlignDataToDword(GLcontext *ctx, const struct gl_client_array *input, int count, struct vertex_attribute *attr)
+{
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+       const int dst_stride = (input->StrideB + 3) & ~3;
+       const int size = getTypeSize(input->Type) * input->Size * count;
+       GLboolean mapped_named_bo = GL_FALSE;
+
+       radeonAllocDmaRegion(&r300->radeon, &attr->bo, &attr->bo_offset, size, 32);
+
+       if (!input->BufferObj->Pointer) {
+               ctx->Driver.MapBuffer(ctx, GL_ARRAY_BUFFER, GL_READ_ONLY_ARB, input->BufferObj);
+               mapped_named_bo = GL_TRUE;
+       }
+
+       {
+               GLvoid *src_ptr = ADD_POINTERS(input->BufferObj->Pointer, input->Ptr);
+               GLvoid *dst_ptr = ADD_POINTERS(attr->bo->ptr, attr->bo_offset);
+               int i;
+
+               for (i = 0; i < count; ++i) {
+                       _mesa_memcpy(dst_ptr, src_ptr, input->StrideB);
+                       src_ptr += input->StrideB;
+                       dst_ptr += dst_stride;
+               }
+       }
+
+       if (mapped_named_bo) {
+               ctx->Driver.UnmapBuffer(ctx, GL_ARRAY_BUFFER, input->BufferObj);
+       }
+
+       attr->stride = dst_stride;
+}
+
+static void r300TranslateAttrib(GLcontext *ctx, GLuint attr, int count, const struct gl_client_array *input)
+{
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+       struct r300_vertex_buffer *vbuf = &r300->vbuf;
+       struct vertex_attribute r300_attr;
+       GLenum type;
+       GLuint stride;
 
        stride = (input->StrideB == 0) ? getTypeSize(input->Type) * input->Size : input->StrideB;
 
@@ -189,62 +325,57 @@ static void r300TranslateAttrib(GLcontext *ctx, GLuint attr, int count, const st
            getTypeSize(input->Type) != 4 ||
 #endif
            stride < 4) {
-               if (RADEON_DEBUG & DEBUG_FALLBACKS) {
-                       fprintf(stderr, "%s: Converting vertex attributes, attribute data format %x,", __FUNCTION__, input->Type);
-                       fprintf(stderr, "stride %d, components %d\n", stride, input->Size);
-               }
-
-               GLfloat *dst_ptr, *tmp;
-
-               /* Convert value for first element only */
-               if (input->StrideB == 0)
-                       count = 1;
-
-               tmp = dst_ptr = _mesa_malloc(sizeof(GLfloat) * input->Size * count);
-
-               switch (input->Type) {
-                       case GL_DOUBLE:
-                               CONVERT(GLdouble, (GLfloat));
-                               break;
-                       case GL_UNSIGNED_INT:
-                               CONVERT(GLuint, UINT_TO_FLOAT);
-                               break;
-                       case GL_INT:
-                               CONVERT(GLint, INT_TO_FLOAT);
-                               break;
-                       case GL_UNSIGNED_SHORT:
-                               CONVERT(GLushort, USHORT_TO_FLOAT);
-                               break;
-                       case GL_SHORT:
-                               CONVERT(GLshort, SHORT_TO_FLOAT);
-                               break;
-                       case GL_UNSIGNED_BYTE:
-                               assert(input->Format != GL_BGRA);
-                               CONVERT(GLubyte, UBYTE_TO_FLOAT);
-                               break;
-                       case GL_BYTE:
-                               CONVERT(GLbyte, BYTE_TO_FLOAT);
-                               break;
-                       default:
-                               assert(0);
-                               break;
-               }
 
                type = GL_FLOAT;
-               r300_attr.free_needed = GL_TRUE;
-               r300_attr.data = tmp;
+
+               r300ConvertAttrib(ctx, count, input, &r300_attr);
                if (input->StrideB == 0) {
                        r300_attr.stride = 0;
                } else {
                        r300_attr.stride = sizeof(GLfloat) * input->Size;
                }
                r300_attr.dwords = input->Size;
+               r300_attr.is_named_bo = GL_FALSE;
        } else {
                type = input->Type;
-               r300_attr.free_needed = GL_FALSE;
-               r300_attr.data = (GLvoid *)src_ptr;
-               r300_attr.stride = input->StrideB;
-               r300_attr.dwords = (getTypeSize(type) * input->Size  + 3)/ 4;
+               r300_attr.dwords = (getTypeSize(type) * input->Size + 3)/ 4;
+               if (input->BufferObj->Name) {
+                       if (stride % 4 != 0) {
+                               assert(((int) input->Ptr) % input->StrideB == 0);
+                               r300AlignDataToDword(ctx, input, count, &r300_attr);
+                               r300_attr.is_named_bo = GL_FALSE;
+                       } else {
+                               r300_attr.stride = input->StrideB;
+                               r300_attr.bo_offset = (GLuint) input->Ptr;
+                               r300_attr.bo = get_radeon_buffer_object(input->BufferObj)->bo;
+                               r300_attr.is_named_bo = GL_TRUE;
+                       }
+               } else {
+                       int size;
+                       uint32_t *dst;
+
+                       if (input->StrideB == 0) {
+                               size = getTypeSize(input->Type) * input->Size;
+                               count = 1;
+                               r300_attr.stride = 0;
+                       } else {
+                               size = getTypeSize(input->Type) * input->Size * count;
+                               r300_attr.stride = (getTypeSize(type) * input->Size + 3) & ~3;
+                       }
+
+                       radeonAllocDmaRegion(&r300->radeon, &r300_attr.bo, &r300_attr.bo_offset, size, 32);
+                       assert(r300_attr.bo->ptr != NULL);
+                       dst = (uint32_t *)ADD_POINTERS(r300_attr.bo->ptr, r300_attr.bo_offset);
+                       switch (r300_attr.dwords) {
+                               case 1: radeonEmitVec4(dst, input->Ptr, input->StrideB, count); break;
+                               case 2: radeonEmitVec8(dst, input->Ptr, input->StrideB, count); break;
+                               case 3: radeonEmitVec12(dst, input->Ptr, input->StrideB, count); break;
+                               case 4: radeonEmitVec16(dst, input->Ptr, input->StrideB, count); break;
+                               default: assert(0); break;
+                       }
+
+                       r300_attr.is_named_bo = GL_FALSE;
+               }
        }
 
        r300_attr.size = input->Size;
@@ -333,15 +464,15 @@ static void r300TranslateAttrib(GLcontext *ctx, GLuint attr, int count, const st
        ++vbuf->num_attribs;
 }
 
-static void r300SetVertexFormat(GLcontext *ctx, const struct gl_client_array *arrays[], int count, struct gl_buffer_object **bo, GLuint *nr_bo)
+static void r300SetVertexFormat(GLcontext *ctx, const struct gl_client_array *arrays[], int count)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
        struct r300_vertex_buffer *vbuf = &r300->vbuf;
-
+       int ret;
        {
                int i, tmp;
 
-               tmp = r300->selected_vp->Base->Base.InputsRead;
+               tmp = r300->selected_vp->code.InputsRead;
                i = 0;
                vbuf->num_attribs = 0;
                while (tmp) {
@@ -351,7 +482,7 @@ static void r300SetVertexFormat(GLcontext *ctx, const struct gl_client_array *ar
                                ++i;
                        }
 
-                       r300TranslateAttrib(ctx, i, count, arrays[i], bo, nr_bo);
+                       r300TranslateAttrib(ctx, i, count, arrays[i]);
 
                        tmp >>= 1;
                        ++i;
@@ -366,38 +497,47 @@ static void r300SetVertexFormat(GLcontext *ctx, const struct gl_client_array *ar
                int i;
 
                for (i = 0; i < vbuf->num_attribs; i++) {
-                       rcommon_emit_vector(ctx, &r300->radeon.tcl.aos[i],
-                                               vbuf->attribs[i].data, vbuf->attribs[i].dwords,
-                                               vbuf->attribs[i].stride, count);
+                       struct radeon_aos *aos = &r300->radeon.tcl.aos[i];
+
+                       aos->count = vbuf->attribs[i].stride == 0 ? 1 : count;
+                       aos->stride = vbuf->attribs[i].stride / sizeof(float);
+                       aos->offset = vbuf->attribs[i].bo_offset;
+                       aos->components = vbuf->attribs[i].dwords;
+                       aos->bo = vbuf->attribs[i].bo;
+
+                       if (vbuf->attribs[i].is_named_bo) {
+                               radeon_cs_space_add_persistent_bo(r300->radeon.cmdbuf.cs, r300->vbuf.attribs[i].bo, RADEON_GEM_DOMAIN_GTT, 0);
+                       }
                }
 
                r300->radeon.tcl.aos_count = vbuf->num_attribs;
+               ret = radeon_cs_space_check_with_bo(r300->radeon.cmdbuf.cs, r300->radeon.dma.current, RADEON_GEM_DOMAIN_GTT, 0);
+               if (ret)
+                       r300SwitchFallback(ctx, R300_FALLBACK_INVALID_BUFFERS, GL_TRUE);
        }
 }
 
-static void r300FreeData(GLcontext *ctx, struct gl_buffer_object **bo, GLuint nr_bo)
+static void r300FreeData(GLcontext *ctx)
 {
+       /* Need to zero tcl.aos[n].bo and tcl.elt_dma_bo
+        * to prevent double unref in radeonReleaseArrays
+        * called during context destroy
+        */
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
        {
-               struct r300_vertex_buffer *vbuf = &R300_CONTEXT(ctx)->vbuf;
                int i;
 
-               for (i = 0; i < vbuf->num_attribs; i++) {
-                       if (vbuf->attribs[i].free_needed)
-                               _mesa_free(vbuf->attribs[i].data);
+               for (i = 0; i < r300->vbuf.num_attribs; i++) {
+                       if (!r300->vbuf.attribs[i].is_named_bo) {
+                               radeon_bo_unref(r300->vbuf.attribs[i].bo);
+                       }
+                       r300->radeon.tcl.aos[i].bo = NULL;
                }
        }
 
        {
-               struct r300_index_buffer *ind_buf = &R300_CONTEXT(ctx)->ind_buf;
-               if (ind_buf->free_needed)
-                       _mesa_free(ind_buf->ptr);
-       }
-
-       {
-               int i;
-
-               for (i = 0; i < nr_bo; ++i) {
-                       ctx->Driver.UnmapBuffer(ctx, 0, bo[i]);
+               if (r300->ind_buf.bo != NULL) {
+                       radeon_bo_unref(r300->ind_buf.bo);
                }
        }
 }
@@ -411,8 +551,7 @@ static GLboolean r300TryDrawPrims(GLcontext *ctx,
                                         GLuint max_index )
 {
        struct r300_context *r300 = R300_CONTEXT(ctx);
-       struct gl_buffer_object *bo[VERT_ATTRIB_MAX+1];
-       GLuint i, nr_bo = 0;
+       GLuint i;
 
        if (ctx->NewState)
                _mesa_update_state( ctx );
@@ -424,35 +563,37 @@ static GLboolean r300TryDrawPrims(GLcontext *ctx,
 
        r300SwitchFallback(ctx, R300_FALLBACK_INVALID_BUFFERS, !r300ValidateBuffers(ctx));
 
-       r300FixupIndexBuffer(ctx, ib, bo, &nr_bo);
-
        /* ensure we have the cmd buf space in advance to cover
         * the state + DMA AOS pointers */
        rcommonEnsureCmdBufSpace(&r300->radeon,
-                           r300->radeon.hw.max_state_size + (50*sizeof(int)),
-                           __FUNCTION__);
+                           r300->radeon.hw.max_state_size + (60*sizeof(int)),
+                          __FUNCTION__);
+
+       r300SetupIndexBuffer(ctx, ib);
 
-       r300SetVertexFormat(ctx, arrays, max_index + 1, bo, &nr_bo);
+       r300SetVertexFormat(ctx, arrays, max_index + 1);
 
        if (r300->fallback)
                return GL_FALSE;
 
-       r300SetupVAP(ctx, r300->selected_vp->Base->Base.InputsRead, r300->selected_vp->Base->Base.OutputsWritten);
+       r300SetupVAP(ctx, r300->selected_vp->code.InputsRead, r300->selected_vp->code.OutputsWritten);
 
        r300UpdateShaderStates(r300);
 
        r300EmitCacheFlush(r300);
        radeonEmitState(&r300->radeon);
 
+       r300EmitQueryBegin(ctx);
+
        for (i = 0; i < nr_prims; ++i) {
                r300RunRenderPrimitive(ctx, prim[i].start, prim[i].start + prim[i].count, prim[i].mode);
        }
 
        r300EmitCacheFlush(r300);
 
-       radeonReleaseArrays(ctx, ~0);
+       r300EmitQueryEnd(ctx);
 
-       r300FreeData(ctx, bo, nr_bo);
+       r300FreeData(ctx);
 
        return GL_TRUE;
 }
@@ -462,28 +603,23 @@ static void r300DrawPrims(GLcontext *ctx,
                         const struct _mesa_prim *prim,
                         GLuint nr_prims,
                         const struct _mesa_index_buffer *ib,
+                        GLboolean index_bounds_valid,
                         GLuint min_index,
                         GLuint max_index)
 {
-       struct split_limits limits;
        GLboolean retval;
 
-       if (ib)
-               limits.max_verts = 0xffffffff;
-       else
-               limits.max_verts = 65535;
-
-       limits.max_indices = 65535;
-       limits.max_vb_size = 1024*1024;
+       /* This check should get folded into just the places that
+        * min/max index are really needed.
+        */
+       if (!index_bounds_valid) {
+               vbo_get_minmax_index(ctx, prim, ib, &min_index, &max_index);
+       }
 
        if (min_index) {
                vbo_rebase_prims( ctx, arrays, prim, nr_prims, ib, min_index, max_index, r300DrawPrims );
                return;
        }
-       if ((ib && ib->count > 65535)) {
-               vbo_split_prims (ctx, arrays, prim, nr_prims, ib, min_index, max_index, r300DrawPrims, &limits);
-               return;
-       }
 
        /* Make an attempt at drawing */
        retval = r300TryDrawPrims(ctx, arrays, prim, nr_prims, ib, min_index, max_index);
index feb3370..07e6223 100644 (file)
@@ -124,41 +124,6 @@ GLuint r300VAPOutputCntl1(GLcontext * ctx, GLuint vp_writes)
        return ret;
 }
 
-GLboolean r300EmitArrays(GLcontext * ctx)
-{
-       r300ContextPtr r300 = R300_CONTEXT(ctx);
-       struct r300_vertex_buffer *vbuf = &r300->vbuf;
-       GLuint InputsRead, OutputsWritten;
-
-       r300ChooseSwtclVertexFormat(ctx, &InputsRead, &OutputsWritten);
-
-       r300SwitchFallback(ctx, R300_FALLBACK_AOS_LIMIT, vbuf->num_attribs > R300_MAX_AOS_ARRAYS);
-       if (r300->fallback & R300_RASTER_FALLBACK_MASK)
-               return GL_FALSE;
-
-       {
-               struct vertex_buffer *mesa_vb = &TNL_CONTEXT(ctx)->vb;
-               GLuint attr, i;
-
-               for (i = 0; i < vbuf->num_attribs; i++) {
-                       attr = vbuf->attribs[i].element;
-                       rcommon_emit_vector(ctx, &r300->radeon.tcl.aos[i], mesa_vb->AttribPtr[attr]->data,
-                                       mesa_vb->AttribPtr[attr]->size, mesa_vb->AttribPtr[attr]->stride, mesa_vb->Count);
-               }
-
-               r300->radeon.tcl.aos_count = vbuf->num_attribs;
-
-               /* Fill index buffer info */
-               r300->ind_buf.ptr = mesa_vb->Elts;
-               r300->ind_buf.is_32bit = GL_TRUE;
-               r300->ind_buf.free_needed = GL_FALSE;
-       }
-
-       r300SetupVAP(ctx, InputsRead, OutputsWritten);
-
-       return GL_TRUE;
-}
-
 void r300EmitCacheFlush(r300ContextPtr rmesa)
 {
        BATCH_LOCALS(&rmesa->radeon);
index 3f8c60f..8e57e35 100644 (file)
@@ -104,7 +104,7 @@ static INLINE uint32_t cmdpacket3(struct radeon_screen *rscrn, int packet)
        return cmd.u;
 }
 
-static INLINE uint32_t cmdcpdelay(struct radeon_screen *rscrn,  
+static INLINE uint32_t cmdcpdelay(struct radeon_screen *rscrn,
                                   unsigned short count)
 {
        drm_r300_cmd_header_t cmd;
@@ -216,8 +216,6 @@ void static INLINE cp_wait(radeonContextPtr radeon, unsigned char flags)
        }
 }
 
-extern GLboolean r300EmitArrays(GLcontext * ctx);
-
 extern int r300PrimitiveType(r300ContextPtr rmesa, int prim);
 extern int r300NumVerts(r300ContextPtr rmesa, int num_verts, int prim);
 
diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.c b/src/mesa/drivers/dri/r300/r300_fragprog.c
deleted file mode 100644 (file)
index 55c1cfe..0000000
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Copyright (C) 2005 Ben Skeggs.
- *
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-#include "r300_fragprog.h"
-
-#include "shader/prog_parameter.h"
-
-#include "r300_context.h"
-#include "r300_fragprog_swizzle.h"
-
-static void reset_srcreg(struct prog_src_register* reg)
-{
-       _mesa_bzero(reg, sizeof(*reg));
-       reg->Swizzle = SWIZZLE_NOOP;
-}
-
-static struct prog_src_register shadow_ambient(struct gl_program *program, int tmu)
-{
-       gl_state_index fail_value_tokens[STATE_LENGTH] = {
-               STATE_INTERNAL, STATE_SHADOW_AMBIENT, 0, 0, 0
-       };
-       struct prog_src_register reg = { 0, };
-
-       fail_value_tokens[2] = tmu;
-       reg.File = PROGRAM_STATE_VAR;
-       reg.Index = _mesa_add_state_reference(program->Parameters, fail_value_tokens);
-       reg.Swizzle = SWIZZLE_WWWW;
-       return reg;
-}
-
-/**
- * Transform TEX, TXP, TXB, and KIL instructions in the following way:
- *  - premultiply texture coordinates for RECT
- *  - extract operand swizzles
- *  - introduce a temporary register when write masks are needed
- *
- * \todo If/when r5xx uses the radeon_program architecture, this can probably
- * be reused.
- */
-GLboolean r300_transform_TEX(
-       struct radeon_transform_context *t,
-       struct prog_instruction* orig_inst, void* data)
-{
-       struct r300_fragment_program_compiler *compiler =
-               (struct r300_fragment_program_compiler*)data;
-       struct prog_instruction inst = *orig_inst;
-       struct prog_instruction* tgt;
-       GLboolean destredirect = GL_FALSE;
-
-       if (inst.Opcode != OPCODE_TEX &&
-           inst.Opcode != OPCODE_TXB &&
-           inst.Opcode != OPCODE_TXP &&
-           inst.Opcode != OPCODE_KIL)
-               return GL_FALSE;
-
-       if (inst.Opcode != OPCODE_KIL &&
-           t->Program->ShadowSamplers & (1 << inst.TexSrcUnit)) {
-               GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func;
-
-               if (comparefunc == GL_NEVER || comparefunc == GL_ALWAYS) {
-                       tgt = radeonAppendInstructions(t->Program, 1);
-
-                       tgt->Opcode = OPCODE_MOV;
-                       tgt->DstReg = inst.DstReg;
-                       if (comparefunc == GL_ALWAYS) {
-                               tgt->SrcReg[0].File = PROGRAM_BUILTIN;
-                               tgt->SrcReg[0].Swizzle = SWIZZLE_1111;
-                       } else {
-                               tgt->SrcReg[0] = shadow_ambient(t->Program, inst.TexSrcUnit);
-                       }
-                       return GL_TRUE;
-               }
-
-               inst.DstReg.File = PROGRAM_TEMPORARY;
-               inst.DstReg.Index = radeonFindFreeTemporary(t);
-               inst.DstReg.WriteMask = WRITEMASK_XYZW;
-       }
-
-
-       /* Hardware uses [0..1]x[0..1] range for rectangle textures
-        * instead of [0..Width]x[0..Height].
-        * Add a scaling instruction.
-        */
-       if (inst.Opcode != OPCODE_KIL && inst.TexSrcTarget == TEXTURE_RECT_INDEX) {
-               gl_state_index tokens[STATE_LENGTH] = {
-                       STATE_INTERNAL, STATE_R300_TEXRECT_FACTOR, 0, 0,
-                       0
-               };
-
-               int tempreg = radeonFindFreeTemporary(t);
-               int factor_index;
-
-               tokens[2] = inst.TexSrcUnit;
-               factor_index = _mesa_add_state_reference(t->Program->Parameters, tokens);
-
-               tgt = radeonAppendInstructions(t->Program, 1);
-
-               tgt->Opcode = OPCODE_MUL;
-               tgt->DstReg.File = PROGRAM_TEMPORARY;
-               tgt->DstReg.Index = tempreg;
-               tgt->SrcReg[0] = inst.SrcReg[0];
-               tgt->SrcReg[1].File = PROGRAM_STATE_VAR;
-               tgt->SrcReg[1].Index = factor_index;
-
-               reset_srcreg(&inst.SrcReg[0]);
-               inst.SrcReg[0].File = PROGRAM_TEMPORARY;
-               inst.SrcReg[0].Index = tempreg;
-       }
-
-       if (inst.Opcode != OPCODE_KIL) {
-               if (inst.DstReg.File != PROGRAM_TEMPORARY ||
-                   inst.DstReg.WriteMask != WRITEMASK_XYZW) {
-                       int tempreg = radeonFindFreeTemporary(t);
-
-                       inst.DstReg.File = PROGRAM_TEMPORARY;
-                       inst.DstReg.Index = tempreg;
-                       inst.DstReg.WriteMask = WRITEMASK_XYZW;
-                       destredirect = GL_TRUE;
-               } else if (inst.SaturateMode) {
-                       destredirect = GL_TRUE;
-               }
-       }
-
-       if (inst.SrcReg[0].File != PROGRAM_TEMPORARY && inst.SrcReg[0].File != PROGRAM_INPUT) {
-               int tmpreg = radeonFindFreeTemporary(t);
-               tgt = radeonAppendInstructions(t->Program, 1);
-               tgt->Opcode = OPCODE_MOV;
-               tgt->DstReg.File = PROGRAM_TEMPORARY;
-               tgt->DstReg.Index = tmpreg;
-               tgt->SrcReg[0] = inst.SrcReg[0];
-
-               reset_srcreg(&inst.SrcReg[0]);
-               inst.SrcReg[0].File = PROGRAM_TEMPORARY;
-               inst.SrcReg[0].Index = tmpreg;
-       }
-
-       tgt = radeonAppendInstructions(t->Program, 1);
-       _mesa_copy_instructions(tgt, &inst, 1);
-
-       if (inst.Opcode != OPCODE_KIL &&
-           t->Program->ShadowSamplers & (1 << inst.TexSrcUnit)) {
-               GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func;
-               GLuint depthmode = compiler->fp->state.unit[inst.TexSrcUnit].depth_texture_mode;
-               int rcptemp = radeonFindFreeTemporary(t);
-               int pass, fail;
-
-               tgt = radeonAppendInstructions(t->Program, 3);
-
-               tgt[0].Opcode = OPCODE_RCP;
-               tgt[0].DstReg.File = PROGRAM_TEMPORARY;
-               tgt[0].DstReg.Index = rcptemp;
-               tgt[0].DstReg.WriteMask = WRITEMASK_W;
-               tgt[0].SrcReg[0] = inst.SrcReg[0];
-               tgt[0].SrcReg[0].Swizzle = SWIZZLE_WWWW;
-
-               tgt[1].Opcode = OPCODE_MAD;
-               tgt[1].DstReg = inst.DstReg;
-               tgt[1].DstReg.WriteMask = orig_inst->DstReg.WriteMask;
-               tgt[1].SrcReg[0] = inst.SrcReg[0];
-               tgt[1].SrcReg[0].Swizzle = SWIZZLE_ZZZZ;
-               tgt[1].SrcReg[1].File = PROGRAM_TEMPORARY;
-               tgt[1].SrcReg[1].Index = rcptemp;
-               tgt[1].SrcReg[1].Swizzle = SWIZZLE_WWWW;
-               tgt[1].SrcReg[2].File = PROGRAM_TEMPORARY;
-               tgt[1].SrcReg[2].Index = inst.DstReg.Index;
-               if (depthmode == 0) /* GL_LUMINANCE */
-                       tgt[1].SrcReg[2].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z);
-               else if (depthmode == 2) /* GL_ALPHA */
-                       tgt[1].SrcReg[2].Swizzle = SWIZZLE_WWWW;
-
-               /* Recall that SrcReg[0] is tex, SrcReg[2] is r and:
-                *   r  < tex  <=>      -tex+r < 0
-                *   r >= tex  <=> not (-tex+r < 0 */
-               if (comparefunc == GL_LESS || comparefunc == GL_GEQUAL)
-                       tgt[1].SrcReg[2].Negate = tgt[0].SrcReg[2].Negate ^ NEGATE_XYZW;
-               else
-                       tgt[1].SrcReg[0].Negate = tgt[0].SrcReg[0].Negate ^ NEGATE_XYZW;
-
-               tgt[2].Opcode = OPCODE_CMP;
-               tgt[2].DstReg = orig_inst->DstReg;
-               tgt[2].SrcReg[0].File = PROGRAM_TEMPORARY;
-               tgt[2].SrcReg[0].Index = tgt[1].DstReg.Index;
-
-               if (comparefunc == GL_LESS || comparefunc == GL_GREATER) {
-                       pass = 1;
-                       fail = 2;
-               } else {
-                       pass = 2;
-                       fail = 1;
-               }
-
-               tgt[2].SrcReg[pass].File = PROGRAM_BUILTIN;
-               tgt[2].SrcReg[pass].Swizzle = SWIZZLE_1111;
-               tgt[2].SrcReg[fail] = shadow_ambient(t->Program, inst.TexSrcUnit);
-       } else if (destredirect) {
-               tgt = radeonAppendInstructions(t->Program, 1);
-
-               tgt->Opcode = OPCODE_MOV;
-               tgt->DstReg = orig_inst->DstReg;
-               tgt->SaturateMode = inst.SaturateMode;
-               tgt->SrcReg[0].File = PROGRAM_TEMPORARY;
-               tgt->SrcReg[0].Index = inst.DstReg.Index;
-       }
-
-       return GL_TRUE;
-}
-
-/* just some random things... */
-void r300FragmentProgramDump(union rX00_fragment_program_code *c)
-{
-       struct r300_fragment_program_code *code = &c->r300;
-       int n, i, j;
-       static int pc = 0;
-
-       fprintf(stderr, "pc=%d*************************************\n", pc++);
-
-       fprintf(stderr, "Hardware program\n");
-       fprintf(stderr, "----------------\n");
-
-       for (n = 0; n < (code->cur_node + 1); n++) {
-               fprintf(stderr, "NODE %d: alu_offset: %d, tex_offset: %d, "
-                       "alu_end: %d, tex_end: %d, flags: %08x\n", n,
-                       code->node[n].alu_offset,
-                       code->node[n].tex_offset,
-                       code->node[n].alu_end, code->node[n].tex_end,
-                       code->node[n].flags);
-
-               if (n > 0 || code->first_node_has_tex) {
-                       fprintf(stderr, "  TEX:\n");
-                       for (i = code->node[n].tex_offset;
-                            i <= code->node[n].tex_offset + code->node[n].tex_end;
-                            ++i) {
-                               const char *instr;
-
-                               switch ((code->tex.
-                                        inst[i] >> R300_TEX_INST_SHIFT) &
-                                       15) {
-                               case R300_TEX_OP_LD:
-                                       instr = "TEX";
-                                       break;
-                               case R300_TEX_OP_KIL:
-                                       instr = "KIL";
-                                       break;
-                               case R300_TEX_OP_TXP:
-                                       instr = "TXP";
-                                       break;
-                               case R300_TEX_OP_TXB:
-                                       instr = "TXB";
-                                       break;
-                               default:
-                                       instr = "UNKNOWN";
-                               }
-
-                               fprintf(stderr,
-                                       "    %s t%i, %c%i, texture[%i]   (%08x)\n",
-                                       instr,
-                                       (code->tex.
-                                        inst[i] >> R300_DST_ADDR_SHIFT) & 31,
-                                       't',
-                                       (code->tex.
-                                        inst[i] >> R300_SRC_ADDR_SHIFT) & 31,
-                                       (code->tex.
-                                        inst[i] & R300_TEX_ID_MASK) >>
-                                       R300_TEX_ID_SHIFT,
-                                       code->tex.inst[i]);
-                       }
-               }
-
-               for (i = code->node[n].alu_offset;
-                    i <= code->node[n].alu_offset + code->node[n].alu_end; ++i) {
-                       char srcc[3][10], dstc[20];
-                       char srca[3][10], dsta[20];
-                       char argc[3][20];
-                       char arga[3][20];
-                       char flags[5], tmp[10];
-
-                       for (j = 0; j < 3; ++j) {
-                               int regc = code->alu.inst[i].inst1 >> (j * 6);
-                               int rega = code->alu.inst[i].inst3 >> (j * 6);
-
-                               sprintf(srcc[j], "%c%i",
-                                       (regc & 32) ? 'c' : 't', regc & 31);
-                               sprintf(srca[j], "%c%i",
-                                       (rega & 32) ? 'c' : 't', rega & 31);
-                       }
-
-                       dstc[0] = 0;
-                       sprintf(flags, "%s%s%s",
-                               (code->alu.inst[i].
-                                inst1 & R300_ALU_DSTC_REG_X) ? "x" : "",
-                               (code->alu.inst[i].
-                                inst1 & R300_ALU_DSTC_REG_Y) ? "y" : "",
-                               (code->alu.inst[i].
-                                inst1 & R300_ALU_DSTC_REG_Z) ? "z" : "");
-                       if (flags[0] != 0) {
-                               sprintf(dstc, "t%i.%s ",
-                                       (code->alu.inst[i].
-                                        inst1 >> R300_ALU_DSTC_SHIFT) & 31,
-                                       flags);
-                       }
-                       sprintf(flags, "%s%s%s",
-                               (code->alu.inst[i].
-                                inst1 & R300_ALU_DSTC_OUTPUT_X) ? "x" : "",
-                               (code->alu.inst[i].
-                                inst1 & R300_ALU_DSTC_OUTPUT_Y) ? "y" : "",
-                               (code->alu.inst[i].
-                                inst1 & R300_ALU_DSTC_OUTPUT_Z) ? "z" : "");
-                       if (flags[0] != 0) {
-                               sprintf(tmp, "o%i.%s",
-                                       (code->alu.inst[i].
-                                        inst1 >> R300_ALU_DSTC_SHIFT) & 31,
-                                       flags);
-                               strcat(dstc, tmp);
-                       }
-
-                       dsta[0] = 0;
-                       if (code->alu.inst[i].inst3 & R300_ALU_DSTA_REG) {
-                               sprintf(dsta, "t%i.w ",
-                                       (code->alu.inst[i].
-                                        inst3 >> R300_ALU_DSTA_SHIFT) & 31);
-                       }
-                       if (code->alu.inst[i].inst3 & R300_ALU_DSTA_OUTPUT) {
-                               sprintf(tmp, "o%i.w ",
-                                       (code->alu.inst[i].
-                                        inst3 >> R300_ALU_DSTA_SHIFT) & 31);
-                               strcat(dsta, tmp);
-                       }
-                       if (code->alu.inst[i].inst3 & R300_ALU_DSTA_DEPTH) {
-                               strcat(dsta, "Z");
-                       }
-
-                       fprintf(stderr,
-                               "%3i: xyz: %3s %3s %3s -> %-20s (%08x)\n"
-                               "       w: %3s %3s %3s -> %-20s (%08x)\n", i,
-                               srcc[0], srcc[1], srcc[2], dstc,
-                               code->alu.inst[i].inst1, srca[0], srca[1],
-                               srca[2], dsta, code->alu.inst[i].inst3);
-
-                       for (j = 0; j < 3; ++j) {
-                               int regc = code->alu.inst[i].inst0 >> (j * 7);
-                               int rega = code->alu.inst[i].inst2 >> (j * 7);
-                               int d;
-                               char buf[20];
-
-                               d = regc & 31;
-                               if (d < 12) {
-                                       switch (d % 4) {
-                                       case R300_ALU_ARGC_SRC0C_XYZ:
-                                               sprintf(buf, "%s.xyz",
-                                                       srcc[d / 4]);
-                                               break;
-                                       case R300_ALU_ARGC_SRC0C_XXX:
-                                               sprintf(buf, "%s.xxx",
-                                                       srcc[d / 4]);
-                                               break;
-                                       case R300_ALU_ARGC_SRC0C_YYY:
-                                               sprintf(buf, "%s.yyy",
-                                                       srcc[d / 4]);
-                                               break;
-                                       case R300_ALU_ARGC_SRC0C_ZZZ:
-                                               sprintf(buf, "%s.zzz",
-                                                       srcc[d / 4]);
-                                               break;
-                                       }
-                               } else if (d < 15) {
-                                       sprintf(buf, "%s.www", srca[d - 12]);
-                               } else if (d == 20) {
-                                       sprintf(buf, "0.0");
-                               } else if (d == 21) {
-                                       sprintf(buf, "1.0");
-                               } else if (d == 22) {
-                                       sprintf(buf, "0.5");
-                               } else if (d >= 23 && d < 32) {
-                                       d -= 23;
-                                       switch (d / 3) {
-                                       case 0:
-                                               sprintf(buf, "%s.yzx",
-                                                       srcc[d % 3]);
-                                               break;
-                                       case 1:
-                                               sprintf(buf, "%s.zxy",
-                                                       srcc[d % 3]);
-                                               break;
-                                       case 2:
-                                               sprintf(buf, "%s.Wzy",
-                                                       srcc[d % 3]);
-                                               break;
-                                       }
-                               } else {
-                                       sprintf(buf, "%i", d);
-                               }
-
-                               sprintf(argc[j], "%s%s%s%s",
-                                       (regc & 32) ? "-" : "",
-                                       (regc & 64) ? "|" : "",
-                                       buf, (regc & 64) ? "|" : "");
-
-                               d = rega & 31;
-                               if (d < 9) {
-                                       sprintf(buf, "%s.%c", srcc[d / 3],
-                                               'x' + (char)(d % 3));
-                               } else if (d < 12) {
-                                       sprintf(buf, "%s.w", srca[d - 9]);
-                               } else if (d == 16) {
-                                       sprintf(buf, "0.0");
-                               } else if (d == 17) {
-                                       sprintf(buf, "1.0");
-                               } else if (d == 18) {
-                                       sprintf(buf, "0.5");
-                               } else {
-                                       sprintf(buf, "%i", d);
-                               }
-
-                               sprintf(arga[j], "%s%s%s%s",
-                                       (rega & 32) ? "-" : "",
-                                       (rega & 64) ? "|" : "",
-                                       buf, (rega & 64) ? "|" : "");
-                       }
-
-                       fprintf(stderr, "     xyz: %8s %8s %8s    op: %08x\n"
-                               "       w: %8s %8s %8s    op: %08x\n",
-                               argc[0], argc[1], argc[2],
-                               code->alu.inst[i].inst0, arga[0], arga[1],
-                               arga[2], code->alu.inst[i].inst2);
-               }
-       }
-}
diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.h b/src/mesa/drivers/dri/r300/r300_fragprog.h
deleted file mode 100644 (file)
index 5ce6f33..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2005 Ben Skeggs.
- *
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-/*
- * Authors:
- *   Ben Skeggs <darktama@iinet.net.au>
- *   Jerome Glisse <j.glisse@gmail.com>
- */
-#ifndef __R300_FRAGPROG_H_
-#define __R300_FRAGPROG_H_
-
-#include "shader/program.h"
-#include "shader/prog_instruction.h"
-
-#include "r300_context.h"
-#include "radeon_program.h"
-
-#define DRI_CONF_FP_OPTIMIZATION_SPEED   0
-#define DRI_CONF_FP_OPTIMIZATION_QUALITY 1
-
-#if 1
-
-/**
- * Fragment program helper macros
- */
-
-/* Produce unshifted source selectors */
-#define FP_TMP(idx) (idx)
-#define FP_CONST(idx) ((idx) | (1 << 5))
-
-/* Produce source/dest selector dword */
-#define FP_SELC_MASK_NO                0
-#define FP_SELC_MASK_X         1
-#define FP_SELC_MASK_Y         2
-#define FP_SELC_MASK_XY                3
-#define FP_SELC_MASK_Z         4
-#define FP_SELC_MASK_XZ                5
-#define FP_SELC_MASK_YZ                6
-#define FP_SELC_MASK_XYZ       7
-
-#define FP_SELC(destidx,regmask,outmask,src0,src1,src2) \
-       (((destidx) << R300_ALU_DSTC_SHIFT) |           \
-        (FP_SELC_MASK_##regmask << 23) |               \
-        (FP_SELC_MASK_##outmask << 26) |               \
-        ((src0) << R300_ALU_SRC0C_SHIFT) |             \
-        ((src1) << R300_ALU_SRC1C_SHIFT) |             \
-        ((src2) << R300_ALU_SRC2C_SHIFT))
-
-#define FP_SELA_MASK_NO                0
-#define FP_SELA_MASK_W         1
-
-#define FP_SELA(destidx,regmask,outmask,src0,src1,src2) \
-       (((destidx) << R300_ALU_DSTA_SHIFT) |           \
-        (FP_SELA_MASK_##regmask << 23) |               \
-        (FP_SELA_MASK_##outmask << 24) |               \
-        ((src0) << R300_ALU_SRC0A_SHIFT) |             \
-        ((src1) << R300_ALU_SRC1A_SHIFT) |             \
-        ((src2) << R300_ALU_SRC2A_SHIFT))
-
-/* Produce unshifted argument selectors */
-#define FP_ARGC(source)        R300_ALU_ARGC_##source
-#define FP_ARGA(source) R300_ALU_ARGA_##source
-#define FP_ABS(arg) ((arg) | (1 << 6))
-#define FP_NEG(arg) ((arg) ^ (1 << 5))
-
-/* Produce instruction dword */
-#define FP_INSTRC(opcode,arg0,arg1,arg2) \
-       (R300_ALU_OUTC_##opcode |               \
-       ((arg0) << R300_ALU_ARG0C_SHIFT) |      \
-       ((arg1) << R300_ALU_ARG1C_SHIFT) |      \
-       ((arg2) << R300_ALU_ARG2C_SHIFT))
-
-#define FP_INSTRA(opcode,arg0,arg1,arg2) \
-       (R300_ALU_OUTA_##opcode |               \
-       ((arg0) << R300_ALU_ARG0A_SHIFT) |      \
-       ((arg1) << R300_ALU_ARG1A_SHIFT) |      \
-       ((arg2) << R300_ALU_ARG2A_SHIFT))
-
-#endif
-
-extern GLboolean r300BuildFragmentProgramHwCode(struct r300_fragment_program_compiler *compiler);
-
-extern void r300FragmentProgramDump(union rX00_fragment_program_code *c);
-
-extern GLboolean r300_transform_TEX(struct radeon_transform_context *t, struct prog_instruction* orig_inst, void* data);
-
-#endif
index f5c4c0f..6674efc 100644 (file)
 #include "shader/prog_parameter.h"
 #include "shader/prog_print.h"
 
+#include "compiler/radeon_compiler.h"
+
 #include "r300_state.h"
-#include "r300_fragprog.h"
-#include "r300_fragprog_swizzle.h"
-#include "r500_fragprog.h"
 
-#include "radeon_program.h"
-#include "radeon_program_alu.h"
 
-static void nqssadce_init(struct nqssadce_state* s)
+static GLuint build_dtm(GLuint depthmode)
+{
+       switch(depthmode) {
+       default:
+       case GL_LUMINANCE: return 0;
+       case GL_INTENSITY: return 1;
+       case GL_ALPHA: return 2;
+       }
+}
+
+static GLuint build_func(GLuint comparefunc)
 {
-       s->Outputs[FRAG_RESULT_COLOR].Sourced = WRITEMASK_XYZW;
-       s->Outputs[FRAG_RESULT_DEPTH].Sourced = WRITEMASK_W;
+       return comparefunc - GL_NEVER;
 }
 
 /**
+ * Collect all external state that is relevant for compiling the given
+ * fragment program.
+ */
+static void build_state(
+       r300ContextPtr r300,
+       struct gl_fragment_program *fp,
+       struct r300_fragment_program_external_state *state)
+{
+       int unit;
+
+       _mesa_bzero(state, sizeof(*state));
+
+       for(unit = 0; unit < 16; ++unit) {
+               if (fp->Base.ShadowSamplers & (1 << unit)) {
+                       struct gl_texture_object* tex = r300->radeon.glCtx->Texture.Unit[unit]._Current;
+
+                       state->unit[unit].depth_texture_mode = build_dtm(tex->DepthMode);
+                       state->unit[unit].texture_compare_func = build_func(tex->CompareFunc);
+               }
+       }
+}
+
+
+/**
  * Transform the program to support fragment.position.
  *
  * Introduce a small fragment at the start of the program that will be
@@ -65,104 +95,26 @@ static void nqssadce_init(struct nqssadce_state* s)
  * to read from a newly allocated temporary.
  *
  */
-static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler)
+static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler, struct r300_fragment_program * fp)
 {
-       GLuint InputsRead = compiler->fp->Base->InputsRead;
+       int i;
 
-       if (!(InputsRead & FRAG_BIT_WPOS)) {
-               compiler->fp->wpos_attr = FRAG_ATTRIB_MAX;
+       if (!(compiler->Base.Program.InputsRead & FRAG_BIT_WPOS)) {
+               fp->wpos_attr = FRAG_ATTRIB_MAX;
                return;
        }
 
-       static gl_state_index tokens[STATE_LENGTH] = {
-               STATE_INTERNAL, STATE_R300_WINDOW_DIMENSION, 0, 0, 0
-       };
-       struct prog_instruction *fpi;
-       GLuint window_index;
-       int i = 0;
-
        for (i = FRAG_ATTRIB_TEX0; i <= FRAG_ATTRIB_TEX7; ++i)
        {
-               if (!(InputsRead & (1 << i))) {
-                       InputsRead &= ~(1 << FRAG_ATTRIB_WPOS);
-                       InputsRead |= 1 << i;
-                       compiler->fp->Base->InputsRead = InputsRead;
-                       compiler->fp->wpos_attr = i;
+               if (!(compiler->Base.Program.InputsRead & (1 << i))) {
+                       fp->wpos_attr = i;
                        break;
                }
        }
 
-       GLuint tempregi = _mesa_find_free_register(compiler->program, PROGRAM_TEMPORARY);
-
-       _mesa_insert_instructions(compiler->program, 0, 3);
-       fpi = compiler->program->Instructions;
-       i = 0;
-
-       /* perspective divide */
-       fpi[i].Opcode = OPCODE_RCP;
-
-       fpi[i].DstReg.File = PROGRAM_TEMPORARY;
-       fpi[i].DstReg.Index = tempregi;
-       fpi[i].DstReg.WriteMask = WRITEMASK_W;
-       fpi[i].DstReg.CondMask = COND_TR;
-
-       fpi[i].SrcReg[0].File = PROGRAM_INPUT;
-       fpi[i].SrcReg[0].Index = compiler->fp->wpos_attr;
-       fpi[i].SrcReg[0].Swizzle = SWIZZLE_WWWW;
-       i++;
-
-       fpi[i].Opcode = OPCODE_MUL;
-
-       fpi[i].DstReg.File = PROGRAM_TEMPORARY;
-       fpi[i].DstReg.Index = tempregi;
-       fpi[i].DstReg.WriteMask = WRITEMASK_XYZ;
-       fpi[i].DstReg.CondMask = COND_TR;
-
-       fpi[i].SrcReg[0].File = PROGRAM_INPUT;
-       fpi[i].SrcReg[0].Index = compiler->fp->wpos_attr;
-       fpi[i].SrcReg[0].Swizzle = SWIZZLE_XYZW;
-
-       fpi[i].SrcReg[1].File = PROGRAM_TEMPORARY;
-       fpi[i].SrcReg[1].Index = tempregi;
-       fpi[i].SrcReg[1].Swizzle = SWIZZLE_WWWW;
-       i++;
-
-       /* viewport transformation */
-       window_index = _mesa_add_state_reference(compiler->program->Parameters, tokens);
-
-       fpi[i].Opcode = OPCODE_MAD;
-
-       fpi[i].DstReg.File = PROGRAM_TEMPORARY;
-       fpi[i].DstReg.Index = tempregi;
-       fpi[i].DstReg.WriteMask = WRITEMASK_XYZ;
-       fpi[i].DstReg.CondMask = COND_TR;
-
-       fpi[i].SrcReg[0].File = PROGRAM_TEMPORARY;
-       fpi[i].SrcReg[0].Index = tempregi;
-       fpi[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO);
-
-       fpi[i].SrcReg[1].File = PROGRAM_STATE_VAR;
-       fpi[i].SrcReg[1].Index = window_index;
-       fpi[i].SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO);
-
-       fpi[i].SrcReg[2].File = PROGRAM_STATE_VAR;
-       fpi[i].SrcReg[2].Index = window_index;
-       fpi[i].SrcReg[2].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO);
-       i++;
-
-       for (; i < compiler->program->NumInstructions; ++i) {
-               int reg;
-               for (reg = 0; reg < 3; reg++) {
-                       if (fpi[i].SrcReg[reg].File == PROGRAM_INPUT &&
-                           fpi[i].SrcReg[reg].Index == FRAG_ATTRIB_WPOS) {
-                               fpi[i].SrcReg[reg].File = PROGRAM_TEMPORARY;
-                               fpi[i].SrcReg[reg].Index = tempregi;
-                       }
-               }
-       }
+       rc_transform_fragment_wpos(&compiler->Base, FRAG_ATTRIB_WPOS, fp->wpos_attr);
 }
 
-
 /**
  * Rewrite fragment.fogcoord to use a texture coordinate slot.
  * Note that fogcoord is forced into an X001 pattern, and this enforcement
@@ -170,205 +122,117 @@ static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler)
  *
  * See also the counterpart rewriting for vertex programs.
  */
-static void rewriteFog(struct r300_fragment_program_compiler *compiler)
+static void rewriteFog(struct r300_fragment_program_compiler *compiler, struct r300_fragment_program * fp)
 {
-       struct r300_fragment_program *fp = compiler->fp;
-       GLuint InputsRead;
+       struct prog_src_register src;
        int i;
 
-       InputsRead = fp->Base->InputsRead;
-
-       if (!(InputsRead & FRAG_BIT_FOGC)) {
+       if (!(compiler->Base.Program.InputsRead & FRAG_BIT_FOGC)) {
                fp->fog_attr = FRAG_ATTRIB_MAX;
                return;
        }
 
        for (i = FRAG_ATTRIB_TEX0; i <= FRAG_ATTRIB_TEX7; ++i)
        {
-               if (!(InputsRead & (1 << i))) {
-                       InputsRead &= ~(1 << FRAG_ATTRIB_FOGC);
-                       InputsRead |= 1 << i;
-                       fp->Base->InputsRead = InputsRead;
+               if (!(compiler->Base.Program.InputsRead & (1 << i))) {
                        fp->fog_attr = i;
                        break;
                }
        }
 
-       {
-               struct prog_instruction *inst;
-
-               inst = compiler->program->Instructions;
-               while (inst->Opcode != OPCODE_END) {
-                       const int src_regs = _mesa_num_inst_src_regs(inst->Opcode);
-                       for (i = 0; i < src_regs; ++i) {
-                               if (inst->SrcReg[i].File == PROGRAM_INPUT && inst->SrcReg[i].Index == FRAG_ATTRIB_FOGC) {
-                                       inst->SrcReg[i].Index = fp->fog_attr;
-                                       inst->SrcReg[i].Swizzle = combine_swizzles(
-                                               MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ONE),
-                                               inst->SrcReg[i].Swizzle);
-                               }
-                       }
-                       ++inst;
-               }
-       }
-}
-
-static GLuint build_dtm(GLuint depthmode)
-{
-       switch(depthmode) {
-       default:
-       case GL_LUMINANCE: return 0;
-       case GL_INTENSITY: return 1;
-       case GL_ALPHA: return 2;
-       }
+       memset(&src, 0, sizeof(src));
+       src.File = PROGRAM_INPUT;
+       src.Index = fp->fog_attr;
+       src.Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ONE);
+       rc_move_input(&compiler->Base, FRAG_ATTRIB_FOGC, src);
 }
 
-static GLuint build_func(GLuint comparefunc)
-{
-       return comparefunc - GL_NEVER;
-}
 
 /**
- * Collect all external state that is relevant for compiling the given
- * fragment program.
+ * Reserve hardware temporary registers for the program inputs.
+ *
+ * @note This allocation is performed explicitly, because the order of inputs
+ * is determined by the RS hardware.
  */
-static void build_state(
-       r300ContextPtr r300,
-       struct gl_fragment_program *fp,
-       struct r300_fragment_program_external_state *state)
+static void allocate_hw_inputs(
+       struct r300_fragment_program_compiler * c,
+       void (*allocate)(void * data, unsigned input, unsigned hwreg),
+       void * mydata)
 {
-       int unit;
-
-       _mesa_bzero(state, sizeof(*state));
-
-       for(unit = 0; unit < 16; ++unit) {
-               if (fp->Base.ShadowSamplers & (1 << unit)) {
-                       struct gl_texture_object* tex = r300->radeon.glCtx->Texture.Unit[unit]._Current;
-
-                       state->unit[unit].depth_texture_mode = build_dtm(tex->DepthMode);
-                       state->unit[unit].texture_compare_func = build_func(tex->CompareFunc);
-               }
+       GLuint InputsRead = c->Base.Program.InputsRead;
+       int i;
+       GLuint hwindex = 0;
+
+       /* Primary colour */
+       if (InputsRead & FRAG_BIT_COL0)
+               allocate(mydata, FRAG_ATTRIB_COL0, hwindex++);
+       InputsRead &= ~FRAG_BIT_COL0;
+
+       /* Secondary color */
+       if (InputsRead & FRAG_BIT_COL1)
+               allocate(mydata, FRAG_ATTRIB_COL1, hwindex++);
+       InputsRead &= ~FRAG_BIT_COL1;
+
+       /* Texcoords */
+       for (i = 0; i < 8; i++) {
+               if (InputsRead & (FRAG_BIT_TEX0 << i))
+                       allocate(mydata, FRAG_ATTRIB_TEX0+i, hwindex++);
        }
-}
+       InputsRead &= ~FRAG_BITS_TEX_ANY;
 
-static void rewrite_depth_out(struct gl_program *prog)
-{
-       struct prog_instruction *inst;
+       /* Fogcoords treated as a texcoord */
+       if (InputsRead & FRAG_BIT_FOGC)
+               allocate(mydata, FRAG_ATTRIB_FOGC, hwindex++);
+       InputsRead &= ~FRAG_BIT_FOGC;
 
-       for (inst = prog->Instructions; inst->Opcode != OPCODE_END; ++inst) {
-               if (inst->DstReg.File != PROGRAM_OUTPUT || inst->DstReg.Index != FRAG_RESULT_DEPTH)
-                       continue;
+       /* fragment position treated as a texcoord */
+       if (InputsRead & FRAG_BIT_WPOS)
+               allocate(mydata, FRAG_ATTRIB_WPOS, hwindex++);
+       InputsRead &= ~FRAG_BIT_WPOS;
 
-               if (inst->DstReg.WriteMask & WRITEMASK_Z) {
-                       inst->DstReg.WriteMask = WRITEMASK_W;
-               } else {
-                       inst->DstReg.WriteMask = 0;
-                       continue;
-               }
-
-               switch (inst->Opcode) {
-                       case OPCODE_FRC:
-                       case OPCODE_MOV:
-                               inst->SrcReg[0] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[0]);
-                               break;
-                       case OPCODE_ADD:
-                       case OPCODE_MAX:
-                       case OPCODE_MIN:
-                       case OPCODE_MUL:
-                               inst->SrcReg[0] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[0]);
-                               inst->SrcReg[1] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[1]);
-                               break;
-                       case OPCODE_CMP:
-                       case OPCODE_MAD:
-                               inst->SrcReg[0] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[0]);
-                               inst->SrcReg[1] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[1]);
-                               inst->SrcReg[2] = lmul_swizzle(SWIZZLE_ZZZZ, inst->SrcReg[2]);
-                               break;
-                       default:
-                               // Scalar instructions needn't be reswizzled
-                               break;
-               }
-       }
+       /* Anything else */
+       if (InputsRead)
+               rc_error(&c->Base, "Don't know how to handle inputs 0x%x\n", InputsRead);
 }
 
-void r300TranslateFragmentShader(GLcontext *ctx, struct r300_fragment_program *fp)
+
+static void translate_fragment_program(GLcontext *ctx, struct r300_fragment_program_cont *cont, struct r300_fragment_program *fp)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
        struct r300_fragment_program_compiler compiler;
 
-       compiler.r300 = r300;
-       compiler.fp = fp;
+       rc_init(&compiler.Base);
+       compiler.Base.Debug = (RADEON_DEBUG & DEBUG_PIXEL) ? GL_TRUE : GL_FALSE;
+
        compiler.code = &fp->code;
-       compiler.program = fp->Base;
+       compiler.state = fp->state;
+       compiler.is_r500 = (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) ? GL_TRUE : GL_FALSE;
+       compiler.OutputDepth = FRAG_RESULT_DEPTH;
+       compiler.OutputColor = FRAG_RESULT_COLOR;
+       compiler.AllocateHwInputs = &allocate_hw_inputs;
 
-       if (RADEON_DEBUG & DEBUG_PIXEL) {
+       if (compiler.Base.Debug) {
                fflush(stdout);
                _mesa_printf("Fragment Program: Initial program:\n");
-               _mesa_print_program(compiler.program);
+               _mesa_print_program(&cont->Base.Base);
                fflush(stdout);
        }
 
-       insert_WPOS_trailer(&compiler);
-
-       rewriteFog(&compiler);
-
-       rewrite_depth_out(compiler.program);
-
-       if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
-               struct radeon_program_transformation transformations[] = {
-                       { &r500_transform_TEX, &compiler },
-                       { &radeonTransformALU, 0 },
-                       { &radeonTransformDeriv, 0 },
-                       { &radeonTransformTrigScale, 0 }
-               };
-               radeonLocalTransform(ctx, compiler.program, 4, transformations);
-       } else {
-               struct radeon_program_transformation transformations[] = {
-                       { &r300_transform_TEX, &compiler },
-                       { &radeonTransformALU, 0 },
-                       { &radeonTransformTrigSimple, 0 }
-               };
-               radeonLocalTransform(ctx, compiler.program, 3, transformations);
-       }
+       rc_mesa_to_rc_program(&compiler.Base, &cont->Base.Base);
 
-       if (RADEON_DEBUG & DEBUG_PIXEL) {
-               _mesa_printf("Fragment Program: After native rewrite:\n");
-               _mesa_print_program(compiler.program);
-               fflush(stdout);
-       }
-
-       if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
-               struct radeon_nqssadce_descr nqssadce = {
-                       .Init = &nqssadce_init,
-                       .IsNativeSwizzle = &r500FPIsNativeSwizzle,
-                       .BuildSwizzle = &r500FPBuildSwizzle
-               };
-               radeonNqssaDce(ctx, compiler.program, &nqssadce);
-       } else {
-               struct radeon_nqssadce_descr nqssadce = {
-                       .Init = &nqssadce_init,
-                       .IsNativeSwizzle = &r300FPIsNativeSwizzle,
-                       .BuildSwizzle = &r300FPBuildSwizzle
-               };
-               radeonNqssaDce(ctx, compiler.program, &nqssadce);
-       }
+       insert_WPOS_trailer(&compiler, fp);
 
-       if (RADEON_DEBUG & DEBUG_PIXEL) {
-               _mesa_printf("Compiler: after NqSSA-DCE:\n");
-               _mesa_print_program(compiler.program);
-               fflush(stdout);
-       }
+       rewriteFog(&compiler, fp);
 
-       if (!r300->vtbl.BuildFragmentProgramHwCode(&compiler))
-               fp->error = GL_TRUE;
+       r3xx_compile_fragment_program(&compiler);
+       fp->error = compiler.Base.Error;
 
-       fp->translated = GL_TRUE;
+       fp->InputsRead = compiler.Base.Program.InputsRead;
 
-       if (fp->error || (RADEON_DEBUG & DEBUG_PIXEL))
-               r300->vtbl.FragmentProgramDump(&fp->code);
+       rc_destroy(&compiler.Base);
 }
 
-struct r300_fragment_program *r300SelectFragmentShader(GLcontext *ctx)
+struct r300_fragment_program *r300SelectAndTranslateFragmentShader(GLcontext *ctx)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
        struct r300_fragment_program_cont *fp_list;
@@ -389,11 +253,11 @@ struct r300_fragment_program *r300SelectFragmentShader(GLcontext *ctx)
        fp = _mesa_calloc(sizeof(struct r300_fragment_program));
 
        fp->state = state;
-       fp->translated = GL_FALSE;
-       fp->Base = _mesa_clone_program(ctx, &ctx->FragmentProgram._Current->Base);
 
        fp->next = fp_list->progs;
        fp_list->progs = fp;
 
+       translate_fragment_program(ctx, fp_list, fp);
+
        return r300->selected_fp = fp;
 }
index 5e103ee..3d64c08 100644 (file)
@@ -32,8 +32,6 @@
 
 #include "r300_context.h"
 
-extern void r300TranslateFragmentShader(GLcontext *ctx, struct r300_fragment_program *fp);
-
-struct r300_fragment_program *r300SelectFragmentShader(GLcontext *ctx);
+struct r300_fragment_program *r300SelectAndTranslateFragmentShader(GLcontext *ctx);
 
 #endif
index ddabd53..da801f4 100644 (file)
@@ -44,6 +44,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "main/imports.h"
 #include "main/macros.h"
 #include "main/context.h"
+#include "main/simple_list.h"
 #include "swrast/swrast.h"
 
 #include "radeon_common.h"
@@ -55,8 +56,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r300_vertprog.h"
 #include "radeon_reg.h"
 #include "r300_emit.h"
-#include "r300_fragprog.h"
 #include "r300_context.h"
+#include "r300_queryobj.h"
 
 #include "vblank.h"
 
@@ -66,6 +67,66 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define CLEARBUFFER_DEPTH      0x2
 #define CLEARBUFFER_STENCIL    0x4
 
+#if 1
+
+/**
+ * Fragment program helper macros
+ */
+
+/* Produce unshifted source selectors */
+#define FP_TMP(idx) (idx)
+#define FP_CONST(idx) ((idx) | (1 << 5))
+
+/* Produce source/dest selector dword */
+#define FP_SELC_MASK_NO                0
+#define FP_SELC_MASK_X         1
+#define FP_SELC_MASK_Y         2
+#define FP_SELC_MASK_XY                3
+#define FP_SELC_MASK_Z         4
+#define FP_SELC_MASK_XZ                5
+#define FP_SELC_MASK_YZ                6
+#define FP_SELC_MASK_XYZ       7
+
+#define FP_SELC(destidx,regmask,outmask,src0,src1,src2) \
+       (((destidx) << R300_ALU_DSTC_SHIFT) |           \
+        (FP_SELC_MASK_##regmask << 23) |               \
+        (FP_SELC_MASK_##outmask << 26) |               \
+        ((src0) << R300_ALU_SRC0C_SHIFT) |             \
+        ((src1) << R300_ALU_SRC1C_SHIFT) |             \
+        ((src2) << R300_ALU_SRC2C_SHIFT))
+
+#define FP_SELA_MASK_NO                0
+#define FP_SELA_MASK_W         1
+
+#define FP_SELA(destidx,regmask,outmask,src0,src1,src2) \
+       (((destidx) << R300_ALU_DSTA_SHIFT) |           \
+        (FP_SELA_MASK_##regmask << 23) |               \
+        (FP_SELA_MASK_##outmask << 24) |               \
+        ((src0) << R300_ALU_SRC0A_SHIFT) |             \
+        ((src1) << R300_ALU_SRC1A_SHIFT) |             \
+        ((src2) << R300_ALU_SRC2A_SHIFT))
+
+/* Produce unshifted argument selectors */
+#define FP_ARGC(source)        R300_ALU_ARGC_##source
+#define FP_ARGA(source) R300_ALU_ARGA_##source
+#define FP_ABS(arg) ((arg) | (1 << 6))
+#define FP_NEG(arg) ((arg) ^ (1 << 5))
+
+/* Produce instruction dword */
+#define FP_INSTRC(opcode,arg0,arg1,arg2) \
+       (R300_ALU_OUTC_##opcode |               \
+       ((arg0) << R300_ALU_ARG0C_SHIFT) |      \
+       ((arg1) << R300_ALU_ARG1C_SHIFT) |      \
+       ((arg2) << R300_ALU_ARG2C_SHIFT))
+
+#define FP_INSTRA(opcode,arg0,arg1,arg2) \
+       (R300_ALU_OUTA_##opcode |               \
+       ((arg0) << R300_ALU_ARG0A_SHIFT) |      \
+       ((arg1) << R300_ALU_ARG1A_SHIFT) |      \
+       ((arg2) << R300_ALU_ARG2A_SHIFT))
+
+#endif
+
 static void r300EmitClearState(GLcontext * ctx);
 
 static void r300ClearBuffer(r300ContextPtr r300, int flags,
@@ -109,18 +170,21 @@ static void r300ClearBuffer(r300ContextPtr r300, int flags,
        }
 #if 1
        if (flags & (CLEARBUFFER_DEPTH | CLEARBUFFER_STENCIL)) {
-               assert(rrbd != 0);
-               cbpitch = (rrbd->pitch / rrbd->cpp);
+               uint32_t zbpitch = (rrbd->pitch / rrbd->cpp);
                if (rrbd->bo->flags & RADEON_BO_FLAGS_MACRO_TILE){
-                       cbpitch |= R300_DEPTHMACROTILE_ENABLE;
+                       zbpitch |= R300_DEPTHMACROTILE_ENABLE;
         }
                if (rrbd->bo->flags & RADEON_BO_FLAGS_MICRO_TILE){
-            cbpitch |= R300_DEPTHMICROTILE_TILED;
+            zbpitch |= R300_DEPTHMICROTILE_TILED;
         }
                BEGIN_BATCH_NO_AUTOSTATE(6);
                OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET, 1);
                OUT_BATCH_RELOC(0, rrbd->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
-               OUT_BATCH_REGVAL(R300_ZB_DEPTHPITCH, cbpitch);
+               OUT_BATCH_REGSEQ(R300_ZB_DEPTHPITCH, 1);
+               if (!r300->radeon.radeonScreen->kernel_mm)
+                       OUT_BATCH(zbpitch);
+               else
+                       OUT_BATCH_RELOC(zbpitch, rrbd->bo, zbpitch, 0, RADEON_GEM_DOMAIN_VRAM, 0);
                END_BATCH();
        }
 #endif
@@ -508,12 +572,12 @@ static void r300EmitClearState(GLcontext * ctx)
                                          0, 0xf, PVS_DST_REG_OUT);
                vpu.cmd[2] = PVS_SRC_OPERAND(0, PVS_SRC_SELECT_X, PVS_SRC_SELECT_Y,
                                       PVS_SRC_SELECT_Z, PVS_SRC_SELECT_W,
-                                      PVS_SRC_REG_INPUT, VSF_FLAG_NONE);
+                                      PVS_SRC_REG_INPUT, NEGATE_NONE);
                vpu.cmd[3] = PVS_SRC_OPERAND(0, PVS_SRC_SELECT_FORCE_0,
                                       PVS_SRC_SELECT_FORCE_0,
                                       PVS_SRC_SELECT_FORCE_0,
                                       PVS_SRC_SELECT_FORCE_0,
-                                      PVS_SRC_REG_INPUT, VSF_FLAG_NONE);
+                                      PVS_SRC_REG_INPUT, NEGATE_NONE);
                vpu.cmd[4] = 0x0;
 
                vpu.cmd[5] = PVS_OP_DST_OPERAND(VE_ADD, GL_FALSE, GL_FALSE, 1, 0xf,
@@ -521,13 +585,12 @@ static void r300EmitClearState(GLcontext * ctx)
                vpu.cmd[6] = PVS_SRC_OPERAND(1, PVS_SRC_SELECT_X,
                                       PVS_SRC_SELECT_Y, PVS_SRC_SELECT_Z,
                                       PVS_SRC_SELECT_W, PVS_SRC_REG_INPUT,
-
-                                      VSF_FLAG_NONE);
+                                      NEGATE_NONE);
                vpu.cmd[7] = PVS_SRC_OPERAND(1, PVS_SRC_SELECT_FORCE_0,
                                       PVS_SRC_SELECT_FORCE_0,
                                       PVS_SRC_SELECT_FORCE_0,
                                       PVS_SRC_SELECT_FORCE_0,
-                                      PVS_SRC_REG_INPUT, VSF_FLAG_NONE);
+                                      PVS_SRC_REG_INPUT, NEGATE_NONE);
                vpu.cmd[8] = 0x0;
 
                r300->vap_flush_needed = GL_TRUE;
@@ -546,7 +609,7 @@ static int r300KernelClear(GLcontext *ctx, GLuint flags)
 
        /* Make sure it fits there. */
        radeon_cs_space_reset_bos(r300->radeon.cmdbuf.cs);
-       
+
        if (flags & BUFFER_BIT_COLOR0) {
                rrb = radeon_get_renderbuffer(&rfb->base, BUFFER_COLOR0);
                radeon_cs_space_add_persistent_bo(r300->radeon.cmdbuf.cs,
@@ -692,10 +755,19 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
        }
 }
 
+static void r300Flush(GLcontext *ctx)
+{
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+
+       radeonFlush(ctx);
+
+       make_empty_list(&r300->query.not_flushed_head);
+}
+
 
 void r300InitIoctlFuncs(struct dd_function_table *functions)
 {
        functions->Clear = r300Clear;
        functions->Finish = radeonFinish;
-       functions->Flush = radeonFlush;
+       functions->Flush = r300Flush;
 }
diff --git a/src/mesa/drivers/dri/r300/r300_queryobj.c b/src/mesa/drivers/dri/r300/r300_queryobj.c
new file mode 100644 (file)
index 0000000..df1fb32
--- /dev/null
@@ -0,0 +1,250 @@
+/*
+ * Copyright Â© 2008-2009 Maciej Cencora <m.cencora@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Maciej Cencora <m.cencora@gmail.com>
+ *
+ */
+
+#include "r300_queryobj.h"
+#include "r300_emit.h"
+
+#include "main/imports.h"
+#include "main/simple_list.h"
+
+#define DDEBUG 0
+
+#define PAGE_SIZE 4096
+
+static void r300QueryGetResult(GLcontext *ctx, struct gl_query_object *q)
+{
+       struct r300_query_object *query = (struct r300_query_object *)q;
+       uint32_t *result;
+       int i;
+
+       if (DDEBUG) fprintf(stderr, "%s: query id %d, result %d\n", __FUNCTION__, query->Base.Id, (int) query->Base.Result);
+
+       radeon_bo_map(query->bo, GL_FALSE);
+
+       result = query->bo->ptr;
+
+       query->Base.Result = 0;
+       for (i = 0; i < query->curr_offset/sizeof(uint32_t); ++i) {
+               query->Base.Result += result[i];
+               if (DDEBUG) fprintf(stderr, "result[%d] = %d\n", i, result[i]);
+       }
+
+       radeon_bo_unmap(query->bo);
+}
+
+static struct gl_query_object * r300NewQueryObject(GLcontext *ctx, GLuint id)
+{
+       struct r300_query_object *query;
+
+       query = _mesa_calloc(sizeof(struct r300_query_object));
+
+       query->Base.Id = id;
+       query->Base.Result = 0;
+       query->Base.Active = GL_FALSE;
+       query->Base.Ready = GL_TRUE;
+
+       if (DDEBUG) fprintf(stderr, "%s: query id %d\n", __FUNCTION__, query->Base.Id);
+
+       return &query->Base;
+}
+
+static void r300DeleteQuery(GLcontext *ctx, struct gl_query_object *q)
+{
+       struct r300_query_object *query = (struct r300_query_object *)q;
+
+       if (DDEBUG) fprintf(stderr, "%s: query id %d\n", __FUNCTION__, q->Id);
+
+       if (query->bo) {
+               radeon_bo_unref(query->bo);
+       }
+
+       _mesa_free(query);
+}
+
+static void r300BeginQuery(GLcontext *ctx, struct gl_query_object *q)
+{
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+       struct r300_query_object *query = (struct r300_query_object *)q;
+
+       if (DDEBUG) fprintf(stderr, "%s: query id %d\n", __FUNCTION__, q->Id);
+
+       assert(r300->query.current == NULL);
+
+       if (!query->bo) {
+               query->bo = radeon_bo_open(r300->radeon.radeonScreen->bom, 0, PAGE_SIZE, PAGE_SIZE, RADEON_GEM_DOMAIN_GTT, 0);
+       }
+       query->curr_offset = 0;
+
+       r300->query.current = query;
+       insert_at_tail(&r300->query.not_flushed_head, query);
+}
+
+static void r300EndQuery(GLcontext *ctx, struct gl_query_object *q)
+{
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+
+       if (DDEBUG) fprintf(stderr, "%s: query id %d\n", __FUNCTION__, q->Id);
+
+       r300EmitQueryEnd(ctx);
+
+       r300->query.current = NULL;
+}
+
+static void r300WaitQuery(GLcontext *ctx, struct gl_query_object *q)
+{
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+       struct r300_query_object *tmp, *query = (struct r300_query_object *)q;
+
+       /* If the cmdbuf with packets for this query hasn't been flushed yet, do it now */
+       {
+               GLboolean found = GL_FALSE;
+               foreach(tmp, &r300->query.not_flushed_head) {
+                       if (tmp == query) {
+                               found = GL_TRUE;
+                               break;
+                       }
+               }
+
+               if (found)
+                       ctx->Driver.Flush(ctx);
+       }
+
+       if (DDEBUG) fprintf(stderr, "%s: query id %d, bo %p, offset %d\n", __FUNCTION__, q->Id, query->bo, query->curr_offset);
+
+       r300QueryGetResult(ctx, q);
+
+       query->Base.Ready = GL_TRUE;
+}
+
+
+/**
+ * TODO:
+ * should check if bo is idle, bo there's no interface to do it
+ * just wait for result now
+ */
+static void r300CheckQuery(GLcontext *ctx, struct gl_query_object *q)
+{
+       if (DDEBUG) fprintf(stderr, "%s: query id %d\n", __FUNCTION__, q->Id);
+
+       r300WaitQuery(ctx, q);
+}
+
+void r300EmitQueryBegin(GLcontext *ctx)
+{
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+       struct r300_query_object *query = r300->query.current;
+       BATCH_LOCALS(&r300->radeon);
+
+       if (!query || query->emitted_begin)
+               return;
+
+       if (DDEBUG) fprintf(stderr, "%s: query id %d\n", __FUNCTION__, query->Base.Id);
+
+       if (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV530) {
+               BEGIN_BATCH_NO_AUTOSTATE(4);
+               OUT_BATCH_REGVAL(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_ALL);
+               OUT_BATCH_REGVAL(R300_ZB_ZPASS_DATA, 0);
+               END_BATCH();
+       } else {
+               BEGIN_BATCH_NO_AUTOSTATE(4);
+               OUT_BATCH_REGVAL(R300_SU_REG_DEST, R300_RASTER_PIPE_SELECT_ALL);
+               OUT_BATCH_REGVAL(R300_ZB_ZPASS_DATA, 0);
+               END_BATCH();
+       }
+
+       query->emitted_begin = GL_TRUE;
+}
+
+void r300EmitQueryEnd(GLcontext *ctx)
+{
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+       struct r300_query_object *query = r300->query.current;
+       BATCH_LOCALS(&r300->radeon);
+
+       if (!query || !query->emitted_begin)
+               return;
+
+       if (DDEBUG) fprintf(stderr, "%s: query id %d, bo %p, offset %d\n", __FUNCTION__, query->Base.Id, query->bo, query->curr_offset);
+
+       radeon_cs_space_check_with_bo(r300->radeon.cmdbuf.cs,
+                                                                 query->bo,
+                                                                 0, RADEON_GEM_DOMAIN_GTT);
+
+       if (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV530) {
+               BEGIN_BATCH_NO_AUTOSTATE(14);
+               OUT_BATCH_REGVAL(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_0);
+               OUT_BATCH_REGSEQ(R300_ZB_ZPASS_ADDR, 1);
+               OUT_BATCH_RELOC(0, query->bo, query->curr_offset, 0, RADEON_GEM_DOMAIN_GTT, 0);
+               OUT_BATCH_REGVAL(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_1);
+               OUT_BATCH_REGSEQ(R300_ZB_ZPASS_ADDR, 1);
+               OUT_BATCH_RELOC(0, query->bo, query->curr_offset + sizeof(uint32_t), 0, RADEON_GEM_DOMAIN_GTT, 0);
+               OUT_BATCH_REGVAL(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_ALL);
+               END_BATCH();
+       } else {
+               BEGIN_BATCH_NO_AUTOSTATE(3 * 2 *r300->num_z_pipes + 2);
+               switch (r300->num_z_pipes) {
+                       case 4:
+                               OUT_BATCH_REGVAL(R300_SU_REG_DEST, R300_RASTER_PIPE_SELECT_3);
+                               OUT_BATCH_REGSEQ(R300_ZB_ZPASS_ADDR, 1);
+                               OUT_BATCH_RELOC(0, query->bo, query->curr_offset+3*sizeof(uint32_t), 0, RADEON_GEM_DOMAIN_GTT, 0);
+                       case 3:
+                               OUT_BATCH_REGVAL(R300_SU_REG_DEST, R300_RASTER_PIPE_SELECT_2);
+                               OUT_BATCH_REGSEQ(R300_ZB_ZPASS_ADDR, 1);
+                               OUT_BATCH_RELOC(0, query->bo, query->curr_offset+2*sizeof(uint32_t), 0, RADEON_GEM_DOMAIN_GTT, 0);
+                       case 2:
+                               if (r300->radeon.radeonScreen->chip_family <= CHIP_FAMILY_RV380) {
+                                       OUT_BATCH_REGVAL(R300_SU_REG_DEST, R300_RASTER_PIPE_SELECT_3);
+                               } else {
+                                       OUT_BATCH_REGVAL(R300_SU_REG_DEST, R300_RASTER_PIPE_SELECT_1);
+                               }
+                               OUT_BATCH_REGSEQ(R300_ZB_ZPASS_ADDR, 1);
+                               OUT_BATCH_RELOC(0, query->bo, query->curr_offset+1*sizeof(uint32_t), 0, RADEON_GEM_DOMAIN_GTT, 0);
+                       case 1:
+                       default:
+                               OUT_BATCH_REGVAL(R300_SU_REG_DEST, R300_RASTER_PIPE_SELECT_0);
+                               OUT_BATCH_REGSEQ(R300_ZB_ZPASS_ADDR, 1);
+                               OUT_BATCH_RELOC(0, query->bo, query->curr_offset, 0, RADEON_GEM_DOMAIN_GTT, 0);
+                               break;
+               }
+               OUT_BATCH_REGVAL(R300_SU_REG_DEST, R300_RASTER_PIPE_SELECT_ALL);
+               END_BATCH();
+       }
+
+       query->curr_offset += r300->num_z_pipes * sizeof(uint32_t);
+       assert(query->curr_offset < PAGE_SIZE);
+       query->emitted_begin = GL_FALSE;
+}
+
+void r300InitQueryObjFunctions(struct dd_function_table *functions)
+{
+       functions->NewQueryObject = r300NewQueryObject;
+       functions->DeleteQuery = r300DeleteQuery;
+       functions->BeginQuery = r300BeginQuery;
+       functions->EndQuery = r300EndQuery;
+       functions->CheckQuery = r300CheckQuery;
+       functions->WaitQuery = r300WaitQuery;
+}
diff --git a/src/mesa/drivers/dri/r300/r300_queryobj.h b/src/mesa/drivers/dri/r300/r300_queryobj.h
new file mode 100644 (file)
index 0000000..f301f0b
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright Â© 2008 Maciej Cencora <m.cencora@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Maciej Cencora <m.cencora@gmail.com>
+ *
+ */
+
+#include "main/imports.h"
+#include "r300_context.h"
+
+extern void r300EmitQueryBegin(GLcontext *ctx);
+extern void r300EmitQueryEnd(GLcontext *ctx);
+
+extern void r300InitQueryObjFunctions(struct dd_function_table *functions);
index 357c600..39b4b61 100644 (file)
@@ -1128,6 +1128,13 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 /* SU Depth Offset value */
 #define R300_SU_DEPTH_OFFSET                0x42c4
 
+#define R300_SU_REG_DEST                   0x42c8
+#      define R300_RASTER_PIPE_SELECT_0        (1 << 0)
+#      define R300_RASTER_PIPE_SELECT_1        (1 << 1)
+#      define R300_RASTER_PIPE_SELECT_2        (1 << 2)
+#      define R300_RASTER_PIPE_SELECT_3        (1 << 3)
+#      define R300_RASTER_PIPE_SELECT_ALL      0xf
+
 
 /* BEGIN: Rasterization / Interpolators - many guesses */
 
@@ -2014,6 +2021,11 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define R500_FG_ALPHA_VALUE                0x4be0
 #      define R500_FG_ALPHA_VALUE_MASK 0x0000ffff
 
+#define RV530_FG_ZBREG_DEST                 0x4be8
+#      define RV530_FG_ZBREG_DEST_PIPE_SELECT_0             (1 << 0)
+#      define RV530_FG_ZBREG_DEST_PIPE_SELECT_1             (1 << 1)
+#      define RV530_FG_ZBREG_DEST_PIPE_SELECT_ALL           (3 << 0)
+
 /* gap */
 
 /* Fragment program parameters in 7.16 floating point */
@@ -2667,6 +2679,24 @@ enum {
        PVS_SRC_ADDR_MODE_1_SHIFT       = 32,
 };
 
+
+#define PVS_OP_DST_OPERAND(opcode, math_inst, macro_inst, reg_index, reg_writemask, reg_class) \
+        (((opcode & PVS_DST_OPCODE_MASK) << PVS_DST_OPCODE_SHIFT)      \
+        | ((math_inst & PVS_DST_MATH_INST_MASK) << PVS_DST_MATH_INST_SHIFT)    \
+        | ((macro_inst & PVS_DST_MACRO_INST_MASK) << PVS_DST_MACRO_INST_SHIFT) \
+        | ((reg_index & PVS_DST_OFFSET_MASK) << PVS_DST_OFFSET_SHIFT)  \
+        | ((reg_writemask & 0xf) << PVS_DST_WE_X_SHIFT)        /* X Y Z W */   \
+        | ((reg_class & PVS_DST_REG_TYPE_MASK) << PVS_DST_REG_TYPE_SHIFT))
+
+#define PVS_SRC_OPERAND(in_reg_index, comp_x, comp_y, comp_z, comp_w, reg_class, negate)       \
+       (((in_reg_index & PVS_SRC_OFFSET_MASK) << PVS_SRC_OFFSET_SHIFT)                         \
+        | ((comp_x & PVS_SRC_SWIZZLE_X_MASK) << PVS_SRC_SWIZZLE_X_SHIFT)                       \
+        | ((comp_y & PVS_SRC_SWIZZLE_Y_MASK) << PVS_SRC_SWIZZLE_Y_SHIFT)                       \
+        | ((comp_z & PVS_SRC_SWIZZLE_Z_MASK) << PVS_SRC_SWIZZLE_Z_SHIFT)                       \
+        | ((comp_w & PVS_SRC_SWIZZLE_W_MASK) << PVS_SRC_SWIZZLE_W_SHIFT)                       \
+        | ((negate & 0xf) << PVS_SRC_MODIFIER_X_SHIFT) /* X Y Z W */                           \
+        | ((reg_class & PVS_SRC_REG_TYPE_MASK) << PVS_SRC_REG_TYPE_SHIFT))
+
 /*\}*/
 
 /* BEGIN: Packet 3 commands */
index 08d67b7..45330cd 100644 (file)
@@ -64,6 +64,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "swrast/swrast.h"
 #include "swrast_setup/swrast_setup.h"
 #include "vbo/vbo.h"
+#include "vbo/vbo_split.h"
 #include "tnl/tnl.h"
 #include "tnl/t_vp_build.h"
 #include "radeon_reg.h"
@@ -75,6 +76,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r300_tex.h"
 #include "r300_emit.h"
 #include "r300_fragprog_common.h"
+#include "r300_queryobj.h"
 #include "r300_swtcl.h"
 
 /**
@@ -172,64 +174,45 @@ int r300NumVerts(r300ContextPtr rmesa, int num_verts, int prim)
        return num_verts - verts_off;
 }
 
-static void r300EmitElts(GLcontext * ctx, unsigned long n_elts)
-{
-       r300ContextPtr rmesa = R300_CONTEXT(ctx);
-       void *out;
-       GLuint size;
-
-       size = ((rmesa->ind_buf.is_32bit ? 4 : 2) * n_elts + 3) & ~3;
-
-       radeonAllocDmaRegion(&rmesa->radeon, &rmesa->radeon.tcl.elt_dma_bo,
-                            &rmesa->radeon.tcl.elt_dma_offset, size, 4);
-       radeon_bo_map(rmesa->radeon.tcl.elt_dma_bo, 1);
-       out = rmesa->radeon.tcl.elt_dma_bo->ptr + rmesa->radeon.tcl.elt_dma_offset;
-       memcpy(out, rmesa->ind_buf.ptr, size);
-       radeon_bo_unmap(rmesa->radeon.tcl.elt_dma_bo);
-}
-
-static void r300FireEB(r300ContextPtr rmesa, int vertex_count, int type)
+static void r300FireEB(r300ContextPtr rmesa, int vertex_count, int type, int offset)
 {
        BATCH_LOCALS(&rmesa->radeon);
+       int size;
+
+       /* offset is in indices */
+       BEGIN_BATCH(10);
+       OUT_BATCH_PACKET3(R300_PACKET3_3D_DRAW_INDX_2, 0);
+       if (rmesa->ind_buf.is_32bit) {
+               /* convert to bytes */
+               offset *= 4;
+               size = vertex_count;
+               OUT_BATCH(R300_VAP_VF_CNTL__PRIM_WALK_INDICES |
+                 (vertex_count << 16) | type |
+                 R300_VAP_VF_CNTL__INDEX_SIZE_32bit);
+       } else {
+               /* convert to bytes */
+               offset *= 2;
+               size = (vertex_count + 1) >> 1;
+               OUT_BATCH(R300_VAP_VF_CNTL__PRIM_WALK_INDICES |
+                  (vertex_count << 16) | type);
+       }
 
-    r300_emit_scissor(rmesa->radeon.glCtx);
-       if (vertex_count > 0) {
-               int size;
-
-               BEGIN_BATCH(10);
-               OUT_BATCH_PACKET3(R300_PACKET3_3D_DRAW_INDX_2, 0);
-               if (rmesa->ind_buf.is_32bit) {
-                       size = vertex_count;
-                       OUT_BATCH(R300_VAP_VF_CNTL__PRIM_WALK_INDICES |
-                         ((vertex_count + 0) << 16) | type |
-                         R300_VAP_VF_CNTL__INDEX_SIZE_32bit);
-               } else {
-                       size = (vertex_count + 1) >> 1;
-                       OUT_BATCH(R300_VAP_VF_CNTL__PRIM_WALK_INDICES |
-                          ((vertex_count + 0) << 16) | type);
-               }
-
-               if (!rmesa->radeon.radeonScreen->kernel_mm) {
-                       OUT_BATCH_PACKET3(R300_PACKET3_INDX_BUFFER, 2);
-                       OUT_BATCH(R300_INDX_BUFFER_ONE_REG_WR | (0 << R300_INDX_BUFFER_SKIP_SHIFT) |
-                                (R300_VAP_PORT_IDX0 >> 2));
-                       OUT_BATCH_RELOC(rmesa->radeon.tcl.elt_dma_offset,
-                                       rmesa->radeon.tcl.elt_dma_bo,
-                                       rmesa->radeon.tcl.elt_dma_offset,
-                                       RADEON_GEM_DOMAIN_GTT, 0, 0);
-                       OUT_BATCH(size);
-               } else {
-                       OUT_BATCH_PACKET3(R300_PACKET3_INDX_BUFFER, 2);
-                       OUT_BATCH(R300_INDX_BUFFER_ONE_REG_WR | (0 << R300_INDX_BUFFER_SKIP_SHIFT) |
-                                (R300_VAP_PORT_IDX0 >> 2));
-                       OUT_BATCH(rmesa->radeon.tcl.elt_dma_offset);
-                       OUT_BATCH(size);
-                       radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
-                                             rmesa->radeon.tcl.elt_dma_bo,
-                                             RADEON_GEM_DOMAIN_GTT, 0, 0);
-               }
-               END_BATCH();
+       if (!rmesa->radeon.radeonScreen->kernel_mm) {
+               OUT_BATCH_PACKET3(R300_PACKET3_INDX_BUFFER, 2);
+               OUT_BATCH(R300_INDX_BUFFER_ONE_REG_WR | (0 << R300_INDX_BUFFER_SKIP_SHIFT) |
+                                (R300_VAP_PORT_IDX0 >> 2));
+               OUT_BATCH_RELOC(0, rmesa->ind_buf.bo, rmesa->ind_buf.bo_offset + offset, RADEON_GEM_DOMAIN_GTT, 0, 0);
+               OUT_BATCH(size);
+       } else {
+               OUT_BATCH_PACKET3(R300_PACKET3_INDX_BUFFER, 2);
+               OUT_BATCH(R300_INDX_BUFFER_ONE_REG_WR | (0 << R300_INDX_BUFFER_SKIP_SHIFT) |
+                                (R300_VAP_PORT_IDX0 >> 2));
+               OUT_BATCH(rmesa->ind_buf.bo_offset + offset);
+               OUT_BATCH(size);
+               radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
+                                     rmesa->ind_buf.bo, RADEON_GEM_DOMAIN_GTT, 0, 0);
        }
+       END_BATCH();
 }
 
 static void r300EmitAOS(r300ContextPtr rmesa, GLuint nr, GLuint offset)
@@ -340,7 +323,7 @@ static void r300FireAOS(r300ContextPtr rmesa, int vertex_count, int type)
 {
        BATCH_LOCALS(&rmesa->radeon);
 
-    r300_emit_scissor(rmesa->radeon.glCtx);
+        r300_emit_scissor(rmesa->radeon.glCtx);
        BEGIN_BATCH(3);
        OUT_BATCH_PACKET3(R300_PACKET3_3D_DRAW_VBUF_2, 0);
        OUT_BATCH(R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST | (vertex_count << 16) | type);
@@ -365,8 +348,16 @@ void r300RunRenderPrimitive(GLcontext * ctx, int start, int end, int prim)
         */
        rcommonEnsureCmdBufSpace(&rmesa->radeon, 128, __FUNCTION__);
 
-       if (rmesa->ind_buf.ptr) {
-               r300EmitElts(ctx, num_verts);
+       if (rmesa->ind_buf.bo) {
+               GLuint first, incr, offset = 0;
+
+               if (!split_prim_inplace(prim & PRIM_MODE_MASK, &first, &incr) &&
+                       num_verts > 65500) {
+                       WARN_ONCE("Fixme: can't handle spliting prim %d\n", prim);
+                       return;
+               }
+
+
                r300EmitAOS(rmesa, rmesa->radeon.tcl.aos_count, 0);
                if (rmesa->radeon.radeonScreen->kernel_mm) {
                        BEGIN_BATCH_NO_AUTOSTATE(2);
@@ -374,45 +365,56 @@ void r300RunRenderPrimitive(GLcontext * ctx, int start, int end, int prim)
                        OUT_BATCH(rmesa->radeon.tcl.aos[0].count);
                        END_BATCH();
                }
-               r300FireEB(rmesa, num_verts, type);
-       } else {
-               r300EmitAOS(rmesa, rmesa->radeon.tcl.aos_count, start);
-               r300FireAOS(rmesa, num_verts, type);
-       }
-       COMMIT_BATCH();
-}
-
-static void r300RunRender(GLcontext * ctx, struct tnl_pipeline_stage *stage)
-{
-       r300ContextPtr rmesa = R300_CONTEXT(ctx);
-       int i;
-       TNLcontext *tnl = TNL_CONTEXT(ctx);
-       struct vertex_buffer *vb = &tnl->vb;
-
-       if (RADEON_DEBUG & DEBUG_PRIMS)
-               fprintf(stderr, "%s\n", __FUNCTION__);
 
-       r300UpdateShaders(rmesa);
-       r300EmitArrays(ctx);
+               r300_emit_scissor(rmesa->radeon.glCtx);
+               while (num_verts > 0) {
+                       int nr;
+                       int align;
+
+                       nr = MIN2(num_verts, 65535);
+                       nr -= (nr - first) % incr;
+
+                       /* get alignment for IB correct */
+                       if (nr != num_verts) {
+                               do {
+                                   align = nr * (rmesa->ind_buf.is_32bit ? 4 : 2);
+                                   if (align % 4)
+                                       nr -= incr;
+                               } while(align % 4);
+                               if (nr <= 0) {
+                                       WARN_ONCE("did the impossible happen? we never aligned nr to dword\n");
+                                       return;
+                               }
+                                       
+                       }
+                       r300FireEB(rmesa, nr, type, offset);
 
-       r300UpdateShaderStates(rmesa);
+                       num_verts -= nr;
+                       offset += nr;
+               }
 
-       r300EmitCacheFlush(rmesa);
-       radeonEmitState(&rmesa->radeon);
+       } else {
+               GLuint first, incr, offset = 0;
 
-       for (i = 0; i < vb->PrimitiveCount; i++) {
-               GLuint prim = _tnl_translate_prim(&vb->Primitive[i]);
-               GLuint start = vb->Primitive[i].start;
-               GLuint end = vb->Primitive[i].start + vb->Primitive[i].count;
-               r300RunRenderPrimitive(ctx, start, end, prim);
+               if (!split_prim_inplace(prim & PRIM_MODE_MASK, &first, &incr) &&
+                       num_verts > 65500) {
+                       WARN_ONCE("Fixme: can't handle spliting prim %d\n", prim);
+                       return;
+               }
+               r300_emit_scissor(rmesa->radeon.glCtx);
+               while (num_verts > 0) {
+                       int nr;
+                       nr = MIN2(num_verts, 65535);
+                       nr -= (nr - first) % incr;
+                       r300EmitAOS(rmesa, rmesa->radeon.tcl.aos_count, start + offset);
+                       r300FireAOS(rmesa, nr, type);
+                       num_verts -= nr;
+                       offset += nr;
+               }
        }
-
-       r300EmitCacheFlush(rmesa);
-
-       radeonReleaseArrays(ctx, ~0);
+       COMMIT_BATCH();
 }
 
-
 static const char *getFallbackString(uint32_t bit)
 {
        switch (bit) {
@@ -449,7 +451,7 @@ void r300SwitchFallback(GLcontext *ctx, uint32_t bit, GLboolean mode)
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
        uint32_t old_fallback = rmesa->fallback;
        static uint32_t fallback_warn = 0;
-       
+
        if (mode) {
                if ((fallback_warn & bit) == 0) {
                        if (RADEON_DEBUG & DEBUG_FALLBACKS)
@@ -470,7 +472,7 @@ void r300SwitchFallback(GLcontext *ctx, uint32_t bit, GLboolean mode)
                /* update only if we change from no raster fallbacks to some raster fallbacks */
                if (((old_fallback & R300_RASTER_FALLBACK_MASK) == 0) &&
                        ((bit & R300_RASTER_FALLBACK_MASK) > 0)) {
-                       
+
                        radeon_firevertices(&rmesa->radeon);
                        rmesa->radeon.swtcl.RenderIndex = ~0;
                        _swsetup_Wakeup( ctx );
@@ -489,7 +491,7 @@ void r300SwitchFallback(GLcontext *ctx, uint32_t bit, GLboolean mode)
                /* update only if we have disabled all raster fallbacks */
                if ((old_fallback & R300_RASTER_FALLBACK_MASK) == bit) {
                        _swrast_flush( ctx );
-                       
+
                        tnl->Driver.Render.Start = r300RenderStart;
                        tnl->Driver.Render.Finish = r300RenderFinish;
                        tnl->Driver.Render.PrimitiveNotify = r300RenderPrimitive;
@@ -497,38 +499,10 @@ void r300SwitchFallback(GLcontext *ctx, uint32_t bit, GLboolean mode)
                        tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
                        tnl->Driver.Render.CopyPV = _tnl_copy_pv;
                        tnl->Driver.Render.Interp = _tnl_interp;
-                       
+
                        _tnl_invalidate_vertex_state( ctx, ~0 );
                        _tnl_invalidate_vertices( ctx, ~0 );
                }
        }
-       
-}
 
-static GLboolean r300RunNonTCLRender(GLcontext * ctx,
-                                    struct tnl_pipeline_stage *stage)
-{
-       r300ContextPtr rmesa = R300_CONTEXT(ctx);
-
-       if (RADEON_DEBUG & DEBUG_PRIMS)
-               fprintf(stderr, "%s\n", __FUNCTION__);
-
-       if (rmesa->fallback & R300_RASTER_FALLBACK_MASK)
-               return GL_TRUE;
-
-       if (rmesa->options.hw_tcl_enabled == GL_FALSE)
-               return GL_TRUE;
-
-       r300RunRender(ctx, stage);
-
-       return GL_FALSE;
 }
-
-const struct tnl_pipeline_stage _r300_render_stage = {
-       "r300 Hardware Rasterization",
-       NULL,
-       NULL,
-       NULL,
-       NULL,
-       r300RunNonTCLRender
-};
index 62228a3..a4f9db1 100644 (file)
@@ -38,7 +38,7 @@ static void freeFragProgCache(GLcontext *ctx, struct r300_fragment_program_cont
 
        while (fp) {
                tmp = fp->next;
-               _mesa_reference_program(ctx, &fp->Base, NULL);
+               rc_constants_destroy(&fp->code.constants);
                _mesa_free(fp);
                fp = tmp;
        }
@@ -50,6 +50,7 @@ static void freeVertProgCache(GLcontext *ctx, struct r300_vertex_program_cont *c
 
        while (vp) {
                tmp = vp->next;
+               rc_constants_destroy(&vp->code.constants);
                _mesa_reference_vertprog(ctx, &vp->Base, NULL);
                _mesa_free(vp);
                vp = tmp;
@@ -122,15 +123,11 @@ static GLboolean
 r300IsProgramNative(GLcontext * ctx, GLenum target, struct gl_program *prog)
 {
        if (target == GL_FRAGMENT_PROGRAM_ARB) {
-               struct r300_fragment_program *fp = r300SelectFragmentShader(ctx);
-               if (!fp->translated)
-                       r300TranslateFragmentShader(ctx, fp);
+               struct r300_fragment_program *fp = r300SelectAndTranslateFragmentShader(ctx);
 
                return !fp->error;
        } else {
-               struct r300_vertex_program *vp = r300SelectVertexShader(ctx);
-               if (!vp->translated)
-                       r300TranslateVertexShader(vp);
+               struct r300_vertex_program *vp = r300SelectAndTranslateVertexShader(ctx);
 
                return !vp->error;
        }
index 12fbf28..6081c33 100644 (file)
@@ -62,8 +62,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r300_emit.h"
 #include "r300_tex.h"
 #include "r300_fragprog_common.h"
-#include "r300_fragprog.h"
-#include "r500_fragprog.h"
 #include "r300_render.h"
 #include "r300_vertprog.h"
 
@@ -458,7 +456,7 @@ static GLboolean current_fragment_program_writes_depth(GLcontext* ctx)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
 
-       return ctx->FragmentProgram._Current && r300->selected_fp->writes_depth;
+       return ctx->FragmentProgram._Current && r300->selected_fp->code.writes_depth;
 }
 
 static void r300SetEarlyZState(GLcontext * ctx)
@@ -473,6 +471,8 @@ static void r300SetEarlyZState(GLcontext * ctx)
                topZ = R300_ZTOP_DISABLE;
        else if (ctx->FragmentProgram._Current && ctx->FragmentProgram._Current->UsesKill)
                topZ = R300_ZTOP_DISABLE;
+       else if (r300->query.current)
+               topZ = R300_ZTOP_DISABLE;
 
        if (topZ != r300->hw.zstencil_format.cmd[2]) {
                /* Note: This completely reemits the stencil format.
@@ -1046,53 +1046,6 @@ void r300UpdateViewportOffset(GLcontext * ctx)
        radeonUpdateScissor(ctx);
 }
 
-static void
-r300FetchStateParameter(GLcontext * ctx,
-                       const gl_state_index state[STATE_LENGTH],
-                       GLfloat * value)
-{
-       r300ContextPtr r300 = R300_CONTEXT(ctx);
-
-       switch (state[0]) {
-       case STATE_INTERNAL:
-               switch (state[1]) {
-               case STATE_R300_WINDOW_DIMENSION: {
-                               __DRIdrawablePrivate * drawable = radeon_get_drawable(&r300->radeon);
-                               value[0] = drawable->w * 0.5f;  /* width*0.5 */
-                               value[1] = drawable->h * 0.5f;  /* height*0.5 */
-                               value[2] = 0.5F;        /* for moving range [-1 1] -> [0 1] */
-                               value[3] = 1.0F;        /* not used */
-                               break;
-                       }
-
-               case STATE_R300_TEXRECT_FACTOR:{
-                               struct gl_texture_object *t =
-                                   ctx->Texture.Unit[state[2]].CurrentTex[TEXTURE_RECT_INDEX];
-
-                               if (t && t->Image[0][t->BaseLevel]) {
-                                       struct gl_texture_image *image =
-                                           t->Image[0][t->BaseLevel];
-                                       value[0] = 1.0 / image->Width2;
-                                       value[1] = 1.0 / image->Height2;
-                               } else {
-                                       value[0] = 1.0;
-                                       value[1] = 1.0;
-                               }
-                               value[2] = 1.0;
-                               value[3] = 1.0;
-                               break;
-                       }
-
-               default:
-                       break;
-               }
-               break;
-
-       default:
-               break;
-       }
-}
-
 /**
  * Update R300's own internal state parameters.
  * For now just STATE_R300_WINDOW_DIMENSION
@@ -1101,7 +1054,6 @@ static void r300UpdateStateParameters(GLcontext * ctx, GLuint new_state)
 {
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
        struct gl_program_parameter_list *paramList;
-       GLuint i;
 
        if (!(new_state & (_NEW_BUFFERS | _NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS)))
                return;
@@ -1109,21 +1061,12 @@ static void r300UpdateStateParameters(GLcontext * ctx, GLuint new_state)
        if (!ctx->FragmentProgram._Current || !rmesa->selected_fp)
                return;
 
-       paramList = rmesa->selected_fp->Base->Parameters;
+       paramList = ctx->FragmentProgram._Current->Base.Parameters;
 
        if (!paramList)
                return;
 
        _mesa_load_state_parameters(ctx, paramList);
-
-       for (i = 0; i < paramList->NumParameters; i++) {
-               if (paramList->Parameters[i].Type == PROGRAM_STATE_VAR) {
-                       r300FetchStateParameter(ctx,
-                                               paramList->Parameters[i].
-                                               StateIndexes,
-                                               paramList->ParameterValues[i]);
-               }
-       }
 }
 
 /* =============================================================
@@ -1230,7 +1173,7 @@ static void r300SetupFragmentShaderTextures(GLcontext *ctx, int *tmu_mappings)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
        int i;
-       struct r300_fragment_program_code *code = &r300->selected_fp->code.r300;
+       struct r300_fragment_program_code *code = &r300->selected_fp->code.code.r300;
 
        R300_STATECHANGE(r300, fpt);
 
@@ -1272,7 +1215,7 @@ static void r500SetupFragmentShaderTextures(GLcontext *ctx, int *tmu_mappings)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
        int i;
-       struct r500_fragment_program_code *code = &r300->selected_fp->code.r500;
+       struct r500_fragment_program_code *code = &r300->selected_fp->code.code.r500;
 
        /* find all the texture instructions and relocate the texture units */
        for (i = 0; i < code->inst_end + 1; i++) {
@@ -1312,6 +1255,7 @@ static GLuint translate_lod_bias(GLfloat bias)
        return (((GLuint)b) << R300_LOD_BIAS_SHIFT) & R300_LOD_BIAS_MASK;
 }
 
+
 static void r300SetupTextures(GLcontext * ctx)
 {
        int i, mtu;
@@ -1404,6 +1348,28 @@ static void r300SetupTextures(GLcontext * ctx)
                }
        }
 
+       /* R3xx and R4xx chips require that the texture unit corresponding to
+        * KIL instructions is really enabled.
+        *
+        * We do some fakery here and in the state atom emit logic to enable
+        * the texture without tripping up the CS checker in the kernel.
+        */
+       if (r300->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV515) {
+               if (ctx->FragmentProgram._Current->UsesKill && last_hw_tmu < 0) {
+                       last_hw_tmu++;
+
+                       r300->hw.txe.cmd[R300_TXE_ENABLE] |= 1;
+
+                       r300->hw.tex.border_color.cmd[R300_TEX_VALUE_0] = 0;
+                       r300->hw.tex.chroma_key.cmd[R300_TEX_VALUE_0] = 0;
+                       r300->hw.tex.filter.cmd[R300_TEX_VALUE_0] = 0;
+                       r300->hw.tex.filter_1.cmd[R300_TEX_VALUE_0] = 0;
+                       r300->hw.tex.size.cmd[R300_TEX_VALUE_0] = 0; /* 1x1 texture */
+                       r300->hw.tex.format.cmd[R300_TEX_VALUE_0] = 0; /* A8 format */
+                       r300->hw.tex.pitch.cmd[R300_TEX_VALUE_0] = 0;
+               }
+       }
+
        r300->hw.tex.filter.cmd[R300_TEX_CMD_0] =
            cmdpacket0(r300->radeon.radeonScreen, R300_TX_FILTER0_0, last_hw_tmu + 1);
        r300->hw.tex.filter_1.cmd[R300_TEX_CMD_0] =
@@ -1421,16 +1387,6 @@ static void r300SetupTextures(GLcontext * ctx)
        r300->hw.tex.border_color.cmd[R300_TEX_CMD_0] =
            cmdpacket0(r300->radeon.radeonScreen, R300_TX_BORDER_COLOR_0, last_hw_tmu + 1);
 
-       if (r300->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV515) {
-               if (ctx->FragmentProgram._Current->UsesKill && last_hw_tmu < 0) {
-                       // The KILL operation requires the first texture unit
-                       // to be enabled.
-                       r300->hw.txe.cmd[R300_TXE_ENABLE] |= 1;
-                       r300->hw.tex.filter.cmd[R300_TEX_VALUE_0] = 0;
-                       r300->hw.tex.filter.cmd[R300_TEX_CMD_0] =
-                               cmdpacket0(r300->radeon.radeonScreen, R300_TX_FILTER0_0, 1);
-               }
-       }
        r300->vtbl.SetupFragmentShaderTextures(ctx, tmu_mappings);
 
        if (RADEON_DEBUG & DEBUG_STATE)
@@ -1460,11 +1416,11 @@ static void r300SetupRSUnit(GLcontext * ctx)
        hw_tcl_on = r300->options.hw_tcl_enabled;
 
        if (hw_tcl_on)
-               OutputsWritten.vp_outputs = r300->selected_vp->Base->Base.OutputsWritten;
+               OutputsWritten.vp_outputs = r300->selected_vp->code.OutputsWritten;
        else
                RENDERINPUTS_COPY(OutputsWritten.index_bitset, r300->render_inputs_bitset);
 
-       InputsRead = r300->selected_fp->Base->InputsRead;
+       InputsRead = r300->selected_fp->InputsRead;
 
        R300_STATECHANGE(r300, ri);
        R300_STATECHANGE(r300, rc);
@@ -1554,11 +1510,11 @@ static void r500SetupRSUnit(GLcontext * ctx)
        hw_tcl_on = r300->options.hw_tcl_enabled;
 
        if (hw_tcl_on)
-               OutputsWritten.vp_outputs = r300->selected_vp->Base->Base.OutputsWritten;
+               OutputsWritten.vp_outputs = r300->selected_vp->code.OutputsWritten;
        else
                RENDERINPUTS_COPY(OutputsWritten.index_bitset, r300->render_inputs_bitset);
 
-       InputsRead = r300->selected_fp->Base->InputsRead;
+       InputsRead = r300->selected_fp->InputsRead;
 
        R300_STATECHANGE(r300, ri);
        R300_STATECHANGE(r300, rc);
@@ -1997,9 +1953,7 @@ void r300UpdateShaders(r300ContextPtr rmesa)
        {
                struct r300_fragment_program *fp;
 
-               fp = r300SelectFragmentShader(ctx);
-               if (!fp->translated)
-                       r300TranslateFragmentShader(ctx, fp);
+               fp = r300SelectAndTranslateFragmentShader(ctx);
 
                r300SwitchFallback(ctx, R300_FALLBACK_FRAGMENT_PROGRAM, fp->error);
        }
@@ -2024,9 +1978,7 @@ void r300UpdateShaders(r300ContextPtr rmesa)
                        }
                }
 
-               vp = r300SelectVertexShader(ctx);
-               if (!vp->translated)
-                       r300TranslateVertexShader(vp);
+               vp = r300SelectAndTranslateVertexShader(ctx);
 
                r300SwitchFallback(ctx, R300_FALLBACK_VERTEX_PROGRAM, vp->error);
        }
@@ -2035,24 +1987,61 @@ void r300UpdateShaders(r300ContextPtr rmesa)
        rmesa->radeon.NewGLState = 0;
 }
 
-static const GLfloat *get_fragmentprogram_constant(GLcontext *ctx,
-       struct gl_program *program, struct prog_src_register srcreg)
+static const GLfloat *get_fragmentprogram_constant(GLcontext *ctx, GLuint index, GLfloat * buffer)
 {
        static const GLfloat dummy[4] = { 0, 0, 0, 0 };
+       r300ContextPtr rmesa = R300_CONTEXT(ctx);
+       struct rc_constant * rcc = &rmesa->selected_fp->code.constants.Constants[index];
+
+       switch(rcc->Type) {
+       case RC_CONSTANT_EXTERNAL:
+               return ctx->FragmentProgram._Current->Base.Parameters->ParameterValues[rcc->u.External];
+       case RC_CONSTANT_IMMEDIATE:
+               return rcc->u.Immediate;
+       case RC_CONSTANT_STATE:
+               switch(rcc->u.State[0]) {
+               case RC_STATE_SHADOW_AMBIENT: {
+                       const int unit = (int) rcc->u.State[1];
+                       const struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current;
+                       if (texObj) {
+                               buffer[0] =
+                               buffer[1] =
+                               buffer[2] =
+                               buffer[3] = texObj->CompareFailValue;
+                       }
+                       return buffer;
+               }
 
-       switch(srcreg.File) {
-       case PROGRAM_LOCAL_PARAM:
-               return program->LocalParams[srcreg.Index];
-       case PROGRAM_ENV_PARAM:
-               return ctx->FragmentProgram.Parameters[srcreg.Index];
-       case PROGRAM_STATE_VAR:
-       case PROGRAM_NAMED_PARAM:
-       case PROGRAM_CONSTANT:
-               return program->Parameters->ParameterValues[srcreg.Index];
-       default:
-               _mesa_problem(ctx, "get_fragmentprogram_constant: Unknown\n");
-               return dummy;
+               case RC_STATE_R300_WINDOW_DIMENSION: {
+                       __DRIdrawablePrivate * drawable = radeon_get_drawable(&rmesa->radeon);
+                       buffer[0] = drawable->w * 0.5f; /* width*0.5 */
+                       buffer[1] = drawable->h * 0.5f; /* height*0.5 */
+                       buffer[2] = 0.5F;       /* for moving range [-1 1] -> [0 1] */
+                       buffer[3] = 1.0F;       /* not used */
+                       return buffer;
+               }
+
+               case RC_STATE_R300_TEXRECT_FACTOR: {
+                       struct gl_texture_object *t =
+                               ctx->Texture.Unit[rcc->u.State[1]].CurrentTex[TEXTURE_RECT_INDEX];
+
+                       if (t && t->Image[0][t->BaseLevel]) {
+                               struct gl_texture_image *image =
+                                       t->Image[0][t->BaseLevel];
+                               buffer[0] = 1.0 / image->Width2;
+                               buffer[1] = 1.0 / image->Height2;
+                       } else {
+                               buffer[0] = 1.0;
+                               buffer[1] = 1.0;
+                       }
+                       buffer[2] = 1.0;
+                       buffer[3] = 1.0;
+                       return buffer;
+               }
+               }
        }
+
+       return dummy;
 }
 
 
@@ -2061,9 +2050,9 @@ static void r300SetupPixelShader(GLcontext *ctx)
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
        struct r300_fragment_program *fp = rmesa->selected_fp;
        struct r300_fragment_program_code *code;
-       int i, k;
+       int i;
 
-       code = &fp->code.r300;
+       code = &fp->code.code.r300;
 
        R300_STATECHANGE(rmesa, fpi[0]);
        R300_STATECHANGE(rmesa, fpi[1]);
@@ -2074,38 +2063,24 @@ static void r300SetupPixelShader(GLcontext *ctx)
        rmesa->hw.fpi[2].cmd[R300_FPI_CMD_0] = cmdpacket0(rmesa->radeon.radeonScreen, R300_US_ALU_ALPHA_INST_0, code->alu.length);
        rmesa->hw.fpi[3].cmd[R300_FPI_CMD_0] = cmdpacket0(rmesa->radeon.radeonScreen, R300_US_ALU_ALPHA_ADDR_0, code->alu.length);
        for (i = 0; i < code->alu.length; i++) {
-               rmesa->hw.fpi[0].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].inst0;
-               rmesa->hw.fpi[1].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].inst1;
-               rmesa->hw.fpi[2].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].inst2;
-               rmesa->hw.fpi[3].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].inst3;
+               rmesa->hw.fpi[0].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].rgb_inst;
+               rmesa->hw.fpi[1].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].rgb_addr;
+               rmesa->hw.fpi[2].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].alpha_inst;
+               rmesa->hw.fpi[3].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].alpha_addr;
        }
 
        R300_STATECHANGE(rmesa, fp);
-       rmesa->hw.fp.cmd[R300_FP_CNTL0] = code->cur_node | (code->first_node_has_tex << 3);
-       rmesa->hw.fp.cmd[R300_FP_CNTL1] = code->max_temp_idx;
-       rmesa->hw.fp.cmd[R300_FP_CNTL2] =
-         (0 << R300_PFS_CNTL_ALU_OFFSET_SHIFT) |
-         ((code->alu.length-1) << R300_PFS_CNTL_ALU_END_SHIFT) |
-         (0 << R300_PFS_CNTL_TEX_OFFSET_SHIFT) |
-         ((code->tex.length ? code->tex.length-1 : 0) << R300_PFS_CNTL_TEX_END_SHIFT);
-       /* I just want to say, the way these nodes are stored.. weird.. */
-       for (i = 0, k = (4 - (code->cur_node + 1)); i < 4; i++, k++) {
-               if (i < (code->cur_node + 1)) {
-                       rmesa->hw.fp.cmd[R300_FP_NODE0 + k] =
-                         (code->node[i].alu_offset << R300_ALU_START_SHIFT) |
-                         (code->node[i].alu_end << R300_ALU_SIZE_SHIFT) |
-                         (code->node[i].tex_offset << R300_TEX_START_SHIFT) |
-                         (code->node[i].tex_end << R300_TEX_SIZE_SHIFT) |
-                         code->node[i].flags;
-               } else {
-                       rmesa->hw.fp.cmd[R300_FP_NODE0 + (3 - i)] = 0;
-               }
-       }
+       rmesa->hw.fp.cmd[R300_FP_CNTL0] = code->config;
+       rmesa->hw.fp.cmd[R300_FP_CNTL1] = code->pixsize;
+       rmesa->hw.fp.cmd[R300_FP_CNTL2] = code->code_offset;
+       for (i = 0; i < 4; i++)
+               rmesa->hw.fp.cmd[R300_FP_NODE0 + i] = code->code_addr[i];
 
        R300_STATECHANGE(rmesa, fpp);
-       rmesa->hw.fpp.cmd[R300_FPP_CMD_0] = cmdpacket0(rmesa->radeon.radeonScreen, R300_PFS_PARAM_0_X, code->const_nr * 4);
-       for (i = 0; i < code->const_nr; i++) {
-               const GLfloat *constant = get_fragmentprogram_constant(ctx, fp->Base, code->constant[i]);
+       rmesa->hw.fpp.cmd[R300_FPP_CMD_0] = cmdpacket0(rmesa->radeon.radeonScreen, R300_PFS_PARAM_0_X, fp->code.constants.Count * 4);
+       for (i = 0; i < fp->code.constants.Count; i++) {
+               GLfloat buffer[4];
+               const GLfloat *constant = get_fragmentprogram_constant(ctx, i, buffer);
                rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 0] = r300PackFloat24(constant[0]);
                rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 1] = r300PackFloat24(constant[1]);
                rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 2] = r300PackFloat24(constant[2]);
@@ -2137,19 +2112,19 @@ static void r500SetupPixelShader(GLcontext *ctx)
        ((drm_r300_cmd_header_t *) rmesa->hw.r500fp.cmd)->r500fp.count = 0;
        ((drm_r300_cmd_header_t *) rmesa->hw.r500fp_const.cmd)->r500fp.count = 0;
 
-       code = &fp->code.r500;
+       code = &fp->code.code.r500;
 
        R300_STATECHANGE(rmesa, fp);
        rmesa->hw.fp.cmd[R500_FP_PIXSIZE] = code->max_temp_idx;
 
        rmesa->hw.fp.cmd[R500_FP_CODE_ADDR] =
-           R500_US_CODE_START_ADDR(code->inst_offset) |
+           R500_US_CODE_START_ADDR(0) |
            R500_US_CODE_END_ADDR(code->inst_end);
        rmesa->hw.fp.cmd[R500_FP_CODE_RANGE] =
-           R500_US_CODE_RANGE_ADDR(code->inst_offset) |
+           R500_US_CODE_RANGE_ADDR(0) |
            R500_US_CODE_RANGE_SIZE(code->inst_end);
        rmesa->hw.fp.cmd[R500_FP_CODE_OFFSET] =
-           R500_US_CODE_OFFSET_ADDR(0); /* FIXME when we add flow control */
+           R500_US_CODE_OFFSET_ADDR(0);
 
        R300_STATECHANGE(rmesa, r500fp);
        /* Emit our shader... */
@@ -2165,14 +2140,15 @@ static void r500SetupPixelShader(GLcontext *ctx)
        bump_r500fp_count(rmesa->hw.r500fp.cmd, (code->inst_end + 1) * 6);
 
        R300_STATECHANGE(rmesa, r500fp_const);
-       for (i = 0; i < code->const_nr; i++) {
-               const GLfloat *constant = get_fragmentprogram_constant(ctx, fp->Base, code->constant[i]);
+       for (i = 0; i < fp->code.constants.Count; i++) {
+               GLfloat buffer[4];
+               const GLfloat *constant = get_fragmentprogram_constant(ctx, i, buffer);
                rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 0] = r300PackFloat32(constant[0]);
                rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 1] = r300PackFloat32(constant[1]);
                rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 2] = r300PackFloat32(constant[2]);
                rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 3] = r300PackFloat32(constant[3]);
        }
-       bump_r500fp_const_count(rmesa->hw.r500fp_const.cmd, code->const_nr * 4);
+       bump_r500fp_const_count(rmesa->hw.r500fp_const.cmd, fp->code.constants.Count * 4);
 }
 
 void r300SetupVAP(GLcontext *ctx, GLuint InputsRead, GLuint OutputsWritten)
@@ -2273,6 +2249,7 @@ static void r300InvalidateState(GLcontext * ctx, GLuint new_state)
                _mesa_update_draw_buffer_bounds(ctx);
 
                R300_STATECHANGE(r300, cb);
+               R300_STATECHANGE(r300, zb);
        }
 
        r300->radeon.NewGLState |= new_state;
@@ -2345,13 +2322,9 @@ void r300InitShaderFunctions(r300ContextPtr r300)
                r300->vtbl.SetupRSUnit = r500SetupRSUnit;
                r300->vtbl.SetupPixelShader = r500SetupPixelShader;
                r300->vtbl.SetupFragmentShaderTextures = r500SetupFragmentShaderTextures;
-               r300->vtbl.BuildFragmentProgramHwCode = r500BuildFragmentProgramHwCode;
-               r300->vtbl.FragmentProgramDump = r500FragmentProgramDump;
        } else {
                r300->vtbl.SetupRSUnit = r300SetupRSUnit;
                r300->vtbl.SetupPixelShader = r300SetupPixelShader;
                r300->vtbl.SetupFragmentShaderTextures = r300SetupFragmentShaderTextures;
-               r300->vtbl.BuildFragmentProgramHwCode = r300BuildFragmentProgramHwCode;
-               r300->vtbl.FragmentProgramDump = r300FragmentProgramDump;
        }
 }
index 56ed519..a634cb5 100644 (file)
@@ -76,7 +76,7 @@ void r300ChooseSwtclVertexFormat(GLcontext *ctx, GLuint *_InputsRead,  GLuint *_
        GLuint InputsRead = 0;
        GLuint OutputsWritten = 0;
        int num_attrs = 0;
-       GLuint fp_reads = rmesa->selected_fp->Base->InputsRead;
+       GLuint fp_reads = rmesa->selected_fp->InputsRead;
        struct vertex_attribute *attrs = rmesa->vbuf.attribs;
 
        rmesa->swtcl.coloroffset = rmesa->swtcl.specoffset = 0;
index de32013..c5edbd0 100644 (file)
@@ -40,927 +40,124 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "shader/prog_statevars.h"
 #include "tnl/tnl.h"
 
-#include "radeon_nqssadce.h"
+#include "compiler/radeon_compiler.h"
+#include "compiler/radeon_nqssadce.h"
 #include "r300_context.h"
 #include "r300_state.h"
 
-/* TODO: Get rid of t_src_class call */
-#define CMP_SRCS(a, b) ((a.RelAddr != b.RelAddr) || (a.Index != b.Index && \
-                      ((t_src_class(a.File) == PVS_SRC_REG_CONSTANT && \
-                        t_src_class(b.File) == PVS_SRC_REG_CONSTANT) || \
-                       (t_src_class(a.File) == PVS_SRC_REG_INPUT && \
-                        t_src_class(b.File) == PVS_SRC_REG_INPUT)))) \
-
-/*
- * Take an already-setup and valid source then swizzle it appropriately to
- * obtain a constant ZERO or ONE source.
+/**
+ * Write parameter array for the given vertex program into dst.
+ * Return the total number of components written.
  */
-#define __CONST(x, y)  \
-       (PVS_SRC_OPERAND(t_src_index(vp, &src[x]),      \
-                          t_swizzle(y),        \
-                          t_swizzle(y),        \
-                          t_swizzle(y),        \
-                          t_swizzle(y),        \
-                          t_src_class(src[x].File), \
-                          VSF_FLAG_NONE) | (src[x].RelAddr << 4))
-
-#define FREE_TEMPS() \
-       do { \
-               int u_temp_used = (VSF_MAX_FRAGMENT_TEMPS - 1) - u_temp_i; \
-               if((vp->num_temporaries + u_temp_used) > VSF_MAX_FRAGMENT_TEMPS) { \
-                       WARN_ONCE("Ran out of temps, num temps %d, us %d\n", vp->num_temporaries, u_temp_used); \
-                       vp->error = GL_TRUE; \
-               } \
-               u_temp_i=VSF_MAX_FRAGMENT_TEMPS-1; \
-       } while (0)
-
-static int r300VertexProgUpdateParams(GLcontext * ctx, struct gl_vertex_program *vp, float *dst)
+static int r300VertexProgUpdateParams(GLcontext * ctx, struct r300_vertex_program *vp, float *dst)
 {
-       int pi;
-       float *dst_o = dst;
-       struct gl_program_parameter_list *paramList;
+       int i;
 
-       if (vp->IsNVProgram) {
+       if (vp->Base->IsNVProgram) {
                _mesa_load_tracked_matrices(ctx);
-
-               for (pi = 0; pi < MAX_NV_VERTEX_PROGRAM_PARAMS; pi++) {
-                       *dst++ = ctx->VertexProgram.Parameters[pi][0];
-                       *dst++ = ctx->VertexProgram.Parameters[pi][1];
-                       *dst++ = ctx->VertexProgram.Parameters[pi][2];
-                       *dst++ = ctx->VertexProgram.Parameters[pi][3];
+       } else {
+               if (vp->Base->Base.Parameters) {
+                       _mesa_load_state_parameters(ctx, vp->Base->Base.Parameters);
                }
-               return dst - dst_o;
        }
 
-       if (!vp->Base.Parameters)
-               return 0;
-
-       _mesa_load_state_parameters(ctx, vp->Base.Parameters);
-
-       if (vp->Base.Parameters->NumParameters * 4 >
-           VSF_MAX_FRAGMENT_LENGTH) {
+       if (vp->code.constants.Count * 4 > VSF_MAX_FRAGMENT_LENGTH) {
+               /* Should have checked this earlier... */
                fprintf(stderr, "%s:Params exhausted\n", __FUNCTION__);
                _mesa_exit(-1);
        }
 
-       paramList = vp->Base.Parameters;
-       for (pi = 0; pi < paramList->NumParameters; pi++) {
-               switch (paramList->Parameters[pi].Type) {
-               case PROGRAM_STATE_VAR:
-               case PROGRAM_NAMED_PARAM:
-                       //fprintf(stderr, "%s", vp->Parameters->Parameters[pi].Name);
-               case PROGRAM_CONSTANT:
-                       *dst++ = paramList->ParameterValues[pi][0];
-                       *dst++ = paramList->ParameterValues[pi][1];
-                       *dst++ = paramList->ParameterValues[pi][2];
-                       *dst++ = paramList->ParameterValues[pi][3];
-                       break;
-               default:
-                       _mesa_problem(NULL, "Bad param type in %s",
-                                     __FUNCTION__);
-               }
-
-       }
-
-       return dst - dst_o;
-}
-
-static unsigned long t_dst_mask(GLuint mask)
-{
-       /* WRITEMASK_* is equivalent to VSF_FLAG_* */
-       return mask & VSF_FLAG_ALL;
-}
-
-static unsigned long t_dst_class(gl_register_file file)
-{
-
-       switch (file) {
-       case PROGRAM_TEMPORARY:
-               return PVS_DST_REG_TEMPORARY;
-       case PROGRAM_OUTPUT:
-               return PVS_DST_REG_OUT;
-       case PROGRAM_ADDRESS:
-               return PVS_DST_REG_A0;
-               /*
-                  case PROGRAM_INPUT:
-                  case PROGRAM_LOCAL_PARAM:
-                  case PROGRAM_ENV_PARAM:
-                  case PROGRAM_NAMED_PARAM:
-                  case PROGRAM_STATE_VAR:
-                  case PROGRAM_WRITE_ONLY:
-                  case PROGRAM_ADDRESS:
-                */
-       default:
-               fprintf(stderr, "problem in %s", __FUNCTION__);
-               _mesa_exit(-1);
-               return -1;
-       }
-}
+       for(i = 0; i < vp->code.constants.Count; ++i) {
+               const float * src = 0;
+               const struct rc_constant * constant = &vp->code.constants.Constants[i];
 
-static unsigned long t_dst_index(struct r300_vertex_program *vp,
-                                struct prog_dst_register *dst)
-{
-       if (dst->File == PROGRAM_OUTPUT)
-               return vp->outputs[dst->Index];
+               switch(constant->Type) {
+               case RC_CONSTANT_EXTERNAL:
+                       if (vp->Base->IsNVProgram) {
+                               src = ctx->VertexProgram.Parameters[constant->u.External];
+                       } else {
+                               src = vp->Base->Base.Parameters->ParameterValues[constant->u.External];
+                       }
+                       break;
 
-       return dst->Index;
-}
+               case RC_CONSTANT_IMMEDIATE:
+                       src = constant->u.Immediate;
+                       break;
+               }
 
-static unsigned long t_src_class(gl_register_file file)
-{
-       switch (file) {
-       case PROGRAM_TEMPORARY:
-               return PVS_SRC_REG_TEMPORARY;
-       case PROGRAM_INPUT:
-               return PVS_SRC_REG_INPUT;
-       case PROGRAM_LOCAL_PARAM:
-       case PROGRAM_ENV_PARAM:
-       case PROGRAM_NAMED_PARAM:
-       case PROGRAM_CONSTANT:
-       case PROGRAM_STATE_VAR:
-               return PVS_SRC_REG_CONSTANT;
-               /*
-                  case PROGRAM_OUTPUT:
-                  case PROGRAM_WRITE_ONLY:
-                  case PROGRAM_ADDRESS:
-                */
-       default:
-               fprintf(stderr, "problem in %s", __FUNCTION__);
-               _mesa_exit(-1);
-               return -1;
+               dst[4*i] = src[0];
+               dst[4*i + 1] = src[1];
+               dst[4*i + 2] = src[2];
+               dst[4*i + 3] = src[3];
        }
-}
 
-static INLINE unsigned long t_swizzle(GLubyte swizzle)
-{
-/* this is in fact a NOP as the Mesa SWIZZLE_* are all identical to VSF_IN_COMPONENT_* */
-       return swizzle;
+       return 4 * vp->code.constants.Count;
 }
 
-#if 0
-static void vp_dump_inputs(struct r300_vertex_program *vp, char *caller)
+static GLbitfield compute_required_outputs(struct gl_vertex_program * vp, GLbitfield fpreads)
 {
+       GLbitfield outputs = 0;
        int i;
 
-       if (vp == NULL) {
-               fprintf(stderr, "vp null in call to %s from %s\n", __FUNCTION__,
-                       caller);
-               return;
-       }
-
-       fprintf(stderr, "%s:<", caller);
-       for (i = 0; i < VERT_ATTRIB_MAX; i++)
-               fprintf(stderr, "%d ", vp->inputs[i]);
-       fprintf(stderr, ">\n");
-
-}
-#endif
-
-static unsigned long t_src_index(struct r300_vertex_program *vp,
-                                struct prog_src_register *src)
-{
-       if (src->File == PROGRAM_INPUT) {
-               assert(vp->inputs[src->Index] != -1);
-               return vp->inputs[src->Index];
-       } else {
-               if (src->Index < 0) {
-                       fprintf(stderr,
-                               "negative offsets for indirect addressing do not work.\n");
-                       return 0;
-               }
-               return src->Index;
-       }
-}
-
-/* these two functions should probably be merged... */
-
-static unsigned long t_src(struct r300_vertex_program *vp,
-                          struct prog_src_register *src)
-{
-       /* src->Negate uses the NEGATE_ flags from program_instruction.h,
-        * which equal our VSF_FLAGS_ values, so it's safe to just pass it here.
-        */
-       return PVS_SRC_OPERAND(t_src_index(vp, src),
-                              t_swizzle(GET_SWZ(src->Swizzle, 0)),
-                              t_swizzle(GET_SWZ(src->Swizzle, 1)),
-                              t_swizzle(GET_SWZ(src->Swizzle, 2)),
-                              t_swizzle(GET_SWZ(src->Swizzle, 3)),
-                              t_src_class(src->File),
-                              src->Negate) | (src->RelAddr << 4);
-}
+#define ADD_OUTPUT(fp_attr, vp_result) \
+       do { \
+               if (fpreads & (1 << (fp_attr))) \
+                       outputs |= (1 << (vp_result)); \
+       } while (0)
 
-static unsigned long t_src_scalar(struct r300_vertex_program *vp,
-                                 struct prog_src_register *src)
-{
-       /* src->Negate uses the NEGATE_ flags from program_instruction.h,
-        * which equal our VSF_FLAGS_ values, so it's safe to just pass it here.
-        */
-       return PVS_SRC_OPERAND(t_src_index(vp, src),
-                              t_swizzle(GET_SWZ(src->Swizzle, 0)),
-                              t_swizzle(GET_SWZ(src->Swizzle, 0)),
-                              t_swizzle(GET_SWZ(src->Swizzle, 0)),
-                              t_swizzle(GET_SWZ(src->Swizzle, 0)),
-                              t_src_class(src->File),
-                              src->Negate ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
-           (src->RelAddr << 4);
-}
+       ADD_OUTPUT(FRAG_ATTRIB_COL0, VERT_RESULT_COL0);
+       ADD_OUTPUT(FRAG_ATTRIB_COL1, VERT_RESULT_COL1);
 
-static GLboolean valid_dst(struct r300_vertex_program *vp,
-                          struct prog_dst_register *dst)
-{
-       if (dst->File == PROGRAM_OUTPUT && vp->outputs[dst->Index] == -1) {
-               return GL_FALSE;
-       } else if (dst->File == PROGRAM_ADDRESS) {
-               assert(dst->Index == 0);
+       for (i = 0; i <= 7; ++i) {
+               ADD_OUTPUT(FRAG_ATTRIB_TEX0 + i, VERT_RESULT_TEX0 + i);
        }
 
-       return GL_TRUE;
-}
-
-static GLuint *r300TranslateOpcodeABS(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       //MAX RESULT 1.X Y Z W PARAM 0{} {X Y Z W} PARAM 0{X Y Z W } {X Y Z W} neg Xneg Yneg Zneg W
-
-       inst[0] = PVS_OP_DST_OPERAND(VE_MAXIMUM,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]),
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 1)),
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 2)),
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 3)),
-                                 t_src_class(src[0].File),
-                                 (!src[0].
-                                  Negate) ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
-           (src[0].RelAddr << 4);
-       inst[3] = 0;
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeADD(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(VE_ADD,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = t_src(vp, &src[1]);
-       inst[3] = __CONST(1, SWIZZLE_ZERO);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeARL(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(VE_FLT2FIX_DX,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = __CONST(0, SWIZZLE_ZERO);
-       inst[3] = __CONST(0, SWIZZLE_ZERO);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeDP3(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       //DOT RESULT 1.X Y Z W PARAM 0{} {X Y Z ZERO} PARAM 0{} {X Y Z ZERO}
-
-       inst[0] = PVS_OP_DST_OPERAND(VE_DOT_PRODUCT,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]),
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 1)),
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 2)),
-                                 SWIZZLE_ZERO,
-                                 t_src_class(src[0].File),
-                                 src[0].Negate ? VSF_FLAG_XYZ : VSF_FLAG_NONE) |
-           (src[0].RelAddr << 4);
-       inst[2] =
-           PVS_SRC_OPERAND(t_src_index(vp, &src[1]),
-                           t_swizzle(GET_SWZ(src[1].Swizzle, 0)),
-                           t_swizzle(GET_SWZ(src[1].Swizzle, 1)),
-                           t_swizzle(GET_SWZ(src[1].Swizzle, 2)), SWIZZLE_ZERO,
-                           t_src_class(src[1].File),
-                           src[1].Negate ? VSF_FLAG_XYZ : VSF_FLAG_NONE) |
-           (src[1].RelAddr << 4);
-       inst[3] = __CONST(1, SWIZZLE_ZERO);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeDP4(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(VE_DOT_PRODUCT,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = t_src(vp, &src[1]);
-       inst[3] = __CONST(1, SWIZZLE_ZERO);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeDPH(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       //DOT RESULT 1.X Y Z W PARAM 0{} {X Y Z ONE} PARAM 0{} {X Y Z W}
-       inst[0] = PVS_OP_DST_OPERAND(VE_DOT_PRODUCT,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]),
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 1)),
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 2)),
-                                 PVS_SRC_SELECT_FORCE_1,
-                                 t_src_class(src[0].File),
-                                 src[0].Negate ? VSF_FLAG_XYZ : VSF_FLAG_NONE) |
-           (src[0].RelAddr << 4);
-       inst[2] = t_src(vp, &src[1]);
-       inst[3] = __CONST(1, SWIZZLE_ZERO);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeDST(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(VE_DISTANCE_VECTOR,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = t_src(vp, &src[1]);
-       inst[3] = __CONST(1, SWIZZLE_ZERO);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeEX2(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(ME_EXP_BASE2_FULL_DX,
-                                    GL_TRUE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src_scalar(vp, &src[0]);
-       inst[2] = __CONST(0, SWIZZLE_ZERO);
-       inst[3] = __CONST(0, SWIZZLE_ZERO);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeEXP(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(ME_EXP_BASE2_DX,
-                                    GL_TRUE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src_scalar(vp, &src[0]);
-       inst[2] = __CONST(0, SWIZZLE_ZERO);
-       inst[3] = __CONST(0, SWIZZLE_ZERO);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeFLR(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3],
-                                     int *u_temp_i)
-{
-       /* FRC TMP 0.X Y Z W PARAM 0{} {X Y Z W}
-          ADD RESULT 1.X Y Z W PARAM 0{} {X Y Z W} TMP 0{X Y Z W } {X Y Z W} neg Xneg Yneg Zneg W */
-
-       inst[0] = PVS_OP_DST_OPERAND(VE_FRACTION,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    *u_temp_i,
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    PVS_DST_REG_TEMPORARY);
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = __CONST(0, SWIZZLE_ZERO);
-       inst[3] = __CONST(0, SWIZZLE_ZERO);
-       inst += 4;
-
-       inst[0] = PVS_OP_DST_OPERAND(VE_ADD,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = PVS_SRC_OPERAND(*u_temp_i,
-                                 PVS_SRC_SELECT_X,
-                                 PVS_SRC_SELECT_Y,
-                                 PVS_SRC_SELECT_Z,
-                                 PVS_SRC_SELECT_W, PVS_SRC_REG_TEMPORARY,
-                                 /* Not 100% sure about this */
-                                 (!src[0].
-                                  Negate) ? VSF_FLAG_ALL : VSF_FLAG_NONE
-                                 /*VSF_FLAG_ALL */ );
-       inst[3] = __CONST(0, SWIZZLE_ZERO);
-       (*u_temp_i)--;
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeFRC(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(VE_FRACTION,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = __CONST(0, SWIZZLE_ZERO);
-       inst[3] = __CONST(0, SWIZZLE_ZERO);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeLG2(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       // LG2 RESULT 1.X Y Z W PARAM 0{} {X X X X}
-
-       inst[0] = PVS_OP_DST_OPERAND(ME_LOG_BASE2_FULL_DX,
-                                    GL_TRUE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]),
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
-                                 t_src_class(src[0].File),
-                                 src[0].Negate ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
-           (src[0].RelAddr << 4);
-       inst[2] = __CONST(0, SWIZZLE_ZERO);
-       inst[3] = __CONST(0, SWIZZLE_ZERO);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeLIT(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       //LIT TMP 1.Y Z TMP 1{} {X W Z Y} TMP 1{} {Y W Z X} TMP 1{} {Y X Z W}
-
-       inst[0] = PVS_OP_DST_OPERAND(ME_LIGHT_COEFF_DX,
-                                    GL_TRUE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       /* NOTE: Users swizzling might not work. */
-       inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]), t_swizzle(GET_SWZ(src[0].Swizzle, 0)),      // X
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 3)),        // W
-                                 PVS_SRC_SELECT_FORCE_0,       // Z
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 1)),        // Y
-                                 t_src_class(src[0].File),
-                                 src[0].Negate ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
-           (src[0].RelAddr << 4);
-       inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]), t_swizzle(GET_SWZ(src[0].Swizzle, 1)),      // Y
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 3)),        // W
-                                 PVS_SRC_SELECT_FORCE_0,       // Z
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),        // X
-                                 t_src_class(src[0].File),
-                                 src[0].Negate ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
-           (src[0].RelAddr << 4);
-       inst[3] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]), t_swizzle(GET_SWZ(src[0].Swizzle, 1)),      // Y
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),        // X
-                                 PVS_SRC_SELECT_FORCE_0,       // Z
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 3)),        // W
-                                 t_src_class(src[0].File),
-                                 src[0].Negate ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
-           (src[0].RelAddr << 4);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeLOG(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(ME_LOG_BASE2_DX,
-                                    GL_TRUE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src_scalar(vp, &src[0]);
-       inst[2] = __CONST(0, SWIZZLE_ZERO);
-       inst[3] = __CONST(0, SWIZZLE_ZERO);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeMAD(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(PVS_MACRO_OP_2CLK_MADD,
-                                    GL_FALSE,
-                                    GL_TRUE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = t_src(vp, &src[1]);
-       inst[3] = t_src(vp, &src[2]);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeMAX(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(VE_MAXIMUM,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = t_src(vp, &src[1]);
-       inst[3] = __CONST(1, SWIZZLE_ZERO);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeMIN(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(VE_MINIMUM,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = t_src(vp, &src[1]);
-       inst[3] = __CONST(1, SWIZZLE_ZERO);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeMOV(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       //ADD RESULT 1.X Y Z W PARAM 0{} {X Y Z W} PARAM 0{} {ZERO ZERO ZERO ZERO}
-
-       inst[0] = PVS_OP_DST_OPERAND(VE_ADD,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = __CONST(0, SWIZZLE_ZERO);
-       inst[3] = __CONST(0, SWIZZLE_ZERO);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeMUL(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(VE_MULTIPLY,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = t_src(vp, &src[1]);
-       inst[3] = __CONST(1, SWIZZLE_ZERO);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodePOW(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(ME_POWER_FUNC_FF,
-                                    GL_TRUE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src_scalar(vp, &src[0]);
-       inst[2] = __CONST(0, SWIZZLE_ZERO);
-       inst[3] = t_src_scalar(vp, &src[1]);
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeRCP(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(ME_RECIP_DX,
-                                    GL_TRUE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src_scalar(vp, &src[0]);
-       inst[2] = __CONST(0, SWIZZLE_ZERO);
-       inst[3] = __CONST(0, SWIZZLE_ZERO);
-
-       return inst;
-}
+#undef ADD_OUTPUT
 
-static GLuint *r300TranslateOpcodeRSQ(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(ME_RECIP_SQRT_DX,
-                                    GL_TRUE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src_scalar(vp, &src[0]);
-       inst[2] = __CONST(0, SWIZZLE_ZERO);
-       inst[3] = __CONST(0, SWIZZLE_ZERO);
-
-       return inst;
-}
+       if ((fpreads & (1 << FRAG_ATTRIB_COL0)) &&
+           (vp->Base.OutputsWritten & (1 << VERT_RESULT_BFC0)))
+               outputs |= 1 << VERT_RESULT_BFC0;
+       if ((fpreads & (1 << FRAG_ATTRIB_COL1)) &&
+           (vp->Base.OutputsWritten & (1 << VERT_RESULT_BFC1)))
+               outputs |= 1 << VERT_RESULT_BFC1;
 
-static GLuint *r300TranslateOpcodeSGE(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(VE_SET_GREATER_THAN_EQUAL,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = t_src(vp, &src[1]);
-       inst[3] = __CONST(1, SWIZZLE_ZERO);
-
-       return inst;
-}
+       outputs |= 1 << VERT_RESULT_HPOS;
+       if (vp->Base.OutputsWritten & (1 << VERT_RESULT_PSIZ))
+               outputs |= 1 << VERT_RESULT_PSIZ;
 
-static GLuint *r300TranslateOpcodeSLT(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       inst[0] = PVS_OP_DST_OPERAND(VE_SET_LESS_THAN,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = t_src(vp, &src[1]);
-       inst[3] = __CONST(1, SWIZZLE_ZERO);
-
-       return inst;
+       return outputs;
 }
 
-static GLuint *r300TranslateOpcodeSUB(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       //ADD RESULT 1.X Y Z W TMP 0{} {X Y Z W} PARAM 1{X Y Z W } {X Y Z W} neg Xneg Yneg Zneg W
-
-#if 0
-       inst[0] = PVS_OP_DST_OPERAND(VE_ADD,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &src[1]),
-                                 t_swizzle(GET_SWZ(src[1].Swizzle, 0)),
-                                 t_swizzle(GET_SWZ(src[1].Swizzle, 1)),
-                                 t_swizzle(GET_SWZ(src[1].Swizzle, 2)),
-                                 t_swizzle(GET_SWZ(src[1].Swizzle, 3)),
-                                 t_src_class(src[1].File),
-                                 (!src[1].
-                                  Negate) ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
-           (src[1].RelAddr << 4);
-       inst[3] = 0;
-#else
-       inst[0] =
-           PVS_OP_DST_OPERAND(VE_MULTIPLY_ADD,
-                              GL_FALSE,
-                              GL_FALSE,
-                              t_dst_index(vp, &vpi->DstReg),
-                              t_dst_mask(vpi->DstReg.WriteMask),
-                              t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = __CONST(0, SWIZZLE_ONE);
-       inst[3] = PVS_SRC_OPERAND(t_src_index(vp, &src[1]),
-                                 t_swizzle(GET_SWZ(src[1].Swizzle, 0)),
-                                 t_swizzle(GET_SWZ(src[1].Swizzle, 1)),
-                                 t_swizzle(GET_SWZ(src[1].Swizzle, 2)),
-                                 t_swizzle(GET_SWZ(src[1].Swizzle, 3)),
-                                 t_src_class(src[1].File),
-                                 (!src[1].
-                                  Negate) ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
-           (src[1].RelAddr << 4);
-#endif
-
-       return inst;
-}
-
-static GLuint *r300TranslateOpcodeSWZ(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3])
-{
-       //ADD RESULT 1.X Y Z W PARAM 0{} {X Y Z W} PARAM 0{} {ZERO ZERO ZERO ZERO}
-
-       inst[0] = PVS_OP_DST_OPERAND(VE_ADD,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = t_src(vp, &src[0]);
-       inst[2] = __CONST(0, SWIZZLE_ZERO);
-       inst[3] = __CONST(0, SWIZZLE_ZERO);
-
-       return inst;
-}
 
-static GLuint *r300TranslateOpcodeXPD(struct r300_vertex_program *vp,
-                                     struct prog_instruction *vpi,
-                                     GLuint * inst,
-                                     struct prog_src_register src[3],
-                                     int *u_temp_i)
-{
-       /* mul r0, r1.yzxw, r2.zxyw
-          mad r0, -r2.yzxw, r1.zxyw, r0
-        */
-
-       inst[0] = PVS_OP_DST_OPERAND(VE_MULTIPLY_ADD,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    *u_temp_i,
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    PVS_DST_REG_TEMPORARY);
-       inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]), t_swizzle(GET_SWZ(src[0].Swizzle, 1)),      // Y
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 2)),        // Z
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),        // X
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 3)),        // W
-                                 t_src_class(src[0].File),
-                                 src[0].Negate ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
-           (src[0].RelAddr << 4);
-       inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &src[1]), t_swizzle(GET_SWZ(src[1].Swizzle, 2)),      // Z
-                                 t_swizzle(GET_SWZ(src[1].Swizzle, 0)),        // X
-                                 t_swizzle(GET_SWZ(src[1].Swizzle, 1)),        // Y
-                                 t_swizzle(GET_SWZ(src[1].Swizzle, 3)),        // W
-                                 t_src_class(src[1].File),
-                                 src[1].Negate ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
-           (src[1].RelAddr << 4);
-       inst[3] = __CONST(1, SWIZZLE_ZERO);
-       inst += 4;
-
-       inst[0] = PVS_OP_DST_OPERAND(VE_MULTIPLY_ADD,
-                                    GL_FALSE,
-                                    GL_FALSE,
-                                    t_dst_index(vp, &vpi->DstReg),
-                                    t_dst_mask(vpi->DstReg.WriteMask),
-                                    t_dst_class(vpi->DstReg.File));
-       inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[1]), t_swizzle(GET_SWZ(src[1].Swizzle, 1)),      // Y
-                                 t_swizzle(GET_SWZ(src[1].Swizzle, 2)),        // Z
-                                 t_swizzle(GET_SWZ(src[1].Swizzle, 0)),        // X
-                                 t_swizzle(GET_SWZ(src[1].Swizzle, 3)),        // W
-                                 t_src_class(src[1].File),
-                                 (!src[1].
-                                  Negate) ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
-           (src[1].RelAddr << 4);
-       inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]), t_swizzle(GET_SWZ(src[0].Swizzle, 2)),      // Z
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),        // X
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 1)),        // Y
-                                 t_swizzle(GET_SWZ(src[0].Swizzle, 3)),        // W
-                                 t_src_class(src[0].File),
-                                 src[0].Negate ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
-           (src[0].RelAddr << 4);
-       inst[3] =
-           PVS_SRC_OPERAND(*u_temp_i, PVS_SRC_SELECT_X, PVS_SRC_SELECT_Y,
-                           PVS_SRC_SELECT_Z, PVS_SRC_SELECT_W,
-                           PVS_SRC_REG_TEMPORARY, VSF_FLAG_NONE);
-
-       (*u_temp_i)--;
-
-       return inst;
-}
-
-static void t_inputs_outputs(struct r300_vertex_program *vp)
+static void t_inputs_outputs(struct r300_vertex_program_compiler * c)
 {
        int i;
        int cur_reg;
        GLuint OutputsWritten, InputsRead;
 
-       OutputsWritten = vp->Base->Base.OutputsWritten;
-       InputsRead = vp->Base->Base.InputsRead;
+       OutputsWritten = c->Base.Program.OutputsWritten;
+       InputsRead = c->Base.Program.InputsRead;
 
        cur_reg = -1;
        for (i = 0; i < VERT_ATTRIB_MAX; i++) {
                if (InputsRead & (1 << i))
-                       vp->inputs[i] = ++cur_reg;
+                       c->code->inputs[i] = ++cur_reg;
                else
-                       vp->inputs[i] = -1;
+                       c->code->inputs[i] = -1;
        }
 
        cur_reg = 0;
        for (i = 0; i < VERT_RESULT_MAX; i++)
-               vp->outputs[i] = -1;
+               c->code->outputs[i] = -1;
 
        assert(OutputsWritten & (1 << VERT_RESULT_HPOS));
 
        if (OutputsWritten & (1 << VERT_RESULT_HPOS)) {
-               vp->outputs[VERT_RESULT_HPOS] = cur_reg++;
+               c->code->outputs[VERT_RESULT_HPOS] = cur_reg++;
        }
 
        if (OutputsWritten & (1 << VERT_RESULT_PSIZ)) {
-               vp->outputs[VERT_RESULT_PSIZ] = cur_reg++;
+               c->code->outputs[VERT_RESULT_PSIZ] = cur_reg++;
        }
 
        /* If we're writing back facing colors we need to send
@@ -970,668 +167,99 @@ static void t_inputs_outputs(struct r300_vertex_program *vp)
         * get written into appropriate output vectors.
         */
        if (OutputsWritten & (1 << VERT_RESULT_COL0)) {
-               vp->outputs[VERT_RESULT_COL0] = cur_reg++;
+               c->code->outputs[VERT_RESULT_COL0] = cur_reg++;
        } else if (OutputsWritten & (1 << VERT_RESULT_BFC0) ||
                OutputsWritten & (1 << VERT_RESULT_BFC1)) {
                cur_reg++;
        }
 
        if (OutputsWritten & (1 << VERT_RESULT_COL1)) {
-               vp->outputs[VERT_RESULT_COL1] = cur_reg++;
+               c->code->outputs[VERT_RESULT_COL1] = cur_reg++;
        } else if (OutputsWritten & (1 << VERT_RESULT_BFC0) ||
                OutputsWritten & (1 << VERT_RESULT_BFC1)) {
                cur_reg++;
        }
 
        if (OutputsWritten & (1 << VERT_RESULT_BFC0)) {
-               vp->outputs[VERT_RESULT_BFC0] = cur_reg++;
+               c->code->outputs[VERT_RESULT_BFC0] = cur_reg++;
        } else if (OutputsWritten & (1 << VERT_RESULT_BFC1)) {
                cur_reg++;
        }
 
        if (OutputsWritten & (1 << VERT_RESULT_BFC1)) {
-               vp->outputs[VERT_RESULT_BFC1] = cur_reg++;
+               c->code->outputs[VERT_RESULT_BFC1] = cur_reg++;
        } else if (OutputsWritten & (1 << VERT_RESULT_BFC0)) {
                cur_reg++;
        }
 
        for (i = VERT_RESULT_TEX0; i <= VERT_RESULT_TEX7; i++) {
                if (OutputsWritten & (1 << i)) {
-                       vp->outputs[i] = cur_reg++;
+                       c->code->outputs[i] = cur_reg++;
                }
        }
 
        if (OutputsWritten & (1 << VERT_RESULT_FOGC)) {
-               vp->outputs[VERT_RESULT_FOGC] = cur_reg++;
+               c->code->outputs[VERT_RESULT_FOGC] = cur_reg++;
        }
 }
 
-void r300TranslateVertexShader(struct r300_vertex_program *vp)
-{
-       struct prog_instruction *vpi = vp->Base->Base.Instructions;
-       int i;
-       GLuint *inst;
-       unsigned long num_operands;
-       /* Initial value should be last tmp reg that hw supports.
-          Strangely enough r300 doesnt mind even though these would be out of range.
-          Smart enough to realize that it doesnt need it? */
-       int u_temp_i = VSF_MAX_FRAGMENT_TEMPS - 1;
-       struct prog_src_register src[3];
-
-       vp->pos_end = 0;        /* Not supported yet */
-       vp->hw_code.length = 0;
-       vp->translated = GL_TRUE;
-       vp->error = GL_FALSE;
-
-       t_inputs_outputs(vp);
-
-       for (inst = vp->hw_code.body.d; vpi->Opcode != OPCODE_END;
-            vpi++, inst += 4) {
-
-               FREE_TEMPS();
-
-               if (!valid_dst(vp, &vpi->DstReg)) {
-                       /* redirect result to unused temp */
-                       vpi->DstReg.File = PROGRAM_TEMPORARY;
-                       vpi->DstReg.Index = u_temp_i;
-               }
-
-               num_operands = _mesa_num_inst_src_regs(vpi->Opcode);
-
-               /* copy the sources (src) from mesa into a local variable... is this needed? */
-               for (i = 0; i < num_operands; i++) {
-                       src[i] = vpi->SrcReg[i];
-               }
-
-               if (num_operands == 3) {        /* TODO: scalars */
-                       if (CMP_SRCS(src[1], src[2])
-                           || CMP_SRCS(src[0], src[2])) {
-                               inst[0] = PVS_OP_DST_OPERAND(VE_ADD,
-                                                            GL_FALSE,
-                                                            GL_FALSE,
-                                                            u_temp_i,
-                                                            VSF_FLAG_ALL,
-                                                            PVS_DST_REG_TEMPORARY);
-                               inst[1] =
-                                   PVS_SRC_OPERAND(t_src_index(vp, &src[2]),
-                                                   SWIZZLE_X,
-                                                   SWIZZLE_Y,
-                                                   SWIZZLE_Z,
-                                                   SWIZZLE_W,
-                                                   t_src_class(src[2].File),
-                                                   VSF_FLAG_NONE) | (src[2].
-                                                                     RelAddr <<
-                                                                     4);
-                               inst[2] = __CONST(2, SWIZZLE_ZERO);
-                               inst[3] = __CONST(2, SWIZZLE_ZERO);
-                               inst += 4;
-
-                               src[2].File = PROGRAM_TEMPORARY;
-                               src[2].Index = u_temp_i;
-                               src[2].RelAddr = 0;
-                               u_temp_i--;
-                       }
-               }
-
-               if (num_operands >= 2) {
-                       if (CMP_SRCS(src[1], src[0])) {
-                               inst[0] = PVS_OP_DST_OPERAND(VE_ADD,
-                                                            GL_FALSE,
-                                                            GL_FALSE,
-                                                            u_temp_i,
-                                                            VSF_FLAG_ALL,
-                                                            PVS_DST_REG_TEMPORARY);
-                               inst[1] =
-                                   PVS_SRC_OPERAND(t_src_index(vp, &src[0]),
-                                                   SWIZZLE_X,
-                                                   SWIZZLE_Y,
-                                                   SWIZZLE_Z,
-                                                   SWIZZLE_W,
-                                                   t_src_class(src[0].File),
-                                                   VSF_FLAG_NONE) | (src[0].
-                                                                     RelAddr <<
-                                                                     4);
-                               inst[2] = __CONST(0, SWIZZLE_ZERO);
-                               inst[3] = __CONST(0, SWIZZLE_ZERO);
-                               inst += 4;
-
-                               src[0].File = PROGRAM_TEMPORARY;
-                               src[0].Index = u_temp_i;
-                               src[0].RelAddr = 0;
-                               u_temp_i--;
-                       }
-               }
-
-               switch (vpi->Opcode) {
-               case OPCODE_ABS:
-                       inst = r300TranslateOpcodeABS(vp, vpi, inst, src);
-                       break;
-               case OPCODE_ADD:
-                       inst = r300TranslateOpcodeADD(vp, vpi, inst, src);
-                       break;
-               case OPCODE_ARL:
-                       inst = r300TranslateOpcodeARL(vp, vpi, inst, src);
-                       break;
-               case OPCODE_DP3:
-                       inst = r300TranslateOpcodeDP3(vp, vpi, inst, src);
-                       break;
-               case OPCODE_DP4:
-                       inst = r300TranslateOpcodeDP4(vp, vpi, inst, src);
-                       break;
-               case OPCODE_DPH:
-                       inst = r300TranslateOpcodeDPH(vp, vpi, inst, src);
-                       break;
-               case OPCODE_DST:
-                       inst = r300TranslateOpcodeDST(vp, vpi, inst, src);
-                       break;
-               case OPCODE_EX2:
-                       inst = r300TranslateOpcodeEX2(vp, vpi, inst, src);
-                       break;
-               case OPCODE_EXP:
-                       inst = r300TranslateOpcodeEXP(vp, vpi, inst, src);
-                       break;
-               case OPCODE_FLR:
-                       inst = r300TranslateOpcodeFLR(vp, vpi, inst, src,       /* FIXME */
-                                                     &u_temp_i);
-                       break;
-               case OPCODE_FRC:
-                       inst = r300TranslateOpcodeFRC(vp, vpi, inst, src);
-                       break;
-               case OPCODE_LG2:
-                       inst = r300TranslateOpcodeLG2(vp, vpi, inst, src);
-                       break;
-               case OPCODE_LIT:
-                       inst = r300TranslateOpcodeLIT(vp, vpi, inst, src);
-                       break;
-               case OPCODE_LOG:
-                       inst = r300TranslateOpcodeLOG(vp, vpi, inst, src);
-                       break;
-               case OPCODE_MAD:
-                       inst = r300TranslateOpcodeMAD(vp, vpi, inst, src);
-                       break;
-               case OPCODE_MAX:
-                       inst = r300TranslateOpcodeMAX(vp, vpi, inst, src);
-                       break;
-               case OPCODE_MIN:
-                       inst = r300TranslateOpcodeMIN(vp, vpi, inst, src);
-                       break;
-               case OPCODE_MOV:
-                       inst = r300TranslateOpcodeMOV(vp, vpi, inst, src);
-                       break;
-               case OPCODE_MUL:
-                       inst = r300TranslateOpcodeMUL(vp, vpi, inst, src);
-                       break;
-               case OPCODE_POW:
-                       inst = r300TranslateOpcodePOW(vp, vpi, inst, src);
-                       break;
-               case OPCODE_RCP:
-                       inst = r300TranslateOpcodeRCP(vp, vpi, inst, src);
-                       break;
-               case OPCODE_RSQ:
-                       inst = r300TranslateOpcodeRSQ(vp, vpi, inst, src);
-                       break;
-               case OPCODE_SGE:
-                       inst = r300TranslateOpcodeSGE(vp, vpi, inst, src);
-                       break;
-               case OPCODE_SLT:
-                       inst = r300TranslateOpcodeSLT(vp, vpi, inst, src);
-                       break;
-               case OPCODE_SUB:
-                       inst = r300TranslateOpcodeSUB(vp, vpi, inst, src);
-                       break;
-               case OPCODE_SWZ:
-                       inst = r300TranslateOpcodeSWZ(vp, vpi, inst, src);
-                       break;
-               case OPCODE_XPD:
-                       inst = r300TranslateOpcodeXPD(vp, vpi, inst, src,       /* FIXME */
-                                                     &u_temp_i);
-                       break;
-               default:
-                       vp->error = GL_TRUE;
-                       break;
-               }
-       }
-
-       vp->hw_code.length = (inst - vp->hw_code.body.d);
-       if (vp->hw_code.length >= VSF_MAX_FRAGMENT_LENGTH) {
-               vp->error = GL_TRUE;
-       }
-}
-
-static void insert_wpos(struct gl_program *prog, GLuint temp_index, int tex_id)
-{
-       struct prog_instruction *vpi;
-
-       _mesa_insert_instructions(prog, prog->NumInstructions - 1, 2);
-
-       vpi = &prog->Instructions[prog->NumInstructions - 3];
-
-       vpi->Opcode = OPCODE_MOV;
-
-       vpi->DstReg.File = PROGRAM_OUTPUT;
-       vpi->DstReg.Index = VERT_RESULT_HPOS;
-       vpi->DstReg.WriteMask = WRITEMASK_XYZW;
-       vpi->DstReg.CondMask = COND_TR;
-
-       vpi->SrcReg[0].File = PROGRAM_TEMPORARY;
-       vpi->SrcReg[0].Index = temp_index;
-       vpi->SrcReg[0].Swizzle = SWIZZLE_XYZW;
-
-       ++vpi;
-
-       vpi->Opcode = OPCODE_MOV;
-
-       vpi->DstReg.File = PROGRAM_OUTPUT;
-       vpi->DstReg.Index = VERT_RESULT_TEX0 + tex_id;
-       vpi->DstReg.WriteMask = WRITEMASK_XYZW;
-       vpi->DstReg.CondMask = COND_TR;
-
-       vpi->SrcReg[0].File = PROGRAM_TEMPORARY;
-       vpi->SrcReg[0].Index = temp_index;
-       vpi->SrcReg[0].Swizzle = SWIZZLE_XYZW;
-
-       ++vpi;
-
-       vpi->Opcode = OPCODE_END;
-}
-
-static void pos_as_texcoord(struct gl_program *prog, int tex_id)
-{
-       struct prog_instruction *vpi;
-       GLuint tempregi = prog->NumTemporaries;
-
-       prog->NumTemporaries++;
-
-       for (vpi = prog->Instructions; vpi->Opcode != OPCODE_END; vpi++) {
-               if (vpi->DstReg.File == PROGRAM_OUTPUT && vpi->DstReg.Index == VERT_RESULT_HPOS) {
-                       vpi->DstReg.File = PROGRAM_TEMPORARY;
-                       vpi->DstReg.Index = tempregi;
-               }
-       }
-
-       insert_wpos(prog, tempregi, tex_id);
-
-       prog->OutputsWritten |= 1 << (VERT_RESULT_TEX0 + tex_id);
-}
-
-/**
- * The fogcoord attribute is special in that only the first component
- * is relevant, and the remaining components are always fixed (when read
- * from by the fragment program) to yield an X001 pattern.
- *
- * We need to enforce this either in the vertex program or in the fragment
- * program, and this code chooses not to enforce it in the vertex program.
- * This is slightly cheaper, as long as the fragment program does not use
- * weird swizzles.
- *
- * And it seems that usually, weird swizzles are not used, so...
- *
- * See also the counterpart rewriting for fragment programs.
- */
-static void fog_as_texcoord(struct gl_program *prog, int tex_id)
-{
-       struct prog_instruction *vpi;
-
-       vpi = prog->Instructions;
-       while (vpi->Opcode != OPCODE_END) {
-               if (vpi->DstReg.File == PROGRAM_OUTPUT && vpi->DstReg.Index == VERT_RESULT_FOGC) {
-                       vpi->DstReg.Index = VERT_RESULT_TEX0 + tex_id;
-                       vpi->DstReg.WriteMask = WRITEMASK_X;
-               }
-
-               ++vpi;
-       }
-
-       prog->OutputsWritten &= ~(1 << VERT_RESULT_FOGC);
-       prog->OutputsWritten |= 1 << (VERT_RESULT_TEX0 + tex_id);
-}
-
-static int translateABS(struct gl_program *prog, int pos)
-{
-       struct prog_instruction *inst;
-
-       inst = &prog->Instructions[pos];
-
-       inst->Opcode = OPCODE_MAX;
-       inst->SrcReg[1] = inst->SrcReg[0];
-       inst->SrcReg[1].Negate ^= NEGATE_XYZW;
-
-       return 0;
-}
-
-static int translateDP3(struct gl_program *prog, int pos)
-{
-       struct prog_instruction *inst;
-
-       inst = &prog->Instructions[pos];
-
-       inst->Opcode = OPCODE_DP4;
-       inst->SrcReg[0].Swizzle = combine_swizzles4(inst->SrcReg[0].Swizzle, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO);
-
-       return 0;
-}
-
-static int translateDPH(struct gl_program *prog, int pos)
-{
-       struct prog_instruction *inst;
-
-       inst = &prog->Instructions[pos];
-
-       inst->Opcode = OPCODE_DP4;
-       inst->SrcReg[0].Swizzle = combine_swizzles4(inst->SrcReg[0].Swizzle, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ONE);
-
-       return 0;
-}
-
-static int translateFLR(struct gl_program *prog, int pos)
-{
-       struct prog_instruction *inst;
-       struct prog_dst_register dst;
-       int tmp_idx;
-
-       tmp_idx = prog->NumTemporaries++;
-
-       _mesa_insert_instructions(prog, pos + 1, 1);
-
-       inst = &prog->Instructions[pos];
-       dst = inst->DstReg;
-
-       inst->Opcode = OPCODE_FRC;
-       inst->DstReg.File = PROGRAM_TEMPORARY;
-       inst->DstReg.Index = tmp_idx;
-       ++inst;
-
-       inst->Opcode = OPCODE_ADD;
-       inst->DstReg = dst;
-       inst->SrcReg[0] = (inst-1)->SrcReg[0];
-       inst->SrcReg[1].File = PROGRAM_TEMPORARY;
-       inst->SrcReg[1].Index = tmp_idx;
-       inst->SrcReg[1].Negate = NEGATE_XYZW;
-
-       return 1;
-}
-
-static int translateSUB(struct gl_program *prog, int pos)
-{
-       struct prog_instruction *inst;
-
-       inst = &prog->Instructions[pos];
-
-       inst->Opcode = OPCODE_ADD;
-       inst->SrcReg[1].Negate ^= NEGATE_XYZW;
-
-       return 0;
-}
-
-static int translateSWZ(struct gl_program *prog, int pos)
-{
-       prog->Instructions[pos].Opcode = OPCODE_MOV;
-
-       return 0;
-}
-
-static int translateXPD(struct gl_program *prog, int pos)
-{
-       struct prog_instruction *inst;
-       int tmp_idx;
-
-       tmp_idx = prog->NumTemporaries++;
-
-       _mesa_insert_instructions(prog, pos + 1, 1);
-
-       inst = &prog->Instructions[pos];
-
-       *(inst+1) = *inst;
-
-       inst->Opcode = OPCODE_MUL;
-       inst->DstReg.File = PROGRAM_TEMPORARY;
-       inst->DstReg.Index = tmp_idx;
-       inst->SrcReg[0].Swizzle = combine_swizzles4(inst->SrcReg[0].Swizzle, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_W);
-       inst->SrcReg[1].Swizzle = combine_swizzles4(inst->SrcReg[1].Swizzle, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_W);
-       ++inst;
-
-       inst->Opcode = OPCODE_MAD;
-       inst->SrcReg[0].Swizzle = combine_swizzles4(inst->SrcReg[0].Swizzle, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_W);
-       inst->SrcReg[1].Swizzle = combine_swizzles4(inst->SrcReg[1].Swizzle, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_W);
-       inst->SrcReg[1].Negate ^= NEGATE_XYZW;
-       inst->SrcReg[2].File = PROGRAM_TEMPORARY;
-       inst->SrcReg[2].Index = tmp_idx;
-
-       return 1;
-}
-
-static void translateInsts(struct gl_program *prog)
-{
-       struct prog_instruction *inst;
-       int i;
-
-       for (i = 0; i < prog->NumInstructions; ++i) {
-               inst = &prog->Instructions[i];
-
-               switch (inst->Opcode) {
-                       case OPCODE_ABS:
-                               i += translateABS(prog, i);
-                               break;
-                       case OPCODE_DP3:
-                               i += translateDP3(prog, i);
-                               break;
-                       case OPCODE_DPH:
-                               i += translateDPH(prog, i);
-                               break;
-                       case OPCODE_FLR:
-                               i += translateFLR(prog, i);
-                               break;
-                       case OPCODE_SUB:
-                               i += translateSUB(prog, i);
-                               break;
-                       case OPCODE_SWZ:
-                               i += translateSWZ(prog, i);
-                               break;
-                       case OPCODE_XPD:
-                               i += translateXPD(prog, i);
-                               break;
-                       default:
-                               break;
-               }
-       }
-}
-
-#define ADD_OUTPUT(fp_attr, vp_result) \
-       do { \
-               if ((FpReads & (1 << (fp_attr))) && !(prog->OutputsWritten & (1 << (vp_result)))) { \
-                       OutputsAdded |= 1 << (vp_result); \
-                       count++; \
-               } \
-       } while (0)
-
-static void addArtificialOutputs(GLcontext *ctx, struct gl_program *prog)
-{
-       r300ContextPtr r300 = R300_CONTEXT(ctx);
-       GLuint OutputsAdded, FpReads;
-       int i, count;
-
-       OutputsAdded = 0;
-       count = 0;
-       FpReads = r300->selected_fp->Base->InputsRead;
-
-       ADD_OUTPUT(FRAG_ATTRIB_COL0, VERT_RESULT_COL0);
-       ADD_OUTPUT(FRAG_ATTRIB_COL1, VERT_RESULT_COL1);
-
-       for (i = 0; i < 7; ++i) {
-               ADD_OUTPUT(FRAG_ATTRIB_TEX0 + i, VERT_RESULT_TEX0 + i);
-       }
-
-       /* Some outputs may be artificially added, to match the inputs of the fragment program.
-        * Issue 16 of vertex program spec says that all vertex attributes that are unwritten by
-        * vertex program are undefined, so just use MOV [vertex_result], CONST[0]
-        */
-       if (count > 0) {
-               struct prog_instruction *inst;
-
-               _mesa_insert_instructions(prog, prog->NumInstructions - 1, count);
-               inst = &prog->Instructions[prog->NumInstructions - 1 - count];
-
-               for (i = 0; i < VERT_RESULT_MAX; ++i) {
-                       if (OutputsAdded & (1 << i)) {
-                               inst->Opcode = OPCODE_MOV;
-
-                               inst->DstReg.File = PROGRAM_OUTPUT;
-                               inst->DstReg.Index = i;
-                               inst->DstReg.WriteMask = WRITEMASK_XYZW;
-                               inst->DstReg.CondMask = COND_TR;
-
-                               inst->SrcReg[0].File = PROGRAM_CONSTANT;
-                               inst->SrcReg[0].Index = 0;
-                               inst->SrcReg[0].Swizzle = SWIZZLE_XYZW;
-
-                               ++inst;
-                       }
-               }
-
-               prog->OutputsWritten |= OutputsAdded;
-       }
-}
-
-#undef ADD_OUTPUT
-
-static void nqssadceInit(struct nqssadce_state* s)
-{
-       r300ContextPtr r300 = R300_CONTEXT(s->Ctx);
-       GLuint fp_reads;
-
-       fp_reads = r300->selected_fp->Base->InputsRead;
-       {
-               if (fp_reads & FRAG_BIT_COL0) {
-                               s->Outputs[VERT_RESULT_COL0].Sourced = WRITEMASK_XYZW;
-                               s->Outputs[VERT_RESULT_BFC0].Sourced = WRITEMASK_XYZW;
-               }
-
-               if (fp_reads & FRAG_BIT_COL1) {
-                               s->Outputs[VERT_RESULT_COL1].Sourced = WRITEMASK_XYZW;
-                               s->Outputs[VERT_RESULT_BFC1].Sourced = WRITEMASK_XYZW;
-               }
-       }
-
-       {
-               int i;
-               for (i = 0; i < 8; ++i) {
-                       if (fp_reads & FRAG_BIT_TEX(i)) {
-                               s->Outputs[VERT_RESULT_TEX0 + i].Sourced = WRITEMASK_XYZW;
-                       }
-               }
-       }
-
-       s->Outputs[VERT_RESULT_HPOS].Sourced = WRITEMASK_XYZW;
-       if (s->Program->OutputsWritten & (1 << VERT_RESULT_PSIZ))
-               s->Outputs[VERT_RESULT_PSIZ].Sourced = WRITEMASK_X;
-}
-
-static GLboolean swizzleIsNative(GLuint opcode, struct prog_src_register reg)
-{
-       (void) opcode;
-       (void) reg;
-
-       return GL_TRUE;
-}
 
 static struct r300_vertex_program *build_program(GLcontext *ctx,
                                                 struct r300_vertex_program_key *wanted_key,
                                                 const struct gl_vertex_program *mesa_vp)
 {
-       r300ContextPtr r300 = R300_CONTEXT(ctx);
        struct r300_vertex_program *vp;
-       struct gl_program *prog;
+       struct r300_vertex_program_compiler compiler;
 
        vp = _mesa_calloc(sizeof(*vp));
        vp->Base = (struct gl_vertex_program *) _mesa_clone_program(ctx, &mesa_vp->Base);
        _mesa_memcpy(&vp->key, wanted_key, sizeof(vp->key));
 
-       prog = &vp->Base->Base;
+       rc_init(&compiler.Base);
+       compiler.Base.Debug = (RADEON_DEBUG & DEBUG_VERTS) ? GL_TRUE : GL_FALSE;
+
+       compiler.code = &vp->code;
+       compiler.RequiredOutputs = compute_required_outputs(vp->Base, vp->key.FpReads);
+       compiler.SetHwInputOutput = &t_inputs_outputs;
 
-       if (RADEON_DEBUG & DEBUG_VERTS) {
+       if (compiler.Base.Debug) {
                fprintf(stderr, "Initial vertex program:\n");
-               _mesa_print_program(prog);
+               _mesa_print_program(&vp->Base->Base);
                fflush(stdout);
        }
 
-       if (vp->Base->IsPositionInvariant) {
+       if (mesa_vp->IsPositionInvariant) {
                _mesa_insert_mvp_code(ctx, vp->Base);
        }
 
-       if (r300->selected_fp->wpos_attr != FRAG_ATTRIB_MAX) {
-               pos_as_texcoord(&vp->Base->Base, r300->selected_fp->wpos_attr - FRAG_ATTRIB_TEX0);
-       }
-
-       if (r300->selected_fp->fog_attr != FRAG_ATTRIB_MAX) {
-               fog_as_texcoord(&vp->Base->Base, r300->selected_fp->fog_attr - FRAG_ATTRIB_TEX0);
-       }
+       rc_mesa_to_rc_program(&compiler.Base, &vp->Base->Base);
 
-       addArtificialOutputs(ctx, prog);
+       rc_move_output(&compiler.Base, VERT_RESULT_PSIZ, VERT_RESULT_PSIZ, WRITEMASK_X);
 
-       translateInsts(prog);
-
-       if (RADEON_DEBUG & DEBUG_VERTS) {
-               fprintf(stderr, "Vertex program after native rewrite:\n");
-               _mesa_print_program(prog);
-               fflush(stdout);
+       if (vp->key.WPosAttr != FRAG_ATTRIB_MAX) {
+               rc_copy_output(&compiler.Base,
+                       VERT_RESULT_HPOS,
+                       vp->key.WPosAttr - FRAG_ATTRIB_TEX0 + VERT_RESULT_TEX0);
        }
 
-       {
-               struct radeon_nqssadce_descr nqssadce = {
-                       .Init = &nqssadceInit,
-                       .IsNativeSwizzle = &swizzleIsNative,
-                       .BuildSwizzle = NULL
-               };
-               radeonNqssaDce(ctx, prog, &nqssadce);
-
-               /* We need this step for reusing temporary registers */
-               _mesa_optimize_program(ctx, prog);
-
-               if (RADEON_DEBUG & DEBUG_VERTS) {
-                       fprintf(stderr, "Vertex program after NQSSADCE:\n");
-                       _mesa_print_program(prog);
-                       fflush(stdout);
-               }
+       if (vp->key.FogAttr != FRAG_ATTRIB_MAX) {
+               rc_move_output(&compiler.Base,
+                       VERT_RESULT_FOGC,
+                       vp->key.FogAttr - FRAG_ATTRIB_TEX0 + VERT_RESULT_TEX0, WRITEMASK_X);
        }
 
-       assert(prog->NumInstructions);
-       {
-               struct prog_instruction *inst;
-               int max, i, tmp;
-
-               inst = prog->Instructions;
-               max = -1;
-               while (inst->Opcode != OPCODE_END) {
-                       tmp = _mesa_num_inst_src_regs(inst->Opcode);
-                       for (i = 0; i < tmp; ++i) {
-                               if (inst->SrcReg[i].File == PROGRAM_TEMPORARY) {
-                                       if ((int) inst->SrcReg[i].Index > max) {
-                                               max = inst->SrcReg[i].Index;
-                                       }
-                               }
-                       }
+       r3xx_compile_vertex_program(&compiler);
+       vp->error = compiler.Base.Error;
 
-                       if (_mesa_num_inst_dst_regs(inst->Opcode)) {
-                               if (inst->DstReg.File == PROGRAM_TEMPORARY) {
-                                       if ((int) inst->DstReg.Index > max) {
-                                               max = inst->DstReg.Index;
-                                       }
-                               }
-                       }
-                       ++inst;
-               }
+       vp->Base->Base.InputsRead = vp->code.InputsRead;
+       vp->Base->Base.OutputsWritten = vp->code.OutputsWritten;
 
-               /* We actually want highest index of used temporary register,
-                * not the number of temporaries used.
-                * These values aren't always the same.
-                */
-               vp->num_temporaries = max + 1;
-       }
+       rc_destroy(&compiler.Base);
 
        return vp;
 }
 
-struct r300_vertex_program * r300SelectVertexShader(GLcontext *ctx)
+struct r300_vertex_program * r300SelectAndTranslateVertexShader(GLcontext *ctx)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
        struct r300_vertex_program_key wanted_key = { 0 };
@@ -1639,7 +267,7 @@ struct r300_vertex_program * r300SelectVertexShader(GLcontext *ctx)
        struct r300_vertex_program *vp;
 
        vpc = (struct r300_vertex_program_cont *)ctx->VertexProgram._Current;
-       wanted_key.FpReads = r300->selected_fp->Base->InputsRead;
+       wanted_key.FpReads = r300->selected_fp->InputsRead;
        wanted_key.FogAttr = r300->selected_fp->fog_attr;
        wanted_key.WPosAttr = r300->selected_fp->wpos_attr;
 
@@ -1664,7 +292,7 @@ struct r300_vertex_program * r300SelectVertexShader(GLcontext *ctx)
                if(_nc>_p->vpu.count)_p->vpu.count=_nc; \
        } while(0)
 
-static void r300EmitVertexProgram(r300ContextPtr r300, int dest, struct r300_vertex_shader_hw_code *code)
+static void r300EmitVertexProgram(r300ContextPtr r300, int dest, struct r300_vertex_program_code *code)
 {
        int i;
 
@@ -1708,15 +336,15 @@ void r300SetupVertexProgram(r300ContextPtr rmesa)
        ((drm_r300_cmd_header_t *) rmesa->hw.vps.cmd)->vpu.count = 0;
 
        R300_STATECHANGE(rmesa, vpp);
-       param_count = r300VertexProgUpdateParams(ctx, prog->Base, (float *)&rmesa->hw.vpp.cmd[R300_VPP_PARAM_0]);
+       param_count = r300VertexProgUpdateParams(ctx, prog, (float *)&rmesa->hw.vpp.cmd[R300_VPP_PARAM_0]);
        bump_vpu_count(rmesa->hw.vpp.cmd, param_count);
        param_count /= 4;
 
-       r300EmitVertexProgram(rmesa, R300_PVS_CODE_START, &(prog->hw_code));
-       inst_count = (prog->hw_code.length / 4) - 1;
+       r300EmitVertexProgram(rmesa, R300_PVS_CODE_START, &(prog->code));
+       inst_count = (prog->code.length / 4) - 1;
 
-       r300VapCntl(rmesa, _mesa_bitcount(prog->Base->Base.InputsRead),
-                                _mesa_bitcount(prog->Base->Base.OutputsWritten), prog->num_temporaries);
+       r300VapCntl(rmesa, _mesa_bitcount(prog->code.InputsRead),
+                                _mesa_bitcount(prog->code.OutputsWritten), prog->code.num_temporaries);
 
        R300_STATECHANGE(rmesa, pvs);
        rmesa->hw.pvs.cmd[R300_PVS_CNTL_1] = (0 << R300_PVS_FIRST_INST_SHIFT) | (inst_count << R300_PVS_XYZW_VALID_INST_SHIFT) |
index 2dab11c..ccec896 100644 (file)
@@ -3,39 +3,9 @@
 
 #include "r300_reg.h"
 
-#define PVS_OP_DST_OPERAND(opcode, math_inst, macro_inst, reg_index, reg_writemask, reg_class) \
-        (((opcode & PVS_DST_OPCODE_MASK) << PVS_DST_OPCODE_SHIFT)      \
-        | ((math_inst & PVS_DST_MATH_INST_MASK) << PVS_DST_MATH_INST_SHIFT)    \
-        | ((macro_inst & PVS_DST_MACRO_INST_MASK) << PVS_DST_MACRO_INST_SHIFT) \
-        | ((reg_index & PVS_DST_OFFSET_MASK) << PVS_DST_OFFSET_SHIFT)  \
-        | ((reg_writemask & 0xf) << PVS_DST_WE_X_SHIFT)        /* X Y Z W */   \
-        | ((reg_class & PVS_DST_REG_TYPE_MASK) << PVS_DST_REG_TYPE_SHIFT))
-
-#define PVS_SRC_OPERAND(in_reg_index, comp_x, comp_y, comp_z, comp_w, reg_class, negate)       \
-       (((in_reg_index & PVS_SRC_OFFSET_MASK) << PVS_SRC_OFFSET_SHIFT)                         \
-        | ((comp_x & PVS_SRC_SWIZZLE_X_MASK) << PVS_SRC_SWIZZLE_X_SHIFT)                       \
-        | ((comp_y & PVS_SRC_SWIZZLE_Y_MASK) << PVS_SRC_SWIZZLE_Y_SHIFT)                       \
-        | ((comp_z & PVS_SRC_SWIZZLE_Z_MASK) << PVS_SRC_SWIZZLE_Z_SHIFT)                       \
-        | ((comp_w & PVS_SRC_SWIZZLE_W_MASK) << PVS_SRC_SWIZZLE_W_SHIFT)                       \
-        | ((negate & 0xf) << PVS_SRC_MODIFIER_X_SHIFT) /* X Y Z W */                           \
-        | ((reg_class & PVS_SRC_REG_TYPE_MASK) << PVS_SRC_REG_TYPE_SHIFT))
-
-#if 1
-
-#define VSF_FLAG_X     1
-#define VSF_FLAG_Y     2
-#define VSF_FLAG_Z     4
-#define VSF_FLAG_W     8
-#define VSF_FLAG_XYZ   (VSF_FLAG_X | VSF_FLAG_Y | VSF_FLAG_Z)
-#define VSF_FLAG_ALL  0xf
-#define VSF_FLAG_NONE  0
-
-#endif
 
 void r300SetupVertexProgram(r300ContextPtr rmesa);
 
-struct r300_vertex_program * r300SelectVertexShader(GLcontext *ctx);
-
-void r300TranslateVertexShader(struct r300_vertex_program *vp);
+struct r300_vertex_program * r300SelectAndTranslateVertexShader(GLcontext *ctx);
 
 #endif
diff --git a/src/mesa/drivers/dri/r300/radeon_bo_legacy.c b/src/mesa/drivers/dri/r300/radeon_bo_legacy.c
new file mode 120000 (symlink)
index 0000000..79ad050
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_bo_legacy.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_bo_legacy.h b/src/mesa/drivers/dri/r300/radeon_bo_legacy.h
new file mode 120000 (symlink)
index 0000000..83b0f7f
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_bo_legacy.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_bocs_wrapper.h b/src/mesa/drivers/dri/r300/radeon_bocs_wrapper.h
new file mode 120000 (symlink)
index 0000000..ca894b2
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_bocs_wrapper.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_buffer_objects.c b/src/mesa/drivers/dri/r300/radeon_buffer_objects.c
new file mode 120000 (symlink)
index 0000000..f6a5f66
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_buffer_objects.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_buffer_objects.h b/src/mesa/drivers/dri/r300/radeon_buffer_objects.h
new file mode 120000 (symlink)
index 0000000..2f134fd
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_buffer_objects.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_chipset.h b/src/mesa/drivers/dri/r300/radeon_chipset.h
new file mode 120000 (symlink)
index 0000000..eba9900
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_chipset.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_cmdbuf.h b/src/mesa/drivers/dri/r300/radeon_cmdbuf.h
new file mode 120000 (symlink)
index 0000000..a799e1d
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_cmdbuf.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_common.c b/src/mesa/drivers/dri/r300/radeon_common.c
new file mode 120000 (symlink)
index 0000000..67b19ba
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_common.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_common.h b/src/mesa/drivers/dri/r300/radeon_common.h
new file mode 120000 (symlink)
index 0000000..5bcb696
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_common.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_common_context.c b/src/mesa/drivers/dri/r300/radeon_common_context.c
new file mode 120000 (symlink)
index 0000000..86800f3
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_common_context.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_common_context.h b/src/mesa/drivers/dri/r300/radeon_common_context.h
new file mode 120000 (symlink)
index 0000000..4d66312
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_common_context.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_cs_legacy.c b/src/mesa/drivers/dri/r300/radeon_cs_legacy.c
new file mode 120000 (symlink)
index 0000000..006720f
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_cs_legacy.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_cs_legacy.h b/src/mesa/drivers/dri/r300/radeon_cs_legacy.h
new file mode 120000 (symlink)
index 0000000..a5f95e0
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_cs_legacy.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_cs_space_drm.c b/src/mesa/drivers/dri/r300/radeon_cs_space_drm.c
new file mode 120000 (symlink)
index 0000000..c248ea7
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_cs_space_drm.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_dma.c b/src/mesa/drivers/dri/r300/radeon_dma.c
new file mode 120000 (symlink)
index 0000000..43be000
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_dma.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_dma.h b/src/mesa/drivers/dri/r300/radeon_dma.h
new file mode 120000 (symlink)
index 0000000..82e5063
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_dma.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_fbo.c b/src/mesa/drivers/dri/r300/radeon_fbo.c
new file mode 120000 (symlink)
index 0000000..0d738d8
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_fbo.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_lock.c b/src/mesa/drivers/dri/r300/radeon_lock.c
new file mode 120000 (symlink)
index 0000000..af4108a
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_lock.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_lock.h b/src/mesa/drivers/dri/r300/radeon_lock.h
new file mode 120000 (symlink)
index 0000000..64bdf94
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_lock.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_mipmap_tree.c b/src/mesa/drivers/dri/r300/radeon_mipmap_tree.c
new file mode 120000 (symlink)
index 0000000..31c0cfb
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_mipmap_tree.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_mipmap_tree.h b/src/mesa/drivers/dri/r300/radeon_mipmap_tree.h
new file mode 120000 (symlink)
index 0000000..254d50c
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_mipmap_tree.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_program.c b/src/mesa/drivers/dri/r300/radeon_program.c
deleted file mode 100644 (file)
index da5e7ae..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2008 Nicolai Haehnle.
- *
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-#include "radeon_program.h"
-
-#include "shader/prog_print.h"
-
-
-/**
- * Transform the given clause in the following way:
- *  1. Replace it with an empty clause
- *  2. For every instruction in the original clause, try the given
- *     transformations in order.
- *  3. If one of the transformations returns GL_TRUE, assume that it
- *     has emitted the appropriate instruction(s) into the new clause;
- *     otherwise, copy the instruction verbatim.
- *
- * \note The transformation is currently not recursive; in other words,
- * instructions emitted by transformations are not transformed.
- *
- * \note The transform is called 'local' because it can only look at
- * one instruction at a time.
- */
-void radeonLocalTransform(
-       GLcontext *Ctx,
-       struct gl_program *program,
-       int num_transformations,
-       struct radeon_program_transformation* transformations)
-{
-       struct radeon_transform_context ctx;
-       int ip;
-
-       ctx.Ctx = Ctx;
-       ctx.Program = program;
-       ctx.OldInstructions = program->Instructions;
-       ctx.OldNumInstructions = program->NumInstructions;
-
-       program->Instructions = 0;
-       program->NumInstructions = 0;
-
-       for(ip = 0; ip < ctx.OldNumInstructions; ++ip) {
-               struct prog_instruction *instr = ctx.OldInstructions + ip;
-               int i;
-
-               for(i = 0; i < num_transformations; ++i) {
-                       struct radeon_program_transformation* t = transformations + i;
-
-                       if (t->function(&ctx, instr, t->userData))
-                               break;
-               }
-
-               if (i >= num_transformations) {
-                       struct prog_instruction* dest = radeonAppendInstructions(program, 1);
-                       _mesa_copy_instructions(dest, instr, 1);
-               }
-       }
-
-       _mesa_free_instructions(ctx.OldInstructions, ctx.OldNumInstructions);
-}
-
-
-static void scan_instructions(GLboolean* used, const struct prog_instruction* insts, GLuint count)
-{
-       GLuint i;
-       for (i = 0; i < count; i++) {
-               const struct prog_instruction *inst = insts + i;
-               const GLuint n = _mesa_num_inst_src_regs(inst->Opcode);
-               GLuint k;
-
-               for (k = 0; k < n; k++) {
-                       if (inst->SrcReg[k].File == PROGRAM_TEMPORARY)
-                               used[inst->SrcReg[k].Index] = GL_TRUE;
-               }
-       }
-}
-
-GLint radeonFindFreeTemporary(struct radeon_transform_context *t)
-{
-       GLboolean used[MAX_PROGRAM_TEMPS];
-       GLuint i;
-
-       _mesa_memset(used, 0, sizeof(used));
-       scan_instructions(used, t->Program->Instructions, t->Program->NumInstructions);
-       scan_instructions(used, t->OldInstructions, t->OldNumInstructions);
-
-       for (i = 0; i < MAX_PROGRAM_TEMPS; i++) {
-               if (!used[i])
-                       return i;
-       }
-
-       return -1;
-}
-
-
-/**
- * Append the given number of instructions to the program and return a
- * pointer to the first new instruction.
- */
-struct prog_instruction *radeonAppendInstructions(struct gl_program *program, int count)
-{
-       int oldnum = program->NumInstructions;
-       _mesa_insert_instructions(program, oldnum, count);
-       return program->Instructions + oldnum;
-}
diff --git a/src/mesa/drivers/dri/r300/radeon_screen.c b/src/mesa/drivers/dri/r300/radeon_screen.c
new file mode 120000 (symlink)
index 0000000..8616111
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_screen.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_screen.h b/src/mesa/drivers/dri/r300/radeon_screen.h
new file mode 120000 (symlink)
index 0000000..23bb6bd
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_screen.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_span.c b/src/mesa/drivers/dri/r300/radeon_span.c
new file mode 120000 (symlink)
index 0000000..232868c
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_span.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_span.h b/src/mesa/drivers/dri/r300/radeon_span.h
new file mode 120000 (symlink)
index 0000000..f9d6345
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_span.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_texture.c b/src/mesa/drivers/dri/r300/radeon_texture.c
new file mode 120000 (symlink)
index 0000000..a822710
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_texture.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_texture.h b/src/mesa/drivers/dri/r300/radeon_texture.h
new file mode 120000 (symlink)
index 0000000..17fac3d
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_texture.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/server/radeon.h b/src/mesa/drivers/dri/r300/server/radeon.h
new file mode 120000 (symlink)
index 0000000..81274a5
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/server/radeon_dri.c b/src/mesa/drivers/dri/r300/server/radeon_dri.c
new file mode 120000 (symlink)
index 0000000..d05847d
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon_dri.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/server/radeon_dri.h b/src/mesa/drivers/dri/r300/server/radeon_dri.h
new file mode 120000 (symlink)
index 0000000..27c591d
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon_dri.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/server/radeon_egl.c b/src/mesa/drivers/dri/r300/server/radeon_egl.c
new file mode 120000 (symlink)
index 0000000..d7735a7
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon_egl.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/server/radeon_macros.h b/src/mesa/drivers/dri/r300/server/radeon_macros.h
new file mode 120000 (symlink)
index 0000000..c56cd73
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon_macros.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/server/radeon_reg.h b/src/mesa/drivers/dri/r300/server/radeon_reg.h
new file mode 120000 (symlink)
index 0000000..e2349dc
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon_reg.h
\ No newline at end of file
index 2f225f7..5bdc1af 100644 (file)
@@ -68,54 +68,10 @@ DRIVER_DEFINES = -DCOMPILE_R600 -DR200_MERGED=0 \
 #      -DRADEON_BO_TRACK \
        -Wall
 
-SYMLINKS = \
-       server/radeon_dri.c \
-       server/radeon_dri.h \
-       server/radeon.h \
-       server/radeon_macros.h \
-       server/radeon_reg.h \
-       server/radeon_egl.c
-
-COMMON_SYMLINKS = \
-       radeon_chipset.h \
-       radeon_screen.c \
-       radeon_screen.h \
-       radeon_span.h \
-       radeon_span.c \
-       radeon_bo_legacy.c \
-       radeon_cs_legacy.c \
-       radeon_bo_legacy.h \
-       radeon_cs_legacy.h \
-       radeon_bocs_wrapper.h \
-       radeon_lock.c \
-       radeon_lock.h \
-       radeon_common.c \
-       radeon_common.h \
-       radeon_common_context.c \
-       radeon_common_context.h \
-       radeon_cmdbuf.h \
-       radeon_dma.c \
-       radeon_dma.h \
-       radeon_mipmap_tree.c \
-       radeon_mipmap_tree.h \
-       radeon_texture.c \
-       radeon_texture.h \
-       radeon_fbo.c \
-       $(CS_SOURCES)
-
 DRI_LIB_DEPS += $(RADEON_LDFLAGS)
 
 ##### TARGETS #####
 
 include ../Makefile.template
 
-server:
-       mkdir -p server
-
-$(SYMLINKS): server
-       @[ -e $@ ] || ln -sf ../../radeon/$@ server/
-
-$(COMMON_SYMLINKS):
-       @[ -e $@ ] || ln -sf ../radeon/$@ ./
-
-symlinks: $(SYMLINKS) $(COMMON_SYMLINKS)
+symlinks:
index 74fec02..dc2fb01 100644 (file)
@@ -78,8 +78,7 @@ int r600_cs_write_reloc(struct radeon_cs *cs,
                         struct radeon_bo *bo,
                         uint32_t read_domain,
                         uint32_t write_domain,
-                        uint32_t flags,
-                        offset_modifiers* poffset_mod)
+                        uint32_t flags)
 {
     struct r600_cs_reloc_legacy *relocs;
     int i;
@@ -135,10 +134,6 @@ int r600_cs_write_reloc(struct radeon_cs *cs,
             cs->section_ndw += 2;
             cs->section_cdw += 2;
 
-            relocs[i].offset_mod.shift     = poffset_mod->shift;
-            relocs[i].offset_mod.shiftbits = poffset_mod->shiftbits;
-            relocs[i].offset_mod.mask      = poffset_mod->mask;
-
             return 0;
         }
     }
@@ -160,9 +155,6 @@ int r600_cs_write_reloc(struct radeon_cs *cs,
     {
         return -ENOMEM;
     }
-    relocs[cs->crelocs].offset_mod.shift     = poffset_mod->shift;
-    relocs[cs->crelocs].offset_mod.shiftbits = poffset_mod->shiftbits;
-    relocs[cs->crelocs].offset_mod.mask      = poffset_mod->mask;
 
     relocs[cs->crelocs].indices[0] = cs->cdw - 1;
     relocs[cs->crelocs].reloc_indices[0] = cs->section_cdw;
@@ -255,65 +247,44 @@ static int r600_cs_process_relocs(struct radeon_cs *cs,
     csm = (struct r600_cs_manager_legacy*)cs->csm;
     relocs = (struct r600_cs_reloc_legacy *)cs->relocs;
 restart:
-    for (i = 0; i < cs->crelocs; i++) 
-    {
-        for (j = 0; j < relocs[i].cindices; j++) 
-        {
+    for (i = 0; i < cs->crelocs; i++) {
             uint32_t soffset, eoffset, asicoffset;
 
             r = radeon_bo_legacy_validate(relocs[i].base.bo,
-                                           &soffset, &eoffset);
-               if (r == -EAGAIN)
-            {
-                    goto restart;
+                                         &soffset, &eoffset);
+           if (r == -EAGAIN) {
+                   goto restart;
             }
-            if (r) 
-            {
-                fprintf(stderr, "validated %p [0x%08X, 0x%08X]\n",
-                        relocs[i].base.bo, soffset, eoffset);
-                return r;
+            if (r) {
+                   fprintf(stderr, "validated %p [0x%08X, 0x%08X]\n",
+                           relocs[i].base.bo, soffset, eoffset);
+                   return r;
             }
             asicoffset = soffset;
-            if (asicoffset >= eoffset) 
-            {
-             /*                radeon_bo_debug(relocs[i].base.bo, 12); */
-                fprintf(stderr, "validated %p [0x%08X, 0x%08X]\n",
-                        relocs[i].base.bo, soffset, eoffset);
-                fprintf(stderr, "above end: %p 0x%08X 0x%08X\n",
-                        relocs[i].base.bo,
-                        cs->packets[relocs[i].indices[j]],
-                        eoffset);
-                exit(0);
-                return -EINVAL;
-            }
-            /* apply offset operator */
-            switch (relocs[i].offset_mod.shift)
-            {
-            case NO_SHIFT:
-                asicoffset = asicoffset & relocs[i].offset_mod.mask;
-                break;
-            case LEFT_SHIFT:
-                asicoffset = (asicoffset << relocs[i].offset_mod.shiftbits) & relocs[i].offset_mod.mask;
-                break;
-            case RIGHT_SHIFT:
-                asicoffset = (asicoffset >> relocs[i].offset_mod.shiftbits) & relocs[i].offset_mod.mask;
-                break;
-            default:
-                break;
-            };              
-
-            /* pkt3 nop header in ib chunk */
-            cs->packets[relocs[i].reloc_indices[j]] = 0xC0001000;
-
-            /* reloc index in ib chunk */
-            cs->packets[relocs[i].reloc_indices[j] + 1] = offset_dw;
-            
-            /* asic offset in reloc chunk */ /* see alex drm r600_nomm_relocate */
-            reloc_chunk[offset_dw] = asicoffset;
-            reloc_chunk[offset_dw + 3] = 0;
-
-            offset_dw += 4;
-        }
+
+           for (j = 0; j < relocs[i].cindices; j++) {
+                   if (asicoffset >= eoffset) {
+                           /*                radeon_bo_debug(relocs[i].base.bo, 12); */
+                           fprintf(stderr, "validated %p [0x%08X, 0x%08X]\n",
+                                   relocs[i].base.bo, soffset, eoffset);
+                           fprintf(stderr, "above end: %p 0x%08X 0x%08X\n",
+                                   relocs[i].base.bo,
+                                   cs->packets[relocs[i].indices[j]],
+                                   eoffset);
+                           exit(0);
+                           return -EINVAL;
+                   }
+                   /* pkt3 nop header in ib chunk */
+                   cs->packets[relocs[i].reloc_indices[j]] = 0xC0001000;
+                   /* reloc index in ib chunk */
+                   cs->packets[relocs[i].reloc_indices[j] + 1] = offset_dw;
+           }
+
+           /* asic offset in reloc chunk */ /* see alex drm r600_nomm_relocate */
+           reloc_chunk[offset_dw] = asicoffset;
+           reloc_chunk[offset_dw + 3] = 0;
+
+           offset_dw += 4;
     }
 
     *length_dw_reloc_chunk = offset_dw;
@@ -351,10 +322,7 @@ static int r600_cs_emit(struct radeon_cs *cs)
     struct r600_cs_manager_legacy *csm = (struct r600_cs_manager_legacy*)cs->csm;
     struct drm_radeon_cs       cs_cmd;
     struct drm_radeon_cs_chunk cs_chunk[2];
-    drm_radeon_cmd_buffer_t cmd; 
-    /* drm_r300_cmd_header_t age; */
     uint32_t length_dw_reloc_chunk;
-    uint64_t ull;
     uint64_t chunk_ptrs[2];
     uint32_t reloc_chunk[128]; 
     int r;
@@ -363,43 +331,13 @@ static int r600_cs_emit(struct radeon_cs *cs)
     /* TODO : put chip level things here if need. */
     /* csm->ctx->vtbl.emit_cs_header(cs, csm->ctx); */
 
-    BATCH_LOCALS(csm->ctx);
-    drm_radeon_getparam_t gp;
-    uint32_t              current_scratchx_age;
-
-    gp.param = RADEON_PARAM_LAST_CLEAR;
-    gp.value = (int *)&current_scratchx_age;
-    r = drmCommandWriteRead(cs->csm->fd, 
-                            DRM_RADEON_GETPARAM,
-                            &gp, 
-                            sizeof(gp));
-    if (r) 
-    {
-        fprintf(stderr, "%s: drmRadeonGetParam: %d\n", __FUNCTION__, r);
-        exit(1);
-    }
-
-    csm->pending_age = 0;
     csm->pending_count = 1;
 
-    current_scratchx_age++;
-    csm->pending_age = current_scratchx_age;
-
-    BEGIN_BATCH_NO_AUTOSTATE(3);
-    R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CONFIG_REG, 1));
-    R600_OUT_BATCH((SCRATCH_REG2 - R600_SET_CONFIG_REG_OFFSET) >> 2);
-    R600_OUT_BATCH(current_scratchx_age);
-    END_BATCH();
-    COMMIT_BATCH();
-
-    //TODO ioctl to get back cs id assigned in drm
-    //csm->pending_age = cs_id_back;
-    
     r = r600_cs_process_relocs(cs, &(reloc_chunk[0]), &length_dw_reloc_chunk);
     if (r) {
         return 0;
     }
-      
+
     /* raw ib chunk */
     cs_chunk[0].chunk_id   = RADEON_CHUNK_ID_IB;
     cs_chunk[0].length_dw  = cs->cdw;
@@ -429,6 +367,8 @@ static int r600_cs_emit(struct radeon_cs *cs)
         return r;
     }
 
+    csm->pending_age = cs_cmd.cs_id;
+
     r600_cs_set_age(cs);
 
     cs->csm->read_used = 0;
@@ -514,8 +454,12 @@ struct radeon_cs_manager * r600_radeon_cs_manager_legacy_ctor(struct radeon_cont
 void r600InitCmdBuf(context_t *r600) /* from rcommonInitCmdBuf */
 {
     radeonContextPtr rmesa = &r600->radeon;
-       
     GLuint size;
+    rmesa->hw.max_state_size = 4000; /* rough estimate */
+
+    rmesa->hw.all_dirty = GL_TRUE;
+    rmesa->hw.is_dirty = GL_TRUE;
+
        /* Initialize command buffer */
        size = 256 * driQueryOptioni(&rmesa->optionCache,
                                     "command_buffer_size");
index bd1ed7f..5df0cf1 100644 (file)
@@ -132,15 +132,13 @@ struct r600_cs_reloc_legacy {
     uint32_t                cindices;
     uint32_t                *indices;
     uint32_t                *reloc_indices;
-    struct offset_modifiers offset_mod;
 };
 
 extern int r600_cs_write_reloc(struct radeon_cs *cs,
                         struct radeon_bo *bo,
                         uint32_t read_domain,
                         uint32_t write_domain,
-                        uint32_t flags,
-                        offset_modifiers* poffset_mod);
+                        uint32_t flags);
 
 static inline void r600_cs_write_dword(struct radeon_cs *cs, uint32_t dword)
 {
@@ -171,7 +169,7 @@ struct radeon_cs_manager * r600_radeon_cs_manager_legacy_ctor(struct radeon_cont
 /**
  * Write a relocated dword to the command buffer.
  */
-#define R600_OUT_BATCH_RELOC(data, bo, offset, rd, wd, flags, offset_mod)      \
+#define R600_OUT_BATCH_RELOC(data, bo, offset, rd, wd, flags)  \
        do {                                                    \
         if (0 && offset) {                                     \
             fprintf(stderr, "(%s:%s:%d) offset : %d\n",                \
@@ -179,7 +177,7 @@ struct radeon_cs_manager * r600_radeon_cs_manager_legacy_ctor(struct radeon_cont
         }                                                      \
         r600_cs_write_dword(b_l_rmesa->cmdbuf.cs, offset);     \
         r600_cs_write_reloc(b_l_rmesa->cmdbuf.cs,              \
-                              bo, rd, wd, flags, offset_mod);          \
+                              bo, rd, wd, flags);              \
        } while(0)
 
 /* R600/R700 */
index 78bad87..7009374 100644 (file)
@@ -57,7 +57,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "drivers/common/driverfuncs.h"
 
 #include "r600_context.h"
-#include "radeon_context.h"
+#include "radeon_common_context.h"
 #include "radeon_span.h"
 #include "r600_cmdbuf.h"
 #include "r600_emit.h"
@@ -218,7 +218,6 @@ GLboolean r600CreateContext(const __GLcontextModes * glVisual,
        struct dd_function_table functions;
        context_t *r600;
        GLcontext *ctx;
-       int tcl_mode;
 
        assert(glVisual);
        assert(driContextPriv);
@@ -377,23 +376,12 @@ GLboolean r600CreateContext(const __GLcontextModes * glVisual,
 
        TNL_CONTEXT(ctx)->Driver.RunPipeline = r600RunPipeline;
 
-       tcl_mode = driQueryOptioni(&r600->radeon.optionCache, "tcl_mode");
        if (driQueryOptionb(&r600->radeon.optionCache, "no_rast")) {
                fprintf(stderr, "disabling 3D acceleration\n");
 #if R200_MERGED
                FALLBACK(&r600->radeon, RADEON_FALLBACK_DISABLE, 1);
 #endif
        }
-       if (tcl_mode == DRI_CONF_TCL_SW ||
-           !(r600->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL)) {
-               if (r600->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL) {
-                       r600->radeon.radeonScreen->chip_flags &=
-                           ~RADEON_CHIPSET_TCL;
-                       fprintf(stderr, "Disabling HW TCL support\n");
-               }
-               TCL_FALLBACK(r600->radeon.glCtx,
-                            RADEON_TCL_FALLBACK_TCL_DISABLE, 1);
-       }
 
        return GL_TRUE;
 }
@@ -407,6 +395,8 @@ r600DestroyContext (__DRIcontextPrivate * driContextPriv)
 
     if (context)
            FREE(context->hw.pStateList);
+
+    radeonDestroyContext(driContextPriv);
 }
 
 
index bcb33e1..30ddce6 100644 (file)
@@ -128,13 +128,6 @@ enum
     RIGHT_SHIFT = 2,
 };
 
-typedef struct offset_modifiers
-{
-    GLuint shift;
-    GLuint shiftbits;
-    GLuint mask;
-} offset_modifiers;
-
 /**
  * \brief R600 context structure.
  */
@@ -165,6 +158,17 @@ extern GLboolean r700InitChipObject(context_t *context);
 extern GLboolean r700SendContextStates(context_t *context);
 extern GLboolean r700SendViewportState(context_t *context, int id);
 extern GLboolean r700SendRenderTargetState(context_t *context, int id);
+extern GLboolean r700SendTextureState(context_t *context);
+extern GLboolean r700SendDepthTargetState(context_t *context);
+extern GLboolean r700SendUCPState(context_t *context);
+extern GLboolean r700SendFSState(context_t *context);
+extern void r700EmitState(GLcontext * ctx);
+
+extern GLboolean r700SyncSurf(context_t *context,
+                             struct radeon_bo *pbo,
+                             uint32_t read_domain,
+                             uint32_t write_domain,
+                             uint32_t sync_type);
 
 extern int       r700SetupStreams(GLcontext * ctx);
 extern void      r700SetupVTXConstants(GLcontext  * ctx, 
index 685f7fe..b695ed9 100644 (file)
@@ -63,26 +63,15 @@ GLboolean r600EmitShader(GLcontext * ctx,
     struct radeon_bo * pbo;
     uint32_t *out;
 
-shader_again_alloc:    
-#ifdef RADEON_DEBUG_BO
-       pbo = radeon_bo_open(radeonctx->radeonScreen->bom,
-                                            0, 
-                         sizeinDWORD * 4, 
-                         256, 
-                         RADEON_GEM_DOMAIN_GTT,
-                                            0,
-                         szShaderUsage);
-#else
+shader_again_alloc:
     pbo = radeon_bo_open(radeonctx->radeonScreen->bom,
-                                            0, 
-                         sizeinDWORD * 4, 
-                         256, 
+                        0,
+                         sizeinDWORD * 4,
+                         256,
                          RADEON_GEM_DOMAIN_GTT,
-                                            0);
-#endif /* RADEON_DEBUG_BO */
+                        0);
 
-       if (!pbo) 
-    {
+       if (!pbo) {
                rcommonFlushCmdBuf(radeonctx, __FUNCTION__);
                goto shader_again_alloc;
        }
index 43d9f64..6d531bf 100644 (file)
@@ -62,10 +62,10 @@ static unsigned int translate_wrap_mode(GLenum wrapmode)
        case GL_CLAMP: return SQ_TEX_CLAMP_HALF_BORDER;
        case GL_CLAMP_TO_EDGE: return SQ_TEX_CLAMP_LAST_TEXEL;
        case GL_CLAMP_TO_BORDER: return SQ_TEX_CLAMP_BORDER;
-       case GL_MIRRORED_REPEAT: return SQ_TEX_MIRROR_ONCE_HALF_BORDER;
-       case GL_MIRROR_CLAMP_EXT: return SQ_TEX_MIRROR;
-       case GL_MIRROR_CLAMP_TO_EDGE_EXT: return SQ_TEX_MIRROR_ONCE_BORDER;
-       case GL_MIRROR_CLAMP_TO_BORDER_EXT: return SQ_TEX_MIRROR_ONCE_LAST_TEXEL;
+       case GL_MIRRORED_REPEAT: return SQ_TEX_MIRROR;
+       case GL_MIRROR_CLAMP_EXT: return SQ_TEX_MIRROR_ONCE_HALF_BORDER;
+       case GL_MIRROR_CLAMP_TO_EDGE_EXT: return SQ_TEX_MIRROR_ONCE_LAST_TEXEL;
+       case GL_MIRROR_CLAMP_TO_BORDER_EXT: return SQ_TEX_MIRROR_ONCE_BORDER;
        default:
                _mesa_problem(NULL, "bad wrap mode in %s", __FUNCTION__);
                return 0;
@@ -127,10 +127,18 @@ static void r600SetTexDefaultState(radeonTexObjPtr t)
         SETfield(t->SQ_TEX_RESOURCE4, SQ_ENDIAN_NONE,
                  SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_shift, SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_mask);
         SETfield(t->SQ_TEX_RESOURCE4, 1, REQUEST_SIZE_shift, REQUEST_SIZE_mask);
-        t->SQ_TEX_RESOURCE4 |= SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
-                             |SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
-                             |SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
-                             |SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift;
+        SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
         SETfield(t->SQ_TEX_RESOURCE4, 0, BASE_LEVEL_shift, BASE_LEVEL_mask); /* mip-maps */
 
         t->SQ_TEX_RESOURCE5 = 0;
@@ -141,17 +149,18 @@ static void r600SetTexDefaultState(radeonTexObjPtr t)
 
         /* Initialize sampler registers */
         t->SQ_TEX_SAMPLER0                           = 0;
-        t->SQ_TEX_SAMPLER0 |=
-                         SQ_TEX_WRAP << SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift
-                        |SQ_TEX_WRAP << CLAMP_Y_shift
-                        |SQ_TEX_WRAP << CLAMP_Z_shift
-                        |SQ_TEX_XY_FILTER_POINT << XY_MAG_FILTER_shift
-                        |SQ_TEX_XY_FILTER_POINT << XY_MIN_FILTER_shift
-                        |SQ_TEX_Z_FILTER_NONE << Z_FILTER_shift
-                        |SQ_TEX_Z_FILTER_NONE << MIP_FILTER_shift
-                        |SQ_TEX_BORDER_COLOR_TRANS_BLACK << BORDER_COLOR_TYPE_shift;
-
-        t->SQ_TEX_SAMPLER1 = 0x7FF << MAX_LOD_shift;
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_WRAP, SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift,
+                SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_WRAP, CLAMP_Y_shift, CLAMP_Y_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_WRAP, CLAMP_Z_shift, CLAMP_Z_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_XY_FILTER_POINT, XY_MAG_FILTER_shift, XY_MAG_FILTER_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_XY_FILTER_POINT, XY_MIN_FILTER_shift, XY_MIN_FILTER_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_Z_FILTER_NONE, Z_FILTER_shift, Z_FILTER_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_Z_FILTER_NONE, MIP_FILTER_shift, MIP_FILTER_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_BORDER_COLOR_TRANS_BLACK, BORDER_COLOR_TYPE_shift, BORDER_COLOR_TYPE_mask);
+
+        t->SQ_TEX_SAMPLER1                           = 0;
+        SETfield(t->SQ_TEX_SAMPLER1, 0x3ff, MAX_LOD_shift, MAX_LOD_mask);
 
         t->SQ_TEX_SAMPLER2                          = 0;
         SETbit(t->SQ_TEX_SAMPLER2, SQ_TEX_SAMPLER_WORD2_0__TYPE_bit);
@@ -260,14 +269,12 @@ static void r600SetTexFilter(radeonTexObjPtr t, GLenum minf, GLenum magf, GLfloa
 
 static void r600SetTexBorderColor(radeonTexObjPtr t, const GLfloat color[4])
 {
-#if 0
-       GLubyte c[4];
-       CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]);
-       CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]);
-       CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]);
-       CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]);
-       t->pp_border_color = PACK_COLOR_8888(c[3], c[0], c[1], c[2]);
-#endif
+       t->TD_PS_SAMPLER0_BORDER_ALPHA = *((uint32_t*)&(color[3]));
+       t->TD_PS_SAMPLER0_BORDER_RED = *((uint32_t*)&(color[2]));
+       t->TD_PS_SAMPLER0_BORDER_GREEN = *((uint32_t*)&(color[1]));
+       t->TD_PS_SAMPLER0_BORDER_BLUE = *((uint32_t*)&(color[0]));
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_BORDER_COLOR_REGISTER,
+                BORDER_COLOR_TYPE_shift, BORDER_COLOR_TYPE_mask);
 }
 
 /**
index 2466aa9..ee9b64e 100644 (file)
@@ -75,10 +75,10 @@ static GLboolean r600GetTexFormat(struct gl_texture_object *tObj, GLuint mesa_fo
 {
        radeonTexObj *t = radeon_tex_obj(tObj);
 
-       t->SQ_TEX_RESOURCE4 &= ~( SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
-                                 |SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
-                                 |SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
-                                 |SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask );
+       CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+       CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+       CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+       CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
 
        switch (mesa_format) /* This is mesa format. */
        {
@@ -86,163 +86,211 @@ static GLboolean r600GetTexFormat(struct gl_texture_object *tObj, GLuint mesa_fo
                SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_RGBA8888_REV:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_ARGB8888:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_ARGB8888_REV:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_RGB888:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_1 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_RGB565:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_5_6_5,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_1 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_RGB565_REV:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_5_6_5,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_1 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_ARGB4444:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_4_4_4_4,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_ARGB4444_REV:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_4_4_4_4,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_ARGB1555:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_1_5_5_5,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_ARGB1555_REV:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_1_5_5_5,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_AL88:
        case MESA_FORMAT_AL88_REV: /* TODO : Check this. */
                SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_RGB332:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_3_3_2,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_1 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_A8: /* ZERO, ZERO, ZERO, X */
                SETfield(t->SQ_TEX_RESOURCE1, FMT_8,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_0 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_0 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_0 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_L8: /* X, X, X, ONE */
                SETfield(t->SQ_TEX_RESOURCE1, FMT_8,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_1 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_I8: /* X, X, X, X */
        case MESA_FORMAT_CI8:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_8,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
                /* YUV422 TODO conversion */  /* X, Y, Z, ONE, G8R8_G8B8 */
                /*
@@ -272,121 +320,157 @@ static GLboolean r600GetTexFormat(struct gl_texture_object *tObj, GLuint mesa_fo
                SETfield(t->SQ_TEX_RESOURCE1, FMT_32_32_32_32_FLOAT,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_RGBA_FLOAT16:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_16_16_16_16_FLOAT,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_RGB_FLOAT32: /* X, Y, Z, ONE */
                SETfield(t->SQ_TEX_RESOURCE1, FMT_32_32_32_FLOAT,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_1 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_RGB_FLOAT16:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_16_16_16_FLOAT,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_1 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_ALPHA_FLOAT32: /* ZERO, ZERO, ZERO, X */
                SETfield(t->SQ_TEX_RESOURCE1, FMT_32_FLOAT,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_0 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_0 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_0 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_ALPHA_FLOAT16: /* ZERO, ZERO, ZERO, X */
                SETfield(t->SQ_TEX_RESOURCE1, FMT_16_FLOAT,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_0 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_0 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_0 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_LUMINANCE_FLOAT32: /* X, X, X, ONE */
                SETfield(t->SQ_TEX_RESOURCE1, FMT_32_FLOAT,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_1 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_LUMINANCE_FLOAT16: /* X, X, X, ONE */
                SETfield(t->SQ_TEX_RESOURCE1, FMT_16_FLOAT,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_1 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_32_32_FLOAT,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_16_16_FLOAT,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_INTENSITY_FLOAT32: /* X, X, X, X */
                SETfield(t->SQ_TEX_RESOURCE1, FMT_32_FLOAT,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_INTENSITY_FLOAT16: /* X, X, X, X */
                SETfield(t->SQ_TEX_RESOURCE1, FMT_16_FLOAT,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                break;
        case MESA_FORMAT_Z16:
        case MESA_FORMAT_Z24_S8:
@@ -407,25 +491,34 @@ static GLboolean r600GetTexFormat(struct gl_texture_object *tObj, GLuint mesa_fo
                };
                switch (tObj->DepthMode) {
                case GL_LUMINANCE:  /* X, X, X, ONE */
-                       t->SQ_TEX_RESOURCE4 |=
-                               (SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                               |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                               |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                               |(SQ_SEL_1 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                        break;
                case GL_INTENSITY:  /* X, X, X, X */
-                       t->SQ_TEX_RESOURCE4 |=
-                               (SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                               |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                               |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                               |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                        break;
                case GL_ALPHA:     /* ZERO, ZERO, ZERO, X */
-                       t->SQ_TEX_RESOURCE4 |=
-                               (SQ_SEL_0 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                               |(SQ_SEL_0 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                               |(SQ_SEL_0 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                               |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                        break;
                default:
                        return GL_FALSE;
@@ -441,7 +534,6 @@ static GLboolean r600GetTexFormat(struct gl_texture_object *tObj, GLuint mesa_fo
 
 void r600SetDepthTexMode(struct gl_texture_object *tObj)
 {
-       const GLuint *format;
        radeonTexObjPtr t;
 
        if (!tObj)
@@ -464,7 +556,7 @@ static void setup_hardware_state(context_t *rmesa, struct gl_texture_object *tex
        radeonTexObj *t = radeon_tex_obj(texObj);
        const struct gl_texture_image *firstImage;
        int firstlevel = t->mt ? t->mt->firstLevel : 0;
-       GLuint uTexelPitch;
+       GLuint uTexelPitch, row_align;
 
        firstImage = t->base.Image[0][firstlevel];
 
@@ -476,9 +568,6 @@ static void setup_hardware_state(context_t *rmesa, struct gl_texture_object *tex
                }
        }
 
-       if (t->image_override && t->bo)
-               return;
-
        switch (texObj->Target) {
         case GL_TEXTURE_1D:
                SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_1D, DIM_shift, DIM_mask);
@@ -503,15 +592,26 @@ static void setup_hardware_state(context_t *rmesa, struct gl_texture_object *tex
                return;
        }
 
-       uTexelPitch = (firstImage->Width + R700_TEXEL_PITCH_ALIGNMENT_MASK)
+       row_align = rmesa->radeon.texture_row_align - 1;
+       uTexelPitch = ((firstImage->Width * t->mt->bpp + row_align) & ~row_align) / t->mt->bpp;
+       uTexelPitch = (uTexelPitch + R700_TEXEL_PITCH_ALIGNMENT_MASK)
                & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;
 
+       /* min pitch is 8 */
+       if (uTexelPitch < 8)
+               uTexelPitch = 8;
+
        SETfield(t->SQ_TEX_RESOURCE0, (uTexelPitch/8)-1, PITCH_shift, PITCH_mask);
        SETfield(t->SQ_TEX_RESOURCE0, firstImage->Width - 1,
                 TEX_WIDTH_shift, TEX_WIDTH_mask);
        SETfield(t->SQ_TEX_RESOURCE1, firstImage->Height - 1,
                 TEX_HEIGHT_shift, TEX_HEIGHT_mask);
 
+       if ((t->mt->lastLevel - t->mt->firstLevel) > 0) {
+               t->SQ_TEX_RESOURCE3 = t->mt->levels[0].size / 256;
+               SETfield(t->SQ_TEX_RESOURCE4, t->mt->firstLevel, BASE_LEVEL_shift, BASE_LEVEL_mask);
+               SETfield(t->SQ_TEX_RESOURCE5, t->mt->lastLevel, LAST_LEVEL_shift, LAST_LEVEL_mask);
+       }
 }
 
 /**
@@ -598,7 +698,7 @@ void r600SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
        struct gl_texture_object *tObj =
            _mesa_lookup_texture(rmesa->radeon.glCtx, texname);
        radeonTexObjPtr t = radeon_tex_obj(tObj);
-       uint32_t pitch_val;
+       uint32_t pitch_val, size;
 
        if (!tObj)
                return;
@@ -608,7 +708,12 @@ void r600SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
        if (!offset)
                return;
 
-       t->bo = NULL;
+       size = pitch;//h * w * (depth / 8);
+       if (t->bo) {
+               radeon_bo_unref(t->bo);
+               t->bo = NULL;
+       }
+       t->bo = radeon_legacy_bo_alloc_fake(rmesa->radeon.radeonScreen->bom, size, offset);
        t->override_offset = offset;
        pitch_val = pitch;
        switch (depth) {
@@ -616,11 +721,14 @@ void r600SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
                SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                pitch_val /= 4;
                break;
        case 24:
@@ -628,28 +736,39 @@ void r600SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
                SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_1 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                pitch_val /= 4;
                break;
        case 16:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_5_6_5,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_1 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                pitch_val /= 2;
                break;
        }
 
        pitch_val = (pitch_val + R700_TEXEL_PITCH_ALIGNMENT_MASK)
                & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;
+
+       /* min pitch is 8 */
+       if (pitch_val < 8)
+               pitch_val = 8;
+
        SETfield(t->SQ_TEX_RESOURCE0, (pitch_val/8)-1, PITCH_shift, PITCH_mask);
 }
 
@@ -739,20 +858,26 @@ void r600SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_fo
                        SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
                                 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-                       t->SQ_TEX_RESOURCE4 |=
-                               (SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                               |(SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                               |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                               |(SQ_SEL_1 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                } else {
                        SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
                                 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-                       t->SQ_TEX_RESOURCE4 |=
-                               (SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                               |(SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                               |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                               |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+                       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                }
                pitch_val /= 4;
                break;
@@ -762,22 +887,28 @@ void r600SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_fo
                SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_1 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                pitch_val /= 4;
                break;
        case 2:
                SETfield(t->SQ_TEX_RESOURCE1, FMT_5_6_5,
                         SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
 
-               t->SQ_TEX_RESOURCE4 |=
-                       (SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift)
-                       |(SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift)
-                       |(SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift)
-                       |(SQ_SEL_1 << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+               SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
+                        SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
                pitch_val /= 2;
                break;
        }
@@ -785,6 +916,10 @@ void r600SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_fo
        pitch_val = (pitch_val + R700_TEXEL_PITCH_ALIGNMENT_MASK)
                & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;
 
+       /* min pitch is 8 */
+       if (pitch_val < 8)
+               pitch_val = 8;
+
        SETfield(t->SQ_TEX_RESOURCE0, (pitch_val/8)-1, PITCH_shift, PITCH_mask);
        SETfield(t->SQ_TEX_RESOURCE0, rb->base.Width - 1,
                 TEX_WIDTH_shift, TEX_WIDTH_mask);
index 1d41c5c..eaacd06 100644 (file)
@@ -1205,7 +1205,7 @@ GLboolean tex_src(r700_AssemblerBase *pAsm)
     return GL_TRUE;
 }
 
-GLboolean assemble_tex_instruction(r700_AssemblerBase *pAsm)
+GLboolean assemble_tex_instruction(r700_AssemblerBase *pAsm, GLboolean normalized)
 {
     PVSSRC *   texture_coordinate_source;
     PVSSRC *   texture_unit_source;
@@ -1227,10 +1227,18 @@ GLboolean assemble_tex_instruction(r700_AssemblerBase *pAsm)
     tex_instruction_ptr->m_Word0.f.resource_id      = texture_unit_source->reg;
 
     tex_instruction_ptr->m_Word1.f.lod_bias     = 0x0;
-    tex_instruction_ptr->m_Word1.f.coord_type_x = SQ_TEX_NORMALIZED;
-    tex_instruction_ptr->m_Word1.f.coord_type_y = SQ_TEX_NORMALIZED;
-    tex_instruction_ptr->m_Word1.f.coord_type_z = SQ_TEX_NORMALIZED;
-    tex_instruction_ptr->m_Word1.f.coord_type_w = SQ_TEX_NORMALIZED;
+    if (normalized) {
+           tex_instruction_ptr->m_Word1.f.coord_type_x = SQ_TEX_NORMALIZED;
+           tex_instruction_ptr->m_Word1.f.coord_type_y = SQ_TEX_NORMALIZED;
+           tex_instruction_ptr->m_Word1.f.coord_type_z = SQ_TEX_NORMALIZED;
+           tex_instruction_ptr->m_Word1.f.coord_type_w = SQ_TEX_NORMALIZED;
+    } else {
+           /* XXX: UNNORMALIZED tex coords have limited wrap modes */
+           tex_instruction_ptr->m_Word1.f.coord_type_x = SQ_TEX_UNNORMALIZED;
+           tex_instruction_ptr->m_Word1.f.coord_type_y = SQ_TEX_UNNORMALIZED;
+           tex_instruction_ptr->m_Word1.f.coord_type_z = SQ_TEX_UNNORMALIZED;
+           tex_instruction_ptr->m_Word1.f.coord_type_w = SQ_TEX_UNNORMALIZED;
+    }
 
     tex_instruction_ptr->m_Word2.f.offset_x   = 0x0;
     tex_instruction_ptr->m_Word2.f.offset_y   = 0x0;
@@ -2196,11 +2204,19 @@ GLboolean next_ins(r700_AssemblerBase *pAsm)
 
     if( GL_TRUE == IsTex(pILInst->Opcode) )
     {
-        if( GL_FALSE == assemble_tex_instruction(pAsm) ) 
-        {
-            r700_error(ERROR_ASM_TEXINSTRUCTION, "Error assembling TEX instruction");
-            return GL_FALSE;
-        }
+           if (pILInst->TexSrcTarget == TEXTURE_RECT_INDEX) {
+                   if( GL_FALSE == assemble_tex_instruction(pAsm, GL_FALSE) ) 
+                   {
+                           r700_error(ERROR_ASM_TEXINSTRUCTION, "Error assembling TEX instruction");
+                           return GL_FALSE;
+                   }
+           } else {
+                   if( GL_FALSE == assemble_tex_instruction(pAsm, GL_TRUE) ) 
+                   {
+                           r700_error(ERROR_ASM_TEXINSTRUCTION, "Error assembling TEX instruction");
+                           return GL_FALSE;
+                   }
+           }
     }
     else 
     {   //ALU      
@@ -3823,6 +3839,9 @@ GLboolean Process_Export(r700_AssemblerBase* pAsm,
     if (export_count == 1) 
     {
         ucWriteMask = pAsm->pucOutMask[starting_register_number - pAsm->starting_export_register_number];
+       /* exports Z as a float into Red channel */
+       if (GL_TRUE == is_depth_export)
+           ucWriteMask = 0x1;
 
         if( (ucWriteMask & 0x1) != 0)
         {
@@ -4014,6 +4033,22 @@ GLboolean Process_Vertex_Exports(r700_AssemblerBase *pR700AsmCode,
         export_starting_index++;
        }
 
+        unBit = 1 << VERT_RESULT_FOGC;
+        if(OutputsWritten & unBit)
+        {
+        if( GL_FALSE == Process_Export(pR700AsmCode,
+                                       SQ_EXPORT_PARAM,
+                                       export_starting_index,
+                                       1,
+                                       pR700AsmCode->ucVP_OutputMap[VERT_RESULT_FOGC],
+                                       GL_FALSE) )
+        {
+            return GL_FALSE;
+        }
+
+        export_starting_index++;
+        }
+
        for(i=0; i<8; i++)
        {
                unBit = 1 << (VERT_RESULT_TEX0 + i);
index e9b21b8..f9c4d84 100644 (file)
@@ -424,7 +424,7 @@ GLboolean assemble_src(r700_AssemblerBase *pAsm,
 GLboolean assemble_dst(r700_AssemblerBase *pAsm);
 GLboolean tex_dst(r700_AssemblerBase *pAsm);
 GLboolean tex_src(r700_AssemblerBase *pAsm);
-GLboolean assemble_tex_instruction(r700_AssemblerBase *pAsm);
+GLboolean assemble_tex_instruction(r700_AssemblerBase *pAsm, GLboolean normalized);
 void initialize(r700_AssemblerBase *pAsm);
 GLboolean assemble_alu_src(R700ALUInstruction*  alu_instruction_ptr,
                            int                  source_index,
index 087d173..0fb355a 100644 (file)
@@ -38,6 +38,8 @@
 #include "r700_vertprog.h"
 #include "r700_ioctl.h"
 
+#include "radeon_mipmap_tree.h"
+
 #define LINK_STATES(reg)                                            \
 do                                                                  \
 {                                                                   \
@@ -136,9 +138,23 @@ GLboolean r700InitChipObject(context_t *context)
     LINK_STATES(CB_CLRCMP_MSK);
     LINK_STATES(CB_BLEND_CONTROL);
 
+    //DB
+    LINK_STATES(DB_HTILE_DATA_BASE);
+    LINK_STATES(DB_STENCIL_CLEAR);
+    LINK_STATES(DB_DEPTH_CLEAR);
+    LINK_STATES(DB_STENCILREFMASK);
+    LINK_STATES(DB_STENCILREFMASK_BF);
+    LINK_STATES(DB_DEPTH_CONTROL);
+    LINK_STATES(DB_SHADER_CONTROL);
+    LINK_STATES(DB_RENDER_CONTROL);
+    LINK_STATES(DB_RENDER_OVERRIDE);
+    LINK_STATES(DB_HTILE_SURFACE);
+    LINK_STATES(DB_ALPHA_TO_MASK);
+
     // SX
     LINK_STATES(SX_MISC);
     LINK_STATES(SX_ALPHA_TEST_CONTROL);
+    LINK_STATES(SX_ALPHA_REF);
 
     // VGT
     LINK_STATES(VGT_MAX_VTX_INDX);
@@ -159,7 +175,6 @@ GLboolean r700InitChipObject(context_t *context)
     LINK_STATES(VGT_GROUP_VECT_1_FMT_CNTL);
     LINK_STATES(VGT_GS_MODE);
     LINK_STATES(VGT_PRIMITIVEID_EN);
-    LINK_STATES(VGT_DMA_NUM_INSTANCES);
     LINK_STATES(VGT_MULTI_PRIM_IB_RESET_EN);
     LINK_STATES(VGT_INSTANCE_STEP_RATE_0);
     LINK_STATES(VGT_INSTANCE_STEP_RATE_1);
@@ -213,39 +228,6 @@ GLboolean r700InitChipObject(context_t *context)
     LINK_STATES(SPI_VS_OUT_ID_8);
     LINK_STATES(SPI_VS_OUT_ID_9);
 
-    LINK_STATES(SPI_PS_INPUT_CNTL_0);
-    LINK_STATES(SPI_PS_INPUT_CNTL_1);
-    LINK_STATES(SPI_PS_INPUT_CNTL_2);
-    LINK_STATES(SPI_PS_INPUT_CNTL_3);
-    LINK_STATES(SPI_PS_INPUT_CNTL_4);
-    LINK_STATES(SPI_PS_INPUT_CNTL_5);
-    LINK_STATES(SPI_PS_INPUT_CNTL_6);
-    LINK_STATES(SPI_PS_INPUT_CNTL_7);
-    LINK_STATES(SPI_PS_INPUT_CNTL_8);
-    LINK_STATES(SPI_PS_INPUT_CNTL_9);
-    LINK_STATES(SPI_PS_INPUT_CNTL_10);
-    LINK_STATES(SPI_PS_INPUT_CNTL_11);
-    LINK_STATES(SPI_PS_INPUT_CNTL_12);
-    LINK_STATES(SPI_PS_INPUT_CNTL_13);
-    LINK_STATES(SPI_PS_INPUT_CNTL_14);
-    LINK_STATES(SPI_PS_INPUT_CNTL_15);
-    LINK_STATES(SPI_PS_INPUT_CNTL_16);
-    LINK_STATES(SPI_PS_INPUT_CNTL_17);
-    LINK_STATES(SPI_PS_INPUT_CNTL_18);
-    LINK_STATES(SPI_PS_INPUT_CNTL_19);
-    LINK_STATES(SPI_PS_INPUT_CNTL_20);
-    LINK_STATES(SPI_PS_INPUT_CNTL_21);
-    LINK_STATES(SPI_PS_INPUT_CNTL_22);
-    LINK_STATES(SPI_PS_INPUT_CNTL_23);
-    LINK_STATES(SPI_PS_INPUT_CNTL_24);
-    LINK_STATES(SPI_PS_INPUT_CNTL_25);
-    LINK_STATES(SPI_PS_INPUT_CNTL_26);
-    LINK_STATES(SPI_PS_INPUT_CNTL_27);
-    LINK_STATES(SPI_PS_INPUT_CNTL_28);
-    LINK_STATES(SPI_PS_INPUT_CNTL_29);
-    LINK_STATES(SPI_PS_INPUT_CNTL_30);
-    LINK_STATES(SPI_PS_INPUT_CNTL_31);
-
     LINK_STATES(SPI_VS_OUT_CONFIG);
     LINK_STATES(SPI_THREAD_GROUPING);
     LINK_STATES(SPI_PS_IN_CONTROL_0);
@@ -274,6 +256,67 @@ GLboolean r700InitChipObject(context_t *context)
     return GL_TRUE;
 }
 
+GLboolean r700SendTextureState(context_t *context)
+{
+    unsigned int i;
+    R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+    struct radeon_bo *bo = NULL;
+    BATCH_LOCALS(&context->radeon);
+
+    for (i=0; i<R700_TEXTURE_NUMBERUNITS; i++) {
+           radeonTexObj *t = r700->textures[i];
+           if (t) {
+                   if (!t->image_override)
+                           bo = t->mt->bo;
+                   else
+                           bo = t->bo;
+                   if (bo) {
+
+                           r700SyncSurf(context, bo,
+                                        RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM,
+                                        0, TC_ACTION_ENA_bit);
+
+                           BEGIN_BATCH_NO_AUTOSTATE(9);
+                           R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE, 7));
+                           R600_OUT_BATCH(i * 7);
+                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE0);
+                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE1);
+                           R600_OUT_BATCH_RELOC(r700->textures[i]->SQ_TEX_RESOURCE2,
+                                                bo,
+                                                0,
+                                                RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
+                           R600_OUT_BATCH_RELOC(r700->textures[i]->SQ_TEX_RESOURCE3,
+                                                bo,
+                                                r700->textures[i]->SQ_TEX_RESOURCE3,
+                                                RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
+                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE4);
+                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE5);
+                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE6);
+                           END_BATCH();
+
+                           BEGIN_BATCH_NO_AUTOSTATE(5);
+                           R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_SAMPLER, 3));
+                           R600_OUT_BATCH(i * 3);
+                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_SAMPLER0);
+                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_SAMPLER1);
+                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_SAMPLER2);
+                           END_BATCH();
+
+                           BEGIN_BATCH_NO_AUTOSTATE(2 + 4);
+                           R600_OUT_BATCH_REGSEQ((TD_PS_SAMPLER0_BORDER_RED + (i * 16)), 4);
+                           R600_OUT_BATCH(r700->textures[i]->TD_PS_SAMPLER0_BORDER_RED);
+                           R600_OUT_BATCH(r700->textures[i]->TD_PS_SAMPLER0_BORDER_GREEN);
+                           R600_OUT_BATCH(r700->textures[i]->TD_PS_SAMPLER0_BORDER_BLUE);
+                           R600_OUT_BATCH(r700->textures[i]->TD_PS_SAMPLER0_BORDER_ALPHA);
+                           END_BATCH();
+
+                           COMMIT_BATCH();
+                   }
+           }
+    }
+    return GL_TRUE;
+}
+
 void r700SetupVTXConstants(GLcontext  * ctx,
                           unsigned int nStreamID,
                           void *       pAos,
@@ -282,10 +325,7 @@ void r700SetupVTXConstants(GLcontext  * ctx,
                           unsigned int count)     /* number of vectors in stream */
 {
     context_t *context = R700_CONTEXT(ctx);
-    uint32_t *dest;
     struct radeon_aos * paos = (struct radeon_aos *)pAos;
-    offset_modifiers offset_mod = {NO_SHIFT, 0, 0xFFFFFFFF};
-
     BATCH_LOCALS(&context->radeon);
 
     unsigned int uSQ_VTX_CONSTANT_WORD0_0;
@@ -294,6 +334,9 @@ void r700SetupVTXConstants(GLcontext  * ctx,
     unsigned int uSQ_VTX_CONSTANT_WORD3_0 = 0;
     unsigned int uSQ_VTX_CONSTANT_WORD6_0 = 0;
 
+    if (!paos->bo)
+           return;
+
     if ((context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV610) ||
        (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV620) ||
        (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RS780) ||
@@ -305,15 +348,19 @@ void r700SetupVTXConstants(GLcontext  * ctx,
     uSQ_VTX_CONSTANT_WORD0_0 = paos->offset;
     uSQ_VTX_CONSTANT_WORD1_0 = count * (size * 4) - 1;
 
-    uSQ_VTX_CONSTANT_WORD2_0 |= 0 << BASE_ADDRESS_HI_shift /* TODO */
-           |stride << SQ_VTX_CONSTANT_WORD2_0__STRIDE_shift
-           |GetSurfaceFormat(GL_FLOAT, size, NULL) << SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_shift /* TODO : trace back api for initial data type, not only GL_FLOAT */
-           |SQ_NUM_FORMAT_SCALED << SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_shift
-           |SQ_VTX_CONSTANT_WORD2_0__FORMAT_COMP_ALL_bit;
-
-    uSQ_VTX_CONSTANT_WORD3_0 |= 1 << MEM_REQUEST_SIZE_shift;
+    SETfield(uSQ_VTX_CONSTANT_WORD2_0, 0, BASE_ADDRESS_HI_shift, BASE_ADDRESS_HI_mask); /* TODO */
+    SETfield(uSQ_VTX_CONSTANT_WORD2_0, stride, SQ_VTX_CONSTANT_WORD2_0__STRIDE_shift,
+            SQ_VTX_CONSTANT_WORD2_0__STRIDE_mask);
+    SETfield(uSQ_VTX_CONSTANT_WORD2_0, GetSurfaceFormat(GL_FLOAT, size, NULL),
+            SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_shift,
+            SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_mask); /* TODO : trace back api for initial data type, not only GL_FLOAT */
+    SETfield(uSQ_VTX_CONSTANT_WORD2_0, SQ_NUM_FORMAT_SCALED,
+            SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_shift, SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_mask);
+    SETbit(uSQ_VTX_CONSTANT_WORD2_0, SQ_VTX_CONSTANT_WORD2_0__FORMAT_COMP_ALL_bit);
 
-    uSQ_VTX_CONSTANT_WORD6_0 |= SQ_TEX_VTX_VALID_BUFFER << SQ_TEX_RESOURCE_WORD6_0__TYPE_shift;
+    SETfield(uSQ_VTX_CONSTANT_WORD3_0, 1, MEM_REQUEST_SIZE_shift, MEM_REQUEST_SIZE_mask);
+    SETfield(uSQ_VTX_CONSTANT_WORD6_0, SQ_TEX_VTX_VALID_BUFFER,
+            SQ_TEX_RESOURCE_WORD6_0__TYPE_shift, SQ_TEX_RESOURCE_WORD6_0__TYPE_mask);
 
     BEGIN_BATCH_NO_AUTOSTATE(9);
 
@@ -323,7 +370,7 @@ void r700SetupVTXConstants(GLcontext  * ctx,
     R600_OUT_BATCH_RELOC(uSQ_VTX_CONSTANT_WORD0_0,
                          paos->bo,
                          uSQ_VTX_CONSTANT_WORD0_0,
-                         RADEON_GEM_DOMAIN_GTT, 0, 0, &offset_mod);
+                         RADEON_GEM_DOMAIN_GTT, 0, 0);
     R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD1_0);
     R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD2_0);
     R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD3_0);
@@ -339,7 +386,6 @@ void r700SetupVTXConstants(GLcontext  * ctx,
 int r700SetupStreams(GLcontext * ctx)
 {
     context_t         *context = R700_CONTEXT(ctx);
-
     BATCH_LOCALS(&context->radeon);
 
     struct r700_vertex_program *vpc
@@ -353,7 +399,7 @@ int r700SetupStreams(GLcontext * ctx)
 
     BEGIN_BATCH_NO_AUTOSTATE(6);
     R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 1));
-       R600_OUT_BATCH(mmSQ_VTX_BASE_VTX_LOC - ASIC_CTL_CONST_BASE_INDEX);
+    R600_OUT_BATCH(mmSQ_VTX_BASE_VTX_LOC - ASIC_CTL_CONST_BASE_INDEX);
     R600_OUT_BATCH(0);
 
     R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 1));
@@ -431,17 +477,37 @@ GLboolean r700SendContextStates(context_t *context)
         };
         END_BATCH();
     };
+
+    /* todo:
+     * - split this into a separate function?
+     * - only emit the ones we use
+     */
+    BEGIN_BATCH_NO_AUTOSTATE(2 + R700_MAX_SHADER_EXPORTS);
+    R600_OUT_BATCH_REGSEQ(SPI_PS_INPUT_CNTL_0, R700_MAX_SHADER_EXPORTS);
+    for(ui = 0; ui < R700_MAX_SHADER_EXPORTS; ui++)
+           R600_OUT_BATCH(r700->SPI_PS_INPUT_CNTL[ui].u32All);
+    END_BATCH();
+
+    if (context->radeon.radeonScreen->chip_family > CHIP_FAMILY_R600) {
+           for (ui = 0; ui < R700_MAX_RENDER_TARGETS; ui++) {
+                   if (r700->render_target[ui].enabled) {
+                           BEGIN_BATCH_NO_AUTOSTATE(3);
+                           R600_OUT_BATCH_REGVAL(CB_BLEND0_CONTROL + (4 * ui),
+                                                 r700->render_target[ui].CB_BLEND0_CONTROL.u32All);
+                           END_BATCH();
+                   }
+           }
+    }
+
     COMMIT_BATCH();
 
     return GL_TRUE;
 }
 
-
-GLboolean r700SendDepthTargetState(context_t *context, int id)
+GLboolean r700SendDepthTargetState(context_t *context)
 {
        R700_CHIP_CONTEXT *r700 = R700_CONTEXT_STATES(context);
        struct radeon_renderbuffer *rrb;
-       offset_modifiers offset_mod;
        BATCH_LOCALS(&context->radeon);
 
        rrb = radeon_get_depthbuffer(&context->radeon);
@@ -450,42 +516,25 @@ GLboolean r700SendDepthTargetState(context_t *context, int id)
                return GL_FALSE;
        }
 
-       offset_mod.shift     = NO_SHIFT;
-       offset_mod.shiftbits = 0;
-       offset_mod.mask      = 0xFFFFFFFF;
-
-        BEGIN_BATCH_NO_AUTOSTATE(9);
+        BEGIN_BATCH_NO_AUTOSTATE(8);
        R600_OUT_BATCH_REGSEQ(DB_DEPTH_SIZE, 2);
        R600_OUT_BATCH(r700->DB_DEPTH_SIZE.u32All);
        R600_OUT_BATCH(r700->DB_DEPTH_VIEW.u32All);
-       R600_OUT_BATCH_REGSEQ(DB_DEPTH_BASE, 3);
+       R600_OUT_BATCH_REGSEQ(DB_DEPTH_BASE, 2);
        R600_OUT_BATCH_RELOC(r700->DB_DEPTH_BASE.u32All,
                             rrb->bo,
                             r700->DB_DEPTH_BASE.u32All,
-                            0, RADEON_GEM_DOMAIN_VRAM, 0, &offset_mod);
+                            0, RADEON_GEM_DOMAIN_VRAM, 0);
        R600_OUT_BATCH(r700->DB_DEPTH_INFO.u32All);
-       R600_OUT_BATCH(r700->DB_HTILE_DATA_BASE.u32All);
         END_BATCH();
 
-        BEGIN_BATCH_NO_AUTOSTATE(24);
-       R600_OUT_BATCH_REGSEQ(DB_STENCIL_CLEAR, 2);
-       R600_OUT_BATCH(r700->DB_STENCIL_CLEAR.u32All);
-       R600_OUT_BATCH(r700->DB_DEPTH_CLEAR.u32All);
-
-       R600_OUT_BATCH_REGSEQ(DB_STENCILREFMASK, 2);
-       R600_OUT_BATCH(r700->DB_STENCILREFMASK.u32All);
-       R600_OUT_BATCH(r700->DB_STENCILREFMASK_BF.u32All);
-
-       R600_OUT_BATCH_REGVAL(DB_DEPTH_CONTROL, r700->DB_DEPTH_CONTROL.u32All);
-       R600_OUT_BATCH_REGVAL(DB_SHADER_CONTROL, r700->DB_SHADER_CONTROL.u32All);
-
-       R600_OUT_BATCH_REGSEQ(DB_RENDER_CONTROL, 2);
-       R600_OUT_BATCH(r700->DB_RENDER_CONTROL.u32All);
-       R600_OUT_BATCH(r700->DB_RENDER_OVERRIDE.u32All);
-
-       R600_OUT_BATCH_REGVAL(DB_HTILE_SURFACE, r700->DB_HTILE_SURFACE.u32All);
-       R600_OUT_BATCH_REGVAL(DB_ALPHA_TO_MASK, r700->DB_ALPHA_TO_MASK.u32All);
-        END_BATCH();
+       if ((context->radeon.radeonScreen->chip_family > CHIP_FAMILY_R600) &&
+           (context->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV770)) {
+               BEGIN_BATCH_NO_AUTOSTATE(2);
+               R600_OUT_BATCH(CP_PACKET3(R600_IT_SURFACE_BASE_UPDATE, 0));
+               R600_OUT_BATCH(1 << 0);
+               END_BATCH();
+       }
 
        COMMIT_BATCH();
 
@@ -499,7 +548,6 @@ GLboolean r700SendRenderTargetState(context_t *context, int id)
 {
        R700_CHIP_CONTEXT *r700 = R700_CONTEXT_STATES(context);
        struct radeon_renderbuffer *rrb;
-       offset_modifiers offset_mod;
        BATCH_LOCALS(&context->radeon);
 
        rrb = radeon_get_colorbuffer(&context->radeon);
@@ -514,16 +562,12 @@ GLboolean r700SendRenderTargetState(context_t *context, int id)
        if (!r700->render_target[id].enabled)
                return GL_FALSE;
 
-       offset_mod.shift     = NO_SHIFT;
-       offset_mod.shiftbits = 0;
-       offset_mod.mask      = 0xFFFFFFFF;
-
         BEGIN_BATCH_NO_AUTOSTATE(3);
        R600_OUT_BATCH_REGSEQ(CB_COLOR0_BASE + (4 * id), 1);
        R600_OUT_BATCH_RELOC(r700->render_target[id].CB_COLOR0_BASE.u32All,
                             rrb->bo,
                             r700->render_target[id].CB_COLOR0_BASE.u32All,
-                            0, RADEON_GEM_DOMAIN_VRAM, 0, &offset_mod);
+                            0, RADEON_GEM_DOMAIN_VRAM, 0);
         END_BATCH();
 
        if ((context->radeon.radeonScreen->chip_family > CHIP_FAMILY_R600) &&
@@ -543,12 +587,6 @@ GLboolean r700SendRenderTargetState(context_t *context, int id)
        R600_OUT_BATCH_REGVAL(CB_COLOR0_MASK + (4 * id), r700->render_target[id].CB_COLOR0_MASK.u32All);
         END_BATCH();
 
-       if (context->radeon.radeonScreen->chip_family > CHIP_FAMILY_R600) {
-               BEGIN_BATCH_NO_AUTOSTATE(3);
-               R600_OUT_BATCH_REGVAL(CB_BLEND0_CONTROL + (4 * id), r700->render_target[id].CB_BLEND0_CONTROL.u32All);
-               END_BATCH();
-       }
-
        COMMIT_BATCH();
 
        r700SyncSurf(context, rrb->bo, 0, RADEON_GEM_DOMAIN_VRAM,
@@ -560,16 +598,13 @@ GLboolean r700SendRenderTargetState(context_t *context, int id)
 GLboolean r700SendPSState(context_t *context)
 {
        R700_CHIP_CONTEXT *r700 = R700_CONTEXT_STATES(context);
-       struct radeon_renderbuffer *rrb;
        struct radeon_bo * pbo;
-       offset_modifiers offset_mod;
        BATCH_LOCALS(&context->radeon);
 
        pbo = (struct radeon_bo *)r700GetActiveFpShaderBo(GL_CONTEXT(context));
 
-       offset_mod.shift     = NO_SHIFT;
-       offset_mod.shiftbits = 0;
-       offset_mod.mask      = 0xFFFFFFFF;
+       if (!pbo)
+               return GL_FALSE;
 
        r700SyncSurf(context, pbo, RADEON_GEM_DOMAIN_GTT, 0, SH_ACTION_ENA_bit);
 
@@ -578,7 +613,7 @@ GLboolean r700SendPSState(context_t *context)
        R600_OUT_BATCH_RELOC(r700->ps.SQ_PGM_START_PS.u32All,
                             pbo,
                             r700->ps.SQ_PGM_START_PS.u32All,
-                            RADEON_GEM_DOMAIN_GTT, 0, 0, &offset_mod);
+                            RADEON_GEM_DOMAIN_GTT, 0, 0);
        END_BATCH();
 
         BEGIN_BATCH_NO_AUTOSTATE(9);
@@ -595,16 +630,13 @@ GLboolean r700SendPSState(context_t *context)
 GLboolean r700SendVSState(context_t *context)
 {
        R700_CHIP_CONTEXT *r700 = R700_CONTEXT_STATES(context);
-       struct radeon_renderbuffer *rrb;
        struct radeon_bo * pbo;
-       offset_modifiers offset_mod;
        BATCH_LOCALS(&context->radeon);
 
        pbo = (struct radeon_bo *)r700GetActiveVpShaderBo(GL_CONTEXT(context));
 
-       offset_mod.shift     = NO_SHIFT;
-       offset_mod.shiftbits = 0;
-       offset_mod.mask      = 0xFFFFFFFF;
+       if (!pbo)
+               return GL_FALSE;
 
        r700SyncSurf(context, pbo, RADEON_GEM_DOMAIN_GTT, 0, SH_ACTION_ENA_bit);
 
@@ -613,7 +645,7 @@ GLboolean r700SendVSState(context_t *context)
        R600_OUT_BATCH_RELOC(r700->vs.SQ_PGM_START_VS.u32All,
                             pbo,
                             r700->vs.SQ_PGM_START_VS.u32All,
-                            RADEON_GEM_DOMAIN_GTT, 0, 0, &offset_mod);
+                            RADEON_GEM_DOMAIN_GTT, 0, 0);
        END_BATCH();
 
         BEGIN_BATCH_NO_AUTOSTATE(6);
@@ -629,9 +661,7 @@ GLboolean r700SendVSState(context_t *context)
 GLboolean r700SendFSState(context_t *context)
 {
        R700_CHIP_CONTEXT *r700 = R700_CONTEXT_STATES(context);
-       struct radeon_renderbuffer *rrb;
        struct radeon_bo * pbo;
-       offset_modifiers offset_mod;
        BATCH_LOCALS(&context->radeon);
 
        /* XXX fixme
@@ -645,9 +675,8 @@ GLboolean r700SendFSState(context_t *context)
        r700->fs.SQ_PGM_CF_OFFSET_FS.u32All = 0;
        /* XXX */
 
-       offset_mod.shift     = NO_SHIFT;
-       offset_mod.shiftbits = 0;
-       offset_mod.mask      = 0xFFFFFFFF;
+       if (!pbo)
+               return GL_FALSE;
 
        r700SyncSurf(context, pbo, RADEON_GEM_DOMAIN_GTT, 0, SH_ACTION_ENA_bit);
 
@@ -656,7 +685,7 @@ GLboolean r700SendFSState(context_t *context)
        R600_OUT_BATCH_RELOC(r700->fs.SQ_PGM_START_FS.u32All,
                             pbo,
                             r700->fs.SQ_PGM_START_FS.u32All,
-                            RADEON_GEM_DOMAIN_GTT, 0, 0, &offset_mod);
+                            RADEON_GEM_DOMAIN_GTT, 0, 0);
        END_BATCH();
 
         BEGIN_BATCH_NO_AUTOSTATE(6);
@@ -672,8 +701,6 @@ GLboolean r700SendFSState(context_t *context)
 GLboolean r700SendViewportState(context_t *context, int id)
 {
        R700_CHIP_CONTEXT *r700 = R700_CONTEXT_STATES(context);
-       struct radeon_renderbuffer *rrb;
-       offset_modifiers offset_mod;
        BATCH_LOCALS(&context->radeon);
 
        if (id > R700_MAX_VIEWPORTS)
@@ -722,3 +749,25 @@ GLboolean r700SendSQConfig(context_t *context)
        return GL_TRUE;
 }
 
+GLboolean r700SendUCPState(context_t *context)
+{
+       R700_CHIP_CONTEXT *r700 = R700_CONTEXT_STATES(context);
+       BATCH_LOCALS(&context->radeon);
+       int i;
+
+       for (i = 0; i < R700_MAX_UCP; i++) {
+               if (r700->ucp[i].enabled) {
+                       BEGIN_BATCH_NO_AUTOSTATE(6);
+                       R600_OUT_BATCH_REGSEQ(PA_CL_UCP_0_X + (16 * i), 4);
+                       R600_OUT_BATCH(r700->ucp[i].PA_CL_UCP_0_X.u32All);
+                       R600_OUT_BATCH(r700->ucp[i].PA_CL_UCP_0_Y.u32All);
+                       R600_OUT_BATCH(r700->ucp[i].PA_CL_UCP_0_Z.u32All);
+                       R600_OUT_BATCH(r700->ucp[i].PA_CL_UCP_0_W.u32All);
+                       END_BATCH();
+                       COMMIT_BATCH();
+               }
+       }
+
+       return GL_TRUE;
+}
+
index 04af4bc..4e89c75 100644 (file)
@@ -372,6 +372,7 @@ typedef struct _R700_CHIP_CONTEXT
        // SX
        union UINT_FLOAT                SX_MISC                   ;  /* 0xA0D4 */
        union UINT_FLOAT                SX_ALPHA_TEST_CONTROL     ;  /* 0xA104 */
+       union UINT_FLOAT                SX_ALPHA_REF              ;  /* 0xA10E */
 
        // VGT
        union UINT_FLOAT                VGT_MAX_VTX_INDX          ;  /* 0xA100 */
@@ -392,7 +393,6 @@ typedef struct _R700_CHIP_CONTEXT
        union UINT_FLOAT                VGT_GROUP_VECT_1_FMT_CNTL ;  /* 0xA28F */
        union UINT_FLOAT                VGT_GS_MODE               ;  /* 0xA290 */
        union UINT_FLOAT                VGT_PRIMITIVEID_EN        ;  /* 0xA2A1 */
-       union UINT_FLOAT                VGT_DMA_NUM_INSTANCES     ;  /* 0xA2A2 */
        union UINT_FLOAT                VGT_MULTI_PRIM_IB_RESET_EN;  /* 0xA2A5 */
        union UINT_FLOAT                VGT_INSTANCE_STEP_RATE_0  ;  /* 0xA2A8 */
        union UINT_FLOAT                VGT_INSTANCE_STEP_RATE_1  ;  /* 0xA2A9 */
@@ -422,7 +422,7 @@ typedef struct _R700_CHIP_CONTEXT
        union UINT_FLOAT                SPI_FOG_FUNC_SCALE        ;  /* 0xA1B8 */
        union UINT_FLOAT                SPI_FOG_FUNC_BIAS         ;  /* 0xA1B9 */
 
-    union UINT_FLOAT           SQ_VTX_SEMANTIC_0         ;  /* 0xA0E0 */
+       union UINT_FLOAT                SQ_VTX_SEMANTIC_0         ;  /* 0xA0E0 */
        union UINT_FLOAT                SQ_VTX_SEMANTIC_1         ;  /* 0xA0E1 */
        union UINT_FLOAT                SQ_VTX_SEMANTIC_2         ;  /* 0xA0E2 */
        union UINT_FLOAT                SQ_VTX_SEMANTIC_3         ;  /* 0xA0E3 */
@@ -455,38 +455,7 @@ typedef struct _R700_CHIP_CONTEXT
        union UINT_FLOAT                SQ_VTX_SEMANTIC_30        ;  /* 0xA0FE */
        union UINT_FLOAT                SQ_VTX_SEMANTIC_31        ;  /* 0xA0FF */
 
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_0       ;  /* 0xA191 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_1       ;  /* 0xA192 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_2       ;  /* 0xA193 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_3       ;  /* 0xA194 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_4       ;  /* 0xA195 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_5       ;  /* 0xA196 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_6       ;  /* 0xA197 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_7       ;  /* 0xA198 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_8       ;  /* 0xA199 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_9       ;  /* 0xA19A */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_10      ;  /* 0xA19B */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_11      ;  /* 0xA19C */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_12      ;  /* 0xA19D */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_13      ;  /* 0xA19E */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_14      ;  /* 0xA19F */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_15      ;  /* 0xA1A0 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_16      ;  /* 0xA1A1 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_17      ;  /* 0xA1A2 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_18      ;  /* 0xA1A3 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_19      ;  /* 0xA1A4 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_20      ;  /* 0xA1A5 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_21      ;  /* 0xA1A6 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_22      ;  /* 0xA1A7 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_23      ;  /* 0xA1A8 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_24      ;  /* 0xA1A9 */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_25      ;  /* 0xA1AA */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_26      ;  /* 0xA1AB */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_27      ;  /* 0xA1AC */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_28      ;  /* 0xA1AD */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_29      ;  /* 0xA1AE */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_30      ;  /* 0xA1AF */
-       union UINT_FLOAT        SPI_PS_INPUT_CNTL_31      ;  /* 0xA1B0 */
+       union UINT_FLOAT        SPI_PS_INPUT_CNTL[R700_MAX_SHADER_EXPORTS];
 
        // shaders
        PS_STATE_STRUCT                 ps;
index e84be38..05d4af3 100644 (file)
@@ -31,6 +31,7 @@
 #include "main/imports.h"
 #include "main/mtypes.h"
 #include "main/enums.h"
+#include "swrast/swrast.h"
 
 #include "radeon_lock.h"
 #include "r600_context.h"
index 44de2ae..6249bde 100644 (file)
@@ -55,6 +55,12 @@ void Map_Fragment_Program(r700_AssemblerBase         *pAsm,
 //Input mapping : mesa_fp->Base.InputsRead set the flag, set in 
        //The flags parsed in parse_attrib_binding. FRAG_ATTRIB_COLx, FRAG_ATTRIB_TEXx, ...
        //MUST match order in Map_Vertex_Output
+       unBit = 1 << FRAG_ATTRIB_WPOS;
+       if(mesa_fp->Base.InputsRead & unBit)
+       {
+               pAsm->uiFP_AttributeMap[FRAG_ATTRIB_WPOS] = pAsm->number_used_registers++;
+       }
+
        unBit = 1 << FRAG_ATTRIB_COL0;
        if(mesa_fp->Base.InputsRead & unBit)
        {
@@ -67,6 +73,12 @@ void Map_Fragment_Program(r700_AssemblerBase         *pAsm,
                pAsm->uiFP_AttributeMap[FRAG_ATTRIB_COL1] = pAsm->number_used_registers++;
        }
 
+        unBit = 1 << FRAG_ATTRIB_FOGC;
+        if(mesa_fp->Base.InputsRead & unBit)
+        {
+                pAsm->uiFP_AttributeMap[FRAG_ATTRIB_FOGC] = pAsm->number_used_registers++;
+        }
+
        for(i=0; i<8; i++)
        {
                unBit = 1 << (FRAG_ATTRIB_TEX0 + i);
@@ -106,6 +118,7 @@ void Map_Fragment_Program(r700_AssemblerBase         *pAsm,
                pAsm->uiFP_OutputMap[FRAG_RESULT_DEPTH] = pAsm->number_used_registers++;
                pAsm->number_of_exports++;
                pAsm->number_of_colorandz_exports++;
+               pAsm->pR700Shader->depthIsExported = 1;
        }
 
     pAsm->pucOutMask = (unsigned char*) MALLOC(pAsm->number_of_exports);    
@@ -255,20 +268,19 @@ void * r700GetActiveFpShaderBo(GLcontext * ctx)
 
 GLboolean r700SetupFragmentProgram(GLcontext * ctx)
 {
-    context_t *context = R700_CONTEXT(ctx);   
-    BATCH_LOCALS(&context->radeon);
-    
+    context_t *context = R700_CONTEXT(ctx);
     R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
-
+    BATCH_LOCALS(&context->radeon);
     struct r700_fragment_program *fp = (struct r700_fragment_program *)
                                           (ctx->FragmentProgram._Current);
-
+    r700_AssemblerBase         *pAsm = &(fp->r700AsmCode);
+    struct gl_fragment_program *mesa_fp = &(fp->mesa_program);
     struct gl_program_parameter_list *paramList;
     unsigned int unNumParamData;
-    unsigned int ui;
-
+    unsigned int ui, i;
     unsigned int unNumOfReg;
-    
+    unsigned int unBit;
+
     if(GL_FALSE == fp->loaded)
     {
         if(fp->r700Shader.bNeedsAssembly == GL_TRUE)
@@ -277,11 +289,11 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
            }
 
         /* Load fp to gpu */
-        r600EmitShader(ctx, 
-                       &(fp->shaderbo), 
+        r600EmitShader(ctx,
+                       &(fp->shaderbo),
                        (GLvoid *)(fp->r700Shader.pProgram),
                        fp->r700Shader.uShaderBinaryDWORDSize,
-                       "FS");                                          
+                       "FS");
 
         fp->loaded = GL_TRUE;
     }
@@ -299,7 +311,17 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
 
     ui = (r700->SPI_PS_IN_CONTROL_0.u32All & NUM_INTERP_mask) / (1 << NUM_INTERP_shift);
 
-    ui = ui ? ui : unNumOfReg;
+    /* PS uses fragment.position */
+    if (mesa_fp->Base.InputsRead & (1 << FRAG_ATTRIB_WPOS))
+    {
+        ui += 1;
+        SETfield(r700->SPI_PS_IN_CONTROL_0.u32All, ui, NUM_INTERP_shift, NUM_INTERP_mask);
+        SETfield(r700->SPI_PS_IN_CONTROL_0.u32All, CENTERS_ONLY, BARYC_SAMPLE_CNTL_shift, BARYC_SAMPLE_CNTL_mask);
+        SETbit(r700->SPI_PS_IN_CONTROL_0.u32All, POSITION_ENA_bit);
+        SETbit(r700->SPI_INPUT_Z.u32All, PROVIDE_Z_TO_SPI_bit);
+    }
+
+    ui = (unNumOfReg < ui) ? ui : unNumOfReg;
 
     SETfield(r700->ps.SQ_PGM_RESOURCES_PS.u32All, ui, NUM_GPRS_shift, NUM_GPRS_mask); 
     
@@ -333,7 +355,6 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
     }
 
     /* sent out shader constants. */
-
     paramList = fp->mesa_program.Base.Parameters;
 
     if(NULL != paramList)
@@ -343,7 +364,7 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
         unNumParamData = paramList->NumParameters * 4;
 
         BEGIN_BATCH_NO_AUTOSTATE(2 + unNumParamData);
-        
+
         R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_ALU_CONST, unNumParamData));
 
         /* assembler map const from very beginning. */
@@ -362,8 +383,72 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
         COMMIT_BATCH();
     }
 
-    return GL_TRUE;
-}
+    // emit ps input map
+    unBit = 1 << FRAG_ATTRIB_WPOS;
+    if(mesa_fp->Base.InputsRead & unBit)
+    {
+            ui = pAsm->uiFP_AttributeMap[FRAG_ATTRIB_WPOS];
+            SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, SEL_CENTROID_bit);
+            SETfield(r700->SPI_PS_INPUT_CNTL[ui].u32All, ui,
+                     SEMANTIC_shift, SEMANTIC_mask);
+            if (r700->SPI_INTERP_CONTROL_0.u32All & FLAT_SHADE_ENA_bit)
+                    SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
+            else
+                    CLEARbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
+    }
+
+    unBit = 1 << FRAG_ATTRIB_COL0;
+    if(mesa_fp->Base.InputsRead & unBit)
+    {
+           ui = pAsm->uiFP_AttributeMap[FRAG_ATTRIB_COL0];
+           SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, SEL_CENTROID_bit);
+           SETfield(r700->SPI_PS_INPUT_CNTL[ui].u32All, ui,
+                    SEMANTIC_shift, SEMANTIC_mask);
+           if (r700->SPI_INTERP_CONTROL_0.u32All & FLAT_SHADE_ENA_bit)
+                   SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
+           else
+                   CLEARbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
+    }
+
+    unBit = 1 << FRAG_ATTRIB_COL1;
+    if(mesa_fp->Base.InputsRead & unBit)
+    {
+           ui = pAsm->uiFP_AttributeMap[FRAG_ATTRIB_COL1];
+           SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, SEL_CENTROID_bit);
+           SETfield(r700->SPI_PS_INPUT_CNTL[ui].u32All, ui,
+                    SEMANTIC_shift, SEMANTIC_mask);
+           if (r700->SPI_INTERP_CONTROL_0.u32All & FLAT_SHADE_ENA_bit)
+                   SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
+           else
+                   CLEARbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
+    }
 
+    unBit = 1 << FRAG_ATTRIB_FOGC;
+    if(mesa_fp->Base.InputsRead & unBit)
+    {
+            ui = pAsm->uiFP_AttributeMap[FRAG_ATTRIB_FOGC];
+            SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, SEL_CENTROID_bit);
+            SETfield(r700->SPI_PS_INPUT_CNTL[ui].u32All, ui,
+                     SEMANTIC_shift, SEMANTIC_mask);
+            if (r700->SPI_INTERP_CONTROL_0.u32All & FLAT_SHADE_ENA_bit)
+                    SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
+            else
+                    CLEARbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
+    }
+
+    for(i=0; i<8; i++)
+    {
+           unBit = 1 << (FRAG_ATTRIB_TEX0 + i);
+           if(mesa_fp->Base.InputsRead & unBit)
+           {
+                   ui = pAsm->uiFP_AttributeMap[FRAG_ATTRIB_TEX0 + i];
+                   SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, SEL_CENTROID_bit);
+                   SETfield(r700->SPI_PS_INPUT_CNTL[ui].u32All, ui,
+                            SEMANTIC_shift, SEMANTIC_mask);
+                   CLEARbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
+           }
+    }
 
+    return GL_TRUE;
+}
 
index c479532..23cc128 100644 (file)
@@ -43,7 +43,6 @@
 static void r700Flush(GLcontext *ctx)
 {
        radeonContextPtr radeon = RADEON_CONTEXT(ctx);
-    context_t *     context = R700_CONTEXT(ctx);
 
        if (RADEON_DEBUG & DEBUG_IOCTL)
                fprintf(stderr, "%s %d\n", __FUNCTION__, radeon->cmdbuf.cs->cdw);
@@ -59,7 +58,7 @@ static void r700Flush(GLcontext *ctx)
        if (radeon->dma.flush)
                radeon->dma.flush( ctx );
 
-       r700SendContextStates(context);
+       r700EmitState(ctx);
 
        if (radeon->cmdbuf.cs->cdw)
                rcommonFlushCmdBuf(radeon, __FUNCTION__);
index 36de143..c49b90c 100644 (file)
@@ -33,6 +33,7 @@
 #include "tnl/tnl.h"
 
 #include "r600_context.h"
+#include "r600_emit.h"
 
 #include "r700_oglprog.h"
 #include "r700_fragprog.h"
@@ -87,7 +88,6 @@ static void r700DeleteProgram(GLcontext * ctx, struct gl_program *prog)
 {
     struct r700_vertex_program   * vp;
     struct r700_fragment_program * fp;
-    context_t *context = R700_CONTEXT(ctx);
 
     switch (prog->Target) 
     {
index f1e467a..6985bd4 100644 (file)
@@ -44,7 +44,6 @@
 #include "tnl/t_vertex.h"
 #include "tnl/t_pipeline.h"
 
-#include "radeon_mipmap_tree.h"
 #include "r600_context.h"
 #include "r600_cmdbuf.h"
 
@@ -58,7 +57,7 @@ void r700WaitForIdle(context_t *context);
 void r700WaitForIdleClean(context_t *context);
 void r700Start3D(context_t *context);
 GLboolean r700SendTextureState(context_t *context);
-unsigned int r700PrimitiveType(int prim);
+static unsigned int r700PrimitiveType(int prim);
 void r600UpdateTextureState(GLcontext * ctx);
 GLboolean r700SyncSurf(context_t *context,
                       struct radeon_bo *pbo,
@@ -138,59 +137,15 @@ static GLboolean r700SetupShaders(GLcontext * ctx)
     exportCount = (r700->ps.SQ_PGM_EXPORTS_PS.u32All & EXPORT_MODE_mask) / (1 << EXPORT_MODE_shift);
     r700->CB_SHADER_CONTROL.u32All = (1 << exportCount) - 1;
 
-    return GL_TRUE;
-}
+    r600UpdateTextureState(ctx);
 
-GLboolean r700SendTextureState(context_t *context)
-{
-    unsigned int i;
-    R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
-    offset_modifiers offset_mod = {NO_SHIFT, 0, 0xFFFFFFFF};
-    struct radeon_bo *bo = NULL;
-    BATCH_LOCALS(&context->radeon);
+    r700SendFSState(context); // FIXME just a place holder for now
+    r700SendPSState(context);
+    r700SendVSState(context);
+
+    r700SendTextureState(context);
+    r700SetupStreams(ctx);
 
-    for (i=0; i<R700_TEXTURE_NUMBERUNITS; i++) {
-           radeonTexObj *t = r700->textures[i];
-           if (t) {
-                   if (!t->image_override)
-                           bo = t->mt->bo;
-                   else
-                           bo = t->bo;
-                   if (bo) {
-
-                           r700SyncSurf(context, bo,
-                                        RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM,
-                                        0, TC_ACTION_ENA_bit);
-
-                           BEGIN_BATCH_NO_AUTOSTATE(9);
-                           R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE, 7));
-                           R600_OUT_BATCH(i * 7);
-                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE0);
-                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE1);
-                           R600_OUT_BATCH_RELOC(r700->textures[i]->SQ_TEX_RESOURCE2,
-                                                bo,
-                                                0,
-                                                RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0, &offset_mod);
-                           R600_OUT_BATCH_RELOC(r700->textures[i]->SQ_TEX_RESOURCE3,
-                                                bo,
-                                                0,
-                                                RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0, &offset_mod);
-                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE4);
-                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE5);
-                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE6);
-                           END_BATCH();
-
-                           BEGIN_BATCH_NO_AUTOSTATE(5);
-                           R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_SAMPLER, 3));
-                           R600_OUT_BATCH(i * 3);
-                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_SAMPLER0);
-                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_SAMPLER1);
-                           R600_OUT_BATCH(r700->textures[i]->SQ_TEX_SAMPLER2);
-                           END_BATCH();
-                           COMMIT_BATCH();
-                   }
-           }
-    }
     return GL_TRUE;
 }
 
@@ -202,17 +157,15 @@ GLboolean r700SyncSurf(context_t *context,
 {
     BATCH_LOCALS(&context->radeon);
     uint32_t cp_coher_size;
-    offset_modifiers offset_mod;
+
+    if (!pbo)
+           return GL_FALSE;
 
     if (pbo->size == 0xffffffff)
            cp_coher_size = 0xffffffff;
     else
            cp_coher_size = ((pbo->size + 255) >> 8);
 
-    offset_mod.shift     = NO_SHIFT;
-    offset_mod.shiftbits = 0;
-    offset_mod.mask      = 0xFFFFFFFF;
-
     BEGIN_BATCH_NO_AUTOSTATE(5);
     R600_OUT_BATCH(CP_PACKET3(R600_IT_SURFACE_SYNC, 3));
     R600_OUT_BATCH(sync_type);
@@ -220,7 +173,7 @@ GLboolean r700SyncSurf(context_t *context,
     R600_OUT_BATCH_RELOC(0,
                         pbo,
                         0,
-                        read_domain, write_domain, 0, &offset_mod); // ???
+                        read_domain, write_domain, 0); // ???
     R600_OUT_BATCH(10);
 
     END_BATCH();
@@ -229,7 +182,7 @@ GLboolean r700SyncSurf(context_t *context,
     return GL_TRUE;
 }
 
-unsigned int r700PrimitiveType(int prim)
+static unsigned int r700PrimitiveType(int prim)
 {
     switch (prim & PRIM_MODE_MASK)
     {
@@ -270,119 +223,163 @@ unsigned int r700PrimitiveType(int prim)
     }
 }
 
-static GLboolean r700RunRender(GLcontext * ctx,
-                                          struct tnl_pipeline_stage *stage)
+static int r700NumVerts(int num_verts, int prim)
 {
-    context_t *context = R700_CONTEXT(ctx);
-    R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
-    int lastIndex = 0;
-#if 1
-    BATCH_LOCALS(&context->radeon);
-
-    unsigned int i, j;
-    TNLcontext *tnl = TNL_CONTEXT(ctx);
-    struct vertex_buffer *vb = &tnl->vb;
-
-    struct r700_fragment_program *fp = (struct r700_fragment_program *)
-                                          (ctx->FragmentProgram._Current);
-    if (context->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV770)
-    {
-        fp->r700AsmCode.bR6xx = 1;
-    }
-
-    r700Start3D(context); /* TODO : this is too much. */
+       int verts_off = 0;
+
+       switch (prim & PRIM_MODE_MASK) {
+       case GL_POINTS:
+               verts_off = 0;
+               break;
+       case GL_LINES:
+               verts_off = num_verts % 2;
+               break;
+       case GL_LINE_STRIP:
+               if (num_verts < 2)
+                       verts_off = num_verts;
+               break;
+       case GL_LINE_LOOP:
+               if (num_verts < 2)
+                       verts_off = num_verts;
+               break;
+       case GL_TRIANGLES:
+               verts_off = num_verts % 3;
+               break;
+       case GL_TRIANGLE_STRIP:
+               if (num_verts < 3)
+                       verts_off = num_verts;
+               break;
+       case GL_TRIANGLE_FAN:
+               if (num_verts < 3)
+                       verts_off = num_verts;
+               break;
+       case GL_QUADS:
+               verts_off = num_verts % 4;
+               break;
+       case GL_QUAD_STRIP:
+               if (num_verts < 4)
+                       verts_off = num_verts;
+               else
+                       verts_off = num_verts % 2;
+               break;
+       case GL_POLYGON:
+               if (num_verts < 3)
+                       verts_off = num_verts;
+               break;
+       default:
+               assert(0);
+               return -1;
+               break;
+       }
+
+       return num_verts - verts_off;
+}
 
-    r700SendSQConfig(context);
+static void r700RunRenderPrimitive(GLcontext * ctx, int start, int end, int prim)
+{
+       context_t *context = R700_CONTEXT(ctx);
+       BATCH_LOCALS(&context->radeon);
+       int type, i, total_emit;
+       int num_indices;
+       uint32_t vgt_draw_initiator = 0;
+       uint32_t vgt_index_type     = 0;
+       uint32_t vgt_primitive_type = 0;
+       uint32_t vgt_num_indices    = 0;
+
+       type = r700PrimitiveType(prim);
+       num_indices = r700NumVerts(end - start, prim);
+
+       if (type < 0 || num_indices <= 0)
+               return;
+
+        total_emit =   3 /* VGT_PRIMITIVE_TYPE */
+                    + 2 /* VGT_INDEX_TYPE */
+                    + 2 /* NUM_INSTANCES */
+                     + num_indices + 3; /* DRAW_INDEX_IMMD */
+
+        BEGIN_BATCH_NO_AUTOSTATE(total_emit);
+       // prim
+        SETfield(vgt_primitive_type, type,
+                VGT_PRIMITIVE_TYPE__PRIM_TYPE_shift, VGT_PRIMITIVE_TYPE__PRIM_TYPE_mask);
+        R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CONFIG_REG, 1));
+        R600_OUT_BATCH(mmVGT_PRIMITIVE_TYPE - ASIC_CONFIG_BASE_INDEX);
+        R600_OUT_BATCH(vgt_primitive_type);
 
-    r700UpdateShaders(ctx);
+       // index type
+        SETfield(vgt_index_type, DI_INDEX_SIZE_32_BIT, INDEX_TYPE_shift, INDEX_TYPE_mask);
+        R600_OUT_BATCH(CP_PACKET3(R600_IT_INDEX_TYPE, 0));
+        R600_OUT_BATCH(vgt_index_type);
 
-    r700SetScissor(context);
-    r700SetRenderTarget(context, 0);
-    r700SetDepthTarget(context);
+       // num instances
+       R600_OUT_BATCH(CP_PACKET3(R600_IT_NUM_INSTANCES, 0));
+        R600_OUT_BATCH(1);
 
-    if(r700SetupStreams(ctx))
-    {
-        return GL_TRUE;
-    }
+       // draw packet
+        vgt_num_indices = num_indices;
+        SETfield(vgt_draw_initiator, DI_SRC_SEL_IMMEDIATE, SOURCE_SELECT_shift, SOURCE_SELECT_mask);
+       SETfield(vgt_draw_initiator, DI_MAJOR_MODE_0, MAJOR_MODE_shift, MAJOR_MODE_mask);
 
-    r600UpdateTextureState(ctx);
-    r700SendTextureState(context);
+        R600_OUT_BATCH(CP_PACKET3(R600_IT_DRAW_INDEX_IMMD, (num_indices + 1)));
+        R600_OUT_BATCH(vgt_num_indices);
+        R600_OUT_BATCH(vgt_draw_initiator);
 
-    if(GL_FALSE == fp->translated)
-    {
-        if( GL_FALSE == r700TranslateFragmentShader(fp, &(fp->mesa_program)) )
-        {
-            return GL_TRUE;
+        for (i = start; i < (start + num_indices); i++) {
+            R600_OUT_BATCH(i);
         }
-    }
+        END_BATCH();
+        COMMIT_BATCH();
 
-    r700SetupShaders(ctx);
+}
 
-    r700SendFSState(context); // FIXME just a place holder for now
-    r700SendPSState(context);
-    r700SendVSState(context);
+void r700EmitState(GLcontext * ctx)
+{
+       context_t *context = R700_CONTEXT(ctx);
+       radeonContextPtr radeon = &context->radeon;
 
-    r700SendContextStates(context);
-    r700SendViewportState(context, 0);
-    r700SendRenderTargetState(context, 0);
-    r700SendDepthTargetState(context);
+       if (radeon->cmdbuf.cs->cdw && !radeon->hw.is_dirty && !radeon->hw.all_dirty)
+               return;
 
-    /* richard test code */
-    for (i = 0; i < vb->PrimitiveCount; i++) 
-    {
-        GLuint prim = _tnl_translate_prim(&vb->Primitive[i]);
-        GLuint start = vb->Primitive[i].start;
-        GLuint end = vb->Primitive[i].start + vb->Primitive[i].count;
-        GLuint numIndices = vb->Primitive[i].count;
-        GLuint numEntires;
-
-        unsigned int VGT_DRAW_INITIATOR = 0;
-        unsigned int VGT_INDEX_TYPE     = 0;
-        unsigned int VGT_PRIMITIVE_TYPE = 0;
-        unsigned int VGT_NUM_INDICES    = 0;
-        
-        numEntires = 2 /* VGT_INDEX_TYPE */
-                     + 3 /* VGT_PRIMITIVE_TYPE */
-                     + numIndices + 3; /* DRAW_INDEX_IMMD */                  
-                     
-        BEGIN_BATCH_NO_AUTOSTATE(numEntires);  
-
-        VGT_INDEX_TYPE |= DI_INDEX_SIZE_32_BIT << INDEX_TYPE_shift;
+       rcommonEnsureCmdBufSpace(&context->radeon,
+                                context->radeon.hw.max_state_size, __FUNCTION__);
 
-        R600_OUT_BATCH(CP_PACKET3(R600_IT_INDEX_TYPE, 0));
-        R600_OUT_BATCH(VGT_INDEX_TYPE);
+       r700SendSQConfig(context);
 
-        VGT_NUM_INDICES = numIndices;
+       r700SendUCPState(context);
+       r700SendContextStates(context);
+       r700SendViewportState(context, 0);
+       r700SendRenderTargetState(context, 0);
+       r700SendDepthTargetState(context);
 
-        VGT_PRIMITIVE_TYPE |= r700PrimitiveType(prim) << VGT_PRIMITIVE_TYPE__PRIM_TYPE_shift;
-        R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CONFIG_REG, 1));
-        R600_OUT_BATCH(mmVGT_PRIMITIVE_TYPE - ASIC_CONFIG_BASE_INDEX);
-        R600_OUT_BATCH(VGT_PRIMITIVE_TYPE);
+}
 
-        VGT_DRAW_INITIATOR |= DI_SRC_SEL_IMMEDIATE << SOURCE_SELECT_shift;
-        VGT_DRAW_INITIATOR |= DI_MAJOR_MODE_0 << MAJOR_MODE_shift;
+static GLboolean r700RunRender(GLcontext * ctx,
+                                          struct tnl_pipeline_stage *stage)
+{
+    context_t *context = R700_CONTEXT(ctx);
+    unsigned int i;
+    TNLcontext *tnl = TNL_CONTEXT(ctx);
+    struct vertex_buffer *vb = &tnl->vb;
 
-        R600_OUT_BATCH(CP_PACKET3(R600_IT_DRAW_INDEX_IMMD, (numIndices + 1)));
-        R600_OUT_BATCH(VGT_NUM_INDICES);
-        R600_OUT_BATCH(VGT_DRAW_INITIATOR);
+    r700Start3D(context);
 
-        for (j = lastIndex; j < lastIndex + numIndices; j++)
-        {
-            R600_OUT_BATCH(j);
-        }
-        lastIndex += numIndices;
+    r700UpdateShaders(ctx);
+    r700SetScissor(context);
+    r700SetupShaders(ctx);
 
-        END_BATCH();
-        COMMIT_BATCH();
+    r700EmitState(ctx);
+
+    /* richard test code */
+    for (i = 0; i < vb->PrimitiveCount; i++) {
+        GLuint prim = _tnl_translate_prim(&vb->Primitive[i]);
+        GLuint start = vb->Primitive[i].start;
+        GLuint end = vb->Primitive[i].start + vb->Primitive[i].count;
+       r700RunRenderPrimitive(ctx, start, end, prim);
     }
 
     /* Flush render op cached for last several quads. */
     r700WaitForIdleClean(context);
 
-    radeonReleaseArrays(ctx, 0);
-
-#endif //0
-    rcommonFlushCmdBuf( &context->radeon, __FUNCTION__ );
+    radeonReleaseArrays(ctx, ~0);
 
     return GL_FALSE;
 }
@@ -410,10 +407,6 @@ static GLboolean r700RunTCLRender(GLcontext * ctx,  /*----------------------*/
         return GL_TRUE;
     }
 
-    context_t *context = R700_CONTEXT(ctx);
-
-    r700UpdateShaders(ctx);
-
     bRet = r700RunRender(ctx, stage);
 
     return bRet;
index eda224d..835b5e1 100644 (file)
@@ -30,6 +30,7 @@
 #include "main/imports.h"
 #include "main/enums.h"
 #include "main/macros.h"
+#include "main/context.h"
 #include "main/dd.h"
 #include "main/simple_list.h"
 
 #include "r700_vertprog.h"
 
 
+static void r700SetClipPlaneState(GLcontext * ctx, GLenum cap, GLboolean state);
+static void r700UpdatePolygonMode(GLcontext * ctx);
+static void r700SetPolygonOffsetState(GLcontext * ctx, GLboolean state);
+static void r700SetStencilState(GLcontext * ctx, GLboolean state);
+static void r700SetRenderTarget(context_t *context, int id);
+static void r700SetDepthTarget(context_t *context);
+
 void r700SetDefaultStates(context_t *context) //--------------------
 {
     
@@ -66,12 +74,28 @@ void r700UpdateShaders (GLcontext * ctx)  //----------------------------------
 
     GLvector4f dummy_attrib[_TNL_ATTRIB_MAX];
     GLvector4f *temp_attrib[_TNL_ATTRIB_MAX];
-
-    struct r700_vertex_program *vp;
-       int i;
+    int i;
+
+    if (ctx->FragmentProgram._Current) {
+           struct r700_fragment_program *fp = (struct r700_fragment_program *)
+                   (ctx->FragmentProgram._Current);
+           if (context->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV770)
+           {
+                   fp->r700AsmCode.bR6xx = 1;
+           }
+
+           if(GL_FALSE == fp->translated)
+           {
+                   if( GL_FALSE == r700TranslateFragmentShader(fp, &(fp->mesa_program)) )
+                   {
+                           //return GL_TRUE;
+                   }
+           }
+    }
 
     if (context->radeon.NewGLState) 
     {
+       struct r700_vertex_program *vp;
         context->radeon.NewGLState = 0;
 
         for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) 
@@ -113,10 +137,21 @@ void r700UpdateShaders (GLcontext * ctx)  //----------------------------------
  */
 void r700UpdateViewportOffset(GLcontext * ctx) //------------------
 {
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+       __DRIdrawablePrivate *dPriv = radeon_get_drawable(&context->radeon);
+       GLfloat xoffset = (GLfloat) dPriv->x;
+       GLfloat yoffset = (GLfloat) dPriv->y + dPriv->h;
+       const GLfloat *v = ctx->Viewport._WindowMap.m;
+       int id = 0;
 
-       //radeonUpdateScissor(ctx);
+       GLfloat tx = v[MAT_TX] + xoffset;
+       GLfloat ty = (-v[MAT_TY]) + yoffset;
 
-    return;
+       r700->viewport[id].PA_CL_VPORT_XOFFSET.f32All = tx;
+       r700->viewport[id].PA_CL_VPORT_YOFFSET.f32All = ty;
+
+       radeonUpdateScissor(ctx);
 }
 
 /**
@@ -125,29 +160,16 @@ void r700UpdateViewportOffset(GLcontext * ctx) //------------------
  */
 void r700UpdateDrawBuffer(GLcontext * ctx) /* TODO */ //---------------------
 {
-#if 0 /* to be enabled */
-    context_t *context = R700_CONTEXT(ctx);
+       context_t *context = R700_CONTEXT(ctx);
 
-    switch (ctx->DrawBuffer->_ColorDrawBufferIndexes[0]) 
-    {
-       case BUFFER_FRONT_LEFT:
-           context->target.rt = context->screen->frontBuffer;
-           break;
-       case BUFFER_BACK_LEFT:
-           context->target.rt = context->screen->backBuffer;
-           break;
-       default:
-           memset (&context->target.rt, sizeof(context->target.rt), 0);
-       }
-#endif /* to be enabled */
+       r700SetRenderTarget(context, 0);
+       r700SetDepthTarget(context);
 }
 
 static void r700FetchStateParameter(GLcontext * ctx,
                                                const gl_state_index state[STATE_LENGTH],
                                                GLfloat * value)
 {
-       context_t *context = R700_CONTEXT(ctx);
-
     /* TODO */
 }
 
@@ -257,40 +279,40 @@ static void r700SetDepthState(GLcontext * ctx)
 
         switch (ctx->Depth.Func)
         {
-        case GL_NEVER:            
-            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_NEVER, 
+        case GL_NEVER:
+            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_NEVER,
                      ZFUNC_shift, ZFUNC_mask);
             break;
         case GL_LESS:
-            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_LESS, 
-                     ZFUNC_shift, ZFUNC_mask);            
+            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_LESS,
+                     ZFUNC_shift, ZFUNC_mask);
             break;
         case GL_EQUAL:
-            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_EQUAL, 
+            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_EQUAL,
                      ZFUNC_shift, ZFUNC_mask);
             break;
         case GL_LEQUAL:
-            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_LEQUAL,  
+            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_LEQUAL,
                      ZFUNC_shift, ZFUNC_mask);
             break;
         case GL_GREATER:
-            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_GREATER,  
-                     ZFUNC_shift, ZFUNC_mask);           
+            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_GREATER,
+                     ZFUNC_shift, ZFUNC_mask);
             break;
         case GL_NOTEQUAL:
-            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_NOTEQUAL,  
+            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_NOTEQUAL,
                      ZFUNC_shift, ZFUNC_mask);
             break;
         case GL_GEQUAL:
-            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_GEQUAL,  
+            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_GEQUAL,
                      ZFUNC_shift, ZFUNC_mask);
             break;
         case GL_ALWAYS:
-            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_ALWAYS,  
+            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_ALWAYS,
                      ZFUNC_shift, ZFUNC_mask);
             break;
         default:
-            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_ALWAYS,  
+            SETfield(r700->DB_DEPTH_CONTROL.u32All, FRAG_ALWAYS,
                      ZFUNC_shift, ZFUNC_mask);
             break;
         }
@@ -302,24 +324,336 @@ static void r700SetDepthState(GLcontext * ctx)
     }
 }
 
+static void r700SetAlphaState(GLcontext * ctx)
+{
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+       uint32_t alpha_func = REF_ALWAYS;
+       GLboolean really_enabled = ctx->Color.AlphaEnabled;
+
+       switch (ctx->Color.AlphaFunc) {
+       case GL_NEVER:
+               alpha_func = REF_NEVER;
+               break;
+       case GL_LESS:
+               alpha_func = REF_LESS;
+               break;
+       case GL_EQUAL:
+               alpha_func = REF_EQUAL;
+               break;
+       case GL_LEQUAL:
+               alpha_func = REF_LEQUAL;
+               break;
+       case GL_GREATER:
+               alpha_func = REF_GREATER;
+               break;
+       case GL_NOTEQUAL:
+               alpha_func = REF_NOTEQUAL;
+               break;
+       case GL_GEQUAL:
+               alpha_func = REF_GEQUAL;
+               break;
+       case GL_ALWAYS:
+               /*alpha_func = REF_ALWAYS; */
+               really_enabled = GL_FALSE;
+               break;
+       }
+
+       if (really_enabled) {
+               SETfield(r700->SX_ALPHA_TEST_CONTROL.u32All, alpha_func,
+                        ALPHA_FUNC_shift, ALPHA_FUNC_mask);
+               SETbit(r700->SX_ALPHA_TEST_CONTROL.u32All, ALPHA_TEST_ENABLE_bit);
+               r700->SX_ALPHA_REF.f32All = ctx->Color.AlphaRef;
+       } else {
+               CLEARbit(r700->SX_ALPHA_TEST_CONTROL.u32All, ALPHA_TEST_ENABLE_bit);
+       }
+
+}
+
 static void r700AlphaFunc(GLcontext * ctx, GLenum func, GLfloat ref) //---------------
 {
+       (void)func;
+       (void)ref;
+       r700SetAlphaState(ctx);
 }
 
 
 static void r700BlendColor(GLcontext * ctx, const GLfloat cf[4]) //----------------
 {
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+
+       r700->CB_BLEND_RED.f32All = cf[0];
+       r700->CB_BLEND_GREEN.f32All = cf[1];
+       r700->CB_BLEND_BLUE.f32All = cf[2];
+       r700->CB_BLEND_ALPHA.f32All = cf[3];
+}
+
+static int blend_factor(GLenum factor, GLboolean is_src)
+{
+       switch (factor) {
+       case GL_ZERO:
+               return BLEND_ZERO;
+               break;
+       case GL_ONE:
+               return BLEND_ONE;
+               break;
+       case GL_DST_COLOR:
+               return BLEND_DST_COLOR;
+               break;
+       case GL_ONE_MINUS_DST_COLOR:
+               return BLEND_ONE_MINUS_DST_COLOR;
+               break;
+       case GL_SRC_COLOR:
+               return BLEND_SRC_COLOR;
+               break;
+       case GL_ONE_MINUS_SRC_COLOR:
+               return BLEND_ONE_MINUS_SRC_COLOR;
+               break;
+       case GL_SRC_ALPHA:
+               return BLEND_SRC_ALPHA;
+               break;
+       case GL_ONE_MINUS_SRC_ALPHA:
+               return BLEND_ONE_MINUS_SRC_ALPHA;
+               break;
+       case GL_DST_ALPHA:
+               return BLEND_DST_ALPHA;
+               break;
+       case GL_ONE_MINUS_DST_ALPHA:
+               return BLEND_ONE_MINUS_DST_ALPHA;
+               break;
+       case GL_SRC_ALPHA_SATURATE:
+               return (is_src) ? BLEND_SRC_ALPHA_SATURATE : BLEND_ZERO;
+               break;
+       case GL_CONSTANT_COLOR:
+               return BLEND_CONSTANT_COLOR;
+               break;
+       case GL_ONE_MINUS_CONSTANT_COLOR:
+               return BLEND_ONE_MINUS_CONSTANT_COLOR;
+               break;
+       case GL_CONSTANT_ALPHA:
+               return BLEND_CONSTANT_ALPHA;
+               break;
+       case GL_ONE_MINUS_CONSTANT_ALPHA:
+               return BLEND_ONE_MINUS_CONSTANT_ALPHA;
+               break;
+       default:
+               fprintf(stderr, "unknown blend factor %x\n", factor);
+               return (is_src) ? BLEND_ONE : BLEND_ZERO;
+               break;
+       }
+}
+
+static void r700SetBlendState(GLcontext * ctx)
+{
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+       int id = 0;
+       uint32_t blend_reg = 0, eqn, eqnA;
+
+       if (RGBA_LOGICOP_ENABLED(ctx) || !ctx->Color.BlendEnabled) {
+               SETfield(blend_reg,
+                        BLEND_ONE, COLOR_SRCBLEND_shift, COLOR_SRCBLEND_mask);
+               SETfield(blend_reg,
+                        BLEND_ZERO, COLOR_DESTBLEND_shift, COLOR_DESTBLEND_mask);
+               SETfield(blend_reg,
+                        COMB_DST_PLUS_SRC, COLOR_COMB_FCN_shift, COLOR_COMB_FCN_mask);
+               SETfield(blend_reg,
+                        BLEND_ONE, ALPHA_SRCBLEND_shift, ALPHA_SRCBLEND_mask);
+               SETfield(blend_reg,
+                        BLEND_ZERO, ALPHA_DESTBLEND_shift, ALPHA_DESTBLEND_mask);
+               SETfield(blend_reg,
+                        COMB_DST_PLUS_SRC, ALPHA_COMB_FCN_shift, ALPHA_COMB_FCN_mask);
+               if (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_R600)
+                       r700->CB_BLEND_CONTROL.u32All = blend_reg;
+               else
+                       r700->render_target[id].CB_BLEND0_CONTROL.u32All = blend_reg;
+               return;
+       }
+
+       SETfield(blend_reg,
+                blend_factor(ctx->Color.BlendSrcRGB, GL_TRUE),
+                COLOR_SRCBLEND_shift, COLOR_SRCBLEND_mask);
+       SETfield(blend_reg,
+                blend_factor(ctx->Color.BlendDstRGB, GL_FALSE),
+                COLOR_DESTBLEND_shift, COLOR_DESTBLEND_mask);
+
+       switch (ctx->Color.BlendEquationRGB) {
+       case GL_FUNC_ADD:
+               eqn = COMB_DST_PLUS_SRC;
+               break;
+       case GL_FUNC_SUBTRACT:
+               eqn = COMB_SRC_MINUS_DST;
+               break;
+       case GL_FUNC_REVERSE_SUBTRACT:
+               eqn = COMB_DST_MINUS_SRC;
+               break;
+       case GL_MIN:
+               eqn = COMB_MIN_DST_SRC;
+               SETfield(blend_reg,
+                        BLEND_ONE,
+                        COLOR_SRCBLEND_shift, COLOR_SRCBLEND_mask);
+               SETfield(blend_reg,
+                        BLEND_ONE,
+                        COLOR_DESTBLEND_shift, COLOR_DESTBLEND_mask);
+               break;
+       case GL_MAX:
+               eqn = COMB_MAX_DST_SRC;
+               SETfield(blend_reg,
+                        BLEND_ONE,
+                        COLOR_SRCBLEND_shift, COLOR_SRCBLEND_mask);
+               SETfield(blend_reg,
+                        BLEND_ONE,
+                        COLOR_DESTBLEND_shift, COLOR_DESTBLEND_mask);
+               break;
+
+       default:
+               fprintf(stderr,
+                       "[%s:%u] Invalid RGB blend equation (0x%04x).\n",
+                       __FUNCTION__, __LINE__, ctx->Color.BlendEquationRGB);
+               return;
+       }
+       SETfield(blend_reg,
+                eqn, COLOR_COMB_FCN_shift, COLOR_COMB_FCN_mask);
+
+       SETfield(blend_reg,
+                blend_factor(ctx->Color.BlendSrcRGB, GL_TRUE),
+                ALPHA_SRCBLEND_shift, ALPHA_SRCBLEND_mask);
+       SETfield(blend_reg,
+                blend_factor(ctx->Color.BlendDstRGB, GL_FALSE),
+                ALPHA_DESTBLEND_shift, ALPHA_DESTBLEND_mask);
+
+       switch (ctx->Color.BlendEquationA) {
+       case GL_FUNC_ADD:
+               eqnA = COMB_DST_PLUS_SRC;
+               break;
+       case GL_FUNC_SUBTRACT:
+               eqnA = COMB_SRC_MINUS_DST;
+               break;
+       case GL_FUNC_REVERSE_SUBTRACT:
+               eqnA = COMB_DST_MINUS_SRC;
+               break;
+       case GL_MIN:
+               eqnA = COMB_MIN_DST_SRC;
+               SETfield(blend_reg,
+                        BLEND_ONE,
+                        ALPHA_SRCBLEND_shift, ALPHA_SRCBLEND_mask);
+               SETfield(blend_reg,
+                        BLEND_ONE,
+                        ALPHA_DESTBLEND_shift, ALPHA_DESTBLEND_mask);
+               break;
+       case GL_MAX:
+               eqnA = COMB_MAX_DST_SRC;
+               SETfield(blend_reg,
+                        BLEND_ONE,
+                        ALPHA_SRCBLEND_shift, ALPHA_SRCBLEND_mask);
+               SETfield(blend_reg,
+                        BLEND_ONE,
+                        ALPHA_DESTBLEND_shift, ALPHA_DESTBLEND_mask);
+               break;
+       default:
+               fprintf(stderr,
+                       "[%s:%u] Invalid A blend equation (0x%04x).\n",
+                       __FUNCTION__, __LINE__, ctx->Color.BlendEquationA);
+               return;
+       }
+
+       SETfield(blend_reg,
+                eqnA, ALPHA_COMB_FCN_shift, ALPHA_COMB_FCN_mask);
+
+       SETbit(blend_reg, SEPARATE_ALPHA_BLEND_bit);
+
+       if (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_R600)
+               r700->CB_BLEND_CONTROL.u32All = blend_reg;
+       else {
+               r700->render_target[id].CB_BLEND0_CONTROL.u32All = blend_reg;
+               SETbit(r700->CB_COLOR_CONTROL.u32All, PER_MRT_BLEND_bit);
+       }
+       SETfield(r700->CB_COLOR_CONTROL.u32All, (1 << id),
+                TARGET_BLEND_ENABLE_shift, TARGET_BLEND_ENABLE_mask);
+
 }
 
 static void r700BlendEquationSeparate(GLcontext * ctx,
                                                      GLenum modeRGB, GLenum modeA) //-----------------
 {
+       r700SetBlendState(ctx);
 }
 
 static void r700BlendFuncSeparate(GLcontext * ctx,
                                  GLenum sfactorRGB, GLenum dfactorRGB,
                                  GLenum sfactorA, GLenum dfactorA) //------------------------
 {
+       r700SetBlendState(ctx);
+}
+
+/**
+ * Translate LogicOp enums into hardware representation.
+ */
+static GLuint translate_logicop(GLenum logicop)
+{
+       switch (logicop) {
+       case GL_CLEAR:
+               return 0x00;
+       case GL_SET:
+               return 0xff;
+       case GL_COPY:
+               return 0xcc;
+       case GL_COPY_INVERTED:
+               return 0x33;
+       case GL_NOOP:
+               return 0xaa;
+       case GL_INVERT:
+               return 0x55;
+       case GL_AND:
+               return 0x88;
+       case GL_NAND:
+               return 0x77;
+       case GL_OR:
+               return 0xee;
+       case GL_NOR:
+               return 0x11;
+       case GL_XOR:
+               return 0x66;
+       case GL_EQUIV:
+               return 0xaa;
+       case GL_AND_REVERSE:
+               return 0x44;
+       case GL_AND_INVERTED:
+               return 0x22;
+       case GL_OR_REVERSE:
+               return 0xdd;
+       case GL_OR_INVERTED:
+               return 0xbb;
+       default:
+               fprintf(stderr, "unknown blend logic operation %x\n", logicop);
+               return 0xcc;
+       }
+}
+
+/**
+ * Used internally to update the r300->hw hardware state to match the
+ * current OpenGL state.
+ */
+static void r700SetLogicOpState(GLcontext *ctx)
+{
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&R700_CONTEXT(ctx)->hw);
+
+       if (RGBA_LOGICOP_ENABLED(ctx))
+               SETfield(r700->CB_COLOR_CONTROL.u32All,
+                        translate_logicop(ctx->Color.LogicOp), ROP3_shift, ROP3_mask);
+       else
+               SETfield(r700->CB_COLOR_CONTROL.u32All, 0xCC, ROP3_shift, ROP3_mask);
+}
+
+/**
+ * Called by Mesa when an application program changes the LogicOp state
+ * via glLogicOp.
+ */
+static void r700LogicOpcode(GLcontext *ctx, GLenum logicop)
+{
+       if (RGBA_LOGICOP_ENABLED(ctx))
+               r700SetLogicOpState(ctx);
 }
 
 static void r700UpdateCulling(GLcontext * ctx)
@@ -330,11 +664,11 @@ static void r700UpdateCulling(GLcontext * ctx)
     CLEARbit(r700->PA_SU_SC_MODE_CNTL.u32All, CULL_FRONT_bit);
     CLEARbit(r700->PA_SU_SC_MODE_CNTL.u32All, CULL_BACK_bit);
 
-    if (ctx->Polygon.CullFlag) 
+    if (ctx->Polygon.CullFlag)
     {
-        switch (ctx->Polygon.CullFaceMode) 
+        switch (ctx->Polygon.CullFaceMode)
         {
-        case GL_FRONT:            
+        case GL_FRONT:
             SETbit(r700->PA_SU_SC_MODE_CNTL.u32All, CULL_FRONT_bit);
             CLEARbit(r700->PA_SU_SC_MODE_CNTL.u32All, CULL_BACK_bit);
             break;
@@ -353,13 +687,13 @@ static void r700UpdateCulling(GLcontext * ctx)
         }
     }
 
-    switch (ctx->Polygon.FrontFace) 
+    switch (ctx->Polygon.FrontFace)
     {
         case GL_CW:
             SETbit(r700->PA_SU_SC_MODE_CNTL.u32All, FACE_bit);
             break;
         case GL_CCW:
-            CLEARbit(r700->PA_SU_SC_MODE_CNTL.u32All, FACE_bit); 
+            CLEARbit(r700->PA_SU_SC_MODE_CNTL.u32All, FACE_bit);
             break;
         default:
             CLEARbit(r700->PA_SU_SC_MODE_CNTL.u32All, FACE_bit); /* default: ccw */
@@ -394,13 +728,13 @@ static void r700Enable(GLcontext * ctx, GLenum cap, GLboolean state) //---------
                /* empty */
                break;
        case GL_ALPHA_TEST:
-               //r700SetAlphaState(ctx);
+               r700SetAlphaState(ctx);
                break;
        case GL_COLOR_LOGIC_OP:
-               //r700SetLogicOpState(ctx);
+               r700SetLogicOpState(ctx);
                /* fall-through, because logic op overrides blending */
        case GL_BLEND:
-               //r700SetBlendState(ctx);
+               r700SetBlendState(ctx);
                break;
        case GL_CLIP_PLANE0:
        case GL_CLIP_PLANE1:
@@ -408,13 +742,13 @@ static void r700Enable(GLcontext * ctx, GLenum cap, GLboolean state) //---------
        case GL_CLIP_PLANE3:
        case GL_CLIP_PLANE4:
        case GL_CLIP_PLANE5:
-               //r700SetClipPlaneState(ctx, cap, state);
+               r700SetClipPlaneState(ctx, cap, state);
                break;
        case GL_DEPTH_TEST:
                r700SetDepthState(ctx);
                break;
        case GL_STENCIL_TEST:
-               //r700SetStencilState(ctx, state);
+               r700SetStencilState(ctx, state);
                break;
        case GL_CULL_FACE:
                r700UpdateCulling(ctx);
@@ -422,7 +756,7 @@ static void r700Enable(GLcontext * ctx, GLenum cap, GLboolean state) //---------
        case GL_POLYGON_OFFSET_POINT:
        case GL_POLYGON_OFFSET_LINE:
        case GL_POLYGON_OFFSET_FILL:
-               //r700SetPolygonOffsetState(ctx, state);
+               r700SetPolygonOffsetState(ctx, state);
                break;
        case GL_SCISSOR_TEST:
                radeon_firevertices(&context->radeon);
@@ -431,7 +765,7 @@ static void r700Enable(GLcontext * ctx, GLenum cap, GLboolean state) //---------
                break;
        case GL_LINE_STIPPLE:
                r700UpdateLineStipple(ctx);
-               break;  
+               break;
        default:
                break;
        }
@@ -499,6 +833,7 @@ static void r700Fogfv(GLcontext * ctx, GLenum pname, const GLfloat * param) //--
 static void r700FrontFace(GLcontext * ctx, GLenum mode) //------------------
 {
     r700UpdateCulling(ctx);
+    r700UpdatePolygonMode(ctx);
 }
 
 static void r700ShadeModel(GLcontext * ctx, GLenum mode) //--------------------
@@ -519,28 +854,201 @@ static void r700ShadeModel(GLcontext * ctx, GLenum mode) //--------------------
        }
 }
 
+/* =============================================================
+ * Point state
+ */
+static void r700PointSize(GLcontext * ctx, GLfloat size)
+{
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+
+       /* We need to clamp to user defined range here, because
+        * the HW clamping happens only for per vertex point size. */
+       size = CLAMP(size, ctx->Point.MinSize, ctx->Point.MaxSize);
+
+       /* same size limits for AA, non-AA points */
+       size = CLAMP(size, ctx->Const.MinPointSize, ctx->Const.MaxPointSize);
+
+       /* format is 12.4 fixed point */
+       SETfield(r700->PA_SU_POINT_SIZE.u32All, (int)(size * 16),
+                PA_SU_POINT_SIZE__HEIGHT_shift, PA_SU_POINT_SIZE__HEIGHT_mask);
+       SETfield(r700->PA_SU_POINT_SIZE.u32All, (int)(size * 16),
+                PA_SU_POINT_SIZE__WIDTH_shift, PA_SU_POINT_SIZE__WIDTH_mask);
+
+}
+
 static void r700PointParameter(GLcontext * ctx, GLenum pname, const GLfloat * param) //---------------
 {
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+
+       /* format is 12.4 fixed point */
+       switch (pname) {
+       case GL_POINT_SIZE_MIN:
+               SETfield(r700->PA_SU_POINT_MINMAX.u32All, (int)(ctx->Point.MinSize * 16.0),
+                        MIN_SIZE_shift, MIN_SIZE_mask);
+               break;
+       case GL_POINT_SIZE_MAX:
+               SETfield(r700->PA_SU_POINT_MINMAX.u32All, (int)(ctx->Point.MaxSize * 16.0),
+                        MAX_SIZE_shift, MAX_SIZE_mask);
+               break;
+       case GL_POINT_DISTANCE_ATTENUATION:
+               break;
+       case GL_POINT_FADE_THRESHOLD_SIZE:
+               break;
+       default:
+               break;
+       }
+}
+
+static int translate_stencil_func(int func)
+{
+       switch (func) {
+       case GL_NEVER:
+               return REF_NEVER;
+       case GL_LESS:
+               return REF_LESS;
+       case GL_EQUAL:
+               return REF_EQUAL;
+       case GL_LEQUAL:
+               return REF_LEQUAL;
+       case GL_GREATER:
+               return REF_GREATER;
+       case GL_NOTEQUAL:
+               return REF_NOTEQUAL;
+       case GL_GEQUAL:
+               return REF_GEQUAL;
+       case GL_ALWAYS:
+               return REF_ALWAYS;
+       }
+       return 0;
+}
+
+static int translate_stencil_op(int op)
+{
+       switch (op) {
+       case GL_KEEP:
+               return STENCIL_KEEP;
+       case GL_ZERO:
+               return STENCIL_ZERO;
+       case GL_REPLACE:
+               return STENCIL_REPLACE;
+       case GL_INCR:
+               return STENCIL_INCR_CLAMP;
+       case GL_DECR:
+               return STENCIL_DECR_CLAMP;
+       case GL_INCR_WRAP_EXT:
+               return STENCIL_INCR_WRAP;
+       case GL_DECR_WRAP_EXT:
+               return STENCIL_DECR_WRAP;
+       case GL_INVERT:
+               return STENCIL_INVERT;
+       default:
+               WARN_ONCE("Do not know how to translate stencil op");
+               return STENCIL_KEEP;
+       }
+       return 0;
+}
+
+static void r700SetStencilState(GLcontext * ctx, GLboolean state)
+{
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+       GLboolean hw_stencil = GL_FALSE;
+
+       //fixme
+       //r300CatchStencilFallback(ctx);
+
+       if (ctx->DrawBuffer) {
+               struct radeon_renderbuffer *rrbStencil
+                       = radeon_get_renderbuffer(ctx->DrawBuffer, BUFFER_STENCIL);
+               hw_stencil = (rrbStencil && rrbStencil->bo);
+       }
+
+       if (hw_stencil) {
+               if (state)
+                       SETbit(r700->DB_DEPTH_CONTROL.u32All, STENCIL_ENABLE_bit);
+               else
+                       CLEARbit(r700->DB_DEPTH_CONTROL.u32All, STENCIL_ENABLE_bit);
+       }
 }
 
 static void r700StencilFuncSeparate(GLcontext * ctx, GLenum face,
                                    GLenum func, GLint ref, GLuint mask) //---------------------
 {
-}
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+       const unsigned back = ctx->Stencil._BackFace;
+
+       //fixme
+       //r300CatchStencilFallback(ctx);
 
+       //front
+       SETfield(r700->DB_STENCILREFMASK.u32All, ctx->Stencil.Ref[0],
+                STENCILREF_shift, STENCILREF_mask);
+       SETfield(r700->DB_STENCILREFMASK.u32All, ctx->Stencil.ValueMask[0],
+                STENCILMASK_shift, STENCILMASK_mask);
+
+       SETfield(r700->DB_DEPTH_CONTROL.u32All, translate_stencil_func(ctx->Stencil.Function[0]),
+                STENCILFUNC_shift, STENCILFUNC_mask);
+
+       //back
+       SETfield(r700->DB_STENCILREFMASK_BF.u32All, ctx->Stencil.Ref[back],
+                STENCILREF_BF_shift, STENCILREF_BF_mask);
+       SETfield(r700->DB_STENCILREFMASK_BF.u32All, ctx->Stencil.ValueMask[back],
+                STENCILMASK_BF_shift, STENCILMASK_BF_mask);
+
+       SETfield(r700->DB_DEPTH_CONTROL.u32All, translate_stencil_func(ctx->Stencil.Function[back]),
+                STENCILFUNC_BF_shift, STENCILFUNC_BF_mask);
+
+}
 
 static void r700StencilMaskSeparate(GLcontext * ctx, GLenum face, GLuint mask) //--------------
 {
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+       const unsigned back = ctx->Stencil._BackFace;
+
+       //fixme
+       //r300CatchStencilFallback(ctx);
+
+       // front
+       SETfield(r700->DB_STENCILREFMASK.u32All, ctx->Stencil.WriteMask[0],
+                STENCILWRITEMASK_shift, STENCILWRITEMASK_mask);
+
+       // back
+       SETfield(r700->DB_STENCILREFMASK_BF.u32All, ctx->Stencil.WriteMask[back],
+                STENCILWRITEMASK_BF_shift, STENCILWRITEMASK_BF_mask);
+
 }
 
 static void r700StencilOpSeparate(GLcontext * ctx, GLenum face,
                                  GLenum fail, GLenum zfail, GLenum zpass) //--------------------
 {
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+       const unsigned back = ctx->Stencil._BackFace;
+
+       //fixme
+       //r300CatchStencilFallback(ctx);
+
+       SETfield(r700->DB_DEPTH_CONTROL.u32All, translate_stencil_op(ctx->Stencil.FailFunc[0]),
+                STENCILFAIL_shift, STENCILFAIL_mask);
+       SETfield(r700->DB_DEPTH_CONTROL.u32All, translate_stencil_op(ctx->Stencil.ZFailFunc[0]),
+                STENCILZFAIL_shift, STENCILZFAIL_mask);
+       SETfield(r700->DB_DEPTH_CONTROL.u32All, translate_stencil_op(ctx->Stencil.ZPassFunc[0]),
+                STENCILZPASS_shift, STENCILZPASS_mask);
+
+       SETfield(r700->DB_DEPTH_CONTROL.u32All, translate_stencil_op(ctx->Stencil.FailFunc[back]),
+                STENCILFAIL_BF_shift, STENCILFAIL_BF_mask);
+       SETfield(r700->DB_DEPTH_CONTROL.u32All, translate_stencil_op(ctx->Stencil.ZFailFunc[back]),
+                STENCILZFAIL_BF_shift, STENCILZFAIL_BF_mask);
+       SETfield(r700->DB_DEPTH_CONTROL.u32All, translate_stencil_op(ctx->Stencil.ZPassFunc[back]),
+                STENCILZPASS_BF_shift, STENCILZPASS_BF_mask);
 }
 
 static void r700UpdateWindow(GLcontext * ctx, int id) //--------------------
 {
-
        context_t *context = R700_CONTEXT(ctx);
        R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
        __DRIdrawablePrivate *dPriv = radeon_get_drawable(&context->radeon);
@@ -599,10 +1107,6 @@ static void r700DepthRange(GLcontext * ctx, GLclampd nearval, GLclampd farval) /
        r700UpdateWindow(ctx, 0);
 }
 
-static void r700PointSize(GLcontext * ctx, GLfloat size) //-------------------
-{
-}
-
 static void r700LineWidth(GLcontext * ctx, GLfloat widthf) //---------------
 {
     context_t *context = R700_CONTEXT(ctx);
@@ -624,21 +1128,146 @@ static void r700LineStipple(GLcontext *ctx, GLint factor, GLushort pattern)
     SETfield(r700->PA_SC_LINE_STIPPLE.u32All, 1, AUTO_RESET_CNTL_shift, AUTO_RESET_CNTL_mask);
 }
 
+static void r700SetPolygonOffsetState(GLcontext * ctx, GLboolean state)
+{
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+
+       if (state) {
+               SETbit(r700->PA_SU_SC_MODE_CNTL.u32All, POLY_OFFSET_FRONT_ENABLE_bit);
+               SETbit(r700->PA_SU_SC_MODE_CNTL.u32All, POLY_OFFSET_BACK_ENABLE_bit);
+               SETbit(r700->PA_SU_SC_MODE_CNTL.u32All, POLY_OFFSET_PARA_ENABLE_bit);
+       } else {
+               CLEARbit(r700->PA_SU_SC_MODE_CNTL.u32All, POLY_OFFSET_FRONT_ENABLE_bit);
+               CLEARbit(r700->PA_SU_SC_MODE_CNTL.u32All, POLY_OFFSET_BACK_ENABLE_bit);
+               CLEARbit(r700->PA_SU_SC_MODE_CNTL.u32All, POLY_OFFSET_PARA_ENABLE_bit);
+       }
+}
+
 static void r700PolygonOffset(GLcontext * ctx, GLfloat factor, GLfloat units) //--------------
 {
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+       GLfloat constant = units;
+
+       switch (ctx->Visual.depthBits) {
+       case 16:
+               constant *= 4.0;
+               break;
+       case 24:
+               constant *= 2.0;
+               break;
+       }
+
+       factor *= 12.0;
+
+       r700->PA_SU_POLY_OFFSET_FRONT_SCALE.f32All = factor;
+       r700->PA_SU_POLY_OFFSET_FRONT_OFFSET.f32All = constant;
+       r700->PA_SU_POLY_OFFSET_BACK_SCALE.f32All = factor;
+       r700->PA_SU_POLY_OFFSET_BACK_OFFSET.f32All = constant;
 }
 
+static void r700UpdatePolygonMode(GLcontext * ctx)
+{
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+
+       SETfield(r700->PA_SU_SC_MODE_CNTL.u32All, X_DISABLE_POLY_MODE, POLY_MODE_shift, POLY_MODE_mask);
+
+       /* Only do something if a polygon mode is wanted, default is GL_FILL */
+       if (ctx->Polygon.FrontMode != GL_FILL ||
+           ctx->Polygon.BackMode != GL_FILL) {
+               GLenum f, b;
+
+               /* Handle GL_CW (clock wise and GL_CCW (counter clock wise)
+                * correctly by selecting the correct front and back face
+                */
+               if (ctx->Polygon.FrontFace == GL_CCW) {
+                       f = ctx->Polygon.FrontMode;
+                       b = ctx->Polygon.BackMode;
+               } else {
+                       f = ctx->Polygon.BackMode;
+                       b = ctx->Polygon.FrontMode;
+               }
+
+               /* Enable polygon mode */
+               SETfield(r700->PA_SU_SC_MODE_CNTL.u32All, X_DUAL_MODE, POLY_MODE_shift, POLY_MODE_mask);
+
+               switch (f) {
+               case GL_LINE:
+                       SETfield(r700->PA_SU_SC_MODE_CNTL.u32All, X_DRAW_LINES,
+                                POLYMODE_FRONT_PTYPE_shift, POLYMODE_FRONT_PTYPE_mask);
+                       break;
+               case GL_POINT:
+                       SETfield(r700->PA_SU_SC_MODE_CNTL.u32All, X_DRAW_POINTS,
+                                POLYMODE_FRONT_PTYPE_shift, POLYMODE_FRONT_PTYPE_mask);
+                       break;
+               case GL_FILL:
+                       SETfield(r700->PA_SU_SC_MODE_CNTL.u32All, X_DRAW_TRIANGLES,
+                                POLYMODE_FRONT_PTYPE_shift, POLYMODE_FRONT_PTYPE_mask);
+                       break;
+               }
+
+               switch (b) {
+               case GL_LINE:
+                       SETfield(r700->PA_SU_SC_MODE_CNTL.u32All, X_DRAW_LINES,
+                                POLYMODE_BACK_PTYPE_shift, POLYMODE_BACK_PTYPE_mask);
+                       break;
+               case GL_POINT:
+                       SETfield(r700->PA_SU_SC_MODE_CNTL.u32All, X_DRAW_POINTS,
+                                POLYMODE_BACK_PTYPE_shift, POLYMODE_BACK_PTYPE_mask);
+                       break;
+               case GL_FILL:
+                       SETfield(r700->PA_SU_SC_MODE_CNTL.u32All, X_DRAW_TRIANGLES,
+                                POLYMODE_BACK_PTYPE_shift, POLYMODE_BACK_PTYPE_mask);
+                       break;
+               }
+       }
+}
 
 static void r700PolygonMode(GLcontext * ctx, GLenum face, GLenum mode) //------------------
 {
+       (void)face;
+       (void)mode;
+
+       r700UpdatePolygonMode(ctx);
 }
+
 static void r700RenderMode(GLcontext * ctx, GLenum mode) //---------------------
 {
 }
 
-static void r700ClipPlane( GLcontext *ctx, GLenum plane, const GLfloat *eq ) //-----------------
+static void r700ClipPlane( GLcontext *ctx, GLenum plane, const GLfloat *eq )
+{
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+       GLint p;
+       GLint *ip;
+
+       p = (GLint) plane - (GLint) GL_CLIP_PLANE0;
+       ip = (GLint *)ctx->Transform._ClipUserPlane[p];
+
+       r700->ucp[p].PA_CL_UCP_0_X.u32All = ip[0];
+       r700->ucp[p].PA_CL_UCP_0_Y.u32All = ip[1];
+       r700->ucp[p].PA_CL_UCP_0_Z.u32All = ip[2];
+       r700->ucp[p].PA_CL_UCP_0_W.u32All = ip[3];
+}
+
+static void r700SetClipPlaneState(GLcontext * ctx, GLenum cap, GLboolean state)
 {
+       context_t *context = R700_CONTEXT(ctx);
+       R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
+       GLuint p;
+
+       p = cap - GL_CLIP_PLANE0;
+       if (state) {
+               r700->PA_CL_CLIP_CNTL.u32All |= (UCP_ENA_0_bit << p);
+               r700->ucp[p].enabled = GL_TRUE;
+               r700ClipPlane(ctx, cap, NULL);
+       } else {
+               r700->PA_CL_CLIP_CNTL.u32All &= ~(UCP_ENA_0_bit << p);
+               r700->ucp[p].enabled = GL_FALSE;
+       }
 }
 
 void r700SetScissor(context_t *context) //---------------
@@ -719,22 +1348,22 @@ void r700SetScissor(context_t *context) //---------------
        r700->viewport[id].enabled = GL_TRUE;
 }
 
-void r700SetRenderTarget(context_t *context, int id)
+static void r700SetRenderTarget(context_t *context, int id)
 {
     R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
 
     struct radeon_renderbuffer *rrb;
     unsigned int nPitchInPixel;
 
+    rrb = radeon_get_colorbuffer(&context->radeon);
+    if (!rrb || !rrb->bo) {
+           fprintf(stderr, "no rrb\n");
+           return;
+    }
+
     /* screen/window/view */
     SETfield(r700->CB_TARGET_MASK.u32All, 0xF, (4 * id), TARGET0_ENABLE_mask);
 
-    rrb = radeon_get_colorbuffer(&context->radeon);
-       if (!rrb || !rrb->bo) {
-               fprintf(stderr, "no rrb\n");
-               return;
-       }
-
     /* color buffer */
     r700->render_target[id].CB_COLOR0_BASE.u32All = context->radeon.state.color.draw_offset;
 
@@ -764,45 +1393,25 @@ void r700SetRenderTarget(context_t *context, int id)
     SETbit(r700->render_target[id].CB_COLOR0_INFO.u32All, BLEND_CLAMP_bit);
     SETfield(r700->render_target[id].CB_COLOR0_INFO.u32All, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
 
-    CLEARfield(r700->render_target[id].CB_BLEND0_CONTROL.u32All, COLOR_SRCBLEND_mask); /* no dst blend */
-    CLEARfield(r700->render_target[id].CB_BLEND0_CONTROL.u32All, ALPHA_SRCBLEND_mask); /* no dst blend */
-
     r700->render_target[id].enabled = GL_TRUE;
 }
 
-void r700SetDepthTarget(context_t *context)
+static void r700SetDepthTarget(context_t *context)
 {
     R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
 
     struct radeon_renderbuffer *rrb;
     unsigned int nPitchInPixel;
 
+    rrb = radeon_get_depthbuffer(&context->radeon);
+    if (!rrb)
+           return;
+
     /* depth buf */
     r700->DB_DEPTH_SIZE.u32All = 0;
     r700->DB_DEPTH_BASE.u32All = 0;
     r700->DB_DEPTH_INFO.u32All = 0;
-
-    r700->DB_DEPTH_CLEAR.u32All     = 0x3F800000;
-    r700->DB_DEPTH_VIEW.u32All      = 0;
-    r700->DB_RENDER_CONTROL.u32All  = 0;
-    SETbit(r700->DB_RENDER_CONTROL.u32All, STENCIL_COMPRESS_DISABLE_bit);
-    SETbit(r700->DB_RENDER_CONTROL.u32All, DEPTH_COMPRESS_DISABLE_bit);
-    r700->DB_RENDER_OVERRIDE.u32All = 0;
-    if (context->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV770)
-           SETbit(r700->DB_RENDER_OVERRIDE.u32All, FORCE_SHADER_Z_ORDER_bit);
-    SETfield(r700->DB_RENDER_OVERRIDE.u32All, FORCE_DISABLE, FORCE_HIZ_ENABLE_shift, FORCE_HIZ_ENABLE_mask);
-    SETfield(r700->DB_RENDER_OVERRIDE.u32All, FORCE_DISABLE, FORCE_HIS_ENABLE0_shift, FORCE_HIS_ENABLE0_mask);
-    SETfield(r700->DB_RENDER_OVERRIDE.u32All, FORCE_DISABLE, FORCE_HIS_ENABLE1_shift, FORCE_HIS_ENABLE1_mask);
-
-    r700->DB_ALPHA_TO_MASK.u32All = 0;
-    SETfield(r700->DB_ALPHA_TO_MASK.u32All, 2, ALPHA_TO_MASK_OFFSET0_shift, ALPHA_TO_MASK_OFFSET0_mask);
-    SETfield(r700->DB_ALPHA_TO_MASK.u32All, 2, ALPHA_TO_MASK_OFFSET1_shift, ALPHA_TO_MASK_OFFSET1_mask);
-    SETfield(r700->DB_ALPHA_TO_MASK.u32All, 2, ALPHA_TO_MASK_OFFSET2_shift, ALPHA_TO_MASK_OFFSET2_mask);
-    SETfield(r700->DB_ALPHA_TO_MASK.u32All, 2, ALPHA_TO_MASK_OFFSET3_shift, ALPHA_TO_MASK_OFFSET3_mask);
-
-    rrb = radeon_get_depthbuffer(&context->radeon);
-       if (!rrb)
-               return;
+    r700->DB_DEPTH_VIEW.u32All = 0;
 
     nPitchInPixel = rrb->pitch/rrb->cpp;
 
@@ -1033,9 +1642,10 @@ static void r700InitSQConfig(GLcontext * ctx)
 void r700InitState(GLcontext * ctx) //-------------------
 {
     context_t *context = R700_CONTEXT(ctx);
-
     R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
 
+    radeon_firevertices(&context->radeon);
+
     r700->TA_CNTL_AUX.u32All = 0;
     SETfield(r700->TA_CNTL_AUX.u32All, 28, TD_FIFO_CREDIT_shift, TD_FIFO_CREDIT_mask);
     r700->VC_ENHANCE.u32All = 0;
@@ -1064,37 +1674,14 @@ void r700InitState(GLcontext * ctx) //-------------------
     r700->VGT_MIN_VTX_INDX.u32All      = 0;
     r700->VGT_INDX_OFFSET.u32All    = 0;
 
-    /* Specify the number of instances */
-    r700->VGT_DMA_NUM_INSTANCES.u32All = 1;
-
-    /* not alpha blend */
-    CLEARfield(r700->SX_ALPHA_TEST_CONTROL.u32All, ALPHA_FUNC_mask);
-    CLEARbit(r700->SX_ALPHA_TEST_CONTROL.u32All, ALPHA_TEST_ENABLE_bit);
-
     /* default shader connections. */
     r700->SPI_VS_OUT_ID_0.u32All  = 0x03020100;
     r700->SPI_VS_OUT_ID_1.u32All  = 0x07060504;
 
-    r700->SPI_PS_INPUT_CNTL_0.u32All  = 0x00000800;
-    r700->SPI_PS_INPUT_CNTL_1.u32All  = 0x00000801;
-    r700->SPI_PS_INPUT_CNTL_2.u32All  = 0x00000802;
-
     r700->SPI_THREAD_GROUPING.u32All = 0;
     if (context->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV770)
            SETfield(r700->SPI_THREAD_GROUPING.u32All, 1, PS_GROUPING_shift, PS_GROUPING_mask);
 
-    SETfield(r700->CB_COLOR_CONTROL.u32All, 0xCC, ROP3_shift, ROP3_mask);
-    CLEARbit(r700->CB_COLOR_CONTROL.u32All, PER_MRT_BLEND_bit);
-
-    r700->DB_SHADER_CONTROL.u32All = 0;
-    SETbit(r700->DB_SHADER_CONTROL.u32All, DUAL_EXPORT_ENABLE_bit);
-
-    /* Set up the culling control register */
-    SETfield(r700->PA_SU_SC_MODE_CNTL.u32All, X_DRAW_TRIANGLES,
-             POLYMODE_FRONT_PTYPE_shift, POLYMODE_FRONT_PTYPE_mask);
-    SETfield(r700->PA_SU_SC_MODE_CNTL.u32All, X_DRAW_TRIANGLES,
-             POLYMODE_BACK_PTYPE_shift, POLYMODE_BACK_PTYPE_mask);
-
     /* screen */
     r700->PA_SC_SCREEN_SCISSOR_TL.u32All = 0x0;
 
@@ -1138,21 +1725,8 @@ void r700InitState(GLcontext * ctx) //-------------------
     SETbit(r700->PA_CL_VTE_CNTL.u32All, VPORT_Z_SCALE_ENA_bit);
     SETbit(r700->PA_CL_VTE_CNTL.u32All, VPORT_Z_OFFSET_ENA_bit);
 
-    /* Set up point sizes and min/max values */
-    SETfield(r700->PA_SU_POINT_SIZE.u32All, 0x8,
-             PA_SU_POINT_SIZE__HEIGHT_shift, PA_SU_POINT_SIZE__HEIGHT_mask);
-    SETfield(r700->PA_SU_POINT_SIZE.u32All, 0x8,
-             PA_SU_POINT_SIZE__WIDTH_shift, PA_SU_POINT_SIZE__WIDTH_mask);
-    CLEARfield(r700->PA_SU_POINT_MINMAX.u32All, MIN_SIZE_mask);
-    SETfield(r700->PA_SU_POINT_MINMAX.u32All, 0x8000, MAX_SIZE_shift, MAX_SIZE_mask);
-
-    /* Set up line control */
-    SETfield(r700->PA_SU_LINE_CNTL.u32All, 0x8,
-             PA_SU_LINE_CNTL__WIDTH_shift, PA_SU_LINE_CNTL__WIDTH_mask);
-
-    r700->PA_SC_LINE_CNTL.u32All = 0;
-    CLEARbit(r700->PA_SC_LINE_CNTL.u32All, EXPAND_LINE_WIDTH_bit);
-    SETbit(r700->PA_SC_LINE_CNTL.u32All, LAST_PIXEL_bit);
+    /* GL uses last vtx for flat shading components */
+    SETbit(r700->PA_SU_SC_MODE_CNTL.u32All, PROVOKING_VTX_LAST_bit);
 
     /* Set up vertex control */
     r700->PA_SU_VTX_CNTL.u32All = 0;
@@ -1167,7 +1741,84 @@ void r700InitState(GLcontext * ctx) //-------------------
     r700->PA_CL_GB_HORZ_CLIP_ADJ.u32All  = 0x3F800000;
     r700->PA_CL_GB_HORZ_DISC_ADJ.u32All  = 0x3F800000;
 
+    /* Enable all samples for multi-sample anti-aliasing */
+    r700->PA_SC_AA_MASK.u32All = 0xFFFFFFFF;
+    /* Turn off AA */
+    r700->PA_SC_AA_CONFIG.u32All = 0;
+
+    r700->SX_MISC.u32All = 0;
+
+    r700InitSQConfig(ctx);
+
+    r700ColorMask(ctx,
+                 ctx->Color.ColorMask[RCOMP],
+                 ctx->Color.ColorMask[GCOMP],
+                 ctx->Color.ColorMask[BCOMP],
+                 ctx->Color.ColorMask[ACOMP]);
+
+    r700Enable(ctx, GL_DEPTH_TEST, ctx->Depth.Test);
+    r700DepthMask(ctx, ctx->Depth.Mask);
+    r700DepthFunc(ctx, ctx->Depth.Func);
+    SETbit(r700->DB_SHADER_CONTROL.u32All, DUAL_EXPORT_ENABLE_bit);
+
+    r700->DB_DEPTH_CLEAR.u32All     = 0x3F800000;
+
+    r700->DB_RENDER_CONTROL.u32All  = 0;
+    SETbit(r700->DB_RENDER_CONTROL.u32All, STENCIL_COMPRESS_DISABLE_bit);
+    SETbit(r700->DB_RENDER_CONTROL.u32All, DEPTH_COMPRESS_DISABLE_bit);
+    r700->DB_RENDER_OVERRIDE.u32All = 0;
+    if (context->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV770)
+           SETbit(r700->DB_RENDER_OVERRIDE.u32All, FORCE_SHADER_Z_ORDER_bit);
+    SETfield(r700->DB_RENDER_OVERRIDE.u32All, FORCE_DISABLE, FORCE_HIZ_ENABLE_shift, FORCE_HIZ_ENABLE_mask);
+    SETfield(r700->DB_RENDER_OVERRIDE.u32All, FORCE_DISABLE, FORCE_HIS_ENABLE0_shift, FORCE_HIS_ENABLE0_mask);
+    SETfield(r700->DB_RENDER_OVERRIDE.u32All, FORCE_DISABLE, FORCE_HIS_ENABLE1_shift, FORCE_HIS_ENABLE1_mask);
+
+    r700->DB_ALPHA_TO_MASK.u32All = 0;
+    SETfield(r700->DB_ALPHA_TO_MASK.u32All, 2, ALPHA_TO_MASK_OFFSET0_shift, ALPHA_TO_MASK_OFFSET0_mask);
+    SETfield(r700->DB_ALPHA_TO_MASK.u32All, 2, ALPHA_TO_MASK_OFFSET1_shift, ALPHA_TO_MASK_OFFSET1_mask);
+    SETfield(r700->DB_ALPHA_TO_MASK.u32All, 2, ALPHA_TO_MASK_OFFSET2_shift, ALPHA_TO_MASK_OFFSET2_mask);
+    SETfield(r700->DB_ALPHA_TO_MASK.u32All, 2, ALPHA_TO_MASK_OFFSET3_shift, ALPHA_TO_MASK_OFFSET3_mask);
+
+    /* stencil */
+    r700Enable(ctx, GL_STENCIL_TEST, ctx->Stencil._Enabled);
+    r700StencilMaskSeparate(ctx, 0, ctx->Stencil.WriteMask[0]);
+    r700StencilFuncSeparate(ctx, 0, ctx->Stencil.Function[0],
+                           ctx->Stencil.Ref[0], ctx->Stencil.ValueMask[0]);
+    r700StencilOpSeparate(ctx, 0, ctx->Stencil.FailFunc[0],
+                         ctx->Stencil.ZFailFunc[0],
+                         ctx->Stencil.ZPassFunc[0]);
+
+    r700UpdateCulling(ctx);
+
+    r700SetBlendState(ctx);
+    r700SetLogicOpState(ctx);
+
+    r700AlphaFunc(ctx, ctx->Color.AlphaFunc, ctx->Color.AlphaRef);
+    r700Enable(ctx, GL_ALPHA_TEST, ctx->Color.AlphaEnabled);
+
+    r700PointSize(ctx, 1.0);
+
+    CLEARfield(r700->PA_SU_POINT_MINMAX.u32All, MIN_SIZE_mask);
+    SETfield(r700->PA_SU_POINT_MINMAX.u32All, 0x8000, MAX_SIZE_shift, MAX_SIZE_mask);
+
+    r700LineWidth(ctx, 1.0);
+
+    r700->PA_SC_LINE_CNTL.u32All = 0;
+    CLEARbit(r700->PA_SC_LINE_CNTL.u32All, EXPAND_LINE_WIDTH_bit);
+    SETbit(r700->PA_SC_LINE_CNTL.u32All, LAST_PIXEL_bit);
+
+    r700ShadeModel(ctx, ctx->Light.ShadeModel);
+    r700PolygonMode(ctx, GL_FRONT, ctx->Polygon.FrontMode);
+    r700PolygonMode(ctx, GL_BACK, ctx->Polygon.BackMode);
+    r700PolygonOffset(ctx, ctx->Polygon.OffsetFactor,
+                     ctx->Polygon.OffsetUnits);
+    r700Enable(ctx, GL_POLYGON_OFFSET_POINT, ctx->Polygon.OffsetPoint);
+    r700Enable(ctx, GL_POLYGON_OFFSET_LINE, ctx->Polygon.OffsetLine);
+    r700Enable(ctx, GL_POLYGON_OFFSET_FILL, ctx->Polygon.OffsetFill);
+
     /* CB */
+    r700BlendColor(ctx, ctx->Color.BlendColor);
+
     r700->CB_CLEAR_RED_R6XX.f32All = 1.0; //r6xx only
     r700->CB_CLEAR_GREEN_R6XX.f32All = 0.0; //r6xx only
     r700->CB_CLEAR_BLUE_R6XX.f32All = 1.0; //r6xx only
@@ -1176,13 +1827,6 @@ void r700InitState(GLcontext * ctx) //-------------------
     r700->CB_FOG_GREEN_R6XX.u32All = 0; //r6xx only
     r700->CB_FOG_BLUE_R6XX.u32All = 0; //r6xx only
 
-    r700->CB_BLEND_RED.u32All = 0;
-    r700->CB_BLEND_GREEN.u32All = 0;
-    r700->CB_BLEND_BLUE.u32All = 0;
-    r700->CB_BLEND_ALPHA.u32All = 0;
-
-    r700->CB_BLEND_CONTROL.u32All = 0;
-
     /* Disable color compares */
     SETfield(r700->CB_CLRCMP_CONTROL.u32All, CLRCMP_DRAW_ALWAYS,
              CLRCMP_FCN_SRC_shift, CLRCMP_FCN_SRC_mask);
@@ -1200,17 +1844,8 @@ void r700InitState(GLcontext * ctx) //-------------------
     /* Set up color compare mask */
     r700->CB_CLRCMP_MSK.u32All = 0xFFFFFFFF;
 
-    /* default color mask */
-    SETfield(r700->CB_SHADER_MASK.u32All, 0xF, OUTPUT0_ENABLE_shift, OUTPUT0_ENABLE_mask);
-
-    /* Enable all samples for multi-sample anti-aliasing */
-    r700->PA_SC_AA_MASK.u32All = 0xFFFFFFFF;
-    /* Turn off AA */
-    r700->PA_SC_AA_CONFIG.u32All = 0;
-
-    r700->SX_MISC.u32All = 0;
+    context->radeon.hw.all_dirty = GL_TRUE;
 
-    r700InitSQConfig(ctx);
 }
 
 void r700InitStateFuncs(struct dd_function_table *functions) //-----------------
@@ -1228,6 +1863,7 @@ void r700InitStateFuncs(struct dd_function_table *functions) //-----------------
        functions->Fogfv = r700Fogfv;
        functions->FrontFace = r700FrontFace;
        functions->ShadeModel = r700ShadeModel;
+       functions->LogicOpcode = r700LogicOpcode;
 
        /* ARB_point_parameters */
        functions->PointParameterfv = r700PointParameter;
index 2324636..30eb54e 100644 (file)
@@ -42,10 +42,8 @@ extern void r700UpdateDrawBuffer (GLcontext * ctx);
 extern void r700InitState (GLcontext * ctx);
 extern void r700InitStateFuncs (struct dd_function_table *functions);
 
-extern void r700SetRenderTarget(context_t *context, int id);
 extern void r700SetDefaultStates(context_t * context);
 
-void r700SetScissor(context_t *context);
-void r700SetDepthTarget(context_t *context);
+extern void r700SetScissor(context_t *context);
 
 #endif /* _R600_SCREEN_H */
index cbfeaf0..31e71cd 100644 (file)
@@ -52,7 +52,7 @@ unsigned int Map_Vertex_Output(r700_AssemblerBase       *pAsm,
        unsigned int unBit;
        unsigned int unTotal = unStart;
 
-    //!!!!!!! THE ORDER MATCH FS INPUT 
+    //!!!!!!! THE ORDER MATCH FS INPUT
 
        unBit = 1 << VERT_RESULT_HPOS;
        if(mesa_vp->Base.OutputsWritten & unBit)
@@ -73,31 +73,31 @@ unsigned int Map_Vertex_Output(r700_AssemblerBase       *pAsm,
        }
 
        //TODO : dealing back face.
-       //unBit = 1 << VERT_RESULT_BFC0;
-       //if(mesa_vp->Base.OutputsWritten & unBit)
-       //{
-       //      pAsm->ucVP_OutputMap[VERT_RESULT_COL0] = unTotal++;
-       //}
-
-       //unBit = 1 << VERT_RESULT_BFC1;
-       //if(mesa_vp->Base.OutputsWritten & unBit)
-       //{
-       //      pAsm->ucVP_OutputMap[VERT_RESULT_COL1] = unTotal++;
-       //}
+       unBit = 1 << VERT_RESULT_BFC0;
+       if(mesa_vp->Base.OutputsWritten & unBit)
+       {
+               pAsm->ucVP_OutputMap[VERT_RESULT_BFC0] = unTotal++;
+       }
+
+       unBit = 1 << VERT_RESULT_BFC1;
+       if(mesa_vp->Base.OutputsWritten & unBit)
+       {
+               pAsm->ucVP_OutputMap[VERT_RESULT_BFC1] = unTotal++;
+       }
 
        //TODO : dealing fog.
-       //unBit = 1 << VERT_RESULT_FOGC;
-       //if(mesa_vp->Base.OutputsWritten & unBit)
-       //{
-       //      pAsm->ucVP_OutputMap[VERT_RESULT_FOGC] = unTotal++;
-       //}
+       unBit = 1 << VERT_RESULT_FOGC;
+       if(mesa_vp->Base.OutputsWritten & unBit)
+       {
+               pAsm->ucVP_OutputMap[VERT_RESULT_FOGC] = unTotal++;
+       }
 
        //TODO : dealing point size.
-       //unBit = 1 << VERT_RESULT_PSIZ;
-       //if(mesa_vp->Base.OutputsWritten & unBit)
-       //{
-       //      pAsm->ucVP_OutputMap[VERT_RESULT_PSIZ] = unTotal++;
-       //}
+       unBit = 1 << VERT_RESULT_PSIZ;
+       if(mesa_vp->Base.OutputsWritten & unBit)
+       {
+               pAsm->ucVP_OutputMap[VERT_RESULT_PSIZ] = unTotal++;
+       }
 
        for(i=0; i<8; i++)
        {
@@ -335,17 +335,13 @@ void * r700GetActiveVpShaderBo(GLcontext * ctx)
 GLboolean r700SetupVertexProgram(GLcontext * ctx)
 {
     context_t *context = R700_CONTEXT(ctx);
-
-    BATCH_LOCALS(&context->radeon);
-
     R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
-
+    BATCH_LOCALS(&context->radeon);
     struct r700_vertex_program *vp
              = (struct r700_vertex_program *)ctx->VertexProgram._Current;
 
     struct gl_program_parameter_list *paramList;
     unsigned int unNumParamData;
-
     unsigned int ui;
 
     if(GL_FALSE == vp->loaded)
@@ -359,7 +355,7 @@ GLboolean r700SetupVertexProgram(GLcontext * ctx)
         r600EmitShader(ctx, 
                        &(vp->shaderbo), 
                        (GLvoid *)(vp->r700Shader.pProgram),
-                       vp->r700Shader.uShaderBinaryDWORDSize,\r
+                       vp->r700Shader.uShaderBinaryDWORDSize,
                        "VS"); 
 
         vp->loaded = GL_TRUE;
@@ -394,7 +390,6 @@ GLboolean r700SetupVertexProgram(GLcontext * ctx)
     */
 
     /* sent out shader constants. */
-
     paramList = vp->mesa_program.Base.Parameters;
 
     if(NULL != paramList)
@@ -403,8 +398,8 @@ GLboolean r700SetupVertexProgram(GLcontext * ctx)
 
         unNumParamData = paramList->NumParameters * 4;
 
-        BEGIN_BATCH_NO_AUTOSTATE(unNumParamData + 2); 
-        
+        BEGIN_BATCH_NO_AUTOSTATE(unNumParamData + 2);
+
         R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_ALU_CONST, unNumParamData));
         /* assembler map const from very beginning. */
         R600_OUT_BATCH(SQ_ALU_CONSTANT_VS_OFFSET * 4);
diff --git a/src/mesa/drivers/dri/r600/radeon_bo_legacy.c b/src/mesa/drivers/dri/r600/radeon_bo_legacy.c
new file mode 120000 (symlink)
index 0000000..79ad050
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_bo_legacy.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_bo_legacy.h b/src/mesa/drivers/dri/r600/radeon_bo_legacy.h
new file mode 120000 (symlink)
index 0000000..83b0f7f
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_bo_legacy.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_bocs_wrapper.h b/src/mesa/drivers/dri/r600/radeon_bocs_wrapper.h
new file mode 120000 (symlink)
index 0000000..ca894b2
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_bocs_wrapper.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_chipset.h b/src/mesa/drivers/dri/r600/radeon_chipset.h
new file mode 120000 (symlink)
index 0000000..eba9900
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_chipset.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_cmdbuf.h b/src/mesa/drivers/dri/r600/radeon_cmdbuf.h
new file mode 120000 (symlink)
index 0000000..a799e1d
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_cmdbuf.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_common.c b/src/mesa/drivers/dri/r600/radeon_common.c
new file mode 120000 (symlink)
index 0000000..67b19ba
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_common.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_common.h b/src/mesa/drivers/dri/r600/radeon_common.h
new file mode 120000 (symlink)
index 0000000..5bcb696
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_common.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_common_context.c b/src/mesa/drivers/dri/r600/radeon_common_context.c
new file mode 120000 (symlink)
index 0000000..86800f3
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_common_context.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_common_context.h b/src/mesa/drivers/dri/r600/radeon_common_context.h
new file mode 120000 (symlink)
index 0000000..4d66312
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_common_context.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_context.h b/src/mesa/drivers/dri/r600/radeon_context.h
deleted file mode 100644 (file)
index 250570f..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/**************************************************************************
-
-Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
-                     VA Linux Systems Inc., Fremont, California.
-Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved.
-
-The Weather Channel (TM) funded Tungsten Graphics to develop the
-initial release of the Radeon 8500 driver under the XFree86 license.
-This notice must be preserved.
-
-All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice (including the
-next paragraph) shall be included in all copies or substantial
-portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-**************************************************************************/
-
-/*
- * Authors:
- *   Gareth Hughes <gareth@valinux.com>
- *   Keith Whitwell <keith@tungstengraphics.com>
- *   Kevin E. Martin <martin@valinux.com>
- *   Nicolai Haehnle <prefect_@gmx.net>
- */
-
-#ifndef __RADEON_CONTEXT_H__
-#define __RADEON_CONTEXT_H__
-
-#include "main/mtypes.h"
-#include "main/colormac.h"
-#include "radeon_screen.h"
-#include "drm.h"
-#include "dri_util.h"
-
-#include "radeon_screen.h"
-
-#if R200_MERGED
-extern void radeonFallback(GLcontext * ctx, GLuint bit, GLboolean mode);
-
-#define FALLBACK( radeon, bit, mode ) do {                     \
-   if ( 0 ) fprintf( stderr, "FALLBACK in %s: #%d=%d\n",       \
-                    __FUNCTION__, bit, mode );                 \
-   radeonFallback( (radeon)->glCtx, bit, mode );               \
-} while (0)
-#else
-#define FALLBACK( radeon, bit, mode ) fprintf(stderr, "%s:%s\n", __LINE__, __FILE__);
-#endif
-
-/* TCL fallbacks */
-extern void radeonTclFallback(GLcontext * ctx, GLuint bit, GLboolean mode);
-
-#if R200_MERGED
-#define TCL_FALLBACK( ctx, bit, mode ) radeonTclFallback( ctx, bit, mode )
-#else
-#define TCL_FALLBACK( ctx, bit, mode ) ;
-#endif
-
-
-#endif                         /* __RADEON_CONTEXT_H__ */
diff --git a/src/mesa/drivers/dri/r600/radeon_cs_legacy.c b/src/mesa/drivers/dri/r600/radeon_cs_legacy.c
new file mode 120000 (symlink)
index 0000000..006720f
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_cs_legacy.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_cs_legacy.h b/src/mesa/drivers/dri/r600/radeon_cs_legacy.h
new file mode 120000 (symlink)
index 0000000..a5f95e0
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_cs_legacy.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_cs_space_drm.c b/src/mesa/drivers/dri/r600/radeon_cs_space_drm.c
new file mode 120000 (symlink)
index 0000000..c248ea7
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_cs_space_drm.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_dma.c b/src/mesa/drivers/dri/r600/radeon_dma.c
new file mode 120000 (symlink)
index 0000000..43be000
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_dma.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_dma.h b/src/mesa/drivers/dri/r600/radeon_dma.h
new file mode 120000 (symlink)
index 0000000..82e5063
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_dma.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_fbo.c b/src/mesa/drivers/dri/r600/radeon_fbo.c
new file mode 120000 (symlink)
index 0000000..0d738d8
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_fbo.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_lock.c b/src/mesa/drivers/dri/r600/radeon_lock.c
new file mode 120000 (symlink)
index 0000000..af4108a
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_lock.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_lock.h b/src/mesa/drivers/dri/r600/radeon_lock.h
new file mode 120000 (symlink)
index 0000000..64bdf94
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_lock.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_mipmap_tree.c b/src/mesa/drivers/dri/r600/radeon_mipmap_tree.c
new file mode 120000 (symlink)
index 0000000..31c0cfb
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_mipmap_tree.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_mipmap_tree.h b/src/mesa/drivers/dri/r600/radeon_mipmap_tree.h
new file mode 120000 (symlink)
index 0000000..254d50c
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_mipmap_tree.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_screen.c b/src/mesa/drivers/dri/r600/radeon_screen.c
new file mode 120000 (symlink)
index 0000000..8616111
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_screen.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_screen.h b/src/mesa/drivers/dri/r600/radeon_screen.h
new file mode 120000 (symlink)
index 0000000..23bb6bd
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_screen.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_span.c b/src/mesa/drivers/dri/r600/radeon_span.c
new file mode 120000 (symlink)
index 0000000..232868c
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_span.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_span.h b/src/mesa/drivers/dri/r600/radeon_span.h
new file mode 120000 (symlink)
index 0000000..f9d6345
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_span.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_texture.c b/src/mesa/drivers/dri/r600/radeon_texture.c
new file mode 120000 (symlink)
index 0000000..a822710
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_texture.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/radeon_texture.h b/src/mesa/drivers/dri/r600/radeon_texture.h
new file mode 120000 (symlink)
index 0000000..17fac3d
--- /dev/null
@@ -0,0 +1 @@
+../radeon/radeon_texture.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/server/radeon.h b/src/mesa/drivers/dri/r600/server/radeon.h
new file mode 120000 (symlink)
index 0000000..81274a5
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/server/radeon_dri.c b/src/mesa/drivers/dri/r600/server/radeon_dri.c
new file mode 120000 (symlink)
index 0000000..d05847d
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon_dri.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/server/radeon_dri.h b/src/mesa/drivers/dri/r600/server/radeon_dri.h
new file mode 120000 (symlink)
index 0000000..27c591d
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon_dri.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/server/radeon_egl.c b/src/mesa/drivers/dri/r600/server/radeon_egl.c
new file mode 120000 (symlink)
index 0000000..d7735a7
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon_egl.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/server/radeon_macros.h b/src/mesa/drivers/dri/r600/server/radeon_macros.h
new file mode 120000 (symlink)
index 0000000..c56cd73
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon_macros.h
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r600/server/radeon_reg.h b/src/mesa/drivers/dri/r600/server/radeon_reg.h
new file mode 120000 (symlink)
index 0000000..e2349dc
--- /dev/null
@@ -0,0 +1 @@
+../../radeon/server/radeon_reg.h
\ No newline at end of file
index 8eeaea1..8789e3a 100644 (file)
 #include <stdint.h>
 //#include "radeon_track.h"
 
-#ifndef RADEON_DEBUG_BO
-#define RADEON_DEBUG_BO 0
-#endif
-
 /* bo object */
 #define RADEON_BO_FLAGS_MACRO_TILE  1
 #define RADEON_BO_FLAGS_MICRO_TILE  2
@@ -61,28 +57,22 @@ struct radeon_bo {
 
 /* bo functions */
 struct radeon_bo_funcs {
-#ifdef RADEON_DEBUG_BO
-    struct radeon_bo *(*bo_open)(struct radeon_bo_manager *bom,
-                                 uint32_t handle,
-                                 uint32_t size,
-                                 uint32_t alignment,
-                                 uint32_t domains,
-                                 uint32_t flags,
-                                 char * szBufUsage);
-#else
     struct radeon_bo *(*bo_open)(struct radeon_bo_manager *bom,
                                  uint32_t handle,
                                  uint32_t size,
                                  uint32_t alignment,
                                  uint32_t domains,
                                  uint32_t flags);
-#endif /* RADEON_DEBUG_BO */
     void (*bo_ref)(struct radeon_bo *bo);
     struct radeon_bo *(*bo_unref)(struct radeon_bo *bo);
     int (*bo_map)(struct radeon_bo *bo, int write);
     int (*bo_unmap)(struct radeon_bo *bo);
     int (*bo_wait)(struct radeon_bo *bo);
     int (*bo_is_static)(struct radeon_bo *bo);
+    int (*bo_set_tiling)(struct radeon_bo *bo, uint32_t tiling_flags,
+                         uint32_t pitch);
+    int (*bo_get_tiling)(struct radeon_bo *bo, uint32_t *tiling_flags,
+                         uint32_t *pitch);
 };
 
 struct radeon_bo_manager {
@@ -110,20 +100,13 @@ static inline struct radeon_bo *_radeon_bo_open(struct radeon_bo_manager *bom,
                                                 uint32_t alignment,
                                                 uint32_t domains,
                                                 uint32_t flags,
-#ifdef RADEON_DEBUG_BO
-                                                char * szBufUsage,
-#endif /* RADEON_DEBUG_BO */
                                                 const char *file,
                                                 const char *func,
                                                 int line)
 {
     struct radeon_bo *bo;
 
-#ifdef RADEON_DEBUG_BO
-    bo = bom->funcs->bo_open(bom, handle, size, alignment, domains, flags, szBufUsage);
-#else
     bo = bom->funcs->bo_open(bom, handle, size, alignment, domains, flags);
-#endif /* RADEON_DEBUG_BO */
 
 #ifdef RADEON_BO_TRACK
     if (bo) {
@@ -187,6 +170,18 @@ static inline int _radeon_bo_wait(struct radeon_bo *bo,
     return bo->bom->funcs->bo_wait(bo);
 }
 
+static inline int radeon_bo_set_tiling(struct radeon_bo *bo,
+                                      uint32_t tiling_flags, uint32_t pitch)
+{
+    return bo->bom->funcs->bo_set_tiling(bo, tiling_flags, pitch);
+}
+
+static inline int radeon_bo_get_tiling(struct radeon_bo *bo,
+                                      uint32_t *tiling_flags, uint32_t *pitch)
+{
+    return bo->bom->funcs->bo_get_tiling(bo, tiling_flags, pitch);
+}
+
 static inline int radeon_bo_is_static(struct radeon_bo *bo)
 {
        if (bo->bom->funcs->bo_is_static)
@@ -194,13 +189,8 @@ static inline int radeon_bo_is_static(struct radeon_bo *bo)
        return 0;
 }
 
-#ifdef RADEON_DEBUG_BO
-#define radeon_bo_open(bom, h, s, a, d, f, u)\
-    _radeon_bo_open(bom, h, s, a, d, f, u, __FILE__, __FUNCTION__, __LINE__)
-#else
 #define radeon_bo_open(bom, h, s, a, d, f)\
     _radeon_bo_open(bom, h, s, a, d, f, __FILE__, __FUNCTION__, __LINE__)
-#endif /* RADEON_DEBUG_BO */
 #define radeon_bo_ref(bo)\
     _radeon_bo_ref(bo, __FILE__, __FUNCTION__, __LINE__)
 #define radeon_bo_unref(bo)\
index 992eb46..5575da6 100644 (file)
@@ -69,9 +69,6 @@ struct bo_legacy {
     void                *ptr;
     struct bo_legacy    *next, *prev;
     struct bo_legacy    *pnext, *pprev;
-#ifdef RADEON_DEBUG_BO
-    char                szBufUsage[16];
-#endif /* RADEON_DEBUG_BO */
 };
 
 struct bo_manager_legacy {
@@ -289,12 +286,7 @@ static struct bo_legacy *bo_allocate(struct bo_manager_legacy *boml,
                                      uint32_t size,
                                      uint32_t alignment,
                                      uint32_t domains,
-#ifdef RADEON_DEBUG_BO
-                                     uint32_t flags,
-                                     char * szBufUsage)
-#else
                                      uint32_t flags)
-#endif /* RADEON_DEBUG_BO */
 {
     struct bo_legacy *bo_legacy;
     static int pgsize;
@@ -327,10 +319,6 @@ static struct bo_legacy *bo_allocate(struct bo_manager_legacy *boml,
         bo_legacy->next->prev = bo_legacy;
     }
 
-#ifdef RADEON_DEBUG_BO
-    sprintf(bo_legacy->szBufUsage, "%s", szBufUsage); 
-#endif /* RADEON_DEBUG_BO */
-
     return bo_legacy;
 }
 
@@ -429,12 +417,7 @@ static struct radeon_bo *bo_open(struct radeon_bo_manager *bom,
                                  uint32_t size,
                                  uint32_t alignment,
                                  uint32_t domains,
-#ifdef RADEON_DEBUG_BO
-                                 uint32_t flags,
-                                 char *   szBufUsage)
-#else
                                  uint32_t flags)
-#endif /* RADEON_DEBUG_BO */
 {
     struct bo_manager_legacy *boml = (struct bo_manager_legacy *)bom;
     struct bo_legacy *bo_legacy;
@@ -451,11 +434,7 @@ static struct radeon_bo *bo_open(struct radeon_bo_manager *bom,
         }
         return NULL;
     }
-#ifdef RADEON_DEBUG_BO
-    bo_legacy = bo_allocate(boml, size, alignment, domains, flags, szBufUsage);
-#else
     bo_legacy = bo_allocate(boml, size, alignment, domains, flags);
-#endif /* RADEON_DEBUG_BO */
     bo_legacy->static_bo = 0;
     r = legacy_new_handle(boml, &bo_legacy->base.handle);
     if (r) {
@@ -577,6 +556,8 @@ static struct radeon_bo_funcs bo_legacy_funcs = {
     bo_unmap,
     NULL,
     bo_is_static,
+    NULL,
+    NULL,
 };
 
 static int bo_vram_validate(struct radeon_bo *bo,
@@ -622,12 +603,34 @@ static int bo_vram_validate(struct radeon_bo *bo,
 
     if (bo_legacy->dirty || bo_legacy->tobj->base.dirty_images[0]) {
            if (IS_R600_CLASS(boml->screen)) {
-                   char *src = bo_legacy->ptr;
-                   char *dst = (char *) boml->screen->driScreen->pFB +
-                           (bo_legacy->offset - boml->fb_location);
+                   drm_radeon_texture_t tex;
+                   drm_radeon_tex_image_t tmp;
+                   int ret;
 
-                   /* FIXME: alignment, pitch, etc. */
-                   memcpy(dst, src, bo->size);
+                   tex.offset = bo_legacy->offset;
+                   tex.image = &tmp;
+                   assert(!(tex.offset & 1023));
+
+                   tmp.x = 0;
+                   tmp.y = 0;
+                   tmp.width = bo->size;
+                   tmp.height = 1;
+                   tmp.data = bo_legacy->ptr;
+                   tex.format = RADEON_TXFORMAT_ARGB8888;
+                   tex.width = tmp.width;
+                   tex.height = tmp.height;
+                   tex.pitch = bo->size;
+                   do {
+                           ret = drmCommandWriteRead(bo->bom->fd,
+                                                     DRM_RADEON_TEXTURE,
+                                                     &tex,
+                                                     sizeof(drm_radeon_texture_t));
+                           if (ret) {
+                                   if (RADEON_DEBUG & DEBUG_IOCTL)
+                                           fprintf(stderr, "DRM_RADEON_TEXTURE:  again!\n");
+                                   usleep(1);
+                           }
+                   } while (ret == -EAGAIN);
            } else {
                    /* Copy to VRAM using a blit.
                     * All memory is 4K aligned. We're using 1024 pixels wide blits.
@@ -689,14 +692,8 @@ int radeon_bo_legacy_validate(struct radeon_bo *bo,
     int retries = 0;
 
     if (bo_legacy->map_count) {
-#ifdef RADEON_DEBUG_BO
-        fprintf(stderr, "bo(%p, %d, %s) is mapped (%d) can't valide it.\n",
-                bo, bo->size, bo_legacy->szBufUsage, bo_legacy->map_count);
-#else
         fprintf(stderr, "bo(%p, %d) is mapped (%d) can't valide it.\n",
                 bo, bo->size, bo_legacy->map_count);
-#endif /* RADEON_DEBUG_BO */
-
         return -EINVAL;
     }
     if (bo_legacy->static_bo || bo_legacy->validated) {
@@ -768,21 +765,13 @@ void radeon_bo_manager_legacy_dtor(struct radeon_bo_manager *bom)
 }
 
 static struct bo_legacy *radeon_legacy_bo_alloc_static(struct bo_manager_legacy *bom,
-                                                      int size, 
-#ifdef RADEON_DEBUG_BO
-                               uint32_t offset,
-                               char * szBufUsage)
-#else
-                               uint32_t offset)
-#endif /* RADEON_DEBUG_BO */
+                                                      int size,
+                                                      uint32_t offset)
 {
     struct bo_legacy *bo;
 
-#ifdef RADEON_DEBUG_BO
-    bo = bo_allocate(bom, size, 0, RADEON_GEM_DOMAIN_VRAM, 0, szBufUsage);
-#else
     bo = bo_allocate(bom, size, 0, RADEON_GEM_DOMAIN_VRAM, 0);
-#endif /* RADEON_DEBUG_BO */
+
     if (bo == NULL)
        return NULL;
     bo->static_bo = 1;
@@ -843,11 +832,8 @@ struct radeon_bo_manager *radeon_bo_manager_legacy_ctor(struct radeon_screen *sc
     size = 4096*4096*4; 
 
     /* allocate front */
-#ifdef RADEON_DEBUG_BO
-    bo = radeon_legacy_bo_alloc_static(bom, size, bom->screen->frontOffset, "FRONT BUF");
-#else
     bo = radeon_legacy_bo_alloc_static(bom, size, bom->screen->frontOffset);
-#endif /* RADEON_DEBUG_BO */
+
     if (!bo) {
         radeon_bo_manager_legacy_dtor((struct radeon_bo_manager*)bom);
         return NULL;
@@ -857,11 +843,8 @@ struct radeon_bo_manager *radeon_bo_manager_legacy_ctor(struct radeon_screen *sc
     }
 
     /* allocate back */
-#ifdef RADEON_DEBUG_BO
-    bo = radeon_legacy_bo_alloc_static(bom, size, bom->screen->backOffset, "BACK BUF");
-#else
     bo = radeon_legacy_bo_alloc_static(bom, size, bom->screen->backOffset);
-#endif /* RADEON_DEBUG_BO */
+
     if (!bo) {
         radeon_bo_manager_legacy_dtor((struct radeon_bo_manager*)bom);
         return NULL;
@@ -871,11 +854,8 @@ struct radeon_bo_manager *radeon_bo_manager_legacy_ctor(struct radeon_screen *sc
     }
 
     /* allocate depth */
-#ifdef RADEON_DEBUG_BO
-    bo = radeon_legacy_bo_alloc_static(bom, size, bom->screen->depthOffset, "Z BUF");
-#else
     bo = radeon_legacy_bo_alloc_static(bom, size, bom->screen->depthOffset);
-#endif /* RADEON_DEBUG_BO */
+
     if (!bo) {
         radeon_bo_manager_legacy_dtor((struct radeon_bo_manager*)bom);
         return NULL;
@@ -904,3 +884,29 @@ unsigned radeon_bo_legacy_relocs_size(struct radeon_bo *bo)
     return bo->size;
 }
 
+/*
+ * Fake up a bo for things like texture image_override.
+ * bo->offset already includes fb_location
+ */
+struct radeon_bo *radeon_legacy_bo_alloc_fake(struct radeon_bo_manager *bom,
+                                             int size,
+                                             uint32_t offset)
+{
+    struct bo_manager_legacy *boml = (struct bo_manager_legacy *)bom;
+    struct bo_legacy *bo;
+
+    bo = bo_allocate(boml, size, 0, RADEON_GEM_DOMAIN_VRAM, 0);
+
+    if (bo == NULL)
+       return NULL;
+    bo->static_bo = 1;
+    bo->offset = offset;
+    bo->base.handle = bo->offset;
+    bo->ptr = boml->screen->driScreen->pFB + (offset - boml->fb_location);
+    if (bo->base.handle > boml->nhandle) {
+        boml->nhandle = bo->base.handle + 1;
+    }
+    radeon_bo_ref(&(bo->base));
+    return &(bo->base);
+}
+
index 0db817c..455adeb 100644 (file)
@@ -42,5 +42,8 @@ struct radeon_bo_manager *radeon_bo_manager_legacy_ctor(struct radeon_screen *sc
 void radeon_bo_manager_legacy_dtor(struct radeon_bo_manager *bom);
 void radeon_bo_legacy_texture_age(struct radeon_bo_manager *bom);
 unsigned radeon_bo_legacy_relocs_size(struct radeon_bo *bo);
+struct radeon_bo *radeon_legacy_bo_alloc_fake(struct radeon_bo_manager *bom,
+                                             int size,
+                                             uint32_t offset);
 
 #endif
index e0c70dd..a42870f 100644 (file)
 #define RADEON_GEM_DOMAIN_GTT 0x2   // GTT or cache flushed
 #define RADEON_GEM_DOMAIN_VRAM 0x4  // VRAM domain
 
+#define RADEON_TILING_MACRO 0x1
+#define RADEON_TILING_MICRO 0x2
+#define RADEON_TILING_SWAP 0x4
+#define RADEON_TILING_SURFACE 0x8 /* this object requires a surface
+                                  * when mapped - i.e. front buffer */
+
 /* to be used to build locally in mesa with no libdrm bits */
 #include "../radeon/radeon_bo_drm.h"
 #include "../radeon/radeon_cs_drm.h"
diff --git a/src/mesa/drivers/dri/radeon/radeon_buffer_objects.c b/src/mesa/drivers/dri/radeon/radeon_buffer_objects.c
new file mode 100644 (file)
index 0000000..e8ae51e
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2009 Maciej Cencora <m.cencora@gmail.com>
+ *
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include "radeon_buffer_objects.h"
+
+#include "main/imports.h"
+#include "main/mtypes.h"
+#include "main/bufferobj.h"
+
+#include "radeon_common.h"
+
+struct radeon_buffer_object *
+get_radeon_buffer_object(struct gl_buffer_object *obj)
+{
+    return (struct radeon_buffer_object *) obj;
+}
+
+static struct gl_buffer_object *
+radeonNewBufferObject(GLcontext * ctx,
+                      GLuint name,
+                      GLenum target)
+{
+    struct radeon_buffer_object *obj = CALLOC_STRUCT(radeon_buffer_object);
+
+    _mesa_initialize_buffer_object(&obj->Base, name, target);
+
+    obj->bo = NULL;
+
+    return &obj->Base;
+}
+
+/**
+ * Called via glDeleteBuffersARB().
+ */
+static void
+radeonDeleteBufferObject(GLcontext * ctx,
+                         struct gl_buffer_object *obj)
+{
+    struct radeon_buffer_object *radeon_obj = get_radeon_buffer_object(obj);
+
+    if (obj->Pointer) {
+        radeon_bo_unmap(radeon_obj->bo);
+    }
+
+    if (radeon_obj->bo) {
+        radeon_bo_unref(radeon_obj->bo);
+    }
+
+    _mesa_free(radeon_obj);
+}
+
+
+/**
+ * Allocate space for and store data in a buffer object.  Any data that was
+ * previously stored in the buffer object is lost.  If data is NULL,
+ * memory will be allocated, but no copy will occur.
+ * Called via glBufferDataARB().
+ */
+static void
+radeonBufferData(GLcontext * ctx,
+                 GLenum target,
+                 GLsizeiptrARB size,
+                 const GLvoid * data,
+                 GLenum usage,
+                 struct gl_buffer_object *obj)
+{
+    radeonContextPtr radeon = RADEON_CONTEXT(ctx);
+    struct radeon_buffer_object *radeon_obj = get_radeon_buffer_object(obj);
+
+    radeon_obj->Base.Size = size;
+    radeon_obj->Base.Usage = usage;
+
+    if (radeon_obj->bo != NULL) {
+        radeon_bo_unref(radeon_obj->bo);
+        radeon_obj->bo = NULL;
+    }
+
+    if (size != 0) {
+        radeon_obj->bo = radeon_bo_open(radeon->radeonScreen->bom,
+                                        0,
+                                        size,
+                                        32,
+                                        RADEON_GEM_DOMAIN_GTT,
+                                        0);
+
+        if (data != NULL) {
+            radeon_bo_map(radeon_obj->bo, GL_TRUE);
+
+            _mesa_memcpy(radeon_obj->bo->ptr, data, size);
+
+            radeon_bo_unmap(radeon_obj->bo);
+        }
+    }
+}
+
+/**
+ * Replace data in a subrange of buffer object.  If the data range
+ * specified by size + offset extends beyond the end of the buffer or
+ * if data is NULL, no copy is performed.
+ * Called via glBufferSubDataARB().
+ */
+static void
+radeonBufferSubData(GLcontext * ctx,
+                    GLenum target,
+                    GLintptrARB offset,
+                    GLsizeiptrARB size,
+                    const GLvoid * data,
+                    struct gl_buffer_object *obj)
+{
+    struct radeon_buffer_object *radeon_obj = get_radeon_buffer_object(obj);
+
+    radeon_bo_map(radeon_obj->bo, GL_TRUE);
+
+    _mesa_memcpy(radeon_obj->bo->ptr + offset, data, size);
+
+    radeon_bo_unmap(radeon_obj->bo);
+}
+
+/**
+ * Called via glGetBufferSubDataARB()
+ */
+static void
+radeonGetBufferSubData(GLcontext * ctx,
+                       GLenum target,
+                       GLintptrARB offset,
+                       GLsizeiptrARB size,
+                       GLvoid * data,
+                       struct gl_buffer_object *obj)
+{
+    struct radeon_buffer_object *radeon_obj = get_radeon_buffer_object(obj);
+
+    radeon_bo_map(radeon_obj->bo, GL_FALSE);
+
+    _mesa_memcpy(data, radeon_obj->bo->ptr + offset, size);
+
+    radeon_bo_unmap(radeon_obj->bo);
+}
+
+/**
+ * Called via glMapBufferARB()
+ */
+static void *
+radeonMapBuffer(GLcontext * ctx,
+                GLenum target,
+                GLenum access,
+                struct gl_buffer_object *obj)
+{
+    struct radeon_buffer_object *radeon_obj = get_radeon_buffer_object(obj);
+
+    if (access == GL_WRITE_ONLY_ARB) {
+        ctx->Driver.Flush(ctx);
+    }
+
+    if (radeon_obj->bo == NULL) {
+        obj->Pointer = NULL;
+        return NULL;
+    }
+
+    radeon_bo_map(radeon_obj->bo, access == GL_WRITE_ONLY_ARB);
+
+    return obj->Pointer = radeon_obj->bo->ptr;
+}
+
+
+/**
+ * Called via glUnmapBufferARB()
+ */
+static GLboolean
+radeonUnmapBuffer(GLcontext * ctx,
+                  GLenum target,
+                  struct gl_buffer_object *obj)
+{
+    struct radeon_buffer_object *radeon_obj = get_radeon_buffer_object(obj);
+
+    if (radeon_obj->bo != NULL) {
+        radeon_bo_unmap(radeon_obj->bo);
+        obj->Pointer = NULL;
+    }
+
+    return GL_TRUE;
+}
+
+void
+radeonInitBufferObjectFuncs(struct dd_function_table *functions)
+{
+    functions->NewBufferObject = radeonNewBufferObject;
+    functions->DeleteBuffer = radeonDeleteBufferObject;
+    functions->BufferData = radeonBufferData;
+    functions->BufferSubData = radeonBufferSubData;
+    functions->GetBufferSubData = radeonGetBufferSubData;
+    functions->MapBuffer = radeonMapBuffer;
+    functions->UnmapBuffer = radeonUnmapBuffer;
+}
diff --git a/src/mesa/drivers/dri/radeon/radeon_buffer_objects.h b/src/mesa/drivers/dri/radeon/radeon_buffer_objects.h
new file mode 100644 (file)
index 0000000..d681960
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2009 Maciej Cencora <m.cencora@gmail.com>
+ *
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef RADEON_BUFFER_OBJECTS_H
+#define RADEON_BUFFER_OBJECTS_H
+
+#include "main/mtypes.h"
+
+struct radeon_bo;
+
+/**
+ * Radeon vertex/pixel buffer object, derived from Mesa's gl_buffer_object.
+ */
+struct radeon_buffer_object
+{
+   struct gl_buffer_object Base;
+   struct radeon_bo *bo;
+};
+
+struct radeon_buffer_object *
+get_radeon_buffer_object(struct gl_buffer_object *obj);
+
+/**
+ * Hook the bufferobject implementation into mesa:
+ */
+void radeonInitBufferObjectFuncs(struct dd_function_table *functions);
+
+#endif
index 0a6a2df..a275c8f 100644 (file)
 #define PCI_CHIP_RV770_947A             0x947A
 #define PCI_CHIP_RV770_947B             0x947B
 
+#define PCI_CHIP_RV730_9480             0x9480
 #define PCI_CHIP_RV730_9487             0x9487
+#define PCI_CHIP_RV730_9488             0x9488
 #define PCI_CHIP_RV730_9489             0x9489
 #define PCI_CHIP_RV730_948F             0x948F
 #define PCI_CHIP_RV730_9490             0x9490
 #define PCI_CHIP_RV730_9491             0x9491
+#define PCI_CHIP_RV730_9495             0x9495
 #define PCI_CHIP_RV730_9498             0x9498
 #define PCI_CHIP_RV730_949C             0x949C
 #define PCI_CHIP_RV730_949E             0x949E
 #define PCI_CHIP_RV710_9552             0x9552
 #define PCI_CHIP_RV710_9553             0x9553
 #define PCI_CHIP_RV710_9555             0x9555
+#define PCI_CHIP_RV710_9557             0x9557
 
 #define PCI_CHIP_RV740_94A0             0x94A0
 #define PCI_CHIP_RV740_94A1             0x94A1
+#define PCI_CHIP_RV740_94A3             0x94A3
 #define PCI_CHIP_RV740_94B1             0x94B1
 #define PCI_CHIP_RV740_94B3             0x94B3
+#define PCI_CHIP_RV740_94B4             0x94B4
 #define PCI_CHIP_RV740_94B5             0x94B5
+#define PCI_CHIP_RV740_94B9             0x94B9
 
 enum {
    CHIP_FAMILY_R100,
index dde615a..0614c89 100644 (file)
@@ -481,32 +481,6 @@ void radeonCopyBuffer( __DRIdrawablePrivate *dPriv,
                if (!n)
                        continue;
 
-               if (IS_R600_CLASS(rmesa->radeonScreen)) {
-                       int cpp = rmesa->radeonScreen->cpp;
-                       int src_pitch = rmesa->radeonScreen->backPitch * cpp;
-                       int dst_pitch = rmesa->radeonScreen->frontPitch * cpp;
-                       char *src = (char *)rmesa->radeonScreen->driScreen->pFB + rmesa->radeonScreen->backOffset;
-                       char *dst = (char *)rmesa->radeonScreen->driScreen->pFB + rmesa->radeonScreen->frontOffset;
-                       int j;
-                       drm_clip_rect_t *pb = rmesa->sarea->boxes;
-
-                       for (j = 0; j < n; j++) {
-                               int x = pb[j].x1;
-                               int y = pb[j].y1;
-                               int w = pb[j].x2 - x;
-                               int h = pb[j].y2 - y;
-
-                               src += (y * src_pitch) + (x * cpp);
-                               dst += (y * dst_pitch) + (x * cpp);
-
-                               while (h--) {
-                                       memcpy(dst, src, w * cpp);
-                                       src += src_pitch;
-                                       dst += dst_pitch;
-                               }
-                       }
-               }
-
                ret = drmCommandNone( rmesa->dri.fd, DRM_RADEON_SWAP );
 
                if ( ret ) {
@@ -887,10 +861,11 @@ void radeonUpdatePageFlipping(radeonContextPtr radeon)
 
 void radeon_window_moved(radeonContextPtr radeon)
 {
+       /* Cliprects has to be updated before doing anything else */
+       radeonSetCliprects(radeon);
        if (!radeon->radeonScreen->driScreen->dri2.enabled) {
                radeonUpdatePageFlipping(radeon);
        }
-       radeonSetCliprects(radeon);
 }
 
 void radeon_viewport(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height)
@@ -905,7 +880,7 @@ void radeon_viewport(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei he
 
        if (!radeon->meta.internal_viewport_call && ctx->DrawBuffer->Name == 0) {
                if (radeon->is_front_buffer_rendering) {
-                       radeonFlush(ctx);
+                       ctx->Driver.Flush(ctx);
                }
                radeon_update_renderbuffers(driContext, driContext->driDrawablePriv);
                if (driContext->driDrawablePriv != driContext->driReadablePriv)
@@ -1092,7 +1067,7 @@ void radeonFlush(GLcontext *ctx)
                         * each of N places that do rendering.  This has worse performances,
                         * but it is much easier to get correct.
                         */
-                       if (radeon->is_front_buffer_rendering) {
+                       if (!radeon->is_front_buffer_rendering) {
                                radeon->front_buffer_dirty = GL_FALSE;
                        }
                }
@@ -1236,7 +1211,7 @@ void rcommonInitCmdBuf(radeonContextPtr rmesa)
        rmesa->cmdbuf.size = size;
 
        radeon_cs_space_set_flush(rmesa->cmdbuf.cs,
-                                 (void (*)(void *))radeonFlush, rmesa->glCtx);
+                                 (void (*)(void *))rmesa->glCtx->Driver.Flush, rmesa->glCtx);
 
        if (!rmesa->radeonScreen->kernel_mm) {
                radeon_cs_set_limit(rmesa->cmdbuf.cs, RADEON_GEM_DOMAIN_VRAM, rmesa->radeonScreen->texSize[0]);
index 285e015..c0abcbf 100644 (file)
@@ -85,6 +85,17 @@ static const char* get_chip_family_name(int chip_family)
        case CHIP_FAMILY_R580: return "R580";
        case CHIP_FAMILY_RV560: return "RV560";
        case CHIP_FAMILY_RV570: return "RV570";
+       case CHIP_FAMILY_R600: return "R600";
+       case CHIP_FAMILY_RV610: return "RV610";
+       case CHIP_FAMILY_RV630: return "RV630";
+       case CHIP_FAMILY_RV670: return "RV670";
+       case CHIP_FAMILY_RV620: return "RV620";
+       case CHIP_FAMILY_RV635: return "RV635";
+       case CHIP_FAMILY_RS780: return "RS780";
+       case CHIP_FAMILY_RV770: return "RV770";
+       case CHIP_FAMILY_RV730: return "RV730";
+       case CHIP_FAMILY_RV710: return "RV710";
+       case CHIP_FAMILY_RV740: return "RV740";
        default: return "unknown";
        }
 }
@@ -200,6 +211,7 @@ GLboolean radeonInitContext(radeonContextPtr radeon,
        radeon->dri.screen = sPriv;
        radeon->dri.hwContext = driContextPriv->hHWContext;
        radeon->dri.hwLock = &sPriv->pSAREA->lock;
+       radeon->dri.hwLockCount = 0;
        radeon->dri.fd = sPriv->fd;
        radeon->dri.drmMinor = sPriv->drm_version.minor;
 
@@ -230,7 +242,26 @@ GLboolean radeonInitContext(radeonContextPtr radeon,
                 radeon->texture_depth = ( glVisual->rgbBits > 16 ) ?
                DRI_CONF_TEXTURE_DEPTH_32 : DRI_CONF_TEXTURE_DEPTH_16;
 
-       radeon->texture_row_align = 32;
+       if (IS_R600_CLASS(radeon->radeonScreen)) {
+               radeon->texture_row_align = 256;
+               radeon->texture_rect_row_align = 256;
+               radeon->texture_compressed_row_align = 256;
+       } else if (IS_R200_CLASS(radeon->radeonScreen) ||
+                  IS_R100_CLASS(radeon->radeonScreen)) {
+               radeon->texture_row_align = 32;
+               radeon->texture_rect_row_align = 64;
+               radeon->texture_compressed_row_align = 32;
+       } else { /* R300 - not sure this is all correct */
+               int chip_family = radeon->radeonScreen->chip_family;
+               if (chip_family == CHIP_FAMILY_RS600 ||
+                   chip_family == CHIP_FAMILY_RS690 ||
+                   chip_family == CHIP_FAMILY_RS740)
+                       radeon->texture_row_align = 64;
+               else
+                       radeon->texture_row_align = 32;
+               radeon->texture_rect_row_align = 64;
+               radeon->texture_compressed_row_align = 64;
+       }
 
        return GL_TRUE;
 }
@@ -264,11 +295,10 @@ void radeonDestroyContext(__DRIcontextPrivate *driContextPriv )
        GET_CURRENT_CONTEXT(ctx);
        radeonContextPtr radeon = (radeonContextPtr) driContextPriv->driverPrivate;
        radeonContextPtr current = ctx ? RADEON_CONTEXT(ctx) : NULL;
-
-    /* +r6/r7 */
-    __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
+#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) /* +r6/r7 */
+       __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
        radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private);
-    /* --------- */
+#endif
 
        if (radeon == current) {
                radeon_firevertices(radeon);
@@ -276,16 +306,7 @@ void radeonDestroyContext(__DRIcontextPrivate *driContextPriv )
        }
 
        assert(radeon);
-       if (radeon) 
-    {
-
-#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) /* +r6/r7 */
-           if (IS_R600_CLASS(screen))
-        {
-               r600DestroyContext(driContextPriv);
-        }
-#endif
-
+       if (radeon) {
                if (radeon->dma.current) {
                        rcommonFlushCmdBuf( radeon, __FUNCTION__ );
                }
@@ -356,88 +377,48 @@ radeon_make_kernel_renderbuffer_current(radeonContextPtr radeon,
 
        if ((rb = (void *)draw->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
                if (!rb->bo) {
-#ifdef RADEON_DEBUG_BO
-            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
-                                               radeon->radeonScreen->frontOffset,
-                                               0,
-                                               0,
-                                               RADEON_GEM_DOMAIN_VRAM,
-                                               0,
-                        "Front Buf");
-#else
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->frontOffset,
                                                0,
                                                0,
                                                RADEON_GEM_DOMAIN_VRAM,
                                                0);
-#endif /* RADEON_DEBUG_BO */
                }
                rb->cpp = radeon->radeonScreen->cpp;
                rb->pitch = radeon->radeonScreen->frontPitch * rb->cpp;
        }
        if ((rb = (void *)draw->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
                if (!rb->bo) {
-#ifdef RADEON_DEBUG_BO
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->backOffset,
                                                0,
                                                0,
                                                RADEON_GEM_DOMAIN_VRAM,
-                                               0,
-                        "Back Buf");
-#else
-            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
-                                               radeon->radeonScreen->backOffset,
-                                               0,
-                                               0,
-                                               RADEON_GEM_DOMAIN_VRAM,
                                                0);
-#endif /* RADEON_DEBUG_BO */
                }
                rb->cpp = radeon->radeonScreen->cpp;
                rb->pitch = radeon->radeonScreen->backPitch * rb->cpp;
        }
        if ((rb = (void *)draw->base.Attachment[BUFFER_DEPTH].Renderbuffer)) {
                if (!rb->bo) {
-#ifdef RADEON_DEBUG_BO
-            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
-                                               radeon->radeonScreen->depthOffset,
-                                               0,
-                                               0,
-                                               RADEON_GEM_DOMAIN_VRAM,
-                                               0,
-                        "Z Buf");
-#else
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->depthOffset,
                                                0,
                                                0,
                                                RADEON_GEM_DOMAIN_VRAM,
                                                0);
-#endif /* RADEON_DEBUG_BO */
                }
                rb->cpp = radeon->radeonScreen->cpp;
                rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
        }
        if ((rb = (void *)draw->base.Attachment[BUFFER_STENCIL].Renderbuffer)) {
                if (!rb->bo) {
-#ifdef RADEON_DEBUG_BO
-            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
-                                               radeon->radeonScreen->depthOffset,
-                                               0,
-                                               0,
-                                               RADEON_GEM_DOMAIN_VRAM,
-                                               0,
-                        "Stencil Buf");
-#else
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->depthOffset,
                                                0,
                                                0,
                                                RADEON_GEM_DOMAIN_VRAM,
                                                0);
-#endif /* RADEON_DEBUG_BO */
                }
                rb->cpp = radeon->radeonScreen->cpp;
                rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
@@ -460,16 +441,6 @@ radeon_make_renderbuffer_current(radeonContextPtr radeon,
 
        if ((rb = (void *)draw->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
                if (!rb->bo) {
-#ifdef RADEON_DEBUG_BO
-            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
-                                               radeon->radeonScreen->frontOffset +
-                                               radeon->radeonScreen->fbLocation,
-                                               size,
-                                               4096,
-                                               RADEON_GEM_DOMAIN_VRAM,
-                                               0,
-                        "Front Buf");
-#else
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->frontOffset +
                                                radeon->radeonScreen->fbLocation,
@@ -477,23 +448,12 @@ radeon_make_renderbuffer_current(radeonContextPtr radeon,
                                                4096,
                                                RADEON_GEM_DOMAIN_VRAM,
                                                0);
-#endif /* RADEON_DEBUG_BO */
                }
                rb->cpp = radeon->radeonScreen->cpp;
                rb->pitch = radeon->radeonScreen->frontPitch * rb->cpp;
        }
        if ((rb = (void *)draw->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
                if (!rb->bo) {
-#ifdef RADEON_DEBUG_BO
-            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
-                                               radeon->radeonScreen->backOffset +
-                                               radeon->radeonScreen->fbLocation,
-                                               size,
-                                               4096,
-                                               RADEON_GEM_DOMAIN_VRAM,
-                                               0,
-                        "Back Buf");
-#else
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->backOffset +
                                                radeon->radeonScreen->fbLocation,
@@ -501,55 +461,32 @@ radeon_make_renderbuffer_current(radeonContextPtr radeon,
                                                4096,
                                                RADEON_GEM_DOMAIN_VRAM,
                                                0);
-#endif /* RADEON_DEBUG_BO */
                }
                rb->cpp = radeon->radeonScreen->cpp;
                rb->pitch = radeon->radeonScreen->backPitch * rb->cpp;
        }
        if ((rb = (void *)draw->base.Attachment[BUFFER_DEPTH].Renderbuffer)) {
                if (!rb->bo) {
-#ifdef RADEON_DEBUG_BO
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->depthOffset +
                                                radeon->radeonScreen->fbLocation,
                                                size,
                                                4096,
                                                RADEON_GEM_DOMAIN_VRAM,
-                                               0,
-                        "Z Buf");
-#else
-            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
-                                               radeon->radeonScreen->depthOffset +
-                                               radeon->radeonScreen->fbLocation,
-                                               size,
-                                               4096,
-                                               RADEON_GEM_DOMAIN_VRAM,
                                                0);
-#endif /* RADEON_DEBUG_BO */
                }
                rb->cpp = radeon->radeonScreen->cpp;
                rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
        }
        if ((rb = (void *)draw->base.Attachment[BUFFER_STENCIL].Renderbuffer)) {
                if (!rb->bo) {
-#ifdef RADEON_DEBUG_BO
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->depthOffset +
                                                radeon->radeonScreen->fbLocation,
                                                size,
                                                4096,
                                                RADEON_GEM_DOMAIN_VRAM,
-                                               0,
-                        "Stencil Buf");
-#else
-            rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
-                                               radeon->radeonScreen->depthOffset +
-                                               radeon->radeonScreen->fbLocation,
-                                               size,
-                                               4096,
-                                               RADEON_GEM_DOMAIN_VRAM,
                                                0);
-#endif /* RADEON_DEBUG_BO */
                }
                rb->cpp = radeon->radeonScreen->cpp;
                rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
@@ -732,28 +669,29 @@ radeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)
                        bo = depth_bo;
                        radeon_bo_ref(bo);
                } else {
-#ifdef RADEON_DEBUG_BO
-            bo = radeon_bo_open(radeon->radeonScreen->bom,
-                                               buffers[i].name,
-                                               0,
-                                               0,
-                                               RADEON_GEM_DOMAIN_VRAM,
-                                               buffers[i].flags,
-                        regname);
-#else
+                       uint32_t tiling_flags = 0, pitch = 0;
+                       int ret;
+
                        bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                buffers[i].name,
                                                0,
                                                0,
                                                RADEON_GEM_DOMAIN_VRAM,
                                                buffers[i].flags);
-#endif /* RADEON_DEBUG_BO */
+
                        if (bo == NULL) {
 
                                fprintf(stderr, "failed to attach %s %d\n",
                                        regname, buffers[i].name);
 
                        }
+
+                       ret = radeon_bo_get_tiling(bo, &tiling_flags, &pitch);
+                       if (tiling_flags & RADEON_TILING_MACRO)
+                               bo->flags |= RADEON_BO_FLAGS_MACRO_TILE;
+                       if (tiling_flags & RADEON_TILING_MICRO)
+                               bo->flags |= RADEON_BO_FLAGS_MICRO_TILE;
+                       
                }
 
                if (buffers[i].attachment == __DRI_BUFFER_DEPTH) {
index e4a8da0..ee46c1f 100644 (file)
@@ -239,6 +239,11 @@ struct radeon_tex_obj {
        GLuint SQ_TEX_SAMPLER1;
        GLuint SQ_TEX_SAMPLER2;
 
+       GLuint TD_PS_SAMPLER0_BORDER_RED;
+       GLuint TD_PS_SAMPLER0_BORDER_GREEN;
+       GLuint TD_PS_SAMPLER0_BORDER_BLUE;
+       GLuint TD_PS_SAMPLER0_BORDER_ALPHA;
+
        GLboolean border_fallback;
 
 
@@ -360,6 +365,7 @@ struct radeon_dri_mirror {
 
        drm_context_t hwContext;
        drm_hw_lock_t *hwLock;
+       int hwLockCount;
        int fd;
        int drmMinor;
 };
@@ -424,6 +430,8 @@ struct radeon_context {
    int                   texture_depth;
    float                 initialMaxAnisotropy;
    uint32_t              texture_row_align;
+   uint32_t              texture_rect_row_align;
+   uint32_t              texture_compressed_row_align;
 
   struct radeon_dma dma;
   struct radeon_hw_state hw;
@@ -438,7 +446,6 @@ struct radeon_context {
    GLuint numClipRects;        /* Cliprects for the draw buffer */
    drm_clip_rect_t *pClipRects;
    unsigned int lastStamp;
-   GLboolean lost_context;
    drm_radeon_sarea_t *sarea;  /* Private SAREA data */
 
    /* Mirrors of some DRI state */
@@ -587,10 +594,4 @@ extern int RADEON_DEBUG;
 #define RADEON_DEBUG           0
 #endif
 
-#ifndef HAVE_LIBDRM_RADEON
-#ifndef RADEON_DEBUG_BO
-#define RADEON_DEBUG_BO 1
-#endif
-#endif
-
 #endif
index 5a8df7b..89cbbb5 100644 (file)
@@ -82,7 +82,7 @@ static inline int radeon_cs_setup_bo(struct radeon_cs_space_check *sc, struct ra
            if (write_domain == RADEON_GEM_DOMAIN_VRAM) {
                sizes->op_read -= bo->size;
                sizes->op_vram_write += bo->size;
-           } else if (write_domain == RADEON_GEM_DOMAIN_VRAM) {
+           } else if (write_domain == RADEON_GEM_DOMAIN_GTT) {
                sizes->op_read -= bo->size;
                sizes->op_gart_write += bo->size;
            }
index 48114a0..5e755c5 100644 (file)
@@ -52,7 +52,7 @@ do {                                          \
 } while (0)
 #endif
 
-static void radeonEmitVec4(uint32_t *out, GLvoid * data, int stride, int count)
+void radeonEmitVec4(uint32_t *out, const GLvoid * data, int stride, int count)
 {
        int i;
 
@@ -70,7 +70,7 @@ static void radeonEmitVec4(uint32_t *out, GLvoid * data, int stride, int count)
                }
 }
 
-void radeonEmitVec8(uint32_t *out, GLvoid * data, int stride, int count)
+void radeonEmitVec8(uint32_t *out, const GLvoid * data, int stride, int count)
 {
        int i;
 
@@ -89,7 +89,7 @@ void radeonEmitVec8(uint32_t *out, GLvoid * data, int stride, int count)
                }
 }
 
-void radeonEmitVec12(uint32_t *out, GLvoid * data, int stride, int count)
+void radeonEmitVec12(uint32_t *out, const GLvoid * data, int stride, int count)
 {
        int i;
 
@@ -110,7 +110,7 @@ void radeonEmitVec12(uint32_t *out, GLvoid * data, int stride, int count)
                }
 }
 
-static void radeonEmitVec16(uint32_t *out, GLvoid * data, int stride, int count)
+void radeonEmitVec16(uint32_t *out, const GLvoid * data, int stride, int count)
 {
        int i;
 
@@ -132,7 +132,7 @@ static void radeonEmitVec16(uint32_t *out, GLvoid * data, int stride, int count)
 }
 
 void rcommon_emit_vector(GLcontext * ctx, struct radeon_aos *aos,
-                        GLvoid * data, int size, int stride, int count)
+                        const GLvoid * data, int size, int stride, int count)
 {
        radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
        uint32_t *out;
@@ -185,15 +185,9 @@ void radeonRefillCurrentDmaRegion(radeonContextPtr rmesa, int size)
        }
 
 again_alloc:
-#ifdef RADEON_DEBUG_BO
-    rmesa->dma.current = radeon_bo_open(rmesa->radeonScreen->bom,
-                                           0, size, 4, RADEON_GEM_DOMAIN_GTT,
-                                           0, "dma.current");
-#else    
        rmesa->dma.current = radeon_bo_open(rmesa->radeonScreen->bom,
                                            0, size, 4, RADEON_GEM_DOMAIN_GTT,
                                            0);
-#endif /* RADEON_DEBUG_BO */
 
        if (!rmesa->dma.current) {
                rcommonFlushCmdBuf(rmesa, __FUNCTION__);
index 06e388f..55509ed 100644 (file)
@@ -33,11 +33,13 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #ifndef RADEON_DMA_H
 #define RADEON_DMA_H
 
-void radeonEmitVec8(uint32_t *out, GLvoid * data, int stride, int count);
-void radeonEmitVec12(uint32_t *out, GLvoid * data, int stride, int count);
+void radeonEmitVec4(uint32_t *out, const GLvoid * data, int stride, int count);
+void radeonEmitVec8(uint32_t *out, const GLvoid * data, int stride, int count);
+void radeonEmitVec12(uint32_t *out, const GLvoid * data, int stride, int count);
+void radeonEmitVec16(uint32_t *out, const GLvoid * data, int stride, int count);
 
 void rcommon_emit_vector(GLcontext * ctx, struct radeon_aos *aos,
-                        GLvoid * data, int size, int stride, int count);
+                        const GLvoid * data, int size, int stride, int count);
 
 void radeonRefillCurrentDmaRegion(radeonContextPtr rmesa, int size);
 void radeonAllocDmaRegion(radeonContextPtr rmesa,
index f28efa3..8303917 100644 (file)
@@ -185,22 +185,12 @@ radeon_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
 
      rrb->pitch = pitch * cpp;
      rrb->cpp = cpp;
-#ifdef RADEON_DEBUG_BO
-     rrb->bo = radeon_bo_open(radeon->radeonScreen->bom,
-                             0,
-                             size,
-                             0,
-                             RADEON_GEM_DOMAIN_VRAM,
-                             0,
-                  "Radeon RBO");
-#else
      rrb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                              0,
                              size,
                              0,
                              RADEON_GEM_DOMAIN_VRAM,
                              0);
-#endif /* RADEON_DEBUG_BO */
      rb->Width = width;
      rb->Height = height;
        return GL_TRUE;
@@ -291,7 +281,7 @@ radeon_create_renderbuffer(GLenum format, __DRIdrawablePrivate *driDrawPriv)
            rrb->base.RedBits = 8;
            rrb->base.GreenBits = 8;
            rrb->base.BlueBits = 8;
-           rrb->base.AlphaBits = 8;
+           rrb->base.AlphaBits = 0;
            rrb->base.DataType = GL_UNSIGNED_BYTE;
            break;
        case GL_RGBA8:
@@ -407,7 +397,7 @@ restart:
                rrb->cpp = 2;
                rrb->base._ActualFormat = GL_RGB5;
                rrb->base._BaseFormat = GL_RGB;
-               rrb->base.DataType = GL_UNSIGNED_SHORT;
+               rrb->base.DataType = GL_UNSIGNED_BYTE;
                DBG("Render to RGB5 texture OK\n");
        }
        else if (texImage->TexFormat == &_mesa_texformat_argb1555) {
index 5774f7e..6294b7e 100644 (file)
@@ -85,11 +85,35 @@ void radeonGetLock(radeonContextPtr rmesa, GLuint flags)
        }
 
        rmesa->vtbl.get_lock(rmesa);
-
-       rmesa->lost_context = GL_TRUE;
 }
-
-void radeon_lock_hardware(radeonContextPtr radeon)
+#ifndef NDEBUG
+struct lock_debug {
+       const char* function;
+       const char* file;
+       int line;
+};
+
+static struct lock_debug ldebug = {0};
+#endif
+
+#if 0
+/** TODO: use atomic operations for reference counting **/
+/** gcc 4.2 has builtin functios for this **/
+#define ATOMIC_INC_AND_FETCH(atomic) __sync_add_and_fetch(&atomic, 1)
+#define ATOMIC_DEC_AND_FETCH(atomic) __sync_sub_and_fetch(&atomic, 1)
+#else
+#define ATOMIC_INC_AND_FETCH(atomic) (++atomic)
+#define ATOMIC_DEC_AND_FETCH(atomic) (--atomic)
+#endif
+
+
+void radeon_lock_hardware(radeonContextPtr radeon
+#ifndef NDEBUG
+               ,const char* function
+               ,const char* file
+               ,const int line
+#endif
+               )
 {
        char ret = 0;
        struct radeon_framebuffer *rfb = NULL;
@@ -104,16 +128,39 @@ void radeon_lock_hardware(radeonContextPtr radeon)
        }
 
        if (!radeon->radeonScreen->driScreen->dri2.enabled) {
+               if (ATOMIC_INC_AND_FETCH(radeon->dri.hwLockCount) > 1)
+               {
+#ifndef NDEBUG
+                       if ( RADEON_DEBUG & DEBUG_SANITY )
+                               fprintf(stderr, "*** %d times of recursive call to %s ***\n"
+                                               "Original call was from %s (file: %s line: %d)\n"
+                                               "Now call is coming from %s (file: %s line: %d)\n"
+                                               , radeon->dri.hwLockCount, __FUNCTION__
+                                               , ldebug.function, ldebug.file, ldebug.line
+                                               , function, file, line
+                                          );
+#endif
+                       return;
+               }
                DRM_CAS(radeon->dri.hwLock, radeon->dri.hwContext,
                         (DRM_LOCK_HELD | radeon->dri.hwContext), ret );
                if (ret)
                        radeonGetLock(radeon, 0);
+#ifndef NDEBUG
+               ldebug.function = function;
+               ldebug.file = file;
+               ldebug.line = line;
+#endif
        }
 }
 
 void radeon_unlock_hardware(radeonContextPtr radeon)
 {
        if (!radeon->radeonScreen->driScreen->dri2.enabled) {
+               if (ATOMIC_DEC_AND_FETCH(radeon->dri.hwLockCount) > 0)
+               {
+                       return;
+               }
                DRM_UNLOCK( radeon->dri.fd,
                            radeon->dri.hwLock,
                            radeon->dri.hwContext );
index 2817709..da5a5b4 100644 (file)
@@ -48,12 +48,22 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 extern void radeonGetLock(radeonContextPtr rmesa, GLuint flags);
 
-void radeon_lock_hardware(radeonContextPtr rmesa);
+void radeon_lock_hardware(radeonContextPtr rmesa
+#ifndef NDEBUG
+               ,const char* function
+               ,const char* file
+               ,const int line
+#endif
+               );
 void radeon_unlock_hardware(radeonContextPtr rmesa);
 
 /* Lock the hardware and validate our state.
  */
+#ifdef NDEBUG
 #define LOCK_HARDWARE( rmesa ) radeon_lock_hardware(rmesa)
+#else
+#define LOCK_HARDWARE( rmesa ) radeon_lock_hardware(rmesa, __FUNCTION__, __FILE__, __LINE__)
+#endif
 #define UNLOCK_HARDWARE( rmesa )  radeon_unlock_hardware(rmesa)
 
 #endif
index f04a07f..eba9f58 100644 (file)
@@ -90,16 +90,18 @@ static void compute_tex_image_offset(radeonContextPtr rmesa, radeon_mipmap_tree
        GLuint face, GLuint level, GLuint* curOffset)
 {
        radeon_mipmap_level *lvl = &mt->levels[level];
-       uint32_t row_align = rmesa->texture_row_align - 1;
+       uint32_t row_align;
 
        /* Find image size in bytes */
        if (mt->compressed) {
                /* TODO: Is this correct? Need test cases for compressed textures! */
-               lvl->rowstride = (lvl->width * mt->bpp + 63) & ~63;
+               row_align = rmesa->texture_compressed_row_align - 1;
+               lvl->rowstride = (lvl->width * mt->bpp + row_align) & ~row_align;
                lvl->size = radeon_compressed_texture_size(mt->radeon->glCtx,
                                                           lvl->width, lvl->height, lvl->depth, mt->compressed);
        } else if (mt->target == GL_TEXTURE_RECTANGLE_NV) {
-               lvl->rowstride = (lvl->width * mt->bpp + 63) & ~63;
+               row_align = rmesa->texture_rect_row_align - 1;
+               lvl->rowstride = (lvl->width * mt->bpp + row_align) & ~row_align;
                lvl->size = lvl->rowstride * lvl->height;
        } else if (mt->tilebits & RADEON_TXO_MICRO_TILE) {
                /* tile pattern is 16 bytes x2. mipmaps stay 32 byte aligned,
@@ -108,6 +110,7 @@ static void compute_tex_image_offset(radeonContextPtr rmesa, radeon_mipmap_tree
                lvl->rowstride = (lvl->width * mt->bpp * 2 + 31) & ~31;
                lvl->size = lvl->rowstride * ((lvl->height + 1) / 2) * lvl->depth;
        } else {
+               row_align = rmesa->texture_row_align - 1;
                lvl->rowstride = (lvl->width * mt->bpp + row_align) & ~row_align;
                lvl->size = lvl->rowstride * lvl->height * lvl->depth;
        }
@@ -212,18 +215,10 @@ radeon_mipmap_tree* radeon_miptree_create(radeonContextPtr rmesa, radeonTexObj *
        else
                calculate_miptree_layout_r100(rmesa, mt);
 
-#ifdef RADEON_DEBUG_BO
-    mt->bo = radeon_bo_open(rmesa->radeonScreen->bom,
-                            0, mt->totalsize, 1024,
-                            RADEON_GEM_DOMAIN_VRAM,
-                            0,
-                            "MIPMAP TREE");
-#else
        mt->bo = radeon_bo_open(rmesa->radeonScreen->bom,
                             0, mt->totalsize, 1024,
                             RADEON_GEM_DOMAIN_VRAM,
                             0);
-#endif /* RADEON_DEBUG_BO */
 
        return mt;
 }
@@ -323,7 +318,8 @@ GLboolean radeon_miptree_matches_image(radeon_mipmap_tree *mt,
        if (face >= mt->faces || level < mt->firstLevel || level > mt->lastLevel)
                return GL_FALSE;
 
-       if (texImage->IsCompressed != mt->compressed)
+       if ((!texImage->IsCompressed && mt->compressed) ||
+           (texImage->IsCompressed && !mt->compressed))
                return GL_FALSE;
 
        if (!texImage->IsCompressed &&
@@ -363,8 +359,8 @@ GLboolean radeon_miptree_matches_texture(radeon_mipmap_tree *mt, struct gl_textu
                mt->width0 == firstImage->Width &&
                mt->height0 == firstImage->Height &&
                mt->depth0 == firstImage->Depth &&
-               mt->bpp == firstImage->TexFormat->TexelBytes &&
-               mt->compressed == compressed);
+               mt->compressed == compressed &&
+               (!mt->compressed ? (mt->bpp == firstImage->TexFormat->TexelBytes) : 1));
 }
 
 
index 290ef23..c8d4916 100644 (file)
@@ -57,7 +57,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r200_tex.h"
 #elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R300)
 #include "r300_context.h"
-#include "r300_fragprog.h"
 #include "r300_tex.h"
 #elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R600)
 #include "r600_context.h"
@@ -150,6 +149,9 @@ extern const struct dri_extension point_extensions[];
 
 #elif RADEON_COMMON && (defined(RADEON_COMMON_FOR_R300) || defined(RADEON_COMMON_FOR_R600))
 
+#define DRI_CONF_FP_OPTIMIZATION_SPEED   0
+#define DRI_CONF_FP_OPTIMIZATION_QUALITY 1
+
 /* TODO: integrate these into xmlpool.h! */
 #define DRI_CONF_MAX_TEXTURE_IMAGE_UNITS(def,min,max) \
 DRI_CONF_OPT_BEGIN_V(texture_image_units,int,def, # min ":" # max ) \
@@ -876,11 +878,14 @@ static int radeon_set_screen_flags(radeonScreenPtr screen, int device_id)
       screen->chip_flags = RADEON_CHIPSET_TCL;
       break;
 
+   case PCI_CHIP_RV730_9480:
    case PCI_CHIP_RV730_9487:
+   case PCI_CHIP_RV730_9488:
    case PCI_CHIP_RV730_9489:
    case PCI_CHIP_RV730_948F:
    case PCI_CHIP_RV730_9490:
    case PCI_CHIP_RV730_9491:
+   case PCI_CHIP_RV730_9495:
    case PCI_CHIP_RV730_9498:
    case PCI_CHIP_RV730_949C:
    case PCI_CHIP_RV730_949E:
@@ -897,15 +902,19 @@ static int radeon_set_screen_flags(radeonScreenPtr screen, int device_id)
    case PCI_CHIP_RV710_9552:
    case PCI_CHIP_RV710_9553:
    case PCI_CHIP_RV710_9555:
+   case PCI_CHIP_RV710_9557:
       screen->chip_family = CHIP_FAMILY_RV710;
       screen->chip_flags = RADEON_CHIPSET_TCL;
       break;
 
    case PCI_CHIP_RV740_94A0:
    case PCI_CHIP_RV740_94A1:
+   case PCI_CHIP_RV740_94A3:
    case PCI_CHIP_RV740_94B1:
    case PCI_CHIP_RV740_94B3:
+   case PCI_CHIP_RV740_94B4:
    case PCI_CHIP_RV740_94B5:
+   case PCI_CHIP_RV740_94B9:
       screen->chip_family = CHIP_FAMILY_RV740;
       screen->chip_flags = RADEON_CHIPSET_TCL;
       break;
@@ -990,6 +999,7 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
       screen->drmSupportsPointSprites = (sPriv->drm_version.minor >= 13);
       screen->drmSupportsCubeMapsR100 = (sPriv->drm_version.minor >= 15);
       screen->drmSupportsVertexProgram = (sPriv->drm_version.minor >= 25);
+      screen->drmSupportsOcclusionQueries = (sPriv->drm_version.minor >= 30);
    }
 
    ret = radeon_set_screen_flags(screen, dri_priv->deviceID);
@@ -1025,7 +1035,7 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
                   ((GLubyte *)screen->status.map + RADEON_SCRATCH_REG_OFFSET);
    else
           screen->scratch = (__volatile__ uint32_t *)
-                  ((GLubyte *)screen->status.map + RADEON_SCRATCH_REG_OFFSET);
+                  ((GLubyte *)screen->status.map + R600_SCRATCH_REG_OFFSET);
 
    screen->buffers = drmMapBufs( sPriv->fd );
    if ( !screen->buffers ) {
@@ -1085,7 +1095,7 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
    /* +r6/r7 */
    if(screen->chip_family >= CHIP_FAMILY_R600)
    {
-       if (ret) 
+       if (ret)
        {
             FREE( screen );
             fprintf(stderr, "Unable to get fb location need newer drm\n");
@@ -1098,18 +1108,18 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
    }
    else
    {
-        if (ret) 
+        if (ret)
         {
             if (screen->chip_family < CHIP_FAMILY_RS600 && !screen->kernel_mm)
                    screen->fbLocation      = ( INREG( RADEON_MC_FB_LOCATION ) & 0xffff) << 16;
-            else 
+            else
             {
                 FREE( screen );
                 fprintf(stderr, "Unable to get fb location need newer drm\n");
                 return NULL;
             }
-        } 
-        else 
+        }
+        else
         {
             screen->fbLocation = (temp & 0xffff) << 16;
         }
@@ -1289,6 +1299,7 @@ radeonCreateScreen2(__DRIscreenPrivate *sPriv)
    screen->drmSupportsPointSprites = 1;
    screen->drmSupportsCubeMapsR100 = 1;
    screen->drmSupportsVertexProgram = 1;
+   screen->drmSupportsOcclusionQueries = 1;
    screen->irq = 1;
 
    ret = radeonGetParam(sPriv, RADEON_PARAM_DEVICE_ID, &device_id);
@@ -1577,21 +1588,11 @@ static GLboolean radeonCreateContext(const __GLcontextModes * glVisual,
 {
        __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
        radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private);
-#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600)
-       if (IS_R600_CLASS(screen))
-               return r600CreateContext(glVisual, driContextPriv, sharedContextPriv);
-#endif
-
 #if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300)
        if (IS_R300_CLASS(screen))
                return r300CreateContext(glVisual, driContextPriv, sharedContextPriv);
 #endif
 
-#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200)
-       if (IS_R200_CLASS(screen))
-               return r200CreateContext(glVisual, driContextPriv, sharedContextPriv);
-#endif
-
 #if !RADEON_COMMON
        (void)screen;
        return r100CreateContext(glVisual, driContextPriv, sharedContextPriv);
@@ -1791,8 +1792,16 @@ getSwapInfo( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo )
 const struct __DriverAPIRec driDriverAPI = {
    .InitScreen      = radeonInitScreen,
    .DestroyScreen   = radeonDestroyScreen,
+#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200)
+   .CreateContext   = r200CreateContext,
+   .DestroyContext  = r200DestroyContext,
+#elif RADEON_COMMON && defined(RADEON_COMMON_FOR_R600)
+   .CreateContext   = r600CreateContext,
+   .DestroyContext  = r600DestroyContext,
+#else
    .CreateContext   = radeonCreateContext,
    .DestroyContext  = radeonDestroyContext,
+#endif
    .CreateBuffer    = radeonCreateBuffer,
    .DestroyBuffer   = radeonDestroyBuffer,
    .SwapBuffers     = radeonSwapBuffers,
index 2a2f6b1..f0dd46b 100644 (file)
@@ -99,6 +99,7 @@ typedef struct radeon_screen {
    GLboolean drmSupportsPointSprites;   /* need radeon kernel module >= 1.13 */
    GLboolean drmSupportsCubeMapsR100;   /* need radeon kernel module >= 1.15 */
    GLboolean drmSupportsVertexProgram;  /* need radeon kernel module >= 1.25 */
+   GLboolean drmSupportsOcclusionQueries; /* need radeon kernel module >= 1.30 */
    GLboolean depthHasSurface;
 
    /* Configuration cache with default values for all contexts */
index b2a468b..5e4bf00 100644 (file)
@@ -51,6 +51,59 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 static void radeonSetSpanFunctions(struct radeon_renderbuffer *rrb);
 
+
+/* r200 depth buffer is always tiled - this is the formula
+   according to the docs unless I typo'ed in it
+*/
+static GLubyte *r200_depth_2byte(const struct radeon_renderbuffer * rrb,
+                                GLint x, GLint y)
+{
+    GLubyte *ptr = rrb->bo->ptr;
+    GLint offset;
+    if (rrb->has_surface) {
+       offset = x * rrb->cpp + y * rrb->pitch;
+    } else {
+       GLuint b;
+       offset = 0;
+       b = (((y  >> 4) * (rrb->pitch >> 8) + (x >> 6)));
+       offset += (b >> 1) << 12;
+       offset += (((rrb->pitch >> 8) & 0x1) ? (b & 0x1) : ((b & 0x1) ^ ((y >> 4) & 0x1))) << 11;
+       offset += ((y >> 2) & 0x3) << 9;
+       offset += ((x >> 3) & 0x1) << 8;
+       offset += ((x >> 4) & 0x3) << 6;
+       offset += ((x >> 2) & 0x1) << 5;
+       offset += ((y >> 1) & 0x1) << 4;
+       offset += ((x >> 1) & 0x1) << 3;
+       offset += (y & 0x1) << 2;
+       offset += (x & 0x1) << 1;
+    }
+    return &ptr[offset];
+}
+
+static GLubyte *r200_depth_4byte(const struct radeon_renderbuffer * rrb,
+                                GLint x, GLint y)
+{
+    GLubyte *ptr = rrb->bo->ptr;
+    GLint offset;
+    if (rrb->has_surface) {
+       offset = x * rrb->cpp + y * rrb->pitch;
+    } else {
+       GLuint b;
+       offset = 0;
+       b = (((y & 0x7ff) >> 4) * (rrb->pitch >> 7) + (x >> 5));
+       offset += (b >> 1) << 12;
+       offset += (((rrb->pitch >> 7) & 0x1) ? (b & 0x1) : ((b & 0x1) ^ ((y >> 4) & 0x1))) << 11;
+       offset += ((y >> 2) & 0x3) << 9;
+       offset += ((x >> 2) & 0x1) << 8;
+       offset += ((x >> 3) & 0x3) << 6;
+       offset += ((y >> 1) & 0x1) << 5;
+       offset += ((x >> 1) & 0x1) << 4;
+       offset += (y & 0x1) << 3;
+       offset += (x & 0x1) << 2;
+    }
+    return &ptr[offset];
+}
+
 /* radeon tiling on r300-r500 has 4 states,
    macro-linear/micro-linear
    macro-linear/micro-tiled
@@ -61,7 +114,6 @@ static void radeonSetSpanFunctions(struct radeon_renderbuffer *rrb);
    4 byte surface
    8/16 byte (unused)
 */
-   
 static GLubyte *radeon_ptr_4byte(const struct radeon_renderbuffer * rrb,
                             GLint x, GLint y)
 {
@@ -285,11 +337,21 @@ s8z24_to_z24s8(uint32_t val)
  */
 #define VALUE_TYPE GLushort
 
+#if defined(RADEON_COMMON_FOR_R200)
+#define WRITE_DEPTH( _x, _y, d )                                       \
+   *(GLushort *)r200_depth_2byte(rrb, _x + x_off, _y + y_off) = d
+#else
 #define WRITE_DEPTH( _x, _y, d )                                       \
    *(GLushort *)radeon_ptr_2byte_8x2(rrb, _x + x_off, _y + y_off) = d
+#endif
 
+#if defined(RADEON_COMMON_FOR_R200)
+#define READ_DEPTH( d, _x, _y )                                                \
+   d = *(GLushort *)r200_depth_2byte(rrb, _x + x_off, _y + y_off)
+#else
 #define READ_DEPTH( d, _x, _y )                                                \
    d = *(GLushort *)radeon_ptr_2byte_8x2(rrb, _x + x_off, _y + y_off)
+#endif
 
 #define TAG(x) radeon##x##_z16
 #include "depthtmp.h"
@@ -301,7 +363,7 @@ s8z24_to_z24s8(uint32_t val)
  */
 #define VALUE_TYPE GLuint
 
-#ifdef COMPILE_R300
+#if defined(COMPILE_R300)
 #define WRITE_DEPTH( _x, _y, d )                                       \
 do {                                                                   \
    GLuint *_ptr = (GLuint*)radeon_ptr_4byte( rrb, _x + x_off, _y + y_off );            \
@@ -310,6 +372,15 @@ do {                                                                       \
    tmp |= ((d << 8) & 0xffffff00);                                     \
    *_ptr = tmp;                                        \
 } while (0)
+#elif defined(RADEON_COMMON_FOR_R200)
+#define WRITE_DEPTH( _x, _y, d )                                       \
+do {                                                                   \
+   GLuint *_ptr = (GLuint*)r200_depth_4byte( rrb, _x + x_off, _y + y_off );            \
+   GLuint tmp = *_ptr;                         \
+   tmp &= 0xff000000;                                                  \
+   tmp |= ((d) & 0x00ffffff);                                          \
+   *_ptr = tmp;                                        \
+} while (0)
 #else
 #define WRITE_DEPTH( _x, _y, d )                                       \
 do {                                                                   \
@@ -321,19 +392,21 @@ do {                                                                      \
 } while (0)
 #endif
 
-#ifdef COMPILE_R300
+#if defined(COMPILE_R300)
 #define READ_DEPTH( d, _x, _y )                                                \
   do {                                                                 \
     d = (*(GLuint*)(radeon_ptr_4byte(rrb, _x + x_off, _y + y_off)) & 0xffffff00) >> 8; \
   }while(0)
+#elif defined(RADEON_COMMON_FOR_R200)
+#define READ_DEPTH( d, _x, _y )                                                \
+  do {                                                                 \
+    d = *(GLuint*)(r200_depth_4byte(rrb, _x + x_off, _y + y_off)) & 0x00ffffff; \
+  }while(0)
 #else
 #define READ_DEPTH( d, _x, _y )        \
   d = *(GLuint*)(radeon_ptr_4byte(rrb, _x + x_off,     _y + y_off)) & 0x00ffffff;
 #endif
-/*
-    fprintf(stderr, "dval(%d, %d, %d, %d)=0x%08X\n", _x, xo, _y, yo, d);\
-   d = *(GLuint*)(radeon_ptr(rrb, _x,  _y )) & 0x00ffffff;
-*/
+
 #define TAG(x) radeon##x##_z24
 #include "depthtmp.h"
 
@@ -345,12 +418,19 @@ do {                                                                      \
  */
 #define VALUE_TYPE GLuint
 
-#ifdef COMPILE_R300
+#if defined(COMPILE_R300)
 #define WRITE_DEPTH( _x, _y, d )                                       \
 do {                                                                   \
    GLuint *_ptr = (GLuint*)radeon_ptr_4byte( rrb, _x + x_off, _y + y_off );            \
    *_ptr = d;                                                          \
 } while (0)
+#elif defined(RADEON_COMMON_FOR_R200)
+#define WRITE_DEPTH( _x, _y, d )                                       \
+do {                                                                   \
+   GLuint *_ptr = (GLuint*)r200_depth_4byte( rrb, _x + x_off, _y + y_off );            \
+   GLuint tmp = z24s8_to_s8z24(d);                                     \
+   *_ptr = tmp;                                                                \
+} while (0)
 #else
 #define WRITE_DEPTH( _x, _y, d )                                       \
 do {                                                                   \
@@ -360,20 +440,22 @@ do {                                                                      \
 } while (0)
 #endif
 
-#ifdef COMPILE_R300
+#if defined(COMPILE_R300)
 #define READ_DEPTH( d, _x, _y )                                                \
   do { \
     d = (*(GLuint*)(radeon_ptr_4byte(rrb, _x + x_off, _y + y_off)));   \
   }while(0)
+#elif defined(RADEON_COMMON_FOR_R200)
+#define READ_DEPTH( d, _x, _y )                                                \
+  do { \
+    d = s8z24_to_z24s8(*(GLuint*)(r200_depth_4byte(rrb, _x + x_off, _y + y_off)));     \
+  }while(0)
 #else
 #define READ_DEPTH( d, _x, _y )        do {                                    \
     d = s8z24_to_z24s8(*(GLuint*)(radeon_ptr_4byte(rrb, _x + x_off,    _y + y_off ))); \
   } while (0)
 #endif
-/*
-    fprintf(stderr, "dval(%d, %d, %d, %d)=0x%08X\n", _x, xo, _y, yo, d);\
-   d = *(GLuint*)(radeon_ptr(rrb, _x,  _y )) & 0x00ffffff;
-*/
+
 #define TAG(x) radeon##x##_z24_s8
 #include "depthtmp.h"
 
@@ -392,6 +474,15 @@ do {                                                                       \
    tmp |= (d) & 0xff;                                                  \
    *_ptr = tmp;                                        \
 } while (0)
+#elif defined(RADEON_COMMON_FOR_R200)
+#define WRITE_STENCIL( _x, _y, d )                                     \
+do {                                                                   \
+   GLuint *_ptr = (GLuint*)r200_depth_4byte(rrb, _x + x_off, _y + y_off);              \
+   GLuint tmp = *_ptr;                         \
+   tmp &= 0x00ffffff;                                                  \
+   tmp |= (((d) & 0xff) << 24);                                                \
+   *_ptr = tmp;                                        \
+} while (0)
 #else
 #define WRITE_STENCIL( _x, _y, d )                                     \
 do {                                                                   \
@@ -410,6 +501,13 @@ do {                                                                       \
    GLuint tmp = *_ptr;                         \
    d = tmp & 0x000000ff;                                               \
 } while (0)
+#elif defined(RADEON_COMMON_FOR_R200)
+#define READ_STENCIL( d, _x, _y )                                      \
+do {                                                                   \
+   GLuint *_ptr = (GLuint*)r200_depth_4byte( rrb, _x + x_off, _y + y_off );            \
+   GLuint tmp = *_ptr;                         \
+   d = (tmp & 0xff000000) >> 24;                                       \
+} while (0)
 #else
 #define READ_STENCIL( d, _x, _y )                                      \
 do {                                                                   \
index aaa82b1..57aa7f1 100644 (file)
@@ -423,7 +423,7 @@ static void ctx_emit_cs(GLcontext *ctx, struct radeon_state_atom *atom)
    if (drb)
      dwords += 6;
    if (rrb)
-     dwords += 6;
+     dwords += 8;
    BEGIN_BATCH_NO_AUTOSTATE(dwords);
 
    /* In the CS case we need to split this up */
@@ -449,7 +449,7 @@ static void ctx_emit_cs(GLcontext *ctx, struct radeon_state_atom *atom)
      OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
 
      OUT_BATCH(CP_PACKET0(RADEON_RB3D_COLORPITCH, 0));
-     OUT_BATCH(cbpitch);
+     OUT_BATCH_RELOC(cbpitch, rrb->bo, cbpitch, 0, RADEON_GEM_DOMAIN_VRAM, 0);
    }
 
    // if (atom->cmd_size == CTX_STATE_SIZE_NEWDRM) {
index ad501c4..fa16f44 100644 (file)
@@ -610,9 +610,17 @@ static void radeon_teximage(
 
        if (pixels) {
                radeon_teximage_map(image, GL_TRUE);
-
                if (compressed) {
-                       memcpy(texImage->Data, pixels, imageSize);
+                       if (image->mt) {
+                               uint32_t srcRowStride, bytesPerRow, rows;
+                               srcRowStride = _mesa_compressed_row_stride(texImage->TexFormat->MesaFormat, width);
+                               bytesPerRow = srcRowStride;
+                               rows = (height + 3) / 4;
+                               copy_rows(texImage->Data, image->mt->levels[level].rowstride,
+                                         pixels, srcRowStride, rows, bytesPerRow);
+                       } else {
+                               memcpy(texImage->Data, pixels, imageSize);
+                       }
                } else {
                        GLuint dstRowStride;
                        GLuint *dstImageOffsets;
@@ -756,14 +764,23 @@ static void radeon_texsubimage(GLcontext* ctx, int dims, GLenum target, int leve
                }
 
                if (compressed) {
-                       uint32_t srcRowStride, bytesPerRow, rows; 
-                       dstRowStride = _mesa_compressed_row_stride(texImage->TexFormat->MesaFormat, texImage->Width);
+                       uint32_t srcRowStride, bytesPerRow, rows;
+                       GLubyte *img_start;
+                       if (!image->mt) {
+                               dstRowStride = _mesa_compressed_row_stride(texImage->TexFormat->MesaFormat, texImage->Width);
+                               img_start = _mesa_compressed_image_address(xoffset, yoffset, 0,
+                                                                          texImage->TexFormat->MesaFormat,
+                                                                          texImage->Width, texImage->Data);
+                       }
+                       else {
+                               uint32_t blocks_x = dstRowStride / (image->mt->bpp * 4);
+                               img_start = texImage->Data + image->mt->bpp * 4 * (blocks_x * (yoffset / 4) + xoffset / 4);
+                       }
                        srcRowStride = _mesa_compressed_row_stride(texImage->TexFormat->MesaFormat, width);
                        bytesPerRow = srcRowStride;
-                       rows = height / 4;
+                       rows = (height + 3) / 4;
 
-                       copy_rows(texImage->Data, dstRowStride,  image->base.Data, srcRowStride, rows,
-                                 bytesPerRow);
+                       copy_rows(img_start, dstRowStride,  pixels, srcRowStride, rows,  bytesPerRow);
                        
                } else {
                        if (!texImage->TexFormat->StoreImage(ctx, dims, texImage->_BaseFormat,
@@ -884,8 +901,8 @@ static void migrate_image_to_miptree(radeon_mipmap_tree *mt, radeon_texture_imag
                uint32_t height;
                /* need to confirm this value is correct */
                if (mt->compressed) {
-                       height = image->base.Height / 4;
-                       srcrowstride = image->base.RowStride * mt->bpp;
+                       height = (image->base.Height + 3) / 4;
+                       srcrowstride = _mesa_compressed_row_stride(image->base.TexFormat->MesaFormat, image->base.Width);
                } else {
                        height = image->base.Height * image->base.Depth;
                        srcrowstride = image->base.Width * image->base.TexFormat->TexelBytes;
@@ -951,7 +968,7 @@ int radeon_validate_texture_miptree(GLcontext * ctx, struct gl_texture_object *t
                        fprintf(stderr, " Allocate new miptree\n");
                radeon_try_alloc_miptree(rmesa, t, &baseimage->base, 0, texObj->BaseLevel);
                if (!t->mt) {
-                       _mesa_problem(ctx, "r300_validate_texture failed to alloc miptree");
+                       _mesa_problem(ctx, "radeon_validate_texture failed to alloc miptree");
                        return GL_FALSE;
                }
        }
@@ -1000,6 +1017,8 @@ radeon_get_tex_image(GLcontext * ctx, GLenum target, GLint level,
        }
 
        if (compressed) {
+               /* FIXME: this can't work for small textures (mips) which
+                        use different hw stride */
                _mesa_get_compressed_teximage(ctx, target, level, pixels,
                                              texObj, texImage);
        } else {
index fbfa49c..3aa7843 100644 (file)
@@ -63,6 +63,7 @@
 
 /* sw extensions not associated with some GL version */
 #define need_GL_ARB_shader_objects
+#define need_GL_ARB_vertex_array_object
 #define need_GL_ARB_vertex_program
 #define need_GL_APPLE_vertex_array_object
 #define need_GL_ATI_fragment_shader
@@ -94,6 +95,7 @@ const struct dri_extension card_extensions[] =
     { "GL_SGI_color_table",            GL_SGI_color_table_functions },
 
     { "GL_ARB_shader_objects",         GL_ARB_shader_objects_functions },
+    { "GL_ARB_vertex_array_object",    GL_ARB_vertex_array_object_functions },
     { "GL_ARB_vertex_program",         GL_ARB_vertex_program_functions },
     { "GL_APPLE_vertex_array_object",  GL_APPLE_vertex_array_object_functions },
     { "GL_ATI_fragment_shader",                GL_ATI_fragment_shader_functions },
index ede43ef..bd3e5b2 100644 (file)
@@ -902,7 +902,6 @@ EXPORTS
        _mesa_generate_mipmap
        _mesa_get_compressed_teximage
        _mesa_get_current_context
-       _mesa_get_program_register
        _mesa_get_teximage
        _mesa_init_driver_functions
        _mesa_init_glsl_driver_functions
diff --git a/src/mesa/glapi/ARB_seamless_cube_map.xml b/src/mesa/glapi/ARB_seamless_cube_map.xml
new file mode 100644 (file)
index 0000000..3cdc84d
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!DOCTYPE OpenGLAPI SYSTEM "gl_API.dtd">
+
+<OpenGLAPI>
+
+<category name="GL_ARB_seamless_cubemap" number="65">
+    <enum name="TEXTURE_CUBE_MAP_SEAMLESS"     count="1"  value="0x88F4">
+        <size name="Get" mode="get"/>
+    </enum>
+</category>
+
+</OpenGLAPI>
index 1b0de2a..5559b48 100644 (file)
     </function>
 </category>
 
-
-
-<category name="GL_EXT_texture_array" number="329">
-    <enum name="TEXTURE_1D_ARRAY_EXT"                      value="0x8C18"/>
-    <enum name="PROXY_TEXTURE_1D_ARRAY_EXT"                value="0x8C19"/>
-    <enum name="TEXTURE_2D_ARRAY_EXT"                      value="0x8C1A"/>
-    <enum name="PROXY_TEXTURE_2D_ARRAY_EXT"                value="0x8C1B"/>
-
-    <enum name="TEXTURE_BINDING_1D_ARRAY_EXT"   count="1"  value="0x8C1C">
-        <size name="Get" mode="get"/>
-    </enum>
-
-    <enum name="TEXTURE_BINDING_2D_ARRAY_EXT"   count="1"  value="0x8C1D">
-        <size name="Get" mode="get"/>
-    </enum>
-
-    <enum name="MAX_ARRAY_TEXTURE_LAYERS_EXT"   count="1"  value="0x88FF">
-        <size name="Get" mode="get"/>
-    </enum>
-
-    <enum name="COMPARE_REF_DEPTH_TO_TEXTURE_EXT" count="1" value="0x884E">
-        <size name="Get" mode="get"/>
-    </enum>
-
-    <enum name="FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT"   count="1" value="0x8CD4">
-        <size name="GetFramebufferAttachmentParameterivEXT" mode="get"/>
-    </enum>
-
-    <function name="FramebufferTextureLayerEXT" offset="assign">
-        <param name="target" type="GLenum"/>
-        <param name="attachment" type="GLenum"/>
-        <param name="texture" type="GLuint"/>
-        <param name="level" type="GLint"/>
-        <param name="layer" type="GLint"/>
-    </function>
-</category>
-
-
 </OpenGLAPI>
diff --git a/src/mesa/glapi/EXT_texture_array.xml b/src/mesa/glapi/EXT_texture_array.xml
new file mode 100644 (file)
index 0000000..e5bd9f3
--- /dev/null
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<!DOCTYPE OpenGLAPI SYSTEM "gl_API.dtd">
+
+<OpenGLAPI>
+
+<category name="GL_EXT_texture_array" number="329">
+    <enum name="TEXTURE_1D_ARRAY_EXT"                      value="0x8C18"/>
+    <enum name="PROXY_TEXTURE_1D_ARRAY_EXT"                value="0x8C19"/>
+    <enum name="TEXTURE_2D_ARRAY_EXT"                      value="0x8C1A"/>
+    <enum name="PROXY_TEXTURE_2D_ARRAY_EXT"                value="0x8C1B"/>
+
+    <enum name="TEXTURE_BINDING_1D_ARRAY_EXT"   count="1"  value="0x8C1C">
+        <size name="Get" mode="get"/>
+    </enum>
+
+    <enum name="TEXTURE_BINDING_2D_ARRAY_EXT"   count="1"  value="0x8C1D">
+        <size name="Get" mode="get"/>
+    </enum>
+
+    <enum name="MAX_ARRAY_TEXTURE_LAYERS_EXT"   count="1"  value="0x88FF">
+        <size name="Get" mode="get"/>
+    </enum>
+
+    <enum name="COMPARE_REF_DEPTH_TO_TEXTURE_EXT" count="1" value="0x884E">
+        <size name="Get" mode="get"/>
+    </enum>
+
+    <enum name="FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT"   count="1" value="0x8CD4">
+        <size name="GetFramebufferAttachmentParameterivEXT" mode="get"/>
+    </enum>
+
+    <function name="FramebufferTextureLayerEXT" offset="assign">
+        <param name="target" type="GLenum"/>
+        <param name="attachment" type="GLenum"/>
+        <param name="texture" type="GLuint"/>
+        <param name="level" type="GLint"/>
+        <param name="layer" type="GLint"/>
+    </function>
+</category>
+
+</OpenGLAPI>
index 2178eac..f706309 100644 (file)
@@ -50,6 +50,7 @@ API_XML = gl_API.xml \
        ARB_copy_buffer.xml \
        ARB_framebuffer_object.xml \
        ARB_map_buffer_range.xml \
+       ARB_seamless_cube_map.xml \
        ARB_vertex_array_object.xml \
        APPLE_vertex_array_object.xml \
        EXT_provoking_vertex.xml
index b3f1aed..2f5cc55 100644 (file)
 #define CALL_BlitFramebufferEXT(disp, parameters) (*((disp)->BlitFramebufferEXT)) parameters
 #define GET_BlitFramebufferEXT(disp) ((disp)->BlitFramebufferEXT)
 #define SET_BlitFramebufferEXT(disp, fn) ((disp)->BlitFramebufferEXT = fn)
+#define CALL_BufferParameteriAPPLE(disp, parameters) (*((disp)->BufferParameteriAPPLE)) parameters
+#define GET_BufferParameteriAPPLE(disp) ((disp)->BufferParameteriAPPLE)
+#define SET_BufferParameteriAPPLE(disp, fn) ((disp)->BufferParameteriAPPLE = fn)
+#define CALL_FlushMappedBufferRangeAPPLE(disp, parameters) (*((disp)->FlushMappedBufferRangeAPPLE)) parameters
+#define GET_FlushMappedBufferRangeAPPLE(disp) ((disp)->FlushMappedBufferRangeAPPLE)
+#define SET_FlushMappedBufferRangeAPPLE(disp, fn) ((disp)->FlushMappedBufferRangeAPPLE = fn)
 #define CALL_FramebufferTextureLayerEXT(disp, parameters) (*((disp)->FramebufferTextureLayerEXT)) parameters
 #define GET_FramebufferTextureLayerEXT(disp) ((disp)->FramebufferTextureLayerEXT)
 #define SET_FramebufferTextureLayerEXT(disp, fn) ((disp)->FramebufferTextureLayerEXT = fn)
 #define CALL_ProvokingVertexEXT(disp, parameters) (*((disp)->ProvokingVertexEXT)) parameters
 #define GET_ProvokingVertexEXT(disp) ((disp)->ProvokingVertexEXT)
 #define SET_ProvokingVertexEXT(disp, fn) ((disp)->ProvokingVertexEXT = fn)
+#define CALL_GetTexParameterPointervAPPLE(disp, parameters) (*((disp)->GetTexParameterPointervAPPLE)) parameters
+#define GET_GetTexParameterPointervAPPLE(disp) ((disp)->GetTexParameterPointervAPPLE)
+#define SET_GetTexParameterPointervAPPLE(disp, fn) ((disp)->GetTexParameterPointervAPPLE = fn)
+#define CALL_TextureRangeAPPLE(disp, parameters) (*((disp)->TextureRangeAPPLE)) parameters
+#define GET_TextureRangeAPPLE(disp) ((disp)->TextureRangeAPPLE)
+#define SET_TextureRangeAPPLE(disp, fn) ((disp)->TextureRangeAPPLE = fn)
 #define CALL_StencilFuncSeparateATI(disp, parameters) (*((disp)->StencilFuncSeparateATI)) parameters
 #define GET_StencilFuncSeparateATI(disp) ((disp)->StencilFuncSeparateATI)
 #define SET_StencilFuncSeparateATI(disp, fn) ((disp)->StencilFuncSeparateATI = fn)
 
 #else
 
-#define driDispatchRemapTable_size 373
+#define driDispatchRemapTable_size 377
 extern int driDispatchRemapTable[ driDispatchRemapTable_size ];
 
 #define AttachShader_remap_index 0
@@ -2775,13 +2787,17 @@ extern int driDispatchRemapTable[ driDispatchRemapTable_size ];
 #define IsRenderbufferEXT_remap_index 363
 #define RenderbufferStorageEXT_remap_index 364
 #define BlitFramebufferEXT_remap_index 365
-#define FramebufferTextureLayerEXT_remap_index 366
-#define ProvokingVertexEXT_remap_index 367
-#define StencilFuncSeparateATI_remap_index 368
-#define ProgramEnvParameters4fvEXT_remap_index 369
-#define ProgramLocalParameters4fvEXT_remap_index 370
-#define GetQueryObjecti64vEXT_remap_index 371
-#define GetQueryObjectui64vEXT_remap_index 372
+#define BufferParameteriAPPLE_remap_index 366
+#define FlushMappedBufferRangeAPPLE_remap_index 367
+#define FramebufferTextureLayerEXT_remap_index 368
+#define ProvokingVertexEXT_remap_index 369
+#define GetTexParameterPointervAPPLE_remap_index 370
+#define TextureRangeAPPLE_remap_index 371
+#define StencilFuncSeparateATI_remap_index 372
+#define ProgramEnvParameters4fvEXT_remap_index 373
+#define ProgramLocalParameters4fvEXT_remap_index 374
+#define GetQueryObjecti64vEXT_remap_index 375
+#define GetQueryObjectui64vEXT_remap_index 376
 
 #define CALL_AttachShader(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLuint)), driDispatchRemapTable[AttachShader_remap_index], parameters)
 #define GET_AttachShader(disp) GET_by_offset(disp, driDispatchRemapTable[AttachShader_remap_index])
@@ -3881,12 +3897,24 @@ extern int driDispatchRemapTable[ driDispatchRemapTable_size ];
 #define CALL_BlitFramebufferEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum)), driDispatchRemapTable[BlitFramebufferEXT_remap_index], parameters)
 #define GET_BlitFramebufferEXT(disp) GET_by_offset(disp, driDispatchRemapTable[BlitFramebufferEXT_remap_index])
 #define SET_BlitFramebufferEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BlitFramebufferEXT_remap_index], fn)
+#define CALL_BufferParameteriAPPLE(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLint)), driDispatchRemapTable[BufferParameteriAPPLE_remap_index], parameters)
+#define GET_BufferParameteriAPPLE(disp) GET_by_offset(disp, driDispatchRemapTable[BufferParameteriAPPLE_remap_index])
+#define SET_BufferParameteriAPPLE(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BufferParameteriAPPLE_remap_index], fn)
+#define CALL_FlushMappedBufferRangeAPPLE(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLintptr, GLsizeiptr)), driDispatchRemapTable[FlushMappedBufferRangeAPPLE_remap_index], parameters)
+#define GET_FlushMappedBufferRangeAPPLE(disp) GET_by_offset(disp, driDispatchRemapTable[FlushMappedBufferRangeAPPLE_remap_index])
+#define SET_FlushMappedBufferRangeAPPLE(disp, fn) SET_by_offset(disp, driDispatchRemapTable[FlushMappedBufferRangeAPPLE_remap_index], fn)
 #define CALL_FramebufferTextureLayerEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLuint, GLint, GLint)), driDispatchRemapTable[FramebufferTextureLayerEXT_remap_index], parameters)
 #define GET_FramebufferTextureLayerEXT(disp) GET_by_offset(disp, driDispatchRemapTable[FramebufferTextureLayerEXT_remap_index])
 #define SET_FramebufferTextureLayerEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[FramebufferTextureLayerEXT_remap_index], fn)
 #define CALL_ProvokingVertexEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum)), driDispatchRemapTable[ProvokingVertexEXT_remap_index], parameters)
 #define GET_ProvokingVertexEXT(disp) GET_by_offset(disp, driDispatchRemapTable[ProvokingVertexEXT_remap_index])
 #define SET_ProvokingVertexEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProvokingVertexEXT_remap_index], fn)
+#define CALL_GetTexParameterPointervAPPLE(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLvoid **)), driDispatchRemapTable[GetTexParameterPointervAPPLE_remap_index], parameters)
+#define GET_GetTexParameterPointervAPPLE(disp) GET_by_offset(disp, driDispatchRemapTable[GetTexParameterPointervAPPLE_remap_index])
+#define SET_GetTexParameterPointervAPPLE(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GetTexParameterPointervAPPLE_remap_index], fn)
+#define CALL_TextureRangeAPPLE(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLsizei, GLvoid *)), driDispatchRemapTable[TextureRangeAPPLE_remap_index], parameters)
+#define GET_TextureRangeAPPLE(disp) GET_by_offset(disp, driDispatchRemapTable[TextureRangeAPPLE_remap_index])
+#define SET_TextureRangeAPPLE(disp, fn) SET_by_offset(disp, driDispatchRemapTable[TextureRangeAPPLE_remap_index], fn)
 #define CALL_StencilFuncSeparateATI(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum, GLint, GLuint)), driDispatchRemapTable[StencilFuncSeparateATI_remap_index], parameters)
 #define GET_StencilFuncSeparateATI(disp) GET_by_offset(disp, driDispatchRemapTable[StencilFuncSeparateATI_remap_index])
 #define SET_StencilFuncSeparateATI(disp, fn) SET_by_offset(disp, driDispatchRemapTable[StencilFuncSeparateATI_remap_index], fn)
index 06560d1..d2fcc6d 100644 (file)
 
 <xi:include href="ARB_vertex_array_object.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
 
+<xi:include href="ARB_seamless_cube_map.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
+
 
 <!-- Non-ARB extensions sorted by extension number. -->
 
     </function>
 </category>
 
+<category name="GL_APPLE_flush_buffer_range" number="321">
+    <enum name="BUFFER_SERIALIZED_MODIFY_APPLE" count="1" value="0x8A12">
+        <size name="GetBufferParameteriv" mode="get"/>
+    </enum>
+    <enum name="BUFFER_FLUSHING_UNMAP_APPLE" count="1" value="0x8A13">
+        <size name="GetBufferParameteriv" mode="get"/>
+    </enum>
+    <function name="BufferParameteriAPPLE" offset="assign" static_dispatch="false">
+        <param name="target" type="GLenum"/>
+        <param name="pname" type="GLenum"/>
+        <param name="param" type="GLint"/>
+    </function>
+    <function name="FlushMappedBufferRangeAPPLE" offset="assign" static_dispatch="false">
+        <param name="target" type="GLenum"/>
+        <param name="offset" type="GLintptr"/>
+        <param name="size" type="GLsizeiptr"/>
+    </function>
+</category>
+
+<xi:include href="EXT_texture_array.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
+
+<category name="GL_APPLE_texture_range" number="367">
+    <enum name="TEXTURE_STORAGE_HINT_APPLE" count="1" value="0x85BC">
+        <size name="TexParameteriv"/>
+        <size name="TexParameterfv"/>
+        <size name="GetTexParameteriv" mode="get"/>
+        <size name="GetTexParameterfv" mode="get"/>
+    </enum>
+    <enum name="STORAGE_PRIVATE_APPLE" count="1" value="0x85BD">
+        <size name="TexParameteriv"/>
+        <size name="TexParameterfv"/>
+    </enum>
+    <enum name="STORAGE_CACHED_APPLE" count="1" value="0x85BE">
+        <size name="TexParameteriv"/>
+        <size name="TexParameterfv"/>
+    </enum>
+    <enum name="STORAGE_SHARED_APPLE" count="1" value="0x85BF">
+        <size name="TexParameteriv"/>
+        <size name="TexParameterfv"/>
+    </enum>
+    <enum name="TEXTURE_RANGE_LENGTH_APPLE" count="1" value="0x85B7">
+        <size name="GetTexParameteriv" mode="get"/>
+        <size name="GetTexParameterfv" mode="get"/>
+    </enum>
+    <enum name="TEXTURE_RANGE_POINTER_APPLE" count="1" value="0x85B8">
+        <size name="GetTexParameterPointervAPPLE" mode="get"/>
+    </enum>
+    <function name="TextureRangeAPPLE" offset="assign" static_dispatch="false">
+        <param name="target" type="GLenum"/>
+        <param name="length" type="GLsizei"/>
+        <param name="pointer" type="GLvoid *"/>
+    </function>
+    <function name="GetTexParameterPointervAPPLE" offset="assign" static_dispatch="false">
+        <param name="target" type="GLenum"/>
+        <param name="pname" type="GLenum"/>
+        <param name="params" type="GLvoid **"/>
+    </function>
+</category>
+
 <!-- Unnumbered extensions sorted by name. -->
 
 <category name="GL_ATI_blend_equation_separate">
index fa45406..f36ad3a 100644 (file)
@@ -138,7 +138,7 @@ class PrintGenericStubs(gl_XML.gl_print_base):
                print '#  define GL_PREFIX(n) GLNAME(CONCAT(gl,n))'
                print '# endif'
                print ''
-               print '#if defined(PTHREADS) || defined(USE_XTHREADS) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || defined(BEOS_THREADS)'
+               print '#if defined(PTHREADS) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || defined(BEOS_THREADS)'
                print '#  define THREADS'
                print '#endif'
                print ''
index 0dbf3eb..36f0e31 100644 (file)
@@ -79,7 +79,7 @@ class PrintGenericStubs(gl_XML.gl_print_base):
                print '#define GLOBL_FN(x) GLOBL x'
                print '#endif'
                print ''
-               print '#if defined(PTHREADS) || defined(USE_XTHREADS) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || defined(BEOS_THREADS)'
+               print '#if defined(PTHREADS) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || defined(BEOS_THREADS)'
                print '#  define THREADS'
                print '#endif'
                print ''
index 9ed67a6..01fd6f7 100644 (file)
 #define _gloffset_IsRenderbufferEXT 771
 #define _gloffset_RenderbufferStorageEXT 772
 #define _gloffset_BlitFramebufferEXT 773
-#define _gloffset_FramebufferTextureLayerEXT 774
-#define _gloffset_ProvokingVertexEXT 775
-#define _gloffset_StencilFuncSeparateATI 776
-#define _gloffset_ProgramEnvParameters4fvEXT 777
-#define _gloffset_ProgramLocalParameters4fvEXT 778
-#define _gloffset_GetQueryObjecti64vEXT 779
-#define _gloffset_GetQueryObjectui64vEXT 780
-#define _gloffset_FIRST_DYNAMIC 781
+#define _gloffset_BufferParameteriAPPLE 774
+#define _gloffset_FlushMappedBufferRangeAPPLE 775
+#define _gloffset_FramebufferTextureLayerEXT 776
+#define _gloffset_ProvokingVertexEXT 777
+#define _gloffset_GetTexParameterPointervAPPLE 778
+#define _gloffset_TextureRangeAPPLE 779
+#define _gloffset_StencilFuncSeparateATI 780
+#define _gloffset_ProgramEnvParameters4fvEXT 781
+#define _gloffset_ProgramLocalParameters4fvEXT 782
+#define _gloffset_GetQueryObjecti64vEXT 783
+#define _gloffset_GetQueryObjectui64vEXT 784
+#define _gloffset_FIRST_DYNAMIC 785
 
 #else
 
 #define _gloffset_IsRenderbufferEXT driDispatchRemapTable[IsRenderbufferEXT_remap_index]
 #define _gloffset_RenderbufferStorageEXT driDispatchRemapTable[RenderbufferStorageEXT_remap_index]
 #define _gloffset_BlitFramebufferEXT driDispatchRemapTable[BlitFramebufferEXT_remap_index]
+#define _gloffset_BufferParameteriAPPLE driDispatchRemapTable[BufferParameteriAPPLE_remap_index]
+#define _gloffset_FlushMappedBufferRangeAPPLE driDispatchRemapTable[FlushMappedBufferRangeAPPLE_remap_index]
 #define _gloffset_FramebufferTextureLayerEXT driDispatchRemapTable[FramebufferTextureLayerEXT_remap_index]
 #define _gloffset_ProvokingVertexEXT driDispatchRemapTable[ProvokingVertexEXT_remap_index]
+#define _gloffset_GetTexParameterPointervAPPLE driDispatchRemapTable[GetTexParameterPointervAPPLE_remap_index]
+#define _gloffset_TextureRangeAPPLE driDispatchRemapTable[TextureRangeAPPLE_remap_index]
 #define _gloffset_StencilFuncSeparateATI driDispatchRemapTable[StencilFuncSeparateATI_remap_index]
 #define _gloffset_ProgramEnvParameters4fvEXT driDispatchRemapTable[ProgramEnvParameters4fvEXT_remap_index]
 #define _gloffset_ProgramLocalParameters4fvEXT driDispatchRemapTable[ProgramLocalParameters4fvEXT_remap_index]
index 308de4f..c23e9a6 100644 (file)
@@ -814,13 +814,17 @@ struct _glapi_table
    GLboolean (GLAPIENTRYP IsRenderbufferEXT)(GLuint renderbuffer); /* 771 */
    void (GLAPIENTRYP RenderbufferStorageEXT)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); /* 772 */
    void (GLAPIENTRYP BlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); /* 773 */
-   void (GLAPIENTRYP FramebufferTextureLayerEXT)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); /* 774 */
-   void (GLAPIENTRYP ProvokingVertexEXT)(GLenum mode); /* 775 */
-   void (GLAPIENTRYP StencilFuncSeparateATI)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); /* 776 */
-   void (GLAPIENTRYP ProgramEnvParameters4fvEXT)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); /* 777 */
-   void (GLAPIENTRYP ProgramLocalParameters4fvEXT)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); /* 778 */
-   void (GLAPIENTRYP GetQueryObjecti64vEXT)(GLuint id, GLenum pname, GLint64EXT * params); /* 779 */
-   void (GLAPIENTRYP GetQueryObjectui64vEXT)(GLuint id, GLenum pname, GLuint64EXT * params); /* 780 */
+   void (GLAPIENTRYP BufferParameteriAPPLE)(GLenum target, GLenum pname, GLint param); /* 774 */
+   void (GLAPIENTRYP FlushMappedBufferRangeAPPLE)(GLenum target, GLintptr offset, GLsizeiptr size); /* 775 */
+   void (GLAPIENTRYP FramebufferTextureLayerEXT)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); /* 776 */
+   void (GLAPIENTRYP ProvokingVertexEXT)(GLenum mode); /* 777 */
+   void (GLAPIENTRYP GetTexParameterPointervAPPLE)(GLenum target, GLenum pname, GLvoid ** params); /* 778 */
+   void (GLAPIENTRYP TextureRangeAPPLE)(GLenum target, GLsizei length, GLvoid * pointer); /* 779 */
+   void (GLAPIENTRYP StencilFuncSeparateATI)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); /* 780 */
+   void (GLAPIENTRYP ProgramEnvParameters4fvEXT)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); /* 781 */
+   void (GLAPIENTRYP ProgramLocalParameters4fvEXT)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); /* 782 */
+   void (GLAPIENTRYP GetQueryObjecti64vEXT)(GLuint id, GLenum pname, GLint64EXT * params); /* 783 */
+   void (GLAPIENTRYP GetQueryObjectui64vEXT)(GLuint id, GLenum pname, GLuint64EXT * params); /* 784 */
 };
 
 #endif /* !defined( _GLAPI_TABLE_H_ ) */
index 86fda61..68e7a9a 100644 (file)
@@ -5598,6 +5598,20 @@ KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_773)(GLint srcX0, GLint srcY0, GL
    DISPATCH(BlitFramebufferEXT, (srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter), (F, "glBlitFramebufferEXT(%d, %d, %d, %d, %d, %d, %d, %d, %d, 0x%x);\n", srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter));
 }
 
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_774)(GLenum target, GLenum pname, GLint param);
+
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_774)(GLenum target, GLenum pname, GLint param)
+{
+   DISPATCH(BufferParameteriAPPLE, (target, pname, param), (F, "glBufferParameteriAPPLE(0x%x, 0x%x, %d);\n", target, pname, param));
+}
+
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_775)(GLenum target, GLintptr offset, GLsizeiptr size);
+
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_775)(GLenum target, GLintptr offset, GLsizeiptr size)
+{
+   DISPATCH(FlushMappedBufferRangeAPPLE, (target, offset, size), (F, "glFlushMappedBufferRangeAPPLE(0x%x, %d, %d);\n", target, offset, size));
+}
+
 KEYWORD1 void KEYWORD2 NAME(FramebufferTextureLayer)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
 {
    DISPATCH(FramebufferTextureLayerEXT, (target, attachment, texture, level, layer), (F, "glFramebufferTextureLayer(0x%x, 0x%x, %d, %d, %d);\n", target, attachment, texture, level, layer));
@@ -5613,37 +5627,51 @@ KEYWORD1 void KEYWORD2 NAME(ProvokingVertexEXT)(GLenum mode)
    DISPATCH(ProvokingVertexEXT, (mode), (F, "glProvokingVertexEXT(0x%x);\n", mode));
 }
 
-KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_776)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_778)(GLenum target, GLenum pname, GLvoid ** params);
+
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_778)(GLenum target, GLenum pname, GLvoid ** params)
+{
+   DISPATCH(GetTexParameterPointervAPPLE, (target, pname, params), (F, "glGetTexParameterPointervAPPLE(0x%x, 0x%x, %p);\n", target, pname, (const void *) params));
+}
+
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_779)(GLenum target, GLsizei length, GLvoid * pointer);
+
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_779)(GLenum target, GLsizei length, GLvoid * pointer)
+{
+   DISPATCH(TextureRangeAPPLE, (target, length, pointer), (F, "glTextureRangeAPPLE(0x%x, %d, %p);\n", target, length, (const void *) pointer));
+}
+
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_780)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
 
-KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_776)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask)
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_780)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask)
 {
    DISPATCH(StencilFuncSeparateATI, (frontfunc, backfunc, ref, mask), (F, "glStencilFuncSeparateATI(0x%x, 0x%x, %d, %d);\n", frontfunc, backfunc, ref, mask));
 }
 
-KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_777)(GLenum target, GLuint index, GLsizei count, const GLfloat * params);
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_781)(GLenum target, GLuint index, GLsizei count, const GLfloat * params);
 
-KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_777)(GLenum target, GLuint index, GLsizei count, const GLfloat * params)
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_781)(GLenum target, GLuint index, GLsizei count, const GLfloat * params)
 {
    DISPATCH(ProgramEnvParameters4fvEXT, (target, index, count, params), (F, "glProgramEnvParameters4fvEXT(0x%x, %d, %d, %p);\n", target, index, count, (const void *) params));
 }
 
-KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_778)(GLenum target, GLuint index, GLsizei count, const GLfloat * params);
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_782)(GLenum target, GLuint index, GLsizei count, const GLfloat * params);
 
-KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_778)(GLenum target, GLuint index, GLsizei count, const GLfloat * params)
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_782)(GLenum target, GLuint index, GLsizei count, const GLfloat * params)
 {
    DISPATCH(ProgramLocalParameters4fvEXT, (target, index, count, params), (F, "glProgramLocalParameters4fvEXT(0x%x, %d, %d, %p);\n", target, index, count, (const void *) params));
 }
 
-KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_779)(GLuint id, GLenum pname, GLint64EXT * params);
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_783)(GLuint id, GLenum pname, GLint64EXT * params);
 
-KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_779)(GLuint id, GLenum pname, GLint64EXT * params)
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_783)(GLuint id, GLenum pname, GLint64EXT * params)
 {
    DISPATCH(GetQueryObjecti64vEXT, (id, pname, params), (F, "glGetQueryObjecti64vEXT(%d, 0x%x, %p);\n", id, pname, (const void *) params));
 }
 
-KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_780)(GLuint id, GLenum pname, GLuint64EXT * params);
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_784)(GLuint id, GLenum pname, GLuint64EXT * params);
 
-KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_780)(GLuint id, GLenum pname, GLuint64EXT * params)
+KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_784)(GLuint id, GLenum pname, GLuint64EXT * params)
 {
    DISPATCH(GetQueryObjectui64vEXT, (id, pname, params), (F, "glGetQueryObjectui64vEXT(%d, 0x%x, %p);\n", id, pname, (const void *) params));
 }
@@ -6436,13 +6464,17 @@ static _glapi_proc DISPATCH_TABLE_NAME[] = {
    TABLE_ENTRY(IsRenderbufferEXT),
    TABLE_ENTRY(RenderbufferStorageEXT),
    TABLE_ENTRY(_dispatch_stub_773),
+   TABLE_ENTRY(_dispatch_stub_774),
+   TABLE_ENTRY(_dispatch_stub_775),
    TABLE_ENTRY(FramebufferTextureLayerEXT),
    TABLE_ENTRY(ProvokingVertexEXT),
-   TABLE_ENTRY(_dispatch_stub_776),
-   TABLE_ENTRY(_dispatch_stub_777),
    TABLE_ENTRY(_dispatch_stub_778),
    TABLE_ENTRY(_dispatch_stub_779),
    TABLE_ENTRY(_dispatch_stub_780),
+   TABLE_ENTRY(_dispatch_stub_781),
+   TABLE_ENTRY(_dispatch_stub_782),
+   TABLE_ENTRY(_dispatch_stub_783),
+   TABLE_ENTRY(_dispatch_stub_784),
    /* A whole bunch of no-op functions.  These might be called
     * when someone tries to call a dynamically-registered
     * extension function without a current rendering context.
index bd3ebc8..21e96a9 100644 (file)
@@ -826,8 +826,12 @@ static const char gl_string_table[] =
     "glIsRenderbufferEXT\0"
     "glRenderbufferStorageEXT\0"
     "glBlitFramebufferEXT\0"
+    "glBufferParameteriAPPLE\0"
+    "glFlushMappedBufferRangeAPPLE\0"
     "glFramebufferTextureLayerEXT\0"
     "glProvokingVertexEXT\0"
+    "glGetTexParameterPointervAPPLE\0"
+    "glTextureRangeAPPLE\0"
     "glStencilFuncSeparateATI\0"
     "glProgramEnvParameters4fvEXT\0"
     "glProgramLocalParameters4fvEXT\0"
@@ -1178,11 +1182,15 @@ static const char gl_string_table[] =
 #define gl_dispatch_stub_754 mgl_dispatch_stub_754
 #define gl_dispatch_stub_755 mgl_dispatch_stub_755
 #define gl_dispatch_stub_773 mgl_dispatch_stub_773
-#define gl_dispatch_stub_776 mgl_dispatch_stub_776
-#define gl_dispatch_stub_777 mgl_dispatch_stub_777
+#define gl_dispatch_stub_774 mgl_dispatch_stub_774
+#define gl_dispatch_stub_775 mgl_dispatch_stub_775
 #define gl_dispatch_stub_778 mgl_dispatch_stub_778
 #define gl_dispatch_stub_779 mgl_dispatch_stub_779
 #define gl_dispatch_stub_780 mgl_dispatch_stub_780
+#define gl_dispatch_stub_781 mgl_dispatch_stub_781
+#define gl_dispatch_stub_782 mgl_dispatch_stub_782
+#define gl_dispatch_stub_783 mgl_dispatch_stub_783
+#define gl_dispatch_stub_784 mgl_dispatch_stub_784
 #endif /* USE_MGL_NAMESPACE */
 
 
@@ -1228,11 +1236,15 @@ GLboolean GLAPIENTRY gl_dispatch_stub_747(GLuint array);
 void GLAPIENTRY gl_dispatch_stub_754(GLclampd zmin, GLclampd zmax);
 void GLAPIENTRY gl_dispatch_stub_755(GLenum modeRGB, GLenum modeA);
 void GLAPIENTRY gl_dispatch_stub_773(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
-void GLAPIENTRY gl_dispatch_stub_776(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
-void GLAPIENTRY gl_dispatch_stub_777(GLenum target, GLuint index, GLsizei count, const GLfloat * params);
-void GLAPIENTRY gl_dispatch_stub_778(GLenum target, GLuint index, GLsizei count, const GLfloat * params);
-void GLAPIENTRY gl_dispatch_stub_779(GLuint id, GLenum pname, GLint64EXT * params);
-void GLAPIENTRY gl_dispatch_stub_780(GLuint id, GLenum pname, GLuint64EXT * params);
+void GLAPIENTRY gl_dispatch_stub_774(GLenum target, GLenum pname, GLint param);
+void GLAPIENTRY gl_dispatch_stub_775(GLenum target, GLintptr offset, GLsizeiptr size);
+void GLAPIENTRY gl_dispatch_stub_778(GLenum target, GLenum pname, GLvoid ** params);
+void GLAPIENTRY gl_dispatch_stub_779(GLenum target, GLsizei length, GLvoid * pointer);
+void GLAPIENTRY gl_dispatch_stub_780(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
+void GLAPIENTRY gl_dispatch_stub_781(GLenum target, GLuint index, GLsizei count, const GLfloat * params);
+void GLAPIENTRY gl_dispatch_stub_782(GLenum target, GLuint index, GLsizei count, const GLfloat * params);
+void GLAPIENTRY gl_dispatch_stub_783(GLuint id, GLenum pname, GLint64EXT * params);
+void GLAPIENTRY gl_dispatch_stub_784(GLuint id, GLenum pname, GLuint64EXT * params);
 #endif /* defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) */
 
 static const glprocs_table_t static_functions[] = {
@@ -2010,313 +2022,317 @@ static const glprocs_table_t static_functions[] = {
     NAME_FUNC_OFFSET(13543, glIsRenderbufferEXT, glIsRenderbufferEXT, NULL, _gloffset_IsRenderbufferEXT),
     NAME_FUNC_OFFSET(13563, glRenderbufferStorageEXT, glRenderbufferStorageEXT, NULL, _gloffset_RenderbufferStorageEXT),
     NAME_FUNC_OFFSET(13588, gl_dispatch_stub_773, gl_dispatch_stub_773, NULL, _gloffset_BlitFramebufferEXT),
-    NAME_FUNC_OFFSET(13609, glFramebufferTextureLayerEXT, glFramebufferTextureLayerEXT, NULL, _gloffset_FramebufferTextureLayerEXT),
-    NAME_FUNC_OFFSET(13638, glProvokingVertexEXT, glProvokingVertexEXT, NULL, _gloffset_ProvokingVertexEXT),
-    NAME_FUNC_OFFSET(13659, gl_dispatch_stub_776, gl_dispatch_stub_776, NULL, _gloffset_StencilFuncSeparateATI),
-    NAME_FUNC_OFFSET(13684, gl_dispatch_stub_777, gl_dispatch_stub_777, NULL, _gloffset_ProgramEnvParameters4fvEXT),
-    NAME_FUNC_OFFSET(13713, gl_dispatch_stub_778, gl_dispatch_stub_778, NULL, _gloffset_ProgramLocalParameters4fvEXT),
-    NAME_FUNC_OFFSET(13744, gl_dispatch_stub_779, gl_dispatch_stub_779, NULL, _gloffset_GetQueryObjecti64vEXT),
-    NAME_FUNC_OFFSET(13768, gl_dispatch_stub_780, gl_dispatch_stub_780, NULL, _gloffset_GetQueryObjectui64vEXT),
-    NAME_FUNC_OFFSET(13793, glArrayElement, glArrayElement, NULL, _gloffset_ArrayElement),
-    NAME_FUNC_OFFSET(13811, glBindTexture, glBindTexture, NULL, _gloffset_BindTexture),
-    NAME_FUNC_OFFSET(13828, glDrawArrays, glDrawArrays, NULL, _gloffset_DrawArrays),
-    NAME_FUNC_OFFSET(13844, glAreTexturesResident, glAreTexturesResidentEXT, glAreTexturesResidentEXT, _gloffset_AreTexturesResident),
-    NAME_FUNC_OFFSET(13869, glCopyTexImage1D, glCopyTexImage1D, NULL, _gloffset_CopyTexImage1D),
-    NAME_FUNC_OFFSET(13889, glCopyTexImage2D, glCopyTexImage2D, NULL, _gloffset_CopyTexImage2D),
-    NAME_FUNC_OFFSET(13909, glCopyTexSubImage1D, glCopyTexSubImage1D, NULL, _gloffset_CopyTexSubImage1D),
-    NAME_FUNC_OFFSET(13932, glCopyTexSubImage2D, glCopyTexSubImage2D, NULL, _gloffset_CopyTexSubImage2D),
-    NAME_FUNC_OFFSET(13955, glDeleteTextures, glDeleteTexturesEXT, glDeleteTexturesEXT, _gloffset_DeleteTextures),
-    NAME_FUNC_OFFSET(13975, glGenTextures, glGenTexturesEXT, glGenTexturesEXT, _gloffset_GenTextures),
-    NAME_FUNC_OFFSET(13992, glGetPointerv, glGetPointerv, NULL, _gloffset_GetPointerv),
-    NAME_FUNC_OFFSET(14009, glIsTexture, glIsTextureEXT, glIsTextureEXT, _gloffset_IsTexture),
-    NAME_FUNC_OFFSET(14024, glPrioritizeTextures, glPrioritizeTextures, NULL, _gloffset_PrioritizeTextures),
-    NAME_FUNC_OFFSET(14048, glTexSubImage1D, glTexSubImage1D, NULL, _gloffset_TexSubImage1D),
-    NAME_FUNC_OFFSET(14067, glTexSubImage2D, glTexSubImage2D, NULL, _gloffset_TexSubImage2D),
-    NAME_FUNC_OFFSET(14086, glBlendColor, glBlendColor, NULL, _gloffset_BlendColor),
-    NAME_FUNC_OFFSET(14102, glBlendEquation, glBlendEquation, NULL, _gloffset_BlendEquation),
-    NAME_FUNC_OFFSET(14121, glDrawRangeElements, glDrawRangeElements, NULL, _gloffset_DrawRangeElements),
-    NAME_FUNC_OFFSET(14144, glColorTable, glColorTable, NULL, _gloffset_ColorTable),
-    NAME_FUNC_OFFSET(14160, glColorTable, glColorTable, NULL, _gloffset_ColorTable),
-    NAME_FUNC_OFFSET(14176, glColorTableParameterfv, glColorTableParameterfv, NULL, _gloffset_ColorTableParameterfv),
-    NAME_FUNC_OFFSET(14203, glColorTableParameteriv, glColorTableParameteriv, NULL, _gloffset_ColorTableParameteriv),
-    NAME_FUNC_OFFSET(14230, glCopyColorTable, glCopyColorTable, NULL, _gloffset_CopyColorTable),
-    NAME_FUNC_OFFSET(14250, glGetColorTable, glGetColorTableEXT, glGetColorTableEXT, _gloffset_GetColorTable),
-    NAME_FUNC_OFFSET(14269, glGetColorTable, glGetColorTableEXT, glGetColorTableEXT, _gloffset_GetColorTable),
-    NAME_FUNC_OFFSET(14288, glGetColorTableParameterfv, glGetColorTableParameterfvEXT, glGetColorTableParameterfvEXT, _gloffset_GetColorTableParameterfv),
-    NAME_FUNC_OFFSET(14318, glGetColorTableParameterfv, glGetColorTableParameterfvEXT, glGetColorTableParameterfvEXT, _gloffset_GetColorTableParameterfv),
-    NAME_FUNC_OFFSET(14348, glGetColorTableParameteriv, glGetColorTableParameterivEXT, glGetColorTableParameterivEXT, _gloffset_GetColorTableParameteriv),
-    NAME_FUNC_OFFSET(14378, glGetColorTableParameteriv, glGetColorTableParameterivEXT, glGetColorTableParameterivEXT, _gloffset_GetColorTableParameteriv),
-    NAME_FUNC_OFFSET(14408, glColorSubTable, glColorSubTable, NULL, _gloffset_ColorSubTable),
-    NAME_FUNC_OFFSET(14427, glCopyColorSubTable, glCopyColorSubTable, NULL, _gloffset_CopyColorSubTable),
-    NAME_FUNC_OFFSET(14450, glConvolutionFilter1D, glConvolutionFilter1D, NULL, _gloffset_ConvolutionFilter1D),
-    NAME_FUNC_OFFSET(14475, glConvolutionFilter2D, glConvolutionFilter2D, NULL, _gloffset_ConvolutionFilter2D),
-    NAME_FUNC_OFFSET(14500, glConvolutionParameterf, glConvolutionParameterf, NULL, _gloffset_ConvolutionParameterf),
-    NAME_FUNC_OFFSET(14527, glConvolutionParameterfv, glConvolutionParameterfv, NULL, _gloffset_ConvolutionParameterfv),
-    NAME_FUNC_OFFSET(14555, glConvolutionParameteri, glConvolutionParameteri, NULL, _gloffset_ConvolutionParameteri),
-    NAME_FUNC_OFFSET(14582, glConvolutionParameteriv, glConvolutionParameteriv, NULL, _gloffset_ConvolutionParameteriv),
-    NAME_FUNC_OFFSET(14610, glCopyConvolutionFilter1D, glCopyConvolutionFilter1D, NULL, _gloffset_CopyConvolutionFilter1D),
-    NAME_FUNC_OFFSET(14639, glCopyConvolutionFilter2D, glCopyConvolutionFilter2D, NULL, _gloffset_CopyConvolutionFilter2D),
-    NAME_FUNC_OFFSET(14668, glGetConvolutionFilter, gl_dispatch_stub_356, gl_dispatch_stub_356, _gloffset_GetConvolutionFilter),
-    NAME_FUNC_OFFSET(14694, glGetConvolutionParameterfv, gl_dispatch_stub_357, gl_dispatch_stub_357, _gloffset_GetConvolutionParameterfv),
-    NAME_FUNC_OFFSET(14725, glGetConvolutionParameteriv, gl_dispatch_stub_358, gl_dispatch_stub_358, _gloffset_GetConvolutionParameteriv),
-    NAME_FUNC_OFFSET(14756, glGetSeparableFilter, gl_dispatch_stub_359, gl_dispatch_stub_359, _gloffset_GetSeparableFilter),
-    NAME_FUNC_OFFSET(14780, glSeparableFilter2D, glSeparableFilter2D, NULL, _gloffset_SeparableFilter2D),
-    NAME_FUNC_OFFSET(14803, glGetHistogram, gl_dispatch_stub_361, gl_dispatch_stub_361, _gloffset_GetHistogram),
-    NAME_FUNC_OFFSET(14821, glGetHistogramParameterfv, gl_dispatch_stub_362, gl_dispatch_stub_362, _gloffset_GetHistogramParameterfv),
-    NAME_FUNC_OFFSET(14850, glGetHistogramParameteriv, gl_dispatch_stub_363, gl_dispatch_stub_363, _gloffset_GetHistogramParameteriv),
-    NAME_FUNC_OFFSET(14879, glGetMinmax, gl_dispatch_stub_364, gl_dispatch_stub_364, _gloffset_GetMinmax),
-    NAME_FUNC_OFFSET(14894, glGetMinmaxParameterfv, gl_dispatch_stub_365, gl_dispatch_stub_365, _gloffset_GetMinmaxParameterfv),
-    NAME_FUNC_OFFSET(14920, glGetMinmaxParameteriv, gl_dispatch_stub_366, gl_dispatch_stub_366, _gloffset_GetMinmaxParameteriv),
-    NAME_FUNC_OFFSET(14946, glHistogram, glHistogram, NULL, _gloffset_Histogram),
-    NAME_FUNC_OFFSET(14961, glMinmax, glMinmax, NULL, _gloffset_Minmax),
-    NAME_FUNC_OFFSET(14973, glResetHistogram, glResetHistogram, NULL, _gloffset_ResetHistogram),
-    NAME_FUNC_OFFSET(14993, glResetMinmax, glResetMinmax, NULL, _gloffset_ResetMinmax),
-    NAME_FUNC_OFFSET(15010, glTexImage3D, glTexImage3D, NULL, _gloffset_TexImage3D),
-    NAME_FUNC_OFFSET(15026, glTexSubImage3D, glTexSubImage3D, NULL, _gloffset_TexSubImage3D),
-    NAME_FUNC_OFFSET(15045, glCopyTexSubImage3D, glCopyTexSubImage3D, NULL, _gloffset_CopyTexSubImage3D),
-    NAME_FUNC_OFFSET(15068, glActiveTextureARB, glActiveTextureARB, NULL, _gloffset_ActiveTextureARB),
-    NAME_FUNC_OFFSET(15084, glClientActiveTextureARB, glClientActiveTextureARB, NULL, _gloffset_ClientActiveTextureARB),
-    NAME_FUNC_OFFSET(15106, glMultiTexCoord1dARB, glMultiTexCoord1dARB, NULL, _gloffset_MultiTexCoord1dARB),
-    NAME_FUNC_OFFSET(15124, glMultiTexCoord1dvARB, glMultiTexCoord1dvARB, NULL, _gloffset_MultiTexCoord1dvARB),
-    NAME_FUNC_OFFSET(15143, glMultiTexCoord1fARB, glMultiTexCoord1fARB, NULL, _gloffset_MultiTexCoord1fARB),
-    NAME_FUNC_OFFSET(15161, glMultiTexCoord1fvARB, glMultiTexCoord1fvARB, NULL, _gloffset_MultiTexCoord1fvARB),
-    NAME_FUNC_OFFSET(15180, glMultiTexCoord1iARB, glMultiTexCoord1iARB, NULL, _gloffset_MultiTexCoord1iARB),
-    NAME_FUNC_OFFSET(15198, glMultiTexCoord1ivARB, glMultiTexCoord1ivARB, NULL, _gloffset_MultiTexCoord1ivARB),
-    NAME_FUNC_OFFSET(15217, glMultiTexCoord1sARB, glMultiTexCoord1sARB, NULL, _gloffset_MultiTexCoord1sARB),
-    NAME_FUNC_OFFSET(15235, glMultiTexCoord1svARB, glMultiTexCoord1svARB, NULL, _gloffset_MultiTexCoord1svARB),
-    NAME_FUNC_OFFSET(15254, glMultiTexCoord2dARB, glMultiTexCoord2dARB, NULL, _gloffset_MultiTexCoord2dARB),
-    NAME_FUNC_OFFSET(15272, glMultiTexCoord2dvARB, glMultiTexCoord2dvARB, NULL, _gloffset_MultiTexCoord2dvARB),
-    NAME_FUNC_OFFSET(15291, glMultiTexCoord2fARB, glMultiTexCoord2fARB, NULL, _gloffset_MultiTexCoord2fARB),
-    NAME_FUNC_OFFSET(15309, glMultiTexCoord2fvARB, glMultiTexCoord2fvARB, NULL, _gloffset_MultiTexCoord2fvARB),
-    NAME_FUNC_OFFSET(15328, glMultiTexCoord2iARB, glMultiTexCoord2iARB, NULL, _gloffset_MultiTexCoord2iARB),
-    NAME_FUNC_OFFSET(15346, glMultiTexCoord2ivARB, glMultiTexCoord2ivARB, NULL, _gloffset_MultiTexCoord2ivARB),
-    NAME_FUNC_OFFSET(15365, glMultiTexCoord2sARB, glMultiTexCoord2sARB, NULL, _gloffset_MultiTexCoord2sARB),
-    NAME_FUNC_OFFSET(15383, glMultiTexCoord2svARB, glMultiTexCoord2svARB, NULL, _gloffset_MultiTexCoord2svARB),
-    NAME_FUNC_OFFSET(15402, glMultiTexCoord3dARB, glMultiTexCoord3dARB, NULL, _gloffset_MultiTexCoord3dARB),
-    NAME_FUNC_OFFSET(15420, glMultiTexCoord3dvARB, glMultiTexCoord3dvARB, NULL, _gloffset_MultiTexCoord3dvARB),
-    NAME_FUNC_OFFSET(15439, glMultiTexCoord3fARB, glMultiTexCoord3fARB, NULL, _gloffset_MultiTexCoord3fARB),
-    NAME_FUNC_OFFSET(15457, glMultiTexCoord3fvARB, glMultiTexCoord3fvARB, NULL, _gloffset_MultiTexCoord3fvARB),
-    NAME_FUNC_OFFSET(15476, glMultiTexCoord3iARB, glMultiTexCoord3iARB, NULL, _gloffset_MultiTexCoord3iARB),
-    NAME_FUNC_OFFSET(15494, glMultiTexCoord3ivARB, glMultiTexCoord3ivARB, NULL, _gloffset_MultiTexCoord3ivARB),
-    NAME_FUNC_OFFSET(15513, glMultiTexCoord3sARB, glMultiTexCoord3sARB, NULL, _gloffset_MultiTexCoord3sARB),
-    NAME_FUNC_OFFSET(15531, glMultiTexCoord3svARB, glMultiTexCoord3svARB, NULL, _gloffset_MultiTexCoord3svARB),
-    NAME_FUNC_OFFSET(15550, glMultiTexCoord4dARB, glMultiTexCoord4dARB, NULL, _gloffset_MultiTexCoord4dARB),
-    NAME_FUNC_OFFSET(15568, glMultiTexCoord4dvARB, glMultiTexCoord4dvARB, NULL, _gloffset_MultiTexCoord4dvARB),
-    NAME_FUNC_OFFSET(15587, glMultiTexCoord4fARB, glMultiTexCoord4fARB, NULL, _gloffset_MultiTexCoord4fARB),
-    NAME_FUNC_OFFSET(15605, glMultiTexCoord4fvARB, glMultiTexCoord4fvARB, NULL, _gloffset_MultiTexCoord4fvARB),
-    NAME_FUNC_OFFSET(15624, glMultiTexCoord4iARB, glMultiTexCoord4iARB, NULL, _gloffset_MultiTexCoord4iARB),
-    NAME_FUNC_OFFSET(15642, glMultiTexCoord4ivARB, glMultiTexCoord4ivARB, NULL, _gloffset_MultiTexCoord4ivARB),
-    NAME_FUNC_OFFSET(15661, glMultiTexCoord4sARB, glMultiTexCoord4sARB, NULL, _gloffset_MultiTexCoord4sARB),
-    NAME_FUNC_OFFSET(15679, glMultiTexCoord4svARB, glMultiTexCoord4svARB, NULL, _gloffset_MultiTexCoord4svARB),
-    NAME_FUNC_OFFSET(15698, glStencilOpSeparate, glStencilOpSeparate, NULL, _gloffset_StencilOpSeparate),
-    NAME_FUNC_OFFSET(15721, glLoadTransposeMatrixdARB, glLoadTransposeMatrixdARB, NULL, _gloffset_LoadTransposeMatrixdARB),
-    NAME_FUNC_OFFSET(15744, glLoadTransposeMatrixfARB, glLoadTransposeMatrixfARB, NULL, _gloffset_LoadTransposeMatrixfARB),
-    NAME_FUNC_OFFSET(15767, glMultTransposeMatrixdARB, glMultTransposeMatrixdARB, NULL, _gloffset_MultTransposeMatrixdARB),
-    NAME_FUNC_OFFSET(15790, glMultTransposeMatrixfARB, glMultTransposeMatrixfARB, NULL, _gloffset_MultTransposeMatrixfARB),
-    NAME_FUNC_OFFSET(15813, glSampleCoverageARB, glSampleCoverageARB, NULL, _gloffset_SampleCoverageARB),
-    NAME_FUNC_OFFSET(15830, glCompressedTexImage1DARB, glCompressedTexImage1DARB, NULL, _gloffset_CompressedTexImage1DARB),
-    NAME_FUNC_OFFSET(15853, glCompressedTexImage2DARB, glCompressedTexImage2DARB, NULL, _gloffset_CompressedTexImage2DARB),
-    NAME_FUNC_OFFSET(15876, glCompressedTexImage3DARB, glCompressedTexImage3DARB, NULL, _gloffset_CompressedTexImage3DARB),
-    NAME_FUNC_OFFSET(15899, glCompressedTexSubImage1DARB, glCompressedTexSubImage1DARB, NULL, _gloffset_CompressedTexSubImage1DARB),
-    NAME_FUNC_OFFSET(15925, glCompressedTexSubImage2DARB, glCompressedTexSubImage2DARB, NULL, _gloffset_CompressedTexSubImage2DARB),
-    NAME_FUNC_OFFSET(15951, glCompressedTexSubImage3DARB, glCompressedTexSubImage3DARB, NULL, _gloffset_CompressedTexSubImage3DARB),
-    NAME_FUNC_OFFSET(15977, glGetCompressedTexImageARB, glGetCompressedTexImageARB, NULL, _gloffset_GetCompressedTexImageARB),
-    NAME_FUNC_OFFSET(16001, glDisableVertexAttribArrayARB, glDisableVertexAttribArrayARB, NULL, _gloffset_DisableVertexAttribArrayARB),
-    NAME_FUNC_OFFSET(16028, glEnableVertexAttribArrayARB, glEnableVertexAttribArrayARB, NULL, _gloffset_EnableVertexAttribArrayARB),
-    NAME_FUNC_OFFSET(16054, glGetVertexAttribdvARB, glGetVertexAttribdvARB, NULL, _gloffset_GetVertexAttribdvARB),
-    NAME_FUNC_OFFSET(16074, glGetVertexAttribfvARB, glGetVertexAttribfvARB, NULL, _gloffset_GetVertexAttribfvARB),
-    NAME_FUNC_OFFSET(16094, glGetVertexAttribivARB, glGetVertexAttribivARB, NULL, _gloffset_GetVertexAttribivARB),
-    NAME_FUNC_OFFSET(16114, glProgramEnvParameter4dARB, glProgramEnvParameter4dARB, NULL, _gloffset_ProgramEnvParameter4dARB),
-    NAME_FUNC_OFFSET(16137, glProgramEnvParameter4dvARB, glProgramEnvParameter4dvARB, NULL, _gloffset_ProgramEnvParameter4dvARB),
-    NAME_FUNC_OFFSET(16161, glProgramEnvParameter4fARB, glProgramEnvParameter4fARB, NULL, _gloffset_ProgramEnvParameter4fARB),
-    NAME_FUNC_OFFSET(16184, glProgramEnvParameter4fvARB, glProgramEnvParameter4fvARB, NULL, _gloffset_ProgramEnvParameter4fvARB),
-    NAME_FUNC_OFFSET(16208, glVertexAttrib1dARB, glVertexAttrib1dARB, NULL, _gloffset_VertexAttrib1dARB),
-    NAME_FUNC_OFFSET(16225, glVertexAttrib1dvARB, glVertexAttrib1dvARB, NULL, _gloffset_VertexAttrib1dvARB),
-    NAME_FUNC_OFFSET(16243, glVertexAttrib1fARB, glVertexAttrib1fARB, NULL, _gloffset_VertexAttrib1fARB),
-    NAME_FUNC_OFFSET(16260, glVertexAttrib1fvARB, glVertexAttrib1fvARB, NULL, _gloffset_VertexAttrib1fvARB),
-    NAME_FUNC_OFFSET(16278, glVertexAttrib1sARB, glVertexAttrib1sARB, NULL, _gloffset_VertexAttrib1sARB),
-    NAME_FUNC_OFFSET(16295, glVertexAttrib1svARB, glVertexAttrib1svARB, NULL, _gloffset_VertexAttrib1svARB),
-    NAME_FUNC_OFFSET(16313, glVertexAttrib2dARB, glVertexAttrib2dARB, NULL, _gloffset_VertexAttrib2dARB),
-    NAME_FUNC_OFFSET(16330, glVertexAttrib2dvARB, glVertexAttrib2dvARB, NULL, _gloffset_VertexAttrib2dvARB),
-    NAME_FUNC_OFFSET(16348, glVertexAttrib2fARB, glVertexAttrib2fARB, NULL, _gloffset_VertexAttrib2fARB),
-    NAME_FUNC_OFFSET(16365, glVertexAttrib2fvARB, glVertexAttrib2fvARB, NULL, _gloffset_VertexAttrib2fvARB),
-    NAME_FUNC_OFFSET(16383, glVertexAttrib2sARB, glVertexAttrib2sARB, NULL, _gloffset_VertexAttrib2sARB),
-    NAME_FUNC_OFFSET(16400, glVertexAttrib2svARB, glVertexAttrib2svARB, NULL, _gloffset_VertexAttrib2svARB),
-    NAME_FUNC_OFFSET(16418, glVertexAttrib3dARB, glVertexAttrib3dARB, NULL, _gloffset_VertexAttrib3dARB),
-    NAME_FUNC_OFFSET(16435, glVertexAttrib3dvARB, glVertexAttrib3dvARB, NULL, _gloffset_VertexAttrib3dvARB),
-    NAME_FUNC_OFFSET(16453, glVertexAttrib3fARB, glVertexAttrib3fARB, NULL, _gloffset_VertexAttrib3fARB),
-    NAME_FUNC_OFFSET(16470, glVertexAttrib3fvARB, glVertexAttrib3fvARB, NULL, _gloffset_VertexAttrib3fvARB),
-    NAME_FUNC_OFFSET(16488, glVertexAttrib3sARB, glVertexAttrib3sARB, NULL, _gloffset_VertexAttrib3sARB),
-    NAME_FUNC_OFFSET(16505, glVertexAttrib3svARB, glVertexAttrib3svARB, NULL, _gloffset_VertexAttrib3svARB),
-    NAME_FUNC_OFFSET(16523, glVertexAttrib4NbvARB, glVertexAttrib4NbvARB, NULL, _gloffset_VertexAttrib4NbvARB),
-    NAME_FUNC_OFFSET(16542, glVertexAttrib4NivARB, glVertexAttrib4NivARB, NULL, _gloffset_VertexAttrib4NivARB),
-    NAME_FUNC_OFFSET(16561, glVertexAttrib4NsvARB, glVertexAttrib4NsvARB, NULL, _gloffset_VertexAttrib4NsvARB),
-    NAME_FUNC_OFFSET(16580, glVertexAttrib4NubARB, glVertexAttrib4NubARB, NULL, _gloffset_VertexAttrib4NubARB),
-    NAME_FUNC_OFFSET(16599, glVertexAttrib4NubvARB, glVertexAttrib4NubvARB, NULL, _gloffset_VertexAttrib4NubvARB),
-    NAME_FUNC_OFFSET(16619, glVertexAttrib4NuivARB, glVertexAttrib4NuivARB, NULL, _gloffset_VertexAttrib4NuivARB),
-    NAME_FUNC_OFFSET(16639, glVertexAttrib4NusvARB, glVertexAttrib4NusvARB, NULL, _gloffset_VertexAttrib4NusvARB),
-    NAME_FUNC_OFFSET(16659, glVertexAttrib4bvARB, glVertexAttrib4bvARB, NULL, _gloffset_VertexAttrib4bvARB),
-    NAME_FUNC_OFFSET(16677, glVertexAttrib4dARB, glVertexAttrib4dARB, NULL, _gloffset_VertexAttrib4dARB),
-    NAME_FUNC_OFFSET(16694, glVertexAttrib4dvARB, glVertexAttrib4dvARB, NULL, _gloffset_VertexAttrib4dvARB),
-    NAME_FUNC_OFFSET(16712, glVertexAttrib4fARB, glVertexAttrib4fARB, NULL, _gloffset_VertexAttrib4fARB),
-    NAME_FUNC_OFFSET(16729, glVertexAttrib4fvARB, glVertexAttrib4fvARB, NULL, _gloffset_VertexAttrib4fvARB),
-    NAME_FUNC_OFFSET(16747, glVertexAttrib4ivARB, glVertexAttrib4ivARB, NULL, _gloffset_VertexAttrib4ivARB),
-    NAME_FUNC_OFFSET(16765, glVertexAttrib4sARB, glVertexAttrib4sARB, NULL, _gloffset_VertexAttrib4sARB),
-    NAME_FUNC_OFFSET(16782, glVertexAttrib4svARB, glVertexAttrib4svARB, NULL, _gloffset_VertexAttrib4svARB),
-    NAME_FUNC_OFFSET(16800, glVertexAttrib4ubvARB, glVertexAttrib4ubvARB, NULL, _gloffset_VertexAttrib4ubvARB),
-    NAME_FUNC_OFFSET(16819, glVertexAttrib4uivARB, glVertexAttrib4uivARB, NULL, _gloffset_VertexAttrib4uivARB),
-    NAME_FUNC_OFFSET(16838, glVertexAttrib4usvARB, glVertexAttrib4usvARB, NULL, _gloffset_VertexAttrib4usvARB),
-    NAME_FUNC_OFFSET(16857, glVertexAttribPointerARB, glVertexAttribPointerARB, NULL, _gloffset_VertexAttribPointerARB),
-    NAME_FUNC_OFFSET(16879, glBindBufferARB, glBindBufferARB, NULL, _gloffset_BindBufferARB),
-    NAME_FUNC_OFFSET(16892, glBufferDataARB, glBufferDataARB, NULL, _gloffset_BufferDataARB),
-    NAME_FUNC_OFFSET(16905, glBufferSubDataARB, glBufferSubDataARB, NULL, _gloffset_BufferSubDataARB),
-    NAME_FUNC_OFFSET(16921, glDeleteBuffersARB, glDeleteBuffersARB, NULL, _gloffset_DeleteBuffersARB),
-    NAME_FUNC_OFFSET(16937, glGenBuffersARB, glGenBuffersARB, NULL, _gloffset_GenBuffersARB),
-    NAME_FUNC_OFFSET(16950, glGetBufferParameterivARB, glGetBufferParameterivARB, NULL, _gloffset_GetBufferParameterivARB),
-    NAME_FUNC_OFFSET(16973, glGetBufferPointervARB, glGetBufferPointervARB, NULL, _gloffset_GetBufferPointervARB),
-    NAME_FUNC_OFFSET(16993, glGetBufferSubDataARB, glGetBufferSubDataARB, NULL, _gloffset_GetBufferSubDataARB),
-    NAME_FUNC_OFFSET(17012, glIsBufferARB, glIsBufferARB, NULL, _gloffset_IsBufferARB),
-    NAME_FUNC_OFFSET(17023, glMapBufferARB, glMapBufferARB, NULL, _gloffset_MapBufferARB),
-    NAME_FUNC_OFFSET(17035, glUnmapBufferARB, glUnmapBufferARB, NULL, _gloffset_UnmapBufferARB),
-    NAME_FUNC_OFFSET(17049, glBeginQueryARB, glBeginQueryARB, NULL, _gloffset_BeginQueryARB),
-    NAME_FUNC_OFFSET(17062, glDeleteQueriesARB, glDeleteQueriesARB, NULL, _gloffset_DeleteQueriesARB),
-    NAME_FUNC_OFFSET(17078, glEndQueryARB, glEndQueryARB, NULL, _gloffset_EndQueryARB),
-    NAME_FUNC_OFFSET(17089, glGenQueriesARB, glGenQueriesARB, NULL, _gloffset_GenQueriesARB),
-    NAME_FUNC_OFFSET(17102, glGetQueryObjectivARB, glGetQueryObjectivARB, NULL, _gloffset_GetQueryObjectivARB),
-    NAME_FUNC_OFFSET(17121, glGetQueryObjectuivARB, glGetQueryObjectuivARB, NULL, _gloffset_GetQueryObjectuivARB),
-    NAME_FUNC_OFFSET(17141, glGetQueryivARB, glGetQueryivARB, NULL, _gloffset_GetQueryivARB),
-    NAME_FUNC_OFFSET(17154, glIsQueryARB, glIsQueryARB, NULL, _gloffset_IsQueryARB),
-    NAME_FUNC_OFFSET(17164, glCompileShaderARB, glCompileShaderARB, NULL, _gloffset_CompileShaderARB),
-    NAME_FUNC_OFFSET(17180, glGetActiveUniformARB, glGetActiveUniformARB, NULL, _gloffset_GetActiveUniformARB),
-    NAME_FUNC_OFFSET(17199, glGetShaderSourceARB, glGetShaderSourceARB, NULL, _gloffset_GetShaderSourceARB),
-    NAME_FUNC_OFFSET(17217, glGetUniformLocationARB, glGetUniformLocationARB, NULL, _gloffset_GetUniformLocationARB),
-    NAME_FUNC_OFFSET(17238, glGetUniformfvARB, glGetUniformfvARB, NULL, _gloffset_GetUniformfvARB),
-    NAME_FUNC_OFFSET(17253, glGetUniformivARB, glGetUniformivARB, NULL, _gloffset_GetUniformivARB),
-    NAME_FUNC_OFFSET(17268, glLinkProgramARB, glLinkProgramARB, NULL, _gloffset_LinkProgramARB),
-    NAME_FUNC_OFFSET(17282, glShaderSourceARB, glShaderSourceARB, NULL, _gloffset_ShaderSourceARB),
-    NAME_FUNC_OFFSET(17297, glUniform1fARB, glUniform1fARB, NULL, _gloffset_Uniform1fARB),
-    NAME_FUNC_OFFSET(17309, glUniform1fvARB, glUniform1fvARB, NULL, _gloffset_Uniform1fvARB),
-    NAME_FUNC_OFFSET(17322, glUniform1iARB, glUniform1iARB, NULL, _gloffset_Uniform1iARB),
-    NAME_FUNC_OFFSET(17334, glUniform1ivARB, glUniform1ivARB, NULL, _gloffset_Uniform1ivARB),
-    NAME_FUNC_OFFSET(17347, glUniform2fARB, glUniform2fARB, NULL, _gloffset_Uniform2fARB),
-    NAME_FUNC_OFFSET(17359, glUniform2fvARB, glUniform2fvARB, NULL, _gloffset_Uniform2fvARB),
-    NAME_FUNC_OFFSET(17372, glUniform2iARB, glUniform2iARB, NULL, _gloffset_Uniform2iARB),
-    NAME_FUNC_OFFSET(17384, glUniform2ivARB, glUniform2ivARB, NULL, _gloffset_Uniform2ivARB),
-    NAME_FUNC_OFFSET(17397, glUniform3fARB, glUniform3fARB, NULL, _gloffset_Uniform3fARB),
-    NAME_FUNC_OFFSET(17409, glUniform3fvARB, glUniform3fvARB, NULL, _gloffset_Uniform3fvARB),
-    NAME_FUNC_OFFSET(17422, glUniform3iARB, glUniform3iARB, NULL, _gloffset_Uniform3iARB),
-    NAME_FUNC_OFFSET(17434, glUniform3ivARB, glUniform3ivARB, NULL, _gloffset_Uniform3ivARB),
-    NAME_FUNC_OFFSET(17447, glUniform4fARB, glUniform4fARB, NULL, _gloffset_Uniform4fARB),
-    NAME_FUNC_OFFSET(17459, glUniform4fvARB, glUniform4fvARB, NULL, _gloffset_Uniform4fvARB),
-    NAME_FUNC_OFFSET(17472, glUniform4iARB, glUniform4iARB, NULL, _gloffset_Uniform4iARB),
-    NAME_FUNC_OFFSET(17484, glUniform4ivARB, glUniform4ivARB, NULL, _gloffset_Uniform4ivARB),
-    NAME_FUNC_OFFSET(17497, glUniformMatrix2fvARB, glUniformMatrix2fvARB, NULL, _gloffset_UniformMatrix2fvARB),
-    NAME_FUNC_OFFSET(17516, glUniformMatrix3fvARB, glUniformMatrix3fvARB, NULL, _gloffset_UniformMatrix3fvARB),
-    NAME_FUNC_OFFSET(17535, glUniformMatrix4fvARB, glUniformMatrix4fvARB, NULL, _gloffset_UniformMatrix4fvARB),
-    NAME_FUNC_OFFSET(17554, glUseProgramObjectARB, glUseProgramObjectARB, NULL, _gloffset_UseProgramObjectARB),
-    NAME_FUNC_OFFSET(17567, glValidateProgramARB, glValidateProgramARB, NULL, _gloffset_ValidateProgramARB),
-    NAME_FUNC_OFFSET(17585, glBindAttribLocationARB, glBindAttribLocationARB, NULL, _gloffset_BindAttribLocationARB),
-    NAME_FUNC_OFFSET(17606, glGetActiveAttribARB, glGetActiveAttribARB, NULL, _gloffset_GetActiveAttribARB),
-    NAME_FUNC_OFFSET(17624, glGetAttribLocationARB, glGetAttribLocationARB, NULL, _gloffset_GetAttribLocationARB),
-    NAME_FUNC_OFFSET(17644, glDrawBuffersARB, glDrawBuffersARB, NULL, _gloffset_DrawBuffersARB),
-    NAME_FUNC_OFFSET(17658, glDrawBuffersARB, glDrawBuffersARB, NULL, _gloffset_DrawBuffersARB),
-    NAME_FUNC_OFFSET(17675, gl_dispatch_stub_574, gl_dispatch_stub_574, NULL, _gloffset_SampleMaskSGIS),
-    NAME_FUNC_OFFSET(17691, gl_dispatch_stub_575, gl_dispatch_stub_575, NULL, _gloffset_SamplePatternSGIS),
-    NAME_FUNC_OFFSET(17710, glPointParameterfEXT, glPointParameterfEXT, NULL, _gloffset_PointParameterfEXT),
-    NAME_FUNC_OFFSET(17728, glPointParameterfEXT, glPointParameterfEXT, NULL, _gloffset_PointParameterfEXT),
-    NAME_FUNC_OFFSET(17749, glPointParameterfEXT, glPointParameterfEXT, NULL, _gloffset_PointParameterfEXT),
-    NAME_FUNC_OFFSET(17771, glPointParameterfvEXT, glPointParameterfvEXT, NULL, _gloffset_PointParameterfvEXT),
-    NAME_FUNC_OFFSET(17790, glPointParameterfvEXT, glPointParameterfvEXT, NULL, _gloffset_PointParameterfvEXT),
-    NAME_FUNC_OFFSET(17812, glPointParameterfvEXT, glPointParameterfvEXT, NULL, _gloffset_PointParameterfvEXT),
-    NAME_FUNC_OFFSET(17835, glSecondaryColor3bEXT, glSecondaryColor3bEXT, NULL, _gloffset_SecondaryColor3bEXT),
-    NAME_FUNC_OFFSET(17854, glSecondaryColor3bvEXT, glSecondaryColor3bvEXT, NULL, _gloffset_SecondaryColor3bvEXT),
-    NAME_FUNC_OFFSET(17874, glSecondaryColor3dEXT, glSecondaryColor3dEXT, NULL, _gloffset_SecondaryColor3dEXT),
-    NAME_FUNC_OFFSET(17893, glSecondaryColor3dvEXT, glSecondaryColor3dvEXT, NULL, _gloffset_SecondaryColor3dvEXT),
-    NAME_FUNC_OFFSET(17913, glSecondaryColor3fEXT, glSecondaryColor3fEXT, NULL, _gloffset_SecondaryColor3fEXT),
-    NAME_FUNC_OFFSET(17932, glSecondaryColor3fvEXT, glSecondaryColor3fvEXT, NULL, _gloffset_SecondaryColor3fvEXT),
-    NAME_FUNC_OFFSET(17952, glSecondaryColor3iEXT, glSecondaryColor3iEXT, NULL, _gloffset_SecondaryColor3iEXT),
-    NAME_FUNC_OFFSET(17971, glSecondaryColor3ivEXT, glSecondaryColor3ivEXT, NULL, _gloffset_SecondaryColor3ivEXT),
-    NAME_FUNC_OFFSET(17991, glSecondaryColor3sEXT, glSecondaryColor3sEXT, NULL, _gloffset_SecondaryColor3sEXT),
-    NAME_FUNC_OFFSET(18010, glSecondaryColor3svEXT, glSecondaryColor3svEXT, NULL, _gloffset_SecondaryColor3svEXT),
-    NAME_FUNC_OFFSET(18030, glSecondaryColor3ubEXT, glSecondaryColor3ubEXT, NULL, _gloffset_SecondaryColor3ubEXT),
-    NAME_FUNC_OFFSET(18050, glSecondaryColor3ubvEXT, glSecondaryColor3ubvEXT, NULL, _gloffset_SecondaryColor3ubvEXT),
-    NAME_FUNC_OFFSET(18071, glSecondaryColor3uiEXT, glSecondaryColor3uiEXT, NULL, _gloffset_SecondaryColor3uiEXT),
-    NAME_FUNC_OFFSET(18091, glSecondaryColor3uivEXT, glSecondaryColor3uivEXT, NULL, _gloffset_SecondaryColor3uivEXT),
-    NAME_FUNC_OFFSET(18112, glSecondaryColor3usEXT, glSecondaryColor3usEXT, NULL, _gloffset_SecondaryColor3usEXT),
-    NAME_FUNC_OFFSET(18132, glSecondaryColor3usvEXT, glSecondaryColor3usvEXT, NULL, _gloffset_SecondaryColor3usvEXT),
-    NAME_FUNC_OFFSET(18153, glSecondaryColorPointerEXT, glSecondaryColorPointerEXT, NULL, _gloffset_SecondaryColorPointerEXT),
-    NAME_FUNC_OFFSET(18177, glMultiDrawArraysEXT, glMultiDrawArraysEXT, NULL, _gloffset_MultiDrawArraysEXT),
-    NAME_FUNC_OFFSET(18195, glMultiDrawElementsEXT, glMultiDrawElementsEXT, NULL, _gloffset_MultiDrawElementsEXT),
-    NAME_FUNC_OFFSET(18215, glFogCoordPointerEXT, glFogCoordPointerEXT, NULL, _gloffset_FogCoordPointerEXT),
-    NAME_FUNC_OFFSET(18233, glFogCoorddEXT, glFogCoorddEXT, NULL, _gloffset_FogCoorddEXT),
-    NAME_FUNC_OFFSET(18245, glFogCoorddvEXT, glFogCoorddvEXT, NULL, _gloffset_FogCoorddvEXT),
-    NAME_FUNC_OFFSET(18258, glFogCoordfEXT, glFogCoordfEXT, NULL, _gloffset_FogCoordfEXT),
-    NAME_FUNC_OFFSET(18270, glFogCoordfvEXT, glFogCoordfvEXT, NULL, _gloffset_FogCoordfvEXT),
-    NAME_FUNC_OFFSET(18283, glBlendFuncSeparateEXT, glBlendFuncSeparateEXT, NULL, _gloffset_BlendFuncSeparateEXT),
-    NAME_FUNC_OFFSET(18303, glBlendFuncSeparateEXT, glBlendFuncSeparateEXT, NULL, _gloffset_BlendFuncSeparateEXT),
-    NAME_FUNC_OFFSET(18327, glWindowPos2dMESA, glWindowPos2dMESA, NULL, _gloffset_WindowPos2dMESA),
-    NAME_FUNC_OFFSET(18341, glWindowPos2dMESA, glWindowPos2dMESA, NULL, _gloffset_WindowPos2dMESA),
-    NAME_FUNC_OFFSET(18358, glWindowPos2dvMESA, glWindowPos2dvMESA, NULL, _gloffset_WindowPos2dvMESA),
-    NAME_FUNC_OFFSET(18373, glWindowPos2dvMESA, glWindowPos2dvMESA, NULL, _gloffset_WindowPos2dvMESA),
-    NAME_FUNC_OFFSET(18391, glWindowPos2fMESA, glWindowPos2fMESA, NULL, _gloffset_WindowPos2fMESA),
-    NAME_FUNC_OFFSET(18405, glWindowPos2fMESA, glWindowPos2fMESA, NULL, _gloffset_WindowPos2fMESA),
-    NAME_FUNC_OFFSET(18422, glWindowPos2fvMESA, glWindowPos2fvMESA, NULL, _gloffset_WindowPos2fvMESA),
-    NAME_FUNC_OFFSET(18437, glWindowPos2fvMESA, glWindowPos2fvMESA, NULL, _gloffset_WindowPos2fvMESA),
-    NAME_FUNC_OFFSET(18455, glWindowPos2iMESA, glWindowPos2iMESA, NULL, _gloffset_WindowPos2iMESA),
-    NAME_FUNC_OFFSET(18469, glWindowPos2iMESA, glWindowPos2iMESA, NULL, _gloffset_WindowPos2iMESA),
-    NAME_FUNC_OFFSET(18486, glWindowPos2ivMESA, glWindowPos2ivMESA, NULL, _gloffset_WindowPos2ivMESA),
-    NAME_FUNC_OFFSET(18501, glWindowPos2ivMESA, glWindowPos2ivMESA, NULL, _gloffset_WindowPos2ivMESA),
-    NAME_FUNC_OFFSET(18519, glWindowPos2sMESA, glWindowPos2sMESA, NULL, _gloffset_WindowPos2sMESA),
-    NAME_FUNC_OFFSET(18533, glWindowPos2sMESA, glWindowPos2sMESA, NULL, _gloffset_WindowPos2sMESA),
-    NAME_FUNC_OFFSET(18550, glWindowPos2svMESA, glWindowPos2svMESA, NULL, _gloffset_WindowPos2svMESA),
-    NAME_FUNC_OFFSET(18565, glWindowPos2svMESA, glWindowPos2svMESA, NULL, _gloffset_WindowPos2svMESA),
-    NAME_FUNC_OFFSET(18583, glWindowPos3dMESA, glWindowPos3dMESA, NULL, _gloffset_WindowPos3dMESA),
-    NAME_FUNC_OFFSET(18597, glWindowPos3dMESA, glWindowPos3dMESA, NULL, _gloffset_WindowPos3dMESA),
-    NAME_FUNC_OFFSET(18614, glWindowPos3dvMESA, glWindowPos3dvMESA, NULL, _gloffset_WindowPos3dvMESA),
-    NAME_FUNC_OFFSET(18629, glWindowPos3dvMESA, glWindowPos3dvMESA, NULL, _gloffset_WindowPos3dvMESA),
-    NAME_FUNC_OFFSET(18647, glWindowPos3fMESA, glWindowPos3fMESA, NULL, _gloffset_WindowPos3fMESA),
-    NAME_FUNC_OFFSET(18661, glWindowPos3fMESA, glWindowPos3fMESA, NULL, _gloffset_WindowPos3fMESA),
-    NAME_FUNC_OFFSET(18678, glWindowPos3fvMESA, glWindowPos3fvMESA, NULL, _gloffset_WindowPos3fvMESA),
-    NAME_FUNC_OFFSET(18693, glWindowPos3fvMESA, glWindowPos3fvMESA, NULL, _gloffset_WindowPos3fvMESA),
-    NAME_FUNC_OFFSET(18711, glWindowPos3iMESA, glWindowPos3iMESA, NULL, _gloffset_WindowPos3iMESA),
-    NAME_FUNC_OFFSET(18725, glWindowPos3iMESA, glWindowPos3iMESA, NULL, _gloffset_WindowPos3iMESA),
-    NAME_FUNC_OFFSET(18742, glWindowPos3ivMESA, glWindowPos3ivMESA, NULL, _gloffset_WindowPos3ivMESA),
-    NAME_FUNC_OFFSET(18757, glWindowPos3ivMESA, glWindowPos3ivMESA, NULL, _gloffset_WindowPos3ivMESA),
-    NAME_FUNC_OFFSET(18775, glWindowPos3sMESA, glWindowPos3sMESA, NULL, _gloffset_WindowPos3sMESA),
-    NAME_FUNC_OFFSET(18789, glWindowPos3sMESA, glWindowPos3sMESA, NULL, _gloffset_WindowPos3sMESA),
-    NAME_FUNC_OFFSET(18806, glWindowPos3svMESA, glWindowPos3svMESA, NULL, _gloffset_WindowPos3svMESA),
-    NAME_FUNC_OFFSET(18821, glWindowPos3svMESA, glWindowPos3svMESA, NULL, _gloffset_WindowPos3svMESA),
-    NAME_FUNC_OFFSET(18839, glBindProgramNV, glBindProgramNV, NULL, _gloffset_BindProgramNV),
-    NAME_FUNC_OFFSET(18856, glDeleteProgramsNV, glDeleteProgramsNV, NULL, _gloffset_DeleteProgramsNV),
-    NAME_FUNC_OFFSET(18876, glGenProgramsNV, glGenProgramsNV, NULL, _gloffset_GenProgramsNV),
-    NAME_FUNC_OFFSET(18893, glGetVertexAttribPointervNV, glGetVertexAttribPointervNV, NULL, _gloffset_GetVertexAttribPointervNV),
-    NAME_FUNC_OFFSET(18919, glGetVertexAttribPointervNV, glGetVertexAttribPointervNV, NULL, _gloffset_GetVertexAttribPointervNV),
-    NAME_FUNC_OFFSET(18948, glIsProgramNV, glIsProgramNV, NULL, _gloffset_IsProgramNV),
-    NAME_FUNC_OFFSET(18963, glPointParameteriNV, glPointParameteriNV, NULL, _gloffset_PointParameteriNV),
-    NAME_FUNC_OFFSET(18981, glPointParameterivNV, glPointParameterivNV, NULL, _gloffset_PointParameterivNV),
-    NAME_FUNC_OFFSET(19000, gl_dispatch_stub_745, gl_dispatch_stub_745, NULL, _gloffset_DeleteVertexArraysAPPLE),
-    NAME_FUNC_OFFSET(19021, gl_dispatch_stub_747, gl_dispatch_stub_747, NULL, _gloffset_IsVertexArrayAPPLE),
-    NAME_FUNC_OFFSET(19037, gl_dispatch_stub_755, gl_dispatch_stub_755, NULL, _gloffset_BlendEquationSeparateEXT),
-    NAME_FUNC_OFFSET(19061, gl_dispatch_stub_755, gl_dispatch_stub_755, NULL, _gloffset_BlendEquationSeparateEXT),
-    NAME_FUNC_OFFSET(19088, glBindFramebufferEXT, glBindFramebufferEXT, NULL, _gloffset_BindFramebufferEXT),
-    NAME_FUNC_OFFSET(19106, glBindRenderbufferEXT, glBindRenderbufferEXT, NULL, _gloffset_BindRenderbufferEXT),
-    NAME_FUNC_OFFSET(19125, glCheckFramebufferStatusEXT, glCheckFramebufferStatusEXT, NULL, _gloffset_CheckFramebufferStatusEXT),
-    NAME_FUNC_OFFSET(19150, glDeleteFramebuffersEXT, glDeleteFramebuffersEXT, NULL, _gloffset_DeleteFramebuffersEXT),
-    NAME_FUNC_OFFSET(19171, glDeleteRenderbuffersEXT, glDeleteRenderbuffersEXT, NULL, _gloffset_DeleteRenderbuffersEXT),
-    NAME_FUNC_OFFSET(19193, glFramebufferRenderbufferEXT, glFramebufferRenderbufferEXT, NULL, _gloffset_FramebufferRenderbufferEXT),
-    NAME_FUNC_OFFSET(19219, glFramebufferTexture1DEXT, glFramebufferTexture1DEXT, NULL, _gloffset_FramebufferTexture1DEXT),
-    NAME_FUNC_OFFSET(19242, glFramebufferTexture2DEXT, glFramebufferTexture2DEXT, NULL, _gloffset_FramebufferTexture2DEXT),
-    NAME_FUNC_OFFSET(19265, glFramebufferTexture3DEXT, glFramebufferTexture3DEXT, NULL, _gloffset_FramebufferTexture3DEXT),
-    NAME_FUNC_OFFSET(19288, glGenFramebuffersEXT, glGenFramebuffersEXT, NULL, _gloffset_GenFramebuffersEXT),
-    NAME_FUNC_OFFSET(19306, glGenRenderbuffersEXT, glGenRenderbuffersEXT, NULL, _gloffset_GenRenderbuffersEXT),
-    NAME_FUNC_OFFSET(19325, glGenerateMipmapEXT, glGenerateMipmapEXT, NULL, _gloffset_GenerateMipmapEXT),
-    NAME_FUNC_OFFSET(19342, glGetFramebufferAttachmentParameterivEXT, glGetFramebufferAttachmentParameterivEXT, NULL, _gloffset_GetFramebufferAttachmentParameterivEXT),
-    NAME_FUNC_OFFSET(19380, glGetRenderbufferParameterivEXT, glGetRenderbufferParameterivEXT, NULL, _gloffset_GetRenderbufferParameterivEXT),
-    NAME_FUNC_OFFSET(19409, glIsFramebufferEXT, glIsFramebufferEXT, NULL, _gloffset_IsFramebufferEXT),
-    NAME_FUNC_OFFSET(19425, glIsRenderbufferEXT, glIsRenderbufferEXT, NULL, _gloffset_IsRenderbufferEXT),
-    NAME_FUNC_OFFSET(19442, glRenderbufferStorageEXT, glRenderbufferStorageEXT, NULL, _gloffset_RenderbufferStorageEXT),
-    NAME_FUNC_OFFSET(19464, gl_dispatch_stub_773, gl_dispatch_stub_773, NULL, _gloffset_BlitFramebufferEXT),
-    NAME_FUNC_OFFSET(19482, glFramebufferTextureLayerEXT, glFramebufferTextureLayerEXT, NULL, _gloffset_FramebufferTextureLayerEXT),
+    NAME_FUNC_OFFSET(13609, gl_dispatch_stub_774, gl_dispatch_stub_774, NULL, _gloffset_BufferParameteriAPPLE),
+    NAME_FUNC_OFFSET(13633, gl_dispatch_stub_775, gl_dispatch_stub_775, NULL, _gloffset_FlushMappedBufferRangeAPPLE),
+    NAME_FUNC_OFFSET(13663, glFramebufferTextureLayerEXT, glFramebufferTextureLayerEXT, NULL, _gloffset_FramebufferTextureLayerEXT),
+    NAME_FUNC_OFFSET(13692, glProvokingVertexEXT, glProvokingVertexEXT, NULL, _gloffset_ProvokingVertexEXT),
+    NAME_FUNC_OFFSET(13713, gl_dispatch_stub_778, gl_dispatch_stub_778, NULL, _gloffset_GetTexParameterPointervAPPLE),
+    NAME_FUNC_OFFSET(13744, gl_dispatch_stub_779, gl_dispatch_stub_779, NULL, _gloffset_TextureRangeAPPLE),
+    NAME_FUNC_OFFSET(13764, gl_dispatch_stub_780, gl_dispatch_stub_780, NULL, _gloffset_StencilFuncSeparateATI),
+    NAME_FUNC_OFFSET(13789, gl_dispatch_stub_781, gl_dispatch_stub_781, NULL, _gloffset_ProgramEnvParameters4fvEXT),
+    NAME_FUNC_OFFSET(13818, gl_dispatch_stub_782, gl_dispatch_stub_782, NULL, _gloffset_ProgramLocalParameters4fvEXT),
+    NAME_FUNC_OFFSET(13849, gl_dispatch_stub_783, gl_dispatch_stub_783, NULL, _gloffset_GetQueryObjecti64vEXT),
+    NAME_FUNC_OFFSET(13873, gl_dispatch_stub_784, gl_dispatch_stub_784, NULL, _gloffset_GetQueryObjectui64vEXT),
+    NAME_FUNC_OFFSET(13898, glArrayElement, glArrayElement, NULL, _gloffset_ArrayElement),
+    NAME_FUNC_OFFSET(13916, glBindTexture, glBindTexture, NULL, _gloffset_BindTexture),
+    NAME_FUNC_OFFSET(13933, glDrawArrays, glDrawArrays, NULL, _gloffset_DrawArrays),
+    NAME_FUNC_OFFSET(13949, glAreTexturesResident, glAreTexturesResidentEXT, glAreTexturesResidentEXT, _gloffset_AreTexturesResident),
+    NAME_FUNC_OFFSET(13974, glCopyTexImage1D, glCopyTexImage1D, NULL, _gloffset_CopyTexImage1D),
+    NAME_FUNC_OFFSET(13994, glCopyTexImage2D, glCopyTexImage2D, NULL, _gloffset_CopyTexImage2D),
+    NAME_FUNC_OFFSET(14014, glCopyTexSubImage1D, glCopyTexSubImage1D, NULL, _gloffset_CopyTexSubImage1D),
+    NAME_FUNC_OFFSET(14037, glCopyTexSubImage2D, glCopyTexSubImage2D, NULL, _gloffset_CopyTexSubImage2D),
+    NAME_FUNC_OFFSET(14060, glDeleteTextures, glDeleteTexturesEXT, glDeleteTexturesEXT, _gloffset_DeleteTextures),
+    NAME_FUNC_OFFSET(14080, glGenTextures, glGenTexturesEXT, glGenTexturesEXT, _gloffset_GenTextures),
+    NAME_FUNC_OFFSET(14097, glGetPointerv, glGetPointerv, NULL, _gloffset_GetPointerv),
+    NAME_FUNC_OFFSET(14114, glIsTexture, glIsTextureEXT, glIsTextureEXT, _gloffset_IsTexture),
+    NAME_FUNC_OFFSET(14129, glPrioritizeTextures, glPrioritizeTextures, NULL, _gloffset_PrioritizeTextures),
+    NAME_FUNC_OFFSET(14153, glTexSubImage1D, glTexSubImage1D, NULL, _gloffset_TexSubImage1D),
+    NAME_FUNC_OFFSET(14172, glTexSubImage2D, glTexSubImage2D, NULL, _gloffset_TexSubImage2D),
+    NAME_FUNC_OFFSET(14191, glBlendColor, glBlendColor, NULL, _gloffset_BlendColor),
+    NAME_FUNC_OFFSET(14207, glBlendEquation, glBlendEquation, NULL, _gloffset_BlendEquation),
+    NAME_FUNC_OFFSET(14226, glDrawRangeElements, glDrawRangeElements, NULL, _gloffset_DrawRangeElements),
+    NAME_FUNC_OFFSET(14249, glColorTable, glColorTable, NULL, _gloffset_ColorTable),
+    NAME_FUNC_OFFSET(14265, glColorTable, glColorTable, NULL, _gloffset_ColorTable),
+    NAME_FUNC_OFFSET(14281, glColorTableParameterfv, glColorTableParameterfv, NULL, _gloffset_ColorTableParameterfv),
+    NAME_FUNC_OFFSET(14308, glColorTableParameteriv, glColorTableParameteriv, NULL, _gloffset_ColorTableParameteriv),
+    NAME_FUNC_OFFSET(14335, glCopyColorTable, glCopyColorTable, NULL, _gloffset_CopyColorTable),
+    NAME_FUNC_OFFSET(14355, glGetColorTable, glGetColorTableEXT, glGetColorTableEXT, _gloffset_GetColorTable),
+    NAME_FUNC_OFFSET(14374, glGetColorTable, glGetColorTableEXT, glGetColorTableEXT, _gloffset_GetColorTable),
+    NAME_FUNC_OFFSET(14393, glGetColorTableParameterfv, glGetColorTableParameterfvEXT, glGetColorTableParameterfvEXT, _gloffset_GetColorTableParameterfv),
+    NAME_FUNC_OFFSET(14423, glGetColorTableParameterfv, glGetColorTableParameterfvEXT, glGetColorTableParameterfvEXT, _gloffset_GetColorTableParameterfv),
+    NAME_FUNC_OFFSET(14453, glGetColorTableParameteriv, glGetColorTableParameterivEXT, glGetColorTableParameterivEXT, _gloffset_GetColorTableParameteriv),
+    NAME_FUNC_OFFSET(14483, glGetColorTableParameteriv, glGetColorTableParameterivEXT, glGetColorTableParameterivEXT, _gloffset_GetColorTableParameteriv),
+    NAME_FUNC_OFFSET(14513, glColorSubTable, glColorSubTable, NULL, _gloffset_ColorSubTable),
+    NAME_FUNC_OFFSET(14532, glCopyColorSubTable, glCopyColorSubTable, NULL, _gloffset_CopyColorSubTable),
+    NAME_FUNC_OFFSET(14555, glConvolutionFilter1D, glConvolutionFilter1D, NULL, _gloffset_ConvolutionFilter1D),
+    NAME_FUNC_OFFSET(14580, glConvolutionFilter2D, glConvolutionFilter2D, NULL, _gloffset_ConvolutionFilter2D),
+    NAME_FUNC_OFFSET(14605, glConvolutionParameterf, glConvolutionParameterf, NULL, _gloffset_ConvolutionParameterf),
+    NAME_FUNC_OFFSET(14632, glConvolutionParameterfv, glConvolutionParameterfv, NULL, _gloffset_ConvolutionParameterfv),
+    NAME_FUNC_OFFSET(14660, glConvolutionParameteri, glConvolutionParameteri, NULL, _gloffset_ConvolutionParameteri),
+    NAME_FUNC_OFFSET(14687, glConvolutionParameteriv, glConvolutionParameteriv, NULL, _gloffset_ConvolutionParameteriv),
+    NAME_FUNC_OFFSET(14715, glCopyConvolutionFilter1D, glCopyConvolutionFilter1D, NULL, _gloffset_CopyConvolutionFilter1D),
+    NAME_FUNC_OFFSET(14744, glCopyConvolutionFilter2D, glCopyConvolutionFilter2D, NULL, _gloffset_CopyConvolutionFilter2D),
+    NAME_FUNC_OFFSET(14773, glGetConvolutionFilter, gl_dispatch_stub_356, gl_dispatch_stub_356, _gloffset_GetConvolutionFilter),
+    NAME_FUNC_OFFSET(14799, glGetConvolutionParameterfv, gl_dispatch_stub_357, gl_dispatch_stub_357, _gloffset_GetConvolutionParameterfv),
+    NAME_FUNC_OFFSET(14830, glGetConvolutionParameteriv, gl_dispatch_stub_358, gl_dispatch_stub_358, _gloffset_GetConvolutionParameteriv),
+    NAME_FUNC_OFFSET(14861, glGetSeparableFilter, gl_dispatch_stub_359, gl_dispatch_stub_359, _gloffset_GetSeparableFilter),
+    NAME_FUNC_OFFSET(14885, glSeparableFilter2D, glSeparableFilter2D, NULL, _gloffset_SeparableFilter2D),
+    NAME_FUNC_OFFSET(14908, glGetHistogram, gl_dispatch_stub_361, gl_dispatch_stub_361, _gloffset_GetHistogram),
+    NAME_FUNC_OFFSET(14926, glGetHistogramParameterfv, gl_dispatch_stub_362, gl_dispatch_stub_362, _gloffset_GetHistogramParameterfv),
+    NAME_FUNC_OFFSET(14955, glGetHistogramParameteriv, gl_dispatch_stub_363, gl_dispatch_stub_363, _gloffset_GetHistogramParameteriv),
+    NAME_FUNC_OFFSET(14984, glGetMinmax, gl_dispatch_stub_364, gl_dispatch_stub_364, _gloffset_GetMinmax),
+    NAME_FUNC_OFFSET(14999, glGetMinmaxParameterfv, gl_dispatch_stub_365, gl_dispatch_stub_365, _gloffset_GetMinmaxParameterfv),
+    NAME_FUNC_OFFSET(15025, glGetMinmaxParameteriv, gl_dispatch_stub_366, gl_dispatch_stub_366, _gloffset_GetMinmaxParameteriv),
+    NAME_FUNC_OFFSET(15051, glHistogram, glHistogram, NULL, _gloffset_Histogram),
+    NAME_FUNC_OFFSET(15066, glMinmax, glMinmax, NULL, _gloffset_Minmax),
+    NAME_FUNC_OFFSET(15078, glResetHistogram, glResetHistogram, NULL, _gloffset_ResetHistogram),
+    NAME_FUNC_OFFSET(15098, glResetMinmax, glResetMinmax, NULL, _gloffset_ResetMinmax),
+    NAME_FUNC_OFFSET(15115, glTexImage3D, glTexImage3D, NULL, _gloffset_TexImage3D),
+    NAME_FUNC_OFFSET(15131, glTexSubImage3D, glTexSubImage3D, NULL, _gloffset_TexSubImage3D),
+    NAME_FUNC_OFFSET(15150, glCopyTexSubImage3D, glCopyTexSubImage3D, NULL, _gloffset_CopyTexSubImage3D),
+    NAME_FUNC_OFFSET(15173, glActiveTextureARB, glActiveTextureARB, NULL, _gloffset_ActiveTextureARB),
+    NAME_FUNC_OFFSET(15189, glClientActiveTextureARB, glClientActiveTextureARB, NULL, _gloffset_ClientActiveTextureARB),
+    NAME_FUNC_OFFSET(15211, glMultiTexCoord1dARB, glMultiTexCoord1dARB, NULL, _gloffset_MultiTexCoord1dARB),
+    NAME_FUNC_OFFSET(15229, glMultiTexCoord1dvARB, glMultiTexCoord1dvARB, NULL, _gloffset_MultiTexCoord1dvARB),
+    NAME_FUNC_OFFSET(15248, glMultiTexCoord1fARB, glMultiTexCoord1fARB, NULL, _gloffset_MultiTexCoord1fARB),
+    NAME_FUNC_OFFSET(15266, glMultiTexCoord1fvARB, glMultiTexCoord1fvARB, NULL, _gloffset_MultiTexCoord1fvARB),
+    NAME_FUNC_OFFSET(15285, glMultiTexCoord1iARB, glMultiTexCoord1iARB, NULL, _gloffset_MultiTexCoord1iARB),
+    NAME_FUNC_OFFSET(15303, glMultiTexCoord1ivARB, glMultiTexCoord1ivARB, NULL, _gloffset_MultiTexCoord1ivARB),
+    NAME_FUNC_OFFSET(15322, glMultiTexCoord1sARB, glMultiTexCoord1sARB, NULL, _gloffset_MultiTexCoord1sARB),
+    NAME_FUNC_OFFSET(15340, glMultiTexCoord1svARB, glMultiTexCoord1svARB, NULL, _gloffset_MultiTexCoord1svARB),
+    NAME_FUNC_OFFSET(15359, glMultiTexCoord2dARB, glMultiTexCoord2dARB, NULL, _gloffset_MultiTexCoord2dARB),
+    NAME_FUNC_OFFSET(15377, glMultiTexCoord2dvARB, glMultiTexCoord2dvARB, NULL, _gloffset_MultiTexCoord2dvARB),
+    NAME_FUNC_OFFSET(15396, glMultiTexCoord2fARB, glMultiTexCoord2fARB, NULL, _gloffset_MultiTexCoord2fARB),
+    NAME_FUNC_OFFSET(15414, glMultiTexCoord2fvARB, glMultiTexCoord2fvARB, NULL, _gloffset_MultiTexCoord2fvARB),
+    NAME_FUNC_OFFSET(15433, glMultiTexCoord2iARB, glMultiTexCoord2iARB, NULL, _gloffset_MultiTexCoord2iARB),
+    NAME_FUNC_OFFSET(15451, glMultiTexCoord2ivARB, glMultiTexCoord2ivARB, NULL, _gloffset_MultiTexCoord2ivARB),
+    NAME_FUNC_OFFSET(15470, glMultiTexCoord2sARB, glMultiTexCoord2sARB, NULL, _gloffset_MultiTexCoord2sARB),
+    NAME_FUNC_OFFSET(15488, glMultiTexCoord2svARB, glMultiTexCoord2svARB, NULL, _gloffset_MultiTexCoord2svARB),
+    NAME_FUNC_OFFSET(15507, glMultiTexCoord3dARB, glMultiTexCoord3dARB, NULL, _gloffset_MultiTexCoord3dARB),
+    NAME_FUNC_OFFSET(15525, glMultiTexCoord3dvARB, glMultiTexCoord3dvARB, NULL, _gloffset_MultiTexCoord3dvARB),
+    NAME_FUNC_OFFSET(15544, glMultiTexCoord3fARB, glMultiTexCoord3fARB, NULL, _gloffset_MultiTexCoord3fARB),
+    NAME_FUNC_OFFSET(15562, glMultiTexCoord3fvARB, glMultiTexCoord3fvARB, NULL, _gloffset_MultiTexCoord3fvARB),
+    NAME_FUNC_OFFSET(15581, glMultiTexCoord3iARB, glMultiTexCoord3iARB, NULL, _gloffset_MultiTexCoord3iARB),
+    NAME_FUNC_OFFSET(15599, glMultiTexCoord3ivARB, glMultiTexCoord3ivARB, NULL, _gloffset_MultiTexCoord3ivARB),
+    NAME_FUNC_OFFSET(15618, glMultiTexCoord3sARB, glMultiTexCoord3sARB, NULL, _gloffset_MultiTexCoord3sARB),
+    NAME_FUNC_OFFSET(15636, glMultiTexCoord3svARB, glMultiTexCoord3svARB, NULL, _gloffset_MultiTexCoord3svARB),
+    NAME_FUNC_OFFSET(15655, glMultiTexCoord4dARB, glMultiTexCoord4dARB, NULL, _gloffset_MultiTexCoord4dARB),
+    NAME_FUNC_OFFSET(15673, glMultiTexCoord4dvARB, glMultiTexCoord4dvARB, NULL, _gloffset_MultiTexCoord4dvARB),
+    NAME_FUNC_OFFSET(15692, glMultiTexCoord4fARB, glMultiTexCoord4fARB, NULL, _gloffset_MultiTexCoord4fARB),
+    NAME_FUNC_OFFSET(15710, glMultiTexCoord4fvARB, glMultiTexCoord4fvARB, NULL, _gloffset_MultiTexCoord4fvARB),
+    NAME_FUNC_OFFSET(15729, glMultiTexCoord4iARB, glMultiTexCoord4iARB, NULL, _gloffset_MultiTexCoord4iARB),
+    NAME_FUNC_OFFSET(15747, glMultiTexCoord4ivARB, glMultiTexCoord4ivARB, NULL, _gloffset_MultiTexCoord4ivARB),
+    NAME_FUNC_OFFSET(15766, glMultiTexCoord4sARB, glMultiTexCoord4sARB, NULL, _gloffset_MultiTexCoord4sARB),
+    NAME_FUNC_OFFSET(15784, glMultiTexCoord4svARB, glMultiTexCoord4svARB, NULL, _gloffset_MultiTexCoord4svARB),
+    NAME_FUNC_OFFSET(15803, glStencilOpSeparate, glStencilOpSeparate, NULL, _gloffset_StencilOpSeparate),
+    NAME_FUNC_OFFSET(15826, glLoadTransposeMatrixdARB, glLoadTransposeMatrixdARB, NULL, _gloffset_LoadTransposeMatrixdARB),
+    NAME_FUNC_OFFSET(15849, glLoadTransposeMatrixfARB, glLoadTransposeMatrixfARB, NULL, _gloffset_LoadTransposeMatrixfARB),
+    NAME_FUNC_OFFSET(15872, glMultTransposeMatrixdARB, glMultTransposeMatrixdARB, NULL, _gloffset_MultTransposeMatrixdARB),
+    NAME_FUNC_OFFSET(15895, glMultTransposeMatrixfARB, glMultTransposeMatrixfARB, NULL, _gloffset_MultTransposeMatrixfARB),
+    NAME_FUNC_OFFSET(15918, glSampleCoverageARB, glSampleCoverageARB, NULL, _gloffset_SampleCoverageARB),
+    NAME_FUNC_OFFSET(15935, glCompressedTexImage1DARB, glCompressedTexImage1DARB, NULL, _gloffset_CompressedTexImage1DARB),
+    NAME_FUNC_OFFSET(15958, glCompressedTexImage2DARB, glCompressedTexImage2DARB, NULL, _gloffset_CompressedTexImage2DARB),
+    NAME_FUNC_OFFSET(15981, glCompressedTexImage3DARB, glCompressedTexImage3DARB, NULL, _gloffset_CompressedTexImage3DARB),
+    NAME_FUNC_OFFSET(16004, glCompressedTexSubImage1DARB, glCompressedTexSubImage1DARB, NULL, _gloffset_CompressedTexSubImage1DARB),
+    NAME_FUNC_OFFSET(16030, glCompressedTexSubImage2DARB, glCompressedTexSubImage2DARB, NULL, _gloffset_CompressedTexSubImage2DARB),
+    NAME_FUNC_OFFSET(16056, glCompressedTexSubImage3DARB, glCompressedTexSubImage3DARB, NULL, _gloffset_CompressedTexSubImage3DARB),
+    NAME_FUNC_OFFSET(16082, glGetCompressedTexImageARB, glGetCompressedTexImageARB, NULL, _gloffset_GetCompressedTexImageARB),
+    NAME_FUNC_OFFSET(16106, glDisableVertexAttribArrayARB, glDisableVertexAttribArrayARB, NULL, _gloffset_DisableVertexAttribArrayARB),
+    NAME_FUNC_OFFSET(16133, glEnableVertexAttribArrayARB, glEnableVertexAttribArrayARB, NULL, _gloffset_EnableVertexAttribArrayARB),
+    NAME_FUNC_OFFSET(16159, glGetVertexAttribdvARB, glGetVertexAttribdvARB, NULL, _gloffset_GetVertexAttribdvARB),
+    NAME_FUNC_OFFSET(16179, glGetVertexAttribfvARB, glGetVertexAttribfvARB, NULL, _gloffset_GetVertexAttribfvARB),
+    NAME_FUNC_OFFSET(16199, glGetVertexAttribivARB, glGetVertexAttribivARB, NULL, _gloffset_GetVertexAttribivARB),
+    NAME_FUNC_OFFSET(16219, glProgramEnvParameter4dARB, glProgramEnvParameter4dARB, NULL, _gloffset_ProgramEnvParameter4dARB),
+    NAME_FUNC_OFFSET(16242, glProgramEnvParameter4dvARB, glProgramEnvParameter4dvARB, NULL, _gloffset_ProgramEnvParameter4dvARB),
+    NAME_FUNC_OFFSET(16266, glProgramEnvParameter4fARB, glProgramEnvParameter4fARB, NULL, _gloffset_ProgramEnvParameter4fARB),
+    NAME_FUNC_OFFSET(16289, glProgramEnvParameter4fvARB, glProgramEnvParameter4fvARB, NULL, _gloffset_ProgramEnvParameter4fvARB),
+    NAME_FUNC_OFFSET(16313, glVertexAttrib1dARB, glVertexAttrib1dARB, NULL, _gloffset_VertexAttrib1dARB),
+    NAME_FUNC_OFFSET(16330, glVertexAttrib1dvARB, glVertexAttrib1dvARB, NULL, _gloffset_VertexAttrib1dvARB),
+    NAME_FUNC_OFFSET(16348, glVertexAttrib1fARB, glVertexAttrib1fARB, NULL, _gloffset_VertexAttrib1fARB),
+    NAME_FUNC_OFFSET(16365, glVertexAttrib1fvARB, glVertexAttrib1fvARB, NULL, _gloffset_VertexAttrib1fvARB),
+    NAME_FUNC_OFFSET(16383, glVertexAttrib1sARB, glVertexAttrib1sARB, NULL, _gloffset_VertexAttrib1sARB),
+    NAME_FUNC_OFFSET(16400, glVertexAttrib1svARB, glVertexAttrib1svARB, NULL, _gloffset_VertexAttrib1svARB),
+    NAME_FUNC_OFFSET(16418, glVertexAttrib2dARB, glVertexAttrib2dARB, NULL, _gloffset_VertexAttrib2dARB),
+    NAME_FUNC_OFFSET(16435, glVertexAttrib2dvARB, glVertexAttrib2dvARB, NULL, _gloffset_VertexAttrib2dvARB),
+    NAME_FUNC_OFFSET(16453, glVertexAttrib2fARB, glVertexAttrib2fARB, NULL, _gloffset_VertexAttrib2fARB),
+    NAME_FUNC_OFFSET(16470, glVertexAttrib2fvARB, glVertexAttrib2fvARB, NULL, _gloffset_VertexAttrib2fvARB),
+    NAME_FUNC_OFFSET(16488, glVertexAttrib2sARB, glVertexAttrib2sARB, NULL, _gloffset_VertexAttrib2sARB),
+    NAME_FUNC_OFFSET(16505, glVertexAttrib2svARB, glVertexAttrib2svARB, NULL, _gloffset_VertexAttrib2svARB),
+    NAME_FUNC_OFFSET(16523, glVertexAttrib3dARB, glVertexAttrib3dARB, NULL, _gloffset_VertexAttrib3dARB),
+    NAME_FUNC_OFFSET(16540, glVertexAttrib3dvARB, glVertexAttrib3dvARB, NULL, _gloffset_VertexAttrib3dvARB),
+    NAME_FUNC_OFFSET(16558, glVertexAttrib3fARB, glVertexAttrib3fARB, NULL, _gloffset_VertexAttrib3fARB),
+    NAME_FUNC_OFFSET(16575, glVertexAttrib3fvARB, glVertexAttrib3fvARB, NULL, _gloffset_VertexAttrib3fvARB),
+    NAME_FUNC_OFFSET(16593, glVertexAttrib3sARB, glVertexAttrib3sARB, NULL, _gloffset_VertexAttrib3sARB),
+    NAME_FUNC_OFFSET(16610, glVertexAttrib3svARB, glVertexAttrib3svARB, NULL, _gloffset_VertexAttrib3svARB),
+    NAME_FUNC_OFFSET(16628, glVertexAttrib4NbvARB, glVertexAttrib4NbvARB, NULL, _gloffset_VertexAttrib4NbvARB),
+    NAME_FUNC_OFFSET(16647, glVertexAttrib4NivARB, glVertexAttrib4NivARB, NULL, _gloffset_VertexAttrib4NivARB),
+    NAME_FUNC_OFFSET(16666, glVertexAttrib4NsvARB, glVertexAttrib4NsvARB, NULL, _gloffset_VertexAttrib4NsvARB),
+    NAME_FUNC_OFFSET(16685, glVertexAttrib4NubARB, glVertexAttrib4NubARB, NULL, _gloffset_VertexAttrib4NubARB),
+    NAME_FUNC_OFFSET(16704, glVertexAttrib4NubvARB, glVertexAttrib4NubvARB, NULL, _gloffset_VertexAttrib4NubvARB),
+    NAME_FUNC_OFFSET(16724, glVertexAttrib4NuivARB, glVertexAttrib4NuivARB, NULL, _gloffset_VertexAttrib4NuivARB),
+    NAME_FUNC_OFFSET(16744, glVertexAttrib4NusvARB, glVertexAttrib4NusvARB, NULL, _gloffset_VertexAttrib4NusvARB),
+    NAME_FUNC_OFFSET(16764, glVertexAttrib4bvARB, glVertexAttrib4bvARB, NULL, _gloffset_VertexAttrib4bvARB),
+    NAME_FUNC_OFFSET(16782, glVertexAttrib4dARB, glVertexAttrib4dARB, NULL, _gloffset_VertexAttrib4dARB),
+    NAME_FUNC_OFFSET(16799, glVertexAttrib4dvARB, glVertexAttrib4dvARB, NULL, _gloffset_VertexAttrib4dvARB),
+    NAME_FUNC_OFFSET(16817, glVertexAttrib4fARB, glVertexAttrib4fARB, NULL, _gloffset_VertexAttrib4fARB),
+    NAME_FUNC_OFFSET(16834, glVertexAttrib4fvARB, glVertexAttrib4fvARB, NULL, _gloffset_VertexAttrib4fvARB),
+    NAME_FUNC_OFFSET(16852, glVertexAttrib4ivARB, glVertexAttrib4ivARB, NULL, _gloffset_VertexAttrib4ivARB),
+    NAME_FUNC_OFFSET(16870, glVertexAttrib4sARB, glVertexAttrib4sARB, NULL, _gloffset_VertexAttrib4sARB),
+    NAME_FUNC_OFFSET(16887, glVertexAttrib4svARB, glVertexAttrib4svARB, NULL, _gloffset_VertexAttrib4svARB),
+    NAME_FUNC_OFFSET(16905, glVertexAttrib4ubvARB, glVertexAttrib4ubvARB, NULL, _gloffset_VertexAttrib4ubvARB),
+    NAME_FUNC_OFFSET(16924, glVertexAttrib4uivARB, glVertexAttrib4uivARB, NULL, _gloffset_VertexAttrib4uivARB),
+    NAME_FUNC_OFFSET(16943, glVertexAttrib4usvARB, glVertexAttrib4usvARB, NULL, _gloffset_VertexAttrib4usvARB),
+    NAME_FUNC_OFFSET(16962, glVertexAttribPointerARB, glVertexAttribPointerARB, NULL, _gloffset_VertexAttribPointerARB),
+    NAME_FUNC_OFFSET(16984, glBindBufferARB, glBindBufferARB, NULL, _gloffset_BindBufferARB),
+    NAME_FUNC_OFFSET(16997, glBufferDataARB, glBufferDataARB, NULL, _gloffset_BufferDataARB),
+    NAME_FUNC_OFFSET(17010, glBufferSubDataARB, glBufferSubDataARB, NULL, _gloffset_BufferSubDataARB),
+    NAME_FUNC_OFFSET(17026, glDeleteBuffersARB, glDeleteBuffersARB, NULL, _gloffset_DeleteBuffersARB),
+    NAME_FUNC_OFFSET(17042, glGenBuffersARB, glGenBuffersARB, NULL, _gloffset_GenBuffersARB),
+    NAME_FUNC_OFFSET(17055, glGetBufferParameterivARB, glGetBufferParameterivARB, NULL, _gloffset_GetBufferParameterivARB),
+    NAME_FUNC_OFFSET(17078, glGetBufferPointervARB, glGetBufferPointervARB, NULL, _gloffset_GetBufferPointervARB),
+    NAME_FUNC_OFFSET(17098, glGetBufferSubDataARB, glGetBufferSubDataARB, NULL, _gloffset_GetBufferSubDataARB),
+    NAME_FUNC_OFFSET(17117, glIsBufferARB, glIsBufferARB, NULL, _gloffset_IsBufferARB),
+    NAME_FUNC_OFFSET(17128, glMapBufferARB, glMapBufferARB, NULL, _gloffset_MapBufferARB),
+    NAME_FUNC_OFFSET(17140, glUnmapBufferARB, glUnmapBufferARB, NULL, _gloffset_UnmapBufferARB),
+    NAME_FUNC_OFFSET(17154, glBeginQueryARB, glBeginQueryARB, NULL, _gloffset_BeginQueryARB),
+    NAME_FUNC_OFFSET(17167, glDeleteQueriesARB, glDeleteQueriesARB, NULL, _gloffset_DeleteQueriesARB),
+    NAME_FUNC_OFFSET(17183, glEndQueryARB, glEndQueryARB, NULL, _gloffset_EndQueryARB),
+    NAME_FUNC_OFFSET(17194, glGenQueriesARB, glGenQueriesARB, NULL, _gloffset_GenQueriesARB),
+    NAME_FUNC_OFFSET(17207, glGetQueryObjectivARB, glGetQueryObjectivARB, NULL, _gloffset_GetQueryObjectivARB),
+    NAME_FUNC_OFFSET(17226, glGetQueryObjectuivARB, glGetQueryObjectuivARB, NULL, _gloffset_GetQueryObjectuivARB),
+    NAME_FUNC_OFFSET(17246, glGetQueryivARB, glGetQueryivARB, NULL, _gloffset_GetQueryivARB),
+    NAME_FUNC_OFFSET(17259, glIsQueryARB, glIsQueryARB, NULL, _gloffset_IsQueryARB),
+    NAME_FUNC_OFFSET(17269, glCompileShaderARB, glCompileShaderARB, NULL, _gloffset_CompileShaderARB),
+    NAME_FUNC_OFFSET(17285, glGetActiveUniformARB, glGetActiveUniformARB, NULL, _gloffset_GetActiveUniformARB),
+    NAME_FUNC_OFFSET(17304, glGetShaderSourceARB, glGetShaderSourceARB, NULL, _gloffset_GetShaderSourceARB),
+    NAME_FUNC_OFFSET(17322, glGetUniformLocationARB, glGetUniformLocationARB, NULL, _gloffset_GetUniformLocationARB),
+    NAME_FUNC_OFFSET(17343, glGetUniformfvARB, glGetUniformfvARB, NULL, _gloffset_GetUniformfvARB),
+    NAME_FUNC_OFFSET(17358, glGetUniformivARB, glGetUniformivARB, NULL, _gloffset_GetUniformivARB),
+    NAME_FUNC_OFFSET(17373, glLinkProgramARB, glLinkProgramARB, NULL, _gloffset_LinkProgramARB),
+    NAME_FUNC_OFFSET(17387, glShaderSourceARB, glShaderSourceARB, NULL, _gloffset_ShaderSourceARB),
+    NAME_FUNC_OFFSET(17402, glUniform1fARB, glUniform1fARB, NULL, _gloffset_Uniform1fARB),
+    NAME_FUNC_OFFSET(17414, glUniform1fvARB, glUniform1fvARB, NULL, _gloffset_Uniform1fvARB),
+    NAME_FUNC_OFFSET(17427, glUniform1iARB, glUniform1iARB, NULL, _gloffset_Uniform1iARB),
+    NAME_FUNC_OFFSET(17439, glUniform1ivARB, glUniform1ivARB, NULL, _gloffset_Uniform1ivARB),
+    NAME_FUNC_OFFSET(17452, glUniform2fARB, glUniform2fARB, NULL, _gloffset_Uniform2fARB),
+    NAME_FUNC_OFFSET(17464, glUniform2fvARB, glUniform2fvARB, NULL, _gloffset_Uniform2fvARB),
+    NAME_FUNC_OFFSET(17477, glUniform2iARB, glUniform2iARB, NULL, _gloffset_Uniform2iARB),
+    NAME_FUNC_OFFSET(17489, glUniform2ivARB, glUniform2ivARB, NULL, _gloffset_Uniform2ivARB),
+    NAME_FUNC_OFFSET(17502, glUniform3fARB, glUniform3fARB, NULL, _gloffset_Uniform3fARB),
+    NAME_FUNC_OFFSET(17514, glUniform3fvARB, glUniform3fvARB, NULL, _gloffset_Uniform3fvARB),
+    NAME_FUNC_OFFSET(17527, glUniform3iARB, glUniform3iARB, NULL, _gloffset_Uniform3iARB),
+    NAME_FUNC_OFFSET(17539, glUniform3ivARB, glUniform3ivARB, NULL, _gloffset_Uniform3ivARB),
+    NAME_FUNC_OFFSET(17552, glUniform4fARB, glUniform4fARB, NULL, _gloffset_Uniform4fARB),
+    NAME_FUNC_OFFSET(17564, glUniform4fvARB, glUniform4fvARB, NULL, _gloffset_Uniform4fvARB),
+    NAME_FUNC_OFFSET(17577, glUniform4iARB, glUniform4iARB, NULL, _gloffset_Uniform4iARB),
+    NAME_FUNC_OFFSET(17589, glUniform4ivARB, glUniform4ivARB, NULL, _gloffset_Uniform4ivARB),
+    NAME_FUNC_OFFSET(17602, glUniformMatrix2fvARB, glUniformMatrix2fvARB, NULL, _gloffset_UniformMatrix2fvARB),
+    NAME_FUNC_OFFSET(17621, glUniformMatrix3fvARB, glUniformMatrix3fvARB, NULL, _gloffset_UniformMatrix3fvARB),
+    NAME_FUNC_OFFSET(17640, glUniformMatrix4fvARB, glUniformMatrix4fvARB, NULL, _gloffset_UniformMatrix4fvARB),
+    NAME_FUNC_OFFSET(17659, glUseProgramObjectARB, glUseProgramObjectARB, NULL, _gloffset_UseProgramObjectARB),
+    NAME_FUNC_OFFSET(17672, glValidateProgramARB, glValidateProgramARB, NULL, _gloffset_ValidateProgramARB),
+    NAME_FUNC_OFFSET(17690, glBindAttribLocationARB, glBindAttribLocationARB, NULL, _gloffset_BindAttribLocationARB),
+    NAME_FUNC_OFFSET(17711, glGetActiveAttribARB, glGetActiveAttribARB, NULL, _gloffset_GetActiveAttribARB),
+    NAME_FUNC_OFFSET(17729, glGetAttribLocationARB, glGetAttribLocationARB, NULL, _gloffset_GetAttribLocationARB),
+    NAME_FUNC_OFFSET(17749, glDrawBuffersARB, glDrawBuffersARB, NULL, _gloffset_DrawBuffersARB),
+    NAME_FUNC_OFFSET(17763, glDrawBuffersARB, glDrawBuffersARB, NULL, _gloffset_DrawBuffersARB),
+    NAME_FUNC_OFFSET(17780, gl_dispatch_stub_574, gl_dispatch_stub_574, NULL, _gloffset_SampleMaskSGIS),
+    NAME_FUNC_OFFSET(17796, gl_dispatch_stub_575, gl_dispatch_stub_575, NULL, _gloffset_SamplePatternSGIS),
+    NAME_FUNC_OFFSET(17815, glPointParameterfEXT, glPointParameterfEXT, NULL, _gloffset_PointParameterfEXT),
+    NAME_FUNC_OFFSET(17833, glPointParameterfEXT, glPointParameterfEXT, NULL, _gloffset_PointParameterfEXT),
+    NAME_FUNC_OFFSET(17854, glPointParameterfEXT, glPointParameterfEXT, NULL, _gloffset_PointParameterfEXT),
+    NAME_FUNC_OFFSET(17876, glPointParameterfvEXT, glPointParameterfvEXT, NULL, _gloffset_PointParameterfvEXT),
+    NAME_FUNC_OFFSET(17895, glPointParameterfvEXT, glPointParameterfvEXT, NULL, _gloffset_PointParameterfvEXT),
+    NAME_FUNC_OFFSET(17917, glPointParameterfvEXT, glPointParameterfvEXT, NULL, _gloffset_PointParameterfvEXT),
+    NAME_FUNC_OFFSET(17940, glSecondaryColor3bEXT, glSecondaryColor3bEXT, NULL, _gloffset_SecondaryColor3bEXT),
+    NAME_FUNC_OFFSET(17959, glSecondaryColor3bvEXT, glSecondaryColor3bvEXT, NULL, _gloffset_SecondaryColor3bvEXT),
+    NAME_FUNC_OFFSET(17979, glSecondaryColor3dEXT, glSecondaryColor3dEXT, NULL, _gloffset_SecondaryColor3dEXT),
+    NAME_FUNC_OFFSET(17998, glSecondaryColor3dvEXT, glSecondaryColor3dvEXT, NULL, _gloffset_SecondaryColor3dvEXT),
+    NAME_FUNC_OFFSET(18018, glSecondaryColor3fEXT, glSecondaryColor3fEXT, NULL, _gloffset_SecondaryColor3fEXT),
+    NAME_FUNC_OFFSET(18037, glSecondaryColor3fvEXT, glSecondaryColor3fvEXT, NULL, _gloffset_SecondaryColor3fvEXT),
+    NAME_FUNC_OFFSET(18057, glSecondaryColor3iEXT, glSecondaryColor3iEXT, NULL, _gloffset_SecondaryColor3iEXT),
+    NAME_FUNC_OFFSET(18076, glSecondaryColor3ivEXT, glSecondaryColor3ivEXT, NULL, _gloffset_SecondaryColor3ivEXT),
+    NAME_FUNC_OFFSET(18096, glSecondaryColor3sEXT, glSecondaryColor3sEXT, NULL, _gloffset_SecondaryColor3sEXT),
+    NAME_FUNC_OFFSET(18115, glSecondaryColor3svEXT, glSecondaryColor3svEXT, NULL, _gloffset_SecondaryColor3svEXT),
+    NAME_FUNC_OFFSET(18135, glSecondaryColor3ubEXT, glSecondaryColor3ubEXT, NULL, _gloffset_SecondaryColor3ubEXT),
+    NAME_FUNC_OFFSET(18155, glSecondaryColor3ubvEXT, glSecondaryColor3ubvEXT, NULL, _gloffset_SecondaryColor3ubvEXT),
+    NAME_FUNC_OFFSET(18176, glSecondaryColor3uiEXT, glSecondaryColor3uiEXT, NULL, _gloffset_SecondaryColor3uiEXT),
+    NAME_FUNC_OFFSET(18196, glSecondaryColor3uivEXT, glSecondaryColor3uivEXT, NULL, _gloffset_SecondaryColor3uivEXT),
+    NAME_FUNC_OFFSET(18217, glSecondaryColor3usEXT, glSecondaryColor3usEXT, NULL, _gloffset_SecondaryColor3usEXT),
+    NAME_FUNC_OFFSET(18237, glSecondaryColor3usvEXT, glSecondaryColor3usvEXT, NULL, _gloffset_SecondaryColor3usvEXT),
+    NAME_FUNC_OFFSET(18258, glSecondaryColorPointerEXT, glSecondaryColorPointerEXT, NULL, _gloffset_SecondaryColorPointerEXT),
+    NAME_FUNC_OFFSET(18282, glMultiDrawArraysEXT, glMultiDrawArraysEXT, NULL, _gloffset_MultiDrawArraysEXT),
+    NAME_FUNC_OFFSET(18300, glMultiDrawElementsEXT, glMultiDrawElementsEXT, NULL, _gloffset_MultiDrawElementsEXT),
+    NAME_FUNC_OFFSET(18320, glFogCoordPointerEXT, glFogCoordPointerEXT, NULL, _gloffset_FogCoordPointerEXT),
+    NAME_FUNC_OFFSET(18338, glFogCoorddEXT, glFogCoorddEXT, NULL, _gloffset_FogCoorddEXT),
+    NAME_FUNC_OFFSET(18350, glFogCoorddvEXT, glFogCoorddvEXT, NULL, _gloffset_FogCoorddvEXT),
+    NAME_FUNC_OFFSET(18363, glFogCoordfEXT, glFogCoordfEXT, NULL, _gloffset_FogCoordfEXT),
+    NAME_FUNC_OFFSET(18375, glFogCoordfvEXT, glFogCoordfvEXT, NULL, _gloffset_FogCoordfvEXT),
+    NAME_FUNC_OFFSET(18388, glBlendFuncSeparateEXT, glBlendFuncSeparateEXT, NULL, _gloffset_BlendFuncSeparateEXT),
+    NAME_FUNC_OFFSET(18408, glBlendFuncSeparateEXT, glBlendFuncSeparateEXT, NULL, _gloffset_BlendFuncSeparateEXT),
+    NAME_FUNC_OFFSET(18432, glWindowPos2dMESA, glWindowPos2dMESA, NULL, _gloffset_WindowPos2dMESA),
+    NAME_FUNC_OFFSET(18446, glWindowPos2dMESA, glWindowPos2dMESA, NULL, _gloffset_WindowPos2dMESA),
+    NAME_FUNC_OFFSET(18463, glWindowPos2dvMESA, glWindowPos2dvMESA, NULL, _gloffset_WindowPos2dvMESA),
+    NAME_FUNC_OFFSET(18478, glWindowPos2dvMESA, glWindowPos2dvMESA, NULL, _gloffset_WindowPos2dvMESA),
+    NAME_FUNC_OFFSET(18496, glWindowPos2fMESA, glWindowPos2fMESA, NULL, _gloffset_WindowPos2fMESA),
+    NAME_FUNC_OFFSET(18510, glWindowPos2fMESA, glWindowPos2fMESA, NULL, _gloffset_WindowPos2fMESA),
+    NAME_FUNC_OFFSET(18527, glWindowPos2fvMESA, glWindowPos2fvMESA, NULL, _gloffset_WindowPos2fvMESA),
+    NAME_FUNC_OFFSET(18542, glWindowPos2fvMESA, glWindowPos2fvMESA, NULL, _gloffset_WindowPos2fvMESA),
+    NAME_FUNC_OFFSET(18560, glWindowPos2iMESA, glWindowPos2iMESA, NULL, _gloffset_WindowPos2iMESA),
+    NAME_FUNC_OFFSET(18574, glWindowPos2iMESA, glWindowPos2iMESA, NULL, _gloffset_WindowPos2iMESA),
+    NAME_FUNC_OFFSET(18591, glWindowPos2ivMESA, glWindowPos2ivMESA, NULL, _gloffset_WindowPos2ivMESA),
+    NAME_FUNC_OFFSET(18606, glWindowPos2ivMESA, glWindowPos2ivMESA, NULL, _gloffset_WindowPos2ivMESA),
+    NAME_FUNC_OFFSET(18624, glWindowPos2sMESA, glWindowPos2sMESA, NULL, _gloffset_WindowPos2sMESA),
+    NAME_FUNC_OFFSET(18638, glWindowPos2sMESA, glWindowPos2sMESA, NULL, _gloffset_WindowPos2sMESA),
+    NAME_FUNC_OFFSET(18655, glWindowPos2svMESA, glWindowPos2svMESA, NULL, _gloffset_WindowPos2svMESA),
+    NAME_FUNC_OFFSET(18670, glWindowPos2svMESA, glWindowPos2svMESA, NULL, _gloffset_WindowPos2svMESA),
+    NAME_FUNC_OFFSET(18688, glWindowPos3dMESA, glWindowPos3dMESA, NULL, _gloffset_WindowPos3dMESA),
+    NAME_FUNC_OFFSET(18702, glWindowPos3dMESA, glWindowPos3dMESA, NULL, _gloffset_WindowPos3dMESA),
+    NAME_FUNC_OFFSET(18719, glWindowPos3dvMESA, glWindowPos3dvMESA, NULL, _gloffset_WindowPos3dvMESA),
+    NAME_FUNC_OFFSET(18734, glWindowPos3dvMESA, glWindowPos3dvMESA, NULL, _gloffset_WindowPos3dvMESA),
+    NAME_FUNC_OFFSET(18752, glWindowPos3fMESA, glWindowPos3fMESA, NULL, _gloffset_WindowPos3fMESA),
+    NAME_FUNC_OFFSET(18766, glWindowPos3fMESA, glWindowPos3fMESA, NULL, _gloffset_WindowPos3fMESA),
+    NAME_FUNC_OFFSET(18783, glWindowPos3fvMESA, glWindowPos3fvMESA, NULL, _gloffset_WindowPos3fvMESA),
+    NAME_FUNC_OFFSET(18798, glWindowPos3fvMESA, glWindowPos3fvMESA, NULL, _gloffset_WindowPos3fvMESA),
+    NAME_FUNC_OFFSET(18816, glWindowPos3iMESA, glWindowPos3iMESA, NULL, _gloffset_WindowPos3iMESA),
+    NAME_FUNC_OFFSET(18830, glWindowPos3iMESA, glWindowPos3iMESA, NULL, _gloffset_WindowPos3iMESA),
+    NAME_FUNC_OFFSET(18847, glWindowPos3ivMESA, glWindowPos3ivMESA, NULL, _gloffset_WindowPos3ivMESA),
+    NAME_FUNC_OFFSET(18862, glWindowPos3ivMESA, glWindowPos3ivMESA, NULL, _gloffset_WindowPos3ivMESA),
+    NAME_FUNC_OFFSET(18880, glWindowPos3sMESA, glWindowPos3sMESA, NULL, _gloffset_WindowPos3sMESA),
+    NAME_FUNC_OFFSET(18894, glWindowPos3sMESA, glWindowPos3sMESA, NULL, _gloffset_WindowPos3sMESA),
+    NAME_FUNC_OFFSET(18911, glWindowPos3svMESA, glWindowPos3svMESA, NULL, _gloffset_WindowPos3svMESA),
+    NAME_FUNC_OFFSET(18926, glWindowPos3svMESA, glWindowPos3svMESA, NULL, _gloffset_WindowPos3svMESA),
+    NAME_FUNC_OFFSET(18944, glBindProgramNV, glBindProgramNV, NULL, _gloffset_BindProgramNV),
+    NAME_FUNC_OFFSET(18961, glDeleteProgramsNV, glDeleteProgramsNV, NULL, _gloffset_DeleteProgramsNV),
+    NAME_FUNC_OFFSET(18981, glGenProgramsNV, glGenProgramsNV, NULL, _gloffset_GenProgramsNV),
+    NAME_FUNC_OFFSET(18998, glGetVertexAttribPointervNV, glGetVertexAttribPointervNV, NULL, _gloffset_GetVertexAttribPointervNV),
+    NAME_FUNC_OFFSET(19024, glGetVertexAttribPointervNV, glGetVertexAttribPointervNV, NULL, _gloffset_GetVertexAttribPointervNV),
+    NAME_FUNC_OFFSET(19053, glIsProgramNV, glIsProgramNV, NULL, _gloffset_IsProgramNV),
+    NAME_FUNC_OFFSET(19068, glPointParameteriNV, glPointParameteriNV, NULL, _gloffset_PointParameteriNV),
+    NAME_FUNC_OFFSET(19086, glPointParameterivNV, glPointParameterivNV, NULL, _gloffset_PointParameterivNV),
+    NAME_FUNC_OFFSET(19105, gl_dispatch_stub_745, gl_dispatch_stub_745, NULL, _gloffset_DeleteVertexArraysAPPLE),
+    NAME_FUNC_OFFSET(19126, gl_dispatch_stub_747, gl_dispatch_stub_747, NULL, _gloffset_IsVertexArrayAPPLE),
+    NAME_FUNC_OFFSET(19142, gl_dispatch_stub_755, gl_dispatch_stub_755, NULL, _gloffset_BlendEquationSeparateEXT),
+    NAME_FUNC_OFFSET(19166, gl_dispatch_stub_755, gl_dispatch_stub_755, NULL, _gloffset_BlendEquationSeparateEXT),
+    NAME_FUNC_OFFSET(19193, glBindFramebufferEXT, glBindFramebufferEXT, NULL, _gloffset_BindFramebufferEXT),
+    NAME_FUNC_OFFSET(19211, glBindRenderbufferEXT, glBindRenderbufferEXT, NULL, _gloffset_BindRenderbufferEXT),
+    NAME_FUNC_OFFSET(19230, glCheckFramebufferStatusEXT, glCheckFramebufferStatusEXT, NULL, _gloffset_CheckFramebufferStatusEXT),
+    NAME_FUNC_OFFSET(19255, glDeleteFramebuffersEXT, glDeleteFramebuffersEXT, NULL, _gloffset_DeleteFramebuffersEXT),
+    NAME_FUNC_OFFSET(19276, glDeleteRenderbuffersEXT, glDeleteRenderbuffersEXT, NULL, _gloffset_DeleteRenderbuffersEXT),
+    NAME_FUNC_OFFSET(19298, glFramebufferRenderbufferEXT, glFramebufferRenderbufferEXT, NULL, _gloffset_FramebufferRenderbufferEXT),
+    NAME_FUNC_OFFSET(19324, glFramebufferTexture1DEXT, glFramebufferTexture1DEXT, NULL, _gloffset_FramebufferTexture1DEXT),
+    NAME_FUNC_OFFSET(19347, glFramebufferTexture2DEXT, glFramebufferTexture2DEXT, NULL, _gloffset_FramebufferTexture2DEXT),
+    NAME_FUNC_OFFSET(19370, glFramebufferTexture3DEXT, glFramebufferTexture3DEXT, NULL, _gloffset_FramebufferTexture3DEXT),
+    NAME_FUNC_OFFSET(19393, glGenFramebuffersEXT, glGenFramebuffersEXT, NULL, _gloffset_GenFramebuffersEXT),
+    NAME_FUNC_OFFSET(19411, glGenRenderbuffersEXT, glGenRenderbuffersEXT, NULL, _gloffset_GenRenderbuffersEXT),
+    NAME_FUNC_OFFSET(19430, glGenerateMipmapEXT, glGenerateMipmapEXT, NULL, _gloffset_GenerateMipmapEXT),
+    NAME_FUNC_OFFSET(19447, glGetFramebufferAttachmentParameterivEXT, glGetFramebufferAttachmentParameterivEXT, NULL, _gloffset_GetFramebufferAttachmentParameterivEXT),
+    NAME_FUNC_OFFSET(19485, glGetRenderbufferParameterivEXT, glGetRenderbufferParameterivEXT, NULL, _gloffset_GetRenderbufferParameterivEXT),
+    NAME_FUNC_OFFSET(19514, glIsFramebufferEXT, glIsFramebufferEXT, NULL, _gloffset_IsFramebufferEXT),
+    NAME_FUNC_OFFSET(19530, glIsRenderbufferEXT, glIsRenderbufferEXT, NULL, _gloffset_IsRenderbufferEXT),
+    NAME_FUNC_OFFSET(19547, glRenderbufferStorageEXT, glRenderbufferStorageEXT, NULL, _gloffset_RenderbufferStorageEXT),
+    NAME_FUNC_OFFSET(19569, gl_dispatch_stub_773, gl_dispatch_stub_773, NULL, _gloffset_BlitFramebufferEXT),
+    NAME_FUNC_OFFSET(19587, glFramebufferTextureLayerEXT, glFramebufferTextureLayerEXT, NULL, _gloffset_FramebufferTextureLayerEXT),
     NAME_FUNC_OFFSET(-1, NULL, NULL, NULL, 0)
 };
 
index e3abb0f..737fd4d 100644 (file)
@@ -246,57 +246,6 @@ _glthread_SetTSD(_glthread_TSD *tsd, void *ptr)
 
 #endif /* WIN32_THREADS */
 
-
-
-/*
- * XFree86 has its own thread wrapper, Xthreads.h
- * We wrap it again for GL.
- */
-#ifdef USE_XTHREADS
-
-unsigned long
-_glthread_GetID(void)
-{
-   return (unsigned long) xthread_self();
-}
-
-
-void
-_glthread_InitTSD(_glthread_TSD *tsd)
-{
-   if (xthread_key_create(&tsd->key, NULL) != 0) {
-      perror(INIT_TSD_ERROR);
-      exit(-1);
-   }
-   tsd->initMagic = INIT_MAGIC;
-}
-
-
-void *
-_glthread_GetTSD(_glthread_TSD *tsd)
-{
-   void *ptr;
-   if (tsd->initMagic != INIT_MAGIC) {
-      _glthread_InitTSD(tsd);
-   }
-   xthread_get_specific(tsd->key, &ptr);
-   return ptr;
-}
-
-
-void
-_glthread_SetTSD(_glthread_TSD *tsd, void *ptr)
-{
-   if (tsd->initMagic != INIT_MAGIC) {
-      _glthread_InitTSD(tsd);
-   }
-   xthread_set_specific(tsd->key, ptr);
-}
-
-#endif /* XTHREAD */
-
-
-
 /*
  * BeOS threads
  */
index dfe09a9..8ec933a 100644 (file)
@@ -71,7 +71,7 @@
 
 
 #if (defined(PTHREADS) || defined(SOLARIS_THREADS) ||\
-     defined(WIN32_THREADS) || defined(USE_XTHREADS) || defined(BEOS_THREADS)) \
+     defined(WIN32_THREADS) || defined(BEOS_THREADS)) \
     && !defined(THREADS)
 # define THREADS
 #endif
@@ -218,48 +218,6 @@ typedef CRITICAL_SECTION _glthread_Mutex;
 #endif /* WIN32_THREADS */
 
 
-
-
-/*
- * XFree86 has its own thread wrapper, Xthreads.h
- * We wrap it again for GL.
- */
-#ifdef USE_XTHREADS
-#include <X11/Xthreads.h>
-
-typedef struct {
-   xthread_key_t key;
-   int initMagic;
-} _glthread_TSD;
-
-typedef xthread_t _glthread_Thread;
-
-typedef xmutex_rec _glthread_Mutex;
-
-#ifdef XMUTEX_INITIALIZER
-#define _glthread_DECLARE_STATIC_MUTEX(name) \
-   static _glthread_Mutex name = XMUTEX_INITIALIZER
-#else
-#define _glthread_DECLARE_STATIC_MUTEX(name) \
-   static _glthread_Mutex name
-#endif
-
-#define _glthread_INIT_MUTEX(name) \
-   xmutex_init(&(name))
-
-#define _glthread_DESTROY_MUTEX(name) \
-   xmutex_clear(&(name))
-
-#define _glthread_LOCK_MUTEX(name) \
-   (void) xmutex_lock(&(name))
-
-#define _glthread_UNLOCK_MUTEX(name) \
-   (void) xmutex_unlock(&(name))
-
-#endif /* USE_XTHREADS */
-
-
-
 /*
  * BeOS threads. R5.x required.
  */
index f5b7d1e..2462a1b 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "glheader.h"
 #include "api_arrayelt.h"
+#include "bufferobj.h"
 #include "context.h"
 #include "imports.h"
 #include "macros.h"
@@ -1071,7 +1072,7 @@ void _ae_destroy_context( GLcontext *ctx )
 static void check_vbo( AEcontext *actx,
                       struct gl_buffer_object *vbo )
 {
-   if (vbo->Name && !vbo->Pointer) {
+   if (_mesa_is_bufferobj(vbo) && !_mesa_bufferobj_mapped(vbo)) {
       GLuint i;
       for (i = 0; i < actx->nr_vbos; i++)
         if (actx->vbo[i] == vbo)
index e49cd04..199550b 100644 (file)
 #include "state.h"
 #include "stencil.h"
 #include "texenv.h"
+#include "texgetimage.h"
 #include "teximage.h"
 #if FEATURE_texgen
 #include "texgen.h"
index b2f11ff..2df4f17 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "glheader.h"
 #include "api_validate.h"
+#include "bufferobj.h"
 #include "context.h"
 #include "imports.h"
 #include "mtypes.h"
@@ -62,7 +63,7 @@ max_buffer_index(GLcontext *ctx, GLuint count, GLenum type,
    GLuint max = 0;
    GLuint i;
 
-   if (elementBuf->Name) {
+   if (_mesa_is_bufferobj(elementBuf)) {
       /* elements are in a user-defined buffer object.  need to map it */
       map = ctx->Driver.MapBuffer(ctx, GL_ELEMENT_ARRAY_BUFFER,
                                   GL_READ_ONLY, elementBuf);
@@ -96,14 +97,12 @@ max_buffer_index(GLcontext *ctx, GLuint count, GLenum type,
 
 
 /**
- * Check if OK to render by examining framebuffer status and vertex arrays.
+ * Check if OK to draw arrays/elements.
  */
 static GLboolean
-check_valid_to_render(GLcontext *ctx, char *function)
+check_valid_to_render(GLcontext *ctx, const char *function)
 {
-   if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
-      _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
-                  "glDraw%s(incomplete framebuffer)", function);
+   if (!_mesa_valid_to_render(ctx, function)) {
       return GL_FALSE;
    }
 
@@ -160,11 +159,11 @@ _mesa_validate_DrawElements(GLcontext *ctx,
    if (ctx->NewState)
       _mesa_update_state(ctx);
 
-   if (!check_valid_to_render(ctx, "Elements"))
+   if (!check_valid_to_render(ctx, "glDrawElements"))
       return GL_FALSE;
 
    /* Vertex buffer object tests */
-   if (ctx->Array.ElementArrayBufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Array.ElementArrayBufferObj)) {
       /* use indices in the buffer object */
       /* make sure count doesn't go outside buffer bounds */
       if (index_bytes(type, count) > ctx->Array.ElementArrayBufferObj->Size) {
@@ -233,11 +232,11 @@ _mesa_validate_DrawRangeElements(GLcontext *ctx, GLenum mode,
    if (ctx->NewState)
       _mesa_update_state(ctx);
 
-   if (!check_valid_to_render(ctx, "RangeElements"))
+   if (!check_valid_to_render(ctx, "glDrawRangeElements"))
       return GL_FALSE;
 
    /* Vertex buffer object tests */
-   if (ctx->Array.ElementArrayBufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Array.ElementArrayBufferObj)) {
       /* use indices in the buffer object */
       /* make sure count doesn't go outside buffer bounds */
       if (index_bytes(type, count) > ctx->Array.ElementArrayBufferObj->Size) {
@@ -289,7 +288,7 @@ _mesa_validate_DrawArrays(GLcontext *ctx,
    if (ctx->NewState)
       _mesa_update_state(ctx);
 
-   if (!check_valid_to_render(ctx, "Arrays"))
+   if (!check_valid_to_render(ctx, "glDrawArrays"))
       return GL_FALSE;
 
    if (ctx->Const.CheckArrayBounds) {
index cb49c4c..ab99ca1 100644 (file)
@@ -174,24 +174,30 @@ struct texture_state
 
 
 /**
- * Allocate a new attribute state node.  These nodes have a
- * "kind" value and a pointer to a struct of state data.
+ * Allocate new attribute node of given type/kind.  Attach payload data.
+ * Insert it into the linked list named by 'head'.
  */
-static struct gl_attrib_node *
-new_attrib_node( GLbitfield kind )
+static void
+save_attrib_data(struct gl_attrib_node **head,
+                 GLbitfield kind, void *payload)
 {
-   struct gl_attrib_node *an = MALLOC_STRUCT(gl_attrib_node);
-   if (an) {
-      an->kind = kind;
+   struct gl_attrib_node *n = MALLOC_STRUCT(gl_attrib_node);
+   if (n) {
+      n->kind = kind;
+      n->data = payload;
+      /* insert at head */
+      n->next = *head;
+      *head = n;
+   }
+   else {
+      /* out of memory! */
    }
-   return an;
 }
 
 
 void GLAPIENTRY
 _mesa_PushAttrib(GLbitfield mask)
 {
-   struct gl_attrib_node *newnode;
    struct gl_attrib_node *head;
 
    GET_CURRENT_CONTEXT(ctx);
@@ -213,10 +219,7 @@ _mesa_PushAttrib(GLbitfield mask)
       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;
+      save_attrib_data(&head, GL_ACCUM_BUFFER_BIT, attr);
    }
 
    if (mask & GL_COLOR_BUFFER_BIT) {
@@ -227,10 +230,7 @@ _mesa_PushAttrib(GLbitfield mask)
       /* push the Draw FBO's DrawBuffer[] state, not ctx->Color.DrawBuffer[] */
       for (i = 0; i < ctx->Const.MaxDrawBuffers; i ++)
          attr->DrawBuffer[i] = ctx->DrawBuffer->ColorDrawBuffer[i];
-      newnode = new_attrib_node( GL_COLOR_BUFFER_BIT );
-      newnode->data = attr;
-      newnode->next = head;
-      head = newnode;
+      save_attrib_data(&head, GL_COLOR_BUFFER_BIT, attr);
    }
 
    if (mask & GL_CURRENT_BIT) {
@@ -238,20 +238,14 @@ _mesa_PushAttrib(GLbitfield mask)
       FLUSH_CURRENT( ctx, 0 );
       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;
+      save_attrib_data(&head, GL_CURRENT_BIT, attr);
    }
 
    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;
+      save_attrib_data(&head, GL_DEPTH_BUFFER_BIT, attr);
    }
 
    if (mask & GL_ENABLE_BIT) {
@@ -331,40 +325,28 @@ _mesa_PushAttrib(GLbitfield mask)
       attr->VertexProgram = ctx->VertexProgram.Enabled;
       attr->VertexProgramPointSize = ctx->VertexProgram.PointSizeEnabled;
       attr->VertexProgramTwoSide = ctx->VertexProgram.TwoSideEnabled;
-      newnode = new_attrib_node( GL_ENABLE_BIT );
-      newnode->data = attr;
-      newnode->next = head;
-      head = newnode;
+      save_attrib_data(&head, GL_ENABLE_BIT, attr);
    }
 
    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;
+      save_attrib_data(&head, GL_EVAL_BIT, attr);
    }
 
    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;
+      save_attrib_data(&head, GL_FOG_BIT, attr);
    }
 
    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;
+      save_attrib_data(&head, GL_HINT_BIT, attr);
    }
 
    if (mask & GL_LIGHTING_BIT) {
@@ -372,30 +354,21 @@ _mesa_PushAttrib(GLbitfield mask)
       FLUSH_CURRENT(ctx, 0);   /* flush material changes */
       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;
+      save_attrib_data(&head, GL_LIGHTING_BIT, attr);
    }
 
    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;
+      save_attrib_data(&head, GL_LINE_BIT, attr);
    }
 
    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;
+      save_attrib_data(&head, GL_LIST_BIT, attr);
    }
 
    if (mask & GL_PIXEL_MODE_BIT) {
@@ -404,60 +377,42 @@ _mesa_PushAttrib(GLbitfield mask)
       MEMCPY( attr, &ctx->Pixel, sizeof(struct gl_pixel_attrib) );
       /* push the Read FBO's ReadBuffer state, not ctx->Pixel.ReadBuffer */
       attr->ReadBuffer = ctx->ReadBuffer->ColorReadBuffer;
-      newnode = new_attrib_node( GL_PIXEL_MODE_BIT );
-      newnode->data = attr;
-      newnode->next = head;
-      head = newnode;
+      save_attrib_data(&head, GL_PIXEL_MODE_BIT, attr);
    }
 
    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;
+      save_attrib_data(&head, GL_POINT_BIT, attr);
    }
 
    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;
+      save_attrib_data(&head, GL_POLYGON_BIT, attr);
    }
 
    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;
+      save_attrib_data(&head, GL_POLYGON_STIPPLE_BIT, stipple);
    }
 
    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;
+      save_attrib_data(&head, GL_SCISSOR_BIT, attr);
    }
 
    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;
+      save_attrib_data(&head, GL_STENCIL_BUFFER_BIT, attr);
    }
 
    if (mask & GL_TEXTURE_BIT) {
@@ -494,30 +449,21 @@ _mesa_PushAttrib(GLbitfield mask)
 
       _mesa_unlock_context_textures(ctx);
 
-      newnode = new_attrib_node( GL_TEXTURE_BIT );
-      newnode->data = texstate;
-      newnode->next = head;
-      head = newnode;
+      save_attrib_data(&head, GL_TEXTURE_BIT, texstate);
    }
 
    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;
+      save_attrib_data(&head, GL_TRANSFORM_BIT, attr);
    }
 
    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;
+      save_attrib_data(&head, GL_VIEWPORT_BIT, attr);
    }
 
    /* GL_ARB_multisample */
@@ -525,10 +471,7 @@ _mesa_PushAttrib(GLbitfield mask)
       struct gl_multisample_attrib *attr;
       attr = MALLOC_STRUCT( gl_multisample_attrib );
       MEMCPY( attr, &ctx->Multisample, sizeof(struct gl_multisample_attrib) );
-      newnode = new_attrib_node( GL_MULTISAMPLE_BIT_ARB );
-      newnode->data = attr;
-      newnode->next = head;
-      head = newnode;
+      save_attrib_data(&head, GL_MULTISAMPLE_BIT_ARB, attr);
    }
 
 end:
@@ -1373,7 +1316,6 @@ copy_pixelstore(GLcontext *ctx,
 void GLAPIENTRY
 _mesa_PushClientAttrib(GLbitfield mask)
 {
-   struct gl_attrib_node *newnode;
    struct gl_attrib_node *head;
 
    GET_CURRENT_CONTEXT(ctx);
@@ -1394,17 +1336,11 @@ _mesa_PushClientAttrib(GLbitfield mask)
       /* packing attribs */
       attr = CALLOC_STRUCT( gl_pixelstore_attrib );
       copy_pixelstore(ctx, attr, &ctx->Pack);
-      newnode = new_attrib_node( GL_CLIENT_PACK_BIT );
-      newnode->data = attr;
-      newnode->next = head;
-      head = newnode;
+      save_attrib_data(&head, GL_CLIENT_PACK_BIT, attr);
       /* unpacking attribs */
       attr = CALLOC_STRUCT( gl_pixelstore_attrib );
       copy_pixelstore(ctx, attr, &ctx->Unpack);
-      newnode = new_attrib_node( GL_CLIENT_UNPACK_BIT );
-      newnode->data = attr;
-      newnode->next = head;
-      head = newnode;
+      save_attrib_data(&head, GL_CLIENT_UNPACK_BIT, attr);
    }
 
    if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
@@ -1425,10 +1361,8 @@ _mesa_PushClientAttrib(GLbitfield mask)
 
       attr->ArrayObj = obj;
 
-      newnode = new_attrib_node( GL_CLIENT_VERTEX_ARRAY_BIT );
-      newnode->data = attr;
-      newnode->next = head;
-      head = newnode;
+      save_attrib_data(&head, GL_CLIENT_VERTEX_ARRAY_BIT, attr);
+
       /* bump reference counts on buffer objects */
       adjust_buffer_object_ref_counts(ctx->Array.ArrayObj, 1);
    }
index d640f53..f96185a 100644 (file)
@@ -156,7 +156,7 @@ buffer_object_subdata_range_good( GLcontext * ctx, GLenum target,
       _mesa_error(ctx, GL_INVALID_ENUM, "%s(target)", caller);
       return NULL;
    }
-   if (bufObj->Name == 0) {
+   if (!_mesa_is_bufferobj(bufObj)) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "%s", caller);
       return NULL;
    }
@@ -165,7 +165,7 @@ buffer_object_subdata_range_good( GLcontext * ctx, GLenum target,
                  "%s(size + offset > buffer size)", caller);
       return NULL;
    }
-   if (bufObj->Pointer) {
+   if (_mesa_bufferobj_mapped(bufObj)) {
       /* Buffer is currently mapped */
       _mesa_error(ctx, GL_INVALID_OPERATION, "%s", caller);
       return NULL;
@@ -423,7 +423,7 @@ _mesa_buffer_map( GLcontext *ctx, GLenum target, GLenum access,
    (void) target;
    (void) access;
    /* Just return a direct pointer to the data */
-   if (bufObj->Pointer) {
+   if (_mesa_bufferobj_mapped(bufObj)) {
       /* already mapped! */
       return NULL;
    }
@@ -445,7 +445,7 @@ _mesa_buffer_map_range( GLcontext *ctx, GLenum target, GLintptr offset,
    (void) target;
    (void) access;
    (void) length;
-   assert(!bufObj->Pointer);
+   assert(!_mesa_bufferobj_mapped(bufObj));
    /* Just return a direct pointer to the data */
    return bufObj->Data + offset;
 }
@@ -502,8 +502,8 @@ _mesa_copy_buffer_subdata(GLcontext *ctx,
    GLubyte *srcPtr, *dstPtr;
 
    /* buffer should not already be mapped */
-   assert(!src->Pointer);
-   assert(!dst->Pointer);
+   assert(!_mesa_bufferobj_mapped(src));
+   assert(!_mesa_bufferobj_mapped(dst));
 
    srcPtr = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_COPY_READ_BUFFER,
                                               GL_READ_ONLY, src);
@@ -663,7 +663,7 @@ _mesa_validate_pbo_access(GLuint dimensions,
    GLvoid *start, *end;
    const GLubyte *sizeAddr; /* buffer size, cast to a pointer */
 
-   ASSERT(pack->BufferObj->Name != 0);
+   ASSERT(_mesa_is_bufferobj(pack->BufferObj));
 
    if (pack->BufferObj->Size == 0)
       /* no buffer! */
@@ -709,7 +709,7 @@ _mesa_map_bitmap_pbo(GLcontext *ctx,
 {
    const GLubyte *buf;
 
-   if (unpack->BufferObj->Name) {
+   if (_mesa_is_bufferobj(unpack->BufferObj)) {
       /* unpack from PBO */
       buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
                                               GL_READ_ONLY_ARB,
@@ -736,7 +736,7 @@ void
 _mesa_unmap_bitmap_pbo(GLcontext *ctx,
                        const struct gl_pixelstore_attrib *unpack)
 {
-   if (unpack->BufferObj->Name) {
+   if (_mesa_is_bufferobj(unpack->BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
                               unpack->BufferObj);
    }
@@ -753,7 +753,7 @@ _mesa_map_drawpix_pbo(GLcontext *ctx,
 {
    const GLvoid *buf;
 
-   if (unpack->BufferObj->Name) {
+   if (_mesa_is_bufferobj(unpack->BufferObj)) {
       /* unpack from PBO */
       buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
                                               GL_READ_ONLY_ARB,
@@ -779,7 +779,7 @@ void
 _mesa_unmap_drawpix_pbo(GLcontext *ctx,
                         const struct gl_pixelstore_attrib *unpack)
 {
-   if (unpack->BufferObj->Name) {
+   if (_mesa_is_bufferobj(unpack->BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
                               unpack->BufferObj);
    }
@@ -798,7 +798,7 @@ _mesa_map_readpix_pbo(GLcontext *ctx,
 {
    void *buf;
 
-   if (pack->BufferObj->Name) {
+   if (_mesa_is_bufferobj(pack->BufferObj)) {
       /* pack into PBO */
       buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
                                               GL_WRITE_ONLY_ARB,
@@ -824,7 +824,7 @@ void
 _mesa_unmap_readpix_pbo(GLcontext *ctx,
                         const struct gl_pixelstore_attrib *pack)
 {
-   if (pack->BufferObj->Name) {
+   if (_mesa_is_bufferobj(pack->BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, pack->BufferObj);
    }
 }
@@ -932,7 +932,7 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids)
 
          ASSERT(bufObj->Name == ids[i]);
 
-         if (bufObj->Pointer) {
+         if (_mesa_bufferobj_mapped(bufObj)) {
             /* if mapped, unmap it now */
             ctx->Driver.UnmapBuffer(ctx, 0, bufObj);
             bufObj->AccessFlags = DEFAULT_ACCESS;
@@ -1086,12 +1086,12 @@ _mesa_BufferDataARB(GLenum target, GLsizeiptrARB size,
       _mesa_error(ctx, GL_INVALID_ENUM, "glBufferDataARB(target)" );
       return;
    }
-   if (bufObj->Name == 0) {
+   if (!_mesa_is_bufferobj(bufObj)) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glBufferDataARB(buffer 0)" );
       return;
    }
    
-   if (bufObj->Pointer) {
+   if (_mesa_bufferobj_mapped(bufObj)) {
       /* Unmap the existing buffer.  We'll replace it now.  Not an error. */
       ctx->Driver.UnmapBuffer(ctx, target, bufObj);
       bufObj->AccessFlags = DEFAULT_ACCESS;
@@ -1187,18 +1187,18 @@ _mesa_MapBufferARB(GLenum target, GLenum access)
       _mesa_error(ctx, GL_INVALID_ENUM, "glMapBufferARB(target)" );
       return NULL;
    }
-   if (bufObj->Name == 0) {
+   if (!_mesa_is_bufferobj(bufObj)) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glMapBufferARB(buffer 0)" );
       return NULL;
    }
-   if (bufObj->Pointer) {
+   if (_mesa_bufferobj_mapped(bufObj)) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glMapBufferARB(already mapped)");
       return NULL;
    }
 
    ASSERT(ctx->Driver.MapBuffer);
    bufObj->Pointer = ctx->Driver.MapBuffer( ctx, target, access, bufObj );
-   if (!bufObj->Pointer) {
+   if (!_mesa_bufferobj_mapped(bufObj)) {
       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glMapBufferARB(access)");
    }
 
@@ -1248,11 +1248,11 @@ _mesa_UnmapBufferARB(GLenum target)
       _mesa_error(ctx, GL_INVALID_ENUM, "glUnmapBufferARB(target)" );
       return GL_FALSE;
    }
-   if (bufObj->Name == 0) {
+   if (!_mesa_is_bufferobj(bufObj)) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glUnmapBufferARB" );
       return GL_FALSE;
    }
-   if (!bufObj->Pointer) {
+   if (!_mesa_bufferobj_mapped(bufObj)) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glUnmapBufferARB");
       return GL_FALSE;
    }
@@ -1315,7 +1315,7 @@ _mesa_GetBufferParameterivARB(GLenum target, GLenum pname, GLint *params)
       _mesa_error(ctx, GL_INVALID_ENUM, "GetBufferParameterivARB(target)" );
       return;
    }
-   if (bufObj->Name == 0) {
+   if (!_mesa_is_bufferobj(bufObj)) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "GetBufferParameterivARB" );
       return;
    }
@@ -1331,7 +1331,7 @@ _mesa_GetBufferParameterivARB(GLenum target, GLenum pname, GLint *params)
          *params = simplified_access_mode(bufObj->AccessFlags);
          break;
       case GL_BUFFER_MAPPED_ARB:
-         *params = (bufObj->Pointer != NULL);
+         *params = _mesa_bufferobj_mapped(bufObj);
          break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetBufferParameterivARB(pname)");
@@ -1357,7 +1357,7 @@ _mesa_GetBufferPointervARB(GLenum target, GLenum pname, GLvoid **params)
       _mesa_error(ctx, GL_INVALID_ENUM, "glGetBufferPointervARB(target)" );
       return;
    }
-   if (bufObj->Name == 0) {
+   if (!_mesa_is_bufferobj(bufObj)) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glGetBufferPointervARB" );
       return;
    }
@@ -1376,26 +1376,26 @@ _mesa_CopyBufferSubData(GLenum readTarget, GLenum writeTarget,
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    src = get_buffer(ctx, readTarget);
-   if (!src || src->Name == 0) {
+   if (!src || !_mesa_is_bufferobj(src)) {
       _mesa_error(ctx, GL_INVALID_ENUM,
                   "glCopyBuffserSubData(readTarget = 0x%x)", readTarget);
       return;
    }
 
    dst = get_buffer(ctx, writeTarget);
-   if (!dst || dst->Name == 0) {
+   if (!dst || !_mesa_is_bufferobj(dst)) {
       _mesa_error(ctx, GL_INVALID_ENUM,
                   "glCopyBuffserSubData(writeTarget = 0x%x)", writeTarget);
       return;
    }
 
-   if (src->Pointer) {
+   if (_mesa_bufferobj_mapped(src)) {
       _mesa_error(ctx, GL_INVALID_OPERATION,
                   "glCopyBuffserSubData(readBuffer is mapped)");
       return;
    }
 
-   if (dst->Pointer) {
+   if (_mesa_bufferobj_mapped(dst)) {
       _mesa_error(ctx, GL_INVALID_OPERATION,
                   "glCopyBuffserSubData(writeBuffer is mapped)");
       return;
@@ -1499,7 +1499,7 @@ _mesa_MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length,
    }
 
    bufObj = get_buffer(ctx, target);
-   if (!bufObj || bufObj->Name == 0) {
+   if (!bufObj || !_mesa_is_bufferobj(bufObj)) {
       _mesa_error(ctx, GL_INVALID_ENUM,
                   "glMapBufferRange(target = 0x%x)", target);
       return NULL;
@@ -1511,7 +1511,7 @@ _mesa_MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length,
       return NULL;
    }
 
-   if (bufObj->Pointer) {
+   if (_mesa_bufferobj_mapped(bufObj)) {
       _mesa_error(ctx, GL_INVALID_OPERATION,
                   "glMapBufferRange(buffer already mapped)");
       return NULL;
@@ -1564,13 +1564,13 @@ _mesa_FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
       return;
    }
 
-   if (bufObj->Name == 0) {
+   if (!_mesa_is_bufferobj(bufObj)) {
       _mesa_error(ctx, GL_INVALID_OPERATION,
                   "glMapBufferRange(current buffer is 0)");
       return;
    }
 
-   if (!bufObj->Pointer) {
+   if (!_mesa_bufferobj_mapped(bufObj)) {
       /* buffer is not mapped */
       _mesa_error(ctx, GL_INVALID_OPERATION,
                   "glMapBufferRange(buffer is not mapped)");
index ef59ff8..decb44a 100644 (file)
  * Internal functions
  */
 
+
+/** Is the given buffer object currently mapped? */
+static INLINE GLboolean
+_mesa_bufferobj_mapped(const struct gl_buffer_object *obj)
+{
+   return obj->Pointer != NULL;
+}
+
+/**
+ * Is the given buffer object a user-created buffer object?
+ * Mesa uses default buffer objects in several places.  Default buffers
+ * always have Name==0.  User created buffers have Name!=0.
+ */
+static INLINE GLboolean
+_mesa_is_bufferobj(const struct gl_buffer_object *obj)
+{
+   return obj->Name != 0;
+}
+
+
 extern void
 _mesa_init_buffer_objects( GLcontext *ctx );
 
index bd9cf43..3630406 100644 (file)
@@ -179,7 +179,7 @@ store_colortable_entries(GLcontext *ctx, struct gl_color_table *table,
                         GLfloat bScale, GLfloat bBias,
                         GLfloat aScale, GLfloat aBias)
 {
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       /* Get/unpack the color table data from a PBO */
       GLubyte *buf;
       if (!_mesa_validate_pbo_access(1, &ctx->Unpack, count, 1, 1,
@@ -279,7 +279,7 @@ store_colortable_entries(GLcontext *ctx, struct gl_color_table *table,
       }
    }
 
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
                               ctx->Unpack.BufferObj);
    }
@@ -696,7 +696,7 @@ _mesa_GetColorTable( GLenum target, GLenum format,
       return;
    }
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       /* pack color table into PBO */
       GLubyte *buf;
       if (!_mesa_validate_pbo_access(1, &ctx->Pack, table->Size, 1, 1,
@@ -720,7 +720,7 @@ _mesa_GetColorTable( GLenum target, GLenum format,
    _mesa_pack_rgba_span_float(ctx, table->Size, rgba,
                               format, type, data, &ctx->Pack, 0x0);
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
                               ctx->Pack.BufferObj);
    }
index e79bbc2..9319505 100644 (file)
@@ -110,10 +110,8 @@ extern "C" {
 #if defined(_WIN32) && !defined(__WIN32__) && !defined(__CYGWIN__) && !defined(BUILD_FOR_SNAP)
 #  define __WIN32__
 #  define finite _finite
-#endif
-#if defined(__WATCOMC__)
+#elif defined(__WATCOMC__)
 #  define finite _finite
-#  pragma disable_message(201) /* Disable unreachable code warnings */
 #endif
 
 
@@ -135,6 +133,10 @@ extern "C" {
 #    endif
 #  endif
 #endif
+#if defined(__WATCOMC__)
+#  pragma disable_message(201) /* Disable unreachable code warnings */
+#endif
+
 
 
 /**
index f77a29a..e4995c3 100644 (file)
 /** 
  * Maximum viewport/image width. Must accomodate all texture sizes too. 
  */
-#define MAX_WIDTH 4096
+
+#ifndef MAX_WIDTH
+#   define MAX_WIDTH 4096
+#endif
 /** Maximum viewport/image height */
-#define MAX_HEIGHT 4096
+#ifndef MAX_HEIGHT
+#   define MAX_HEIGHT 4096
+#endif
 
 /** Maxmimum size for CVA.  May be overridden by the drivers.  */
 #define MAX_ARRAY_LOCK_SIZE 3000
index 415e339..38ec418 100644 (file)
 #include "glapi/glapioffsets.h"
 #include "glapi/glapitable.h"
 #include "shader/program.h"
+#include "shader/prog_print.h"
 #include "shader/shader_api.h"
 #if FEATURE_ATI_fragment_shader
 #include "shader/atifragshader.h"
@@ -1576,4 +1577,72 @@ _mesa_set_mvp_with_dp4( GLcontext *ctx,
 }
 
 
+
+/**
+ * Prior to drawing anything with glBegin, glDrawArrays, etc. this function
+ * is called to see if it's valid to render.  This involves checking that
+ * the current shader is valid and the framebuffer is complete.
+ * If an error is detected it'll be recorded here.
+ * \return GL_TRUE if OK to render, GL_FALSE if not
+ */
+GLboolean
+_mesa_valid_to_render(GLcontext *ctx, const char *where)
+{
+   if (ctx->Shader.CurrentProgram) {
+      /* using shaders */
+      if (!ctx->Shader.CurrentProgram->LinkStatus) {
+         _mesa_error(ctx, GL_INVALID_OPERATION,
+                     "%s(shader not linked), where");
+         return GL_FALSE;
+      }
+   }
+   else {
+      if (ctx->VertexProgram.Enabled && !ctx->VertexProgram._Enabled) {
+         _mesa_error(ctx, GL_INVALID_OPERATION,
+                     "%s(vertex program not valid)", where);
+         return GL_FALSE;
+      }
+      if (ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled) {
+         _mesa_error(ctx, GL_INVALID_OPERATION,
+                     "%s(fragment program not valid)", where);
+         return GL_FALSE;
+      }
+   }
+
+   if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
+      _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
+                  "%s(incomplete framebuffer)", where);
+      return GL_FALSE;
+   }
+
+#ifdef DEBUG
+   if (ctx->Shader.Flags & GLSL_LOG) {
+      struct gl_shader_program *shProg = ctx->Shader.CurrentProgram;
+      if (shProg) {
+         if (!shProg->_Used) {
+            /* This is the first time this shader is being used.
+             * Append shader's constants/uniforms to log file.
+             */
+            GLuint i;
+            for (i = 0; i < shProg->NumShaders; i++) {
+               struct gl_shader *sh = shProg->Shaders[i];
+               if (sh->Type == GL_VERTEX_SHADER) {
+                  _mesa_append_uniforms_to_file(sh,
+                                                &shProg->VertexProgram->Base);
+               }
+               else if (sh->Type == GL_FRAGMENT_SHADER) {
+                  _mesa_append_uniforms_to_file(sh,
+                                                &shProg->FragmentProgram->Base);
+               }
+            }
+            shProg->_Used = GL_TRUE;
+         }
+      }
+   }
+#endif
+
+   return GL_TRUE;
+}
+
+
 /*@}*/
index 0531ae8..5587695 100644 (file)
@@ -159,6 +159,11 @@ _mesa_set_mvp_with_dp4( GLcontext *ctx,
                         GLboolean flag );
 
 
+extern GLboolean
+_mesa_valid_to_render(GLcontext *ctx, const char *where);
+
+
+
 /** \name Miscellaneous */
 /*@{*/
 
@@ -174,7 +179,6 @@ _mesa_Flush( void );
 /*@}*/
 
 
-
 /**
  * \name Macros for flushing buffered rendering commands before state changes,
  * checking if inside glBegin/glEnd, etc.
index 814c6a0..69dba72 100644 (file)
@@ -144,7 +144,7 @@ _mesa_ConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width, G
    ctx->Convolution1D.Width = width;
    ctx->Convolution1D.Height = 1;
 
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       /* unpack filter from PBO */
       GLubyte *buf;
       if (!_mesa_validate_pbo_access(1, &ctx->Unpack, width, 1, 1,
@@ -173,7 +173,7 @@ _mesa_ConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width, G
                                  format, type, image, &ctx->Unpack,
                                  0); /* transferOps */
 
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
                               ctx->Unpack.BufferObj);
    }
@@ -242,7 +242,7 @@ _mesa_ConvolutionFilter2D(GLenum target, GLenum internalFormat, GLsizei width, G
    ctx->Convolution2D.Width = width;
    ctx->Convolution2D.Height = height;
 
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       /* unpack filter from PBO */
       GLubyte *buf;
       if (!_mesa_validate_pbo_access(2, &ctx->Unpack, width, height, 1,
@@ -276,7 +276,7 @@ _mesa_ConvolutionFilter2D(GLenum target, GLenum internalFormat, GLsizei width, G
                                     0); /* transferOps */
    }
 
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
                               ctx->Unpack.BufferObj);
    }
@@ -598,7 +598,7 @@ _mesa_GetConvolutionFilter(GLenum target, GLenum format, GLenum type,
          return;
    }
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       /* Pack the filter into a PBO */
       GLubyte *buf;
       if (!_mesa_validate_pbo_access(2, &ctx->Pack,
@@ -629,7 +629,7 @@ _mesa_GetConvolutionFilter(GLenum target, GLenum format, GLenum type,
                                  format, type, dst, &ctx->Pack, 0x0);
    }
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
                               ctx->Pack.BufferObj);
    }
@@ -802,7 +802,7 @@ _mesa_GetSeparableFilter(GLenum target, GLenum format, GLenum type,
 
    filter = &ctx->Separable2D;
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       /* Pack filter into PBO */
       GLubyte *buf;
       if (!_mesa_validate_pbo_access(1, &ctx->Pack, filter->Width, 1, 1,
@@ -850,7 +850,7 @@ _mesa_GetSeparableFilter(GLenum target, GLenum format, GLenum type,
 
    (void) span;  /* unused at this time */
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       /* Pack filter into PBO */
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
                               ctx->Unpack.BufferObj);
@@ -905,7 +905,7 @@ _mesa_SeparableFilter2D(GLenum target, GLenum internalFormat, GLsizei width, GLs
    ctx->Separable2D.Width = width;
    ctx->Separable2D.Height = height;
 
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       /* unpack filter from PBO */
       GLubyte *buf;
       if (!_mesa_validate_pbo_access(1, &ctx->Unpack, width, 1, 1,
@@ -971,7 +971,7 @@ _mesa_SeparableFilter2D(GLenum target, GLenum internalFormat, GLsizei width, GLs
                        ctx->Pixel.ConvolutionFilterBias[2][3]);
    }
 
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
                               ctx->Unpack.BufferObj);
    }
index 1c8c44f..8492c85 100644 (file)
@@ -33,6 +33,7 @@
 #include "get.h"
 #include "pixelstore.h"
 #include "readpix.h"
+#include "texgetimage.h"
 #include "texobj.h"
 #include "texformat.h"
 
@@ -234,11 +235,11 @@ _mesa_init_debug( GLcontext *ctx )
  */
 static void
 write_ppm(const char *filename, const GLubyte *buffer, int width, int height,
-          int comps, int rcomp, int gcomp, int bcomp)
+          int comps, int rcomp, int gcomp, int bcomp, GLboolean invert)
 {
    FILE *f = fopen( filename, "w" );
    if (f) {
-      int i, x, y;
+      int x, y;
       const GLubyte *ptr = buffer;
       fprintf(f,"P6\n");
       fprintf(f,"# ppm-file created by osdemo.c\n");
@@ -246,10 +247,11 @@ write_ppm(const char *filename, const GLubyte *buffer, int width, int height,
       fprintf(f,"255\n");
       fclose(f);
       f = fopen( filename, "ab" );  /* reopen in binary append mode */
-      for (y=height-1; y>=0; y--) {
-         for (x=0; x<width; x++) {
-            i = (y*width + x) * comps;
-            fputc(ptr[i+rcomp], f);   /* write red */
+      for (y=0; y < height; y++) {
+         for (x = 0; x < width; x++) {
+            int yy = invert ? (height - 1 - y) : y;
+            int i = (yy * width + x) * comps;
+            fputc(ptr[i+rcomp], f); /* write red */
             fputc(ptr[i+gcomp], f); /* write green */
             fputc(ptr[i+bcomp], f); /* write blue */
          }
@@ -263,47 +265,34 @@ write_ppm(const char *filename, const GLubyte *buffer, int width, int height,
  * Write level[0] image to a ppm file.
  */
 static void
-write_texture_image(struct gl_texture_object *texObj)
+write_texture_image(struct gl_texture_object *texObj, GLuint face, GLuint level)
 {
-   const struct gl_texture_image *img = texObj->Image[0][0];
-   if (img && img->Data) {
+   struct gl_texture_image *img = texObj->Image[face][level];
+   if (img) {
+      GET_CURRENT_CONTEXT(ctx);
+      struct gl_pixelstore_attrib store;
+      GLubyte *buffer;
       char s[100];
 
+      buffer = (GLubyte *) _mesa_malloc(img->Width * img->Height
+                                        * img->Depth * 4);
+
+      store = ctx->Pack; /* save */
+      ctx->Pack = ctx->DefaultPacking;
+
+      ctx->Driver.GetTexImage(ctx, texObj->Target, level,
+                              GL_RGBA, GL_UNSIGNED_BYTE,
+                              buffer, texObj, img);
+
       /* make filename */
-      sprintf(s, "/tmp/teximage%u.ppm", texObj->Name);
-
-      switch (img->TexFormat->MesaFormat) {
-      case MESA_FORMAT_RGBA8888:
-         write_ppm(s, img->Data, img->Width, img->Height, 4, 3, 2, 1);
-         break;
-      case MESA_FORMAT_ARGB8888:
-         write_ppm(s, img->Data, img->Width, img->Height, 4, 2, 1, 0);
-         break;
-      case MESA_FORMAT_RGB888:
-         write_ppm(s, img->Data, img->Width, img->Height, 3, 2, 1, 0);
-         break;
-      case MESA_FORMAT_RGB565:
-         {
-            GLubyte *buf2 = (GLubyte *) _mesa_malloc(img->Width * img->Height * 3);
-            GLuint i;
-            for (i = 0; i < img->Width * img->Height; i++) {
-               GLint r, g, b;
-               GLushort s = ((GLushort *) img->Data)[i];
-               r = UBYTE_TO_CHAN( ((s >> 8) & 0xf8) | ((s >> 13) & 0x7) );
-               g = UBYTE_TO_CHAN( ((s >> 3) & 0xfc) | ((s >>  9) & 0x3) );
-               b = UBYTE_TO_CHAN( ((s << 3) & 0xf8) | ((s >>  2) & 0x7) );
-               buf2[i*3+1] = r;
-               buf2[i*3+2] = g;
-               buf2[i*3+3] = b;
-            }
-            write_ppm(s, buf2, img->Width, img->Height, 3, 2, 1, 0);
-            _mesa_free(buf2);
-         }
-         break;
-      default:
-         printf("XXXX unsupported mesa tex format %d in %s\n",
-                img->TexFormat->MesaFormat, __FUNCTION__);
-      }
+      _mesa_sprintf(s, "/tmp/teximage%u.ppm", texObj->Name);
+
+      _mesa_printf("  Writing image level %u to %s\n", level, s);
+      write_ppm(s, buffer, img->Width, img->Height, 4, 0, 1, 2, GL_FALSE);
+
+      ctx->Pack = store; /* restore */
+
+      _mesa_free(buffer);
    }
 }
 
@@ -316,17 +305,21 @@ dump_texture_cb(GLuint id, void *data, void *userData)
 {
    struct gl_texture_object *texObj = (struct gl_texture_object *) data;
    int i;
+   GLboolean written = GL_FALSE;
    (void) userData;
 
-   printf("Texture %u\n", texObj->Name);
-   printf("  Target 0x%x\n", texObj->Target);
+   _mesa_printf("Texture %u\n", texObj->Name);
+   _mesa_printf("  Target 0x%x\n", texObj->Target);
    for (i = 0; i < MAX_TEXTURE_LEVELS; i++) {
       struct gl_texture_image *texImg = texObj->Image[0][i];
       if (texImg) {
-         printf("  Image %u: %d x %d x %d at %p\n", i,
-                texImg->Width, texImg->Height, texImg->Depth, texImg->Data);
-         if (DumpImages && i == 0) {
-            write_texture_image(texObj);
+         _mesa_printf("  Image %u: %d x %d x %d, format %u at %p\n", i,
+                      texImg->Width, texImg->Height, texImg->Depth,
+                      texImg->TexFormat->MesaFormat, texImg->Data);
+         if (DumpImages && !written) {
+            GLuint face = 0;
+            write_texture_image(texObj, face, i);
+            written = GL_TRUE;
          }
       }
    }
@@ -368,7 +361,7 @@ _mesa_dump_color_buffer(const char *filename)
                 ctx->DrawBuffer->_ColorDrawBuffers[0],
                 ctx->DrawBuffer->ColorDrawBuffer[0]);
    _mesa_printf("Writing %d x %d color buffer to %s\n", w, h, filename);
-   write_ppm(filename, buf, w, h, 4, 0, 1, 2);
+   write_ppm(filename, buf, w, h, 4, 0, 1, 2, GL_TRUE);
 
    _mesa_PopClientAttrib();
 
@@ -403,7 +396,7 @@ _mesa_dump_depth_buffer(const char *filename)
    }
 
    _mesa_printf("Writing %d x %d depth buffer to %s\n", w, h, filename);
-   write_ppm(filename, buf2, w, h, 3, 0, 1, 2);
+   write_ppm(filename, buf2, w, h, 3, 0, 1, 2, GL_TRUE);
 
    _mesa_PopClientAttrib();
 
@@ -438,7 +431,7 @@ _mesa_dump_stencil_buffer(const char *filename)
    }
 
    _mesa_printf("Writing %d x %d stencil buffer to %s\n", w, h, filename);
-   write_ppm(filename, buf2, w, h, 3, 0, 1, 2);
+   write_ppm(filename, buf2, w, h, 3, 0, 1, 2, GL_TRUE);
 
    _mesa_PopClientAttrib();
 
index 49f202d..9b68b3e 100644 (file)
@@ -683,24 +683,48 @@ translate_id(GLsizei n, GLenum type, const GLvoid * list)
 
 /**
  * Wrapper for _mesa_unpack_image() that handles pixel buffer objects.
- * \todo This won't suffice when the PBO is really in VRAM/GPU memory.
+ * If we run out of memory, GL_OUT_OF_MEMORY will be recorded.
  */
 static GLvoid *
-unpack_image(GLuint dimensions, GLsizei width, GLsizei height, GLsizei depth,
+unpack_image(GLcontext *ctx, GLuint dimensions,
+             GLsizei width, GLsizei height, GLsizei depth,
              GLenum format, GLenum type, const GLvoid * pixels,
              const struct gl_pixelstore_attrib *unpack)
 {
-   if (unpack->BufferObj->Name == 0) {
+   if (!_mesa_is_bufferobj(unpack->BufferObj)) {
       /* no PBO */
-      return _mesa_unpack_image(dimensions, width, height, depth, format,
-                                type, pixels, unpack);
+      GLvoid *image = _mesa_unpack_image(dimensions, width, height, depth,
+                                         format, type, pixels, unpack);
+      if (pixels && !image) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "display list construction");
+      }
+      return image;
    }
-   else
-      if (_mesa_validate_pbo_access
-          (dimensions, unpack, width, height, depth, format, type, pixels)) {
-      const GLubyte *src = ADD_POINTERS(unpack->BufferObj->Data, pixels);
-      return _mesa_unpack_image(dimensions, width, height, depth, format,
-                                type, src, unpack);
+   else if (_mesa_validate_pbo_access(dimensions, unpack, width, height, depth,
+                                      format, type, pixels)) {
+      const GLubyte *map, *src;
+      GLvoid *image;
+
+      map = (GLubyte *)
+         ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
+                               GL_READ_ONLY_ARB, unpack->BufferObj);
+      if (!map) {
+         /* unable to map src buffer! */
+         _mesa_error(ctx, GL_INVALID_OPERATION, "unable to map PBO");
+         return NULL;
+      }
+
+      src = ADD_POINTERS(map, pixels);
+      image = _mesa_unpack_image(dimensions, width, height, depth,
+                                 format, type, src, unpack);
+
+      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
+                              unpack->BufferObj);
+
+      if (!image) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "display list construction");
+      }
+      return image;
    }
    /* bad access! */
    return NULL;
@@ -858,7 +882,6 @@ save_Bitmap(GLsizei width, GLsizei height,
             GLfloat xmove, GLfloat ymove, const GLubyte * pixels)
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLvoid *image = _mesa_unpack_bitmap(width, height, pixels, &ctx->Unpack);
    Node *n;
    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
    n = ALLOC_INSTRUCTION(ctx, OPCODE_BITMAP, 7);
@@ -869,10 +892,7 @@ save_Bitmap(GLsizei width, GLsizei height,
       n[4].f = yorig;
       n[5].f = xmove;
       n[6].f = ymove;
-      n[7].data = image;
-   }
-   else if (image) {
-      _mesa_free(image);
+      n[7].data = _mesa_unpack_bitmap(width, height, pixels, &ctx->Unpack);
    }
    if (ctx->ExecuteFlag) {
       CALL_Bitmap(ctx->Exec, (width, height,
@@ -999,7 +1019,7 @@ _mesa_save_CallList(GLuint list)
 
 
 void GLAPIENTRY
-_mesa_save_CallLists(GLsizei n, GLenum type, const GLvoid * lists)
+_mesa_save_CallLists(GLsizei num, GLenum type, const GLvoid * lists)
 {
    GET_CURRENT_CONTEXT(ctx);
    GLint i;
@@ -1024,7 +1044,7 @@ _mesa_save_CallLists(GLsizei n, GLenum type, const GLvoid * lists)
       typeErrorFlag = GL_TRUE;
    }
 
-   for (i = 0; i < n; i++) {
+   for (i = 0; i < num; i++) {
       GLint list = translate_id(i, type, lists);
       Node *n = ALLOC_INSTRUCTION(ctx, OPCODE_CALL_LIST_OFFSET, 2);
       if (n) {
@@ -1039,7 +1059,7 @@ _mesa_save_CallLists(GLsizei n, GLenum type, const GLvoid * lists)
    invalidate_saved_current_state( ctx );
 
    if (ctx->ExecuteFlag) {
-      CALL_CallLists(ctx->Exec, (n, type, lists));
+      CALL_CallLists(ctx->Exec, (num, type, lists));
    }
 }
 
@@ -1217,8 +1237,6 @@ save_ColorTable(GLenum target, GLenum internalFormat,
                                   format, type, table));
    }
    else {
-      GLvoid *image = unpack_image(1, width, 1, 1, format, type, table,
-                                   &ctx->Unpack);
       Node *n;
       ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
       n = ALLOC_INSTRUCTION(ctx, OPCODE_COLOR_TABLE, 6);
@@ -1228,10 +1246,8 @@ save_ColorTable(GLenum target, GLenum internalFormat,
          n[3].i = width;
          n[4].e = format;
          n[5].e = type;
-         n[6].data = image;
-      }
-      else if (image) {
-         _mesa_free(image);
+         n[6].data = unpack_image(ctx, 1, width, 1, 1, format, type, table,
+                                  &ctx->Unpack);
       }
       if (ctx->ExecuteFlag) {
          CALL_ColorTable(ctx->Exec, (target, internalFormat, width,
@@ -1307,8 +1323,6 @@ save_ColorSubTable(GLenum target, GLsizei start, GLsizei count,
                    GLenum format, GLenum type, const GLvoid * table)
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLvoid *image = unpack_image(1, count, 1, 1, format, type, table,
-                                &ctx->Unpack);
    Node *n;
    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
    n = ALLOC_INSTRUCTION(ctx, OPCODE_COLOR_SUB_TABLE, 6);
@@ -1318,10 +1332,8 @@ save_ColorSubTable(GLenum target, GLsizei start, GLsizei count,
       n[3].i = count;
       n[4].e = format;
       n[5].e = type;
-      n[6].data = image;
-   }
-   else if (image) {
-      _mesa_free(image);
+      n[6].data = unpack_image(ctx, 1, count, 1, 1, format, type, table,
+                               &ctx->Unpack);
    }
    if (ctx->ExecuteFlag) {
       CALL_ColorSubTable(ctx->Exec,
@@ -1379,10 +1391,10 @@ save_ConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width,
                          GLenum format, GLenum type, const GLvoid * filter)
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLvoid *image = unpack_image(1, width, 1, 1, format, type, filter,
-                                &ctx->Unpack);
    Node *n;
+
    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+
    n = ALLOC_INSTRUCTION(ctx, OPCODE_CONVOLUTION_FILTER_1D, 6);
    if (n) {
       n[1].e = target;
@@ -1390,10 +1402,8 @@ save_ConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width,
       n[3].i = width;
       n[4].e = format;
       n[5].e = type;
-      n[6].data = image;
-   }
-   else if (image) {
-      _mesa_free(image);
+      n[6].data = unpack_image(ctx, 1, width, 1, 1, format, type, filter,
+                               &ctx->Unpack);
    }
    if (ctx->ExecuteFlag) {
       CALL_ConvolutionFilter1D(ctx->Exec, (target, internalFormat, width,
@@ -1408,10 +1418,10 @@ save_ConvolutionFilter2D(GLenum target, GLenum internalFormat,
                          GLenum type, const GLvoid * filter)
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLvoid *image = unpack_image(2, width, height, 1, format, type, filter,
-                                &ctx->Unpack);
    Node *n;
+
    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+
    n = ALLOC_INSTRUCTION(ctx, OPCODE_CONVOLUTION_FILTER_2D, 7);
    if (n) {
       n[1].e = target;
@@ -1420,10 +1430,8 @@ save_ConvolutionFilter2D(GLenum target, GLenum internalFormat,
       n[4].i = height;
       n[5].e = format;
       n[6].e = type;
-      n[7].data = image;
-   }
-   else if (image) {
-      _mesa_free(image);
+      n[7].data = unpack_image(ctx, 2, width, height, 1, format, type, filter,
+                               &ctx->Unpack);
    }
    if (ctx->ExecuteFlag) {
       CALL_ConvolutionFilter2D(ctx->Exec,
@@ -1778,20 +1786,18 @@ save_DrawPixels(GLsizei width, GLsizei height,
                 GLenum format, GLenum type, const GLvoid * pixels)
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLvoid *image = unpack_image(2, width, height, 1, format, type,
-                                pixels, &ctx->Unpack);
    Node *n;
+
    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+
    n = ALLOC_INSTRUCTION(ctx, OPCODE_DRAW_PIXELS, 5);
    if (n) {
       n[1].i = width;
       n[2].i = height;
       n[3].e = format;
       n[4].e = type;
-      n[5].data = image;
-   }
-   else if (image) {
-      _mesa_free(image);
+      n[5].data = unpack_image(ctx, 2, width, height, 1, format, type,
+                               pixels, &ctx->Unpack);
    }
    if (ctx->ExecuteFlag) {
       CALL_DrawPixels(ctx->Exec, (width, height, format, type, pixels));
@@ -1880,7 +1886,10 @@ save_Fogfv(GLenum pname, const GLfloat *params)
 static void GLAPIENTRY
 save_Fogf(GLenum pname, GLfloat param)
 {
-   save_Fogfv(pname, &param);
+   GLfloat parray[4];
+   parray[0] = param;
+   parray[1] = parray[2] = parray[3] = 0.0F;
+   save_Fogfv(pname, parray);
 }
 
 
@@ -1904,7 +1913,7 @@ save_Fogiv(GLenum pname, const GLint *params)
       break;
    default:
       /* Error will be caught later in gl_Fogfv */
-      ;
+      ASSIGN_4V(p, 0.0F, 0.0F, 0.0F, 0.0F);
    }
    save_Fogfv(pname, p);
 }
@@ -1913,7 +1922,10 @@ save_Fogiv(GLenum pname, const GLint *params)
 static void GLAPIENTRY
 save_Fogi(GLenum pname, GLint param)
 {
-   save_Fogiv(pname, &param);
+   GLint parray[4];
+   parray[0] = param;
+   parray[1] = parray[2] = parray[3] = 0;
+   save_Fogiv(pname, parray);
 }
 
 
@@ -2077,9 +2089,12 @@ save_Lightfv(GLenum light, GLenum pname, const GLfloat *params)
 
 
 static void GLAPIENTRY
-save_Lightf(GLenum light, GLenum pname, GLfloat params)
+save_Lightf(GLenum light, GLenum pname, GLfloat param)
 {
-   save_Lightfv(light, pname, &params);
+   GLfloat parray[4];
+   parray[0] = param;
+   parray[1] = parray[2] = parray[3] = 0.0F;
+   save_Lightfv(light, pname, parray);
 }
 
 
@@ -2125,7 +2140,10 @@ save_Lightiv(GLenum light, GLenum pname, const GLint *params)
 static void GLAPIENTRY
 save_Lighti(GLenum light, GLenum pname, GLint param)
 {
-   save_Lightiv(light, pname, &param);
+   GLint parray[4];
+   parray[0] = param;
+   parray[1] = parray[2] = parray[3] = 0;
+   save_Lightiv(light, pname, parray);
 }
 
 
@@ -2152,7 +2170,10 @@ save_LightModelfv(GLenum pname, const GLfloat *params)
 static void GLAPIENTRY
 save_LightModelf(GLenum pname, GLfloat param)
 {
-   save_LightModelfv(pname, &param);
+   GLfloat parray[4];
+   parray[0] = param;
+   parray[1] = parray[2] = parray[3] = 0.0F;
+   save_LightModelfv(pname, parray);
 }
 
 
@@ -2174,7 +2195,7 @@ save_LightModeliv(GLenum pname, const GLint *params)
       break;
    default:
       /* Error will be caught later in gl_LightModelfv */
-      ;
+      ASSIGN_4V(fparam, 0.0F, 0.0F, 0.0F, 0.0F);
    }
    save_LightModelfv(pname, fparam);
 }
@@ -2183,7 +2204,10 @@ save_LightModeliv(GLenum pname, const GLint *params)
 static void GLAPIENTRY
 save_LightModeli(GLenum pname, GLint param)
 {
-   save_LightModeliv(pname, &param);
+   GLint parray[4];
+   parray[0] = param;
+   parray[1] = parray[2] = parray[3] = 0;
+   save_LightModeliv(pname, parray);
 }
 
 
@@ -2698,21 +2722,28 @@ save_PointParameterfvEXT(GLenum pname, const GLfloat *params)
 static void GLAPIENTRY
 save_PointParameterfEXT(GLenum pname, GLfloat param)
 {
-   save_PointParameterfvEXT(pname, &param);
+   GLfloat parray[3];
+   parray[0] = param;
+   parray[1] = parray[2] = 0.0F;
+   save_PointParameterfvEXT(pname, parray);
 }
 
 static void GLAPIENTRY
 save_PointParameteriNV(GLenum pname, GLint param)
 {
-   GLfloat p = (GLfloat) param;
-   save_PointParameterfvEXT(pname, &p);
+   GLfloat parray[3];
+   parray[0] = (GLfloat) param;
+   parray[1] = parray[2] = 0.0F;
+   save_PointParameterfvEXT(pname, parray);
 }
 
 static void GLAPIENTRY
 save_PointParameterivNV(GLenum pname, const GLint * param)
 {
-   GLfloat p = (GLfloat) param[0];
-   save_PointParameterfvEXT(pname, &p);
+   GLfloat parray[3];
+   parray[0] = (GLfloat) param[0];
+   parray[1] = parray[2] = 0.0F;
+   save_PointParameterfvEXT(pname, parray);
 }
 
 
@@ -2753,16 +2784,14 @@ static void GLAPIENTRY
 save_PolygonStipple(const GLubyte * pattern)
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLvoid *image = unpack_image(2, 32, 32, 1, GL_COLOR_INDEX, GL_BITMAP,
-                                pattern, &ctx->Unpack);
    Node *n;
+
    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+
    n = ALLOC_INSTRUCTION(ctx, OPCODE_POLYGON_STIPPLE, 1);
    if (n) {
-      n[1].data = image; 
-   }
-   else if (image) {
-      _mesa_free(image);
+      n[1].data = unpack_image(ctx, 2, 32, 32, 1, GL_COLOR_INDEX, GL_BITMAP,
+                               pattern, &ctx->Unpack);
    }
    if (ctx->ExecuteFlag) {
       CALL_PolygonStipple(ctx->Exec, ((GLubyte *) pattern));
@@ -3386,7 +3415,10 @@ save_TexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
 static void GLAPIENTRY
 save_TexEnvf(GLenum target, GLenum pname, GLfloat param)
 {
-   save_TexEnvfv(target, pname, &param);
+   GLfloat parray[4];
+   parray[0] = (GLfloat) param;
+   parray[1] = parray[2] = parray[3] = 0.0F;
+   save_TexEnvfv(target, pname, parray);
 }
 
 
@@ -3454,8 +3486,10 @@ save_TexGeniv(GLenum coord, GLenum pname, const GLint *params)
 static void GLAPIENTRY
 save_TexGend(GLenum coord, GLenum pname, GLdouble param)
 {
-   GLfloat p = (GLfloat) param;
-   save_TexGenfv(coord, pname, &p);
+   GLfloat parray[4];
+   parray[0] = (GLfloat) param;
+   parray[1] = parray[2] = parray[3] = 0.0F;
+   save_TexGenfv(coord, pname, parray);
 }
 
 
@@ -3474,14 +3508,20 @@ save_TexGendv(GLenum coord, GLenum pname, const GLdouble *params)
 static void GLAPIENTRY
 save_TexGenf(GLenum coord, GLenum pname, GLfloat param)
 {
-   save_TexGenfv(coord, pname, &param);
+   GLfloat parray[4];
+   parray[0] = param;
+   parray[1] = parray[2] = parray[3] = 0.0F;
+   save_TexGenfv(coord, pname, parray);
 }
 
 
 static void GLAPIENTRY
 save_TexGeni(GLenum coord, GLenum pname, GLint param)
 {
-   save_TexGeniv(coord, pname, &param);
+   GLint parray[4];
+   parray[0] = param;
+   parray[1] = parray[2] = parray[3] = 0;
+   save_TexGeniv(coord, pname, parray);
 }
 
 
@@ -3509,7 +3549,10 @@ save_TexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
 static void GLAPIENTRY
 save_TexParameterf(GLenum target, GLenum pname, GLfloat param)
 {
-   save_TexParameterfv(target, pname, &param);
+   GLfloat parray[4];
+   parray[0] = param;
+   parray[1] = parray[2] = parray[3] = 0.0F;
+   save_TexParameterfv(target, pname, parray);
 }
 
 
@@ -3546,8 +3589,6 @@ save_TexImage1D(GLenum target,
                                   border, format, type, pixels));
    }
    else {
-      GLvoid *image = unpack_image(1, width, 1, 1, format, type,
-                                   pixels, &ctx->Unpack);
       Node *n;
       ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
       n = ALLOC_INSTRUCTION(ctx, OPCODE_TEX_IMAGE1D, 8);
@@ -3559,10 +3600,8 @@ save_TexImage1D(GLenum target,
          n[5].i = border;
          n[6].e = format;
          n[7].e = type;
-         n[8].data = image;
-      }
-      else if (image) {
-         _mesa_free(image);
+         n[8].data = unpack_image(ctx, 1, width, 1, 1, format, type,
+                                  pixels, &ctx->Unpack);
       }
       if (ctx->ExecuteFlag) {
          CALL_TexImage1D(ctx->Exec, (target, level, components, width,
@@ -3585,8 +3624,6 @@ save_TexImage2D(GLenum target,
                                   height, border, format, type, pixels));
    }
    else {
-      GLvoid *image = unpack_image(2, width, height, 1, format, type,
-                                   pixels, &ctx->Unpack);
       Node *n;
       ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
       n = ALLOC_INSTRUCTION(ctx, OPCODE_TEX_IMAGE2D, 9);
@@ -3599,10 +3636,8 @@ save_TexImage2D(GLenum target,
          n[6].i = border;
          n[7].e = format;
          n[8].e = type;
-         n[9].data = image;
-      }
-      else if (image) {
-         _mesa_free(image);
+         n[9].data = unpack_image(ctx, 2, width, height, 1, format, type,
+                                  pixels, &ctx->Unpack);
       }
       if (ctx->ExecuteFlag) {
          CALL_TexImage2D(ctx->Exec, (target, level, components, width,
@@ -3628,8 +3663,6 @@ save_TexImage3D(GLenum target,
    }
    else {
       Node *n;
-      GLvoid *image = unpack_image(3, width, height, depth, format, type,
-                                   pixels, &ctx->Unpack);
       ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
       n = ALLOC_INSTRUCTION(ctx, OPCODE_TEX_IMAGE3D, 10);
       if (n) {
@@ -3642,10 +3675,8 @@ save_TexImage3D(GLenum target,
          n[7].i = border;
          n[8].e = format;
          n[9].e = type;
-         n[10].data = image;
-      }
-      else if (image) {
-         _mesa_free(image);
+         n[10].data = unpack_image(ctx, 3, width, height, depth, format, type,
+                                   pixels, &ctx->Unpack);
       }
       if (ctx->ExecuteFlag) {
          CALL_TexImage3D(ctx->Exec, (target, level, internalFormat, width,
@@ -3663,9 +3694,9 @@ save_TexSubImage1D(GLenum target, GLint level, GLint xoffset,
 {
    GET_CURRENT_CONTEXT(ctx);
    Node *n;
-   GLvoid *image = unpack_image(1, width, 1, 1, format, type,
-                                pixels, &ctx->Unpack);
+
    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+
    n = ALLOC_INSTRUCTION(ctx, OPCODE_TEX_SUB_IMAGE1D, 7);
    if (n) {
       n[1].e = target;
@@ -3674,10 +3705,8 @@ save_TexSubImage1D(GLenum target, GLint level, GLint xoffset,
       n[4].i = (GLint) width;
       n[5].e = format;
       n[6].e = type;
-      n[7].data = image;
-   }
-   else if (image) {
-      _mesa_free(image);
+      n[7].data = unpack_image(ctx, 1, width, 1, 1, format, type,
+                               pixels, &ctx->Unpack);
    }
    if (ctx->ExecuteFlag) {
       CALL_TexSubImage1D(ctx->Exec, (target, level, xoffset, width,
@@ -3694,9 +3723,9 @@ save_TexSubImage2D(GLenum target, GLint level,
 {
    GET_CURRENT_CONTEXT(ctx);
    Node *n;
-   GLvoid *image = unpack_image(2, width, height, 1, format, type,
-                                pixels, &ctx->Unpack);
+
    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+
    n = ALLOC_INSTRUCTION(ctx, OPCODE_TEX_SUB_IMAGE2D, 9);
    if (n) {
       n[1].e = target;
@@ -3707,10 +3736,8 @@ save_TexSubImage2D(GLenum target, GLint level,
       n[6].i = (GLint) height;
       n[7].e = format;
       n[8].e = type;
-      n[9].data = image;
-   }
-   else if (image) {
-      _mesa_free(image);
+      n[9].data = unpack_image(ctx, 2, width, height, 1, format, type,
+                               pixels, &ctx->Unpack);
    }
    if (ctx->ExecuteFlag) {
       CALL_TexSubImage2D(ctx->Exec, (target, level, xoffset, yoffset,
@@ -3727,9 +3754,9 @@ save_TexSubImage3D(GLenum target, GLint level,
 {
    GET_CURRENT_CONTEXT(ctx);
    Node *n;
-   GLvoid *image = unpack_image(3, width, height, depth, format, type,
-                                pixels, &ctx->Unpack);
+
    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+
    n = ALLOC_INSTRUCTION(ctx, OPCODE_TEX_SUB_IMAGE3D, 11);
    if (n) {
       n[1].e = target;
@@ -3742,10 +3769,8 @@ save_TexSubImage3D(GLenum target, GLint level,
       n[8].i = (GLint) depth;
       n[9].e = format;
       n[10].e = type;
-      n[11].data = image;
-   }
-   else if (image) {
-      _mesa_free(image);
+      n[11].data = unpack_image(ctx, 3, width, height, depth, format, type,
+                                pixels, &ctx->Unpack);
    }
    if (ctx->ExecuteFlag) {
       CALL_TexSubImage3D(ctx->Exec, (target, level,
@@ -4458,18 +4483,17 @@ save_LoadProgramNV(GLenum target, GLuint id, GLsizei len,
 {
    GET_CURRENT_CONTEXT(ctx);
    Node *n;
-   GLubyte *programCopy;
-
-   programCopy = (GLubyte *) _mesa_malloc(len);
-   if (!programCopy) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV");
-      return;
-   }
-   _mesa_memcpy(programCopy, program, len);
 
    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+
    n = ALLOC_INSTRUCTION(ctx, OPCODE_LOAD_PROGRAM_NV, 4);
    if (n) {
+      GLubyte *programCopy = (GLubyte *) _mesa_malloc(len);
+      if (!programCopy) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV");
+         return;
+      }
+      _mesa_memcpy(programCopy, program, len);
       n[1].e = target;
       n[2].ui = id;
       n[3].i = len;
@@ -4486,15 +4510,17 @@ save_RequestResidentProgramsNV(GLsizei num, const GLuint * ids)
 {
    GET_CURRENT_CONTEXT(ctx);
    Node *n;
-   GLuint *idCopy = (GLuint *) _mesa_malloc(num * sizeof(GLuint));
-   if (!idCopy) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glRequestResidentProgramsNV");
-      return;
-   }
-   _mesa_memcpy(idCopy, ids, num * sizeof(GLuint));
+
    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+
    n = ALLOC_INSTRUCTION(ctx, OPCODE_TRACK_MATRIX_NV, 2);
    if (n) {
+      GLuint *idCopy = (GLuint *) _mesa_malloc(num * sizeof(GLuint));
+      if (!idCopy) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glRequestResidentProgramsNV");
+         return;
+      }
+      _mesa_memcpy(idCopy, ids, num * sizeof(GLuint));
       n[1].i = num;
       n[2].data = idCopy;
    }
@@ -4655,16 +4681,17 @@ save_ProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte * name,
 {
    GET_CURRENT_CONTEXT(ctx);
    Node *n;
-   GLubyte *nameCopy = (GLubyte *) _mesa_malloc(len);
-   if (!nameCopy) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramNamedParameter4fNV");
-      return;
-   }
-   _mesa_memcpy(nameCopy, name, len);
 
    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+
    n = ALLOC_INSTRUCTION(ctx, OPCODE_PROGRAM_NAMED_PARAMETER_NV, 6);
    if (n) {
+      GLubyte *nameCopy = (GLubyte *) _mesa_malloc(len);
+      if (!nameCopy) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramNamedParameter4fNV");
+         return;
+      }
+      _mesa_memcpy(nameCopy, name, len);
       n[1].ui = id;
       n[2].i = len;
       n[3].data = nameCopy;
@@ -4753,18 +4780,17 @@ save_ProgramStringARB(GLenum target, GLenum format, GLsizei len,
 {
    GET_CURRENT_CONTEXT(ctx);
    Node *n;
-   GLubyte *programCopy;
-
-   programCopy = (GLubyte *) _mesa_malloc(len);
-   if (!programCopy) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB");
-      return;
-   }
-   _mesa_memcpy(programCopy, string, len);
 
    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+
    n = ALLOC_INSTRUCTION(ctx, OPCODE_PROGRAM_STRING_ARB, 4);
    if (n) {
+      GLubyte *programCopy = (GLubyte *) _mesa_malloc(len);
+      if (!programCopy) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB");
+         return;
+      }
+      _mesa_memcpy(programCopy, string, len);
       n[1].e = target;
       n[2].e = format;
       n[3].i = len;
index 6682b5e..6d31f32 100644 (file)
@@ -27,6 +27,7 @@
 #include "bufferobj.h"
 #include "context.h"
 #include "drawpix.h"
+#include "enums.h"
 #include "feedback.h"
 #include "framebuffer.h"
 #include "image.h"
 #include "state.h"
 
 
+
+/**
+ * If a fragment program is enabled, check that it's valid.
+ * \return GL_TRUE if valid, GL_FALSE otherwise
+ */
+static GLboolean
+valid_fragment_program(GLcontext *ctx)
+{
+   return !(ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled);
+}
+
+
 #if _HAVE_FULL_GL
 
 /*
@@ -51,29 +64,34 @@ _mesa_DrawPixels( GLsizei width, GLsizei height,
       return;
    }
 
+   /* We're not using the current vertex program, and the driver may install
+    * it's own.
+    */
+   _mesa_set_vp_override(ctx, GL_TRUE);
+
    if (ctx->NewState) {
       _mesa_update_state(ctx);
    }
 
-   if (ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled) {
+   if (!valid_fragment_program(ctx)) {
       _mesa_error(ctx, GL_INVALID_OPERATION,
                   "glDrawPixels (invalid fragment program)");
-      return;
+      goto end;
    }
 
    if (_mesa_error_check_format_type(ctx, format, type, GL_TRUE)) {
-      /* found an error */
-      return;
+      /* the error was already recorded */
+      goto end;
    }
 
    if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
       _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
                   "glDrawPixels(incomplete framebuffer)" );
-      return;
+      goto end;
    }
 
    if (!ctx->Current.RasterPosValid) {
-      return;
+      goto end; /* no-op, not an error */
    }
 
    if (ctx->RenderMode == GL_RENDER) {
@@ -88,13 +106,13 @@ _mesa_DrawPixels( GLsizei width, GLsizei height,
                                            format, type, pixels)) {
                _mesa_error(ctx, GL_INVALID_OPERATION,
                            "glDrawPixels(invalid PBO access)");
-               return;
+               goto end;
             }
-            if (ctx->Unpack.BufferObj->Pointer) {
+            if (_mesa_bufferobj_mapped(ctx->Unpack.BufferObj)) {
                /* buffer is mapped - that's an error */
                _mesa_error(ctx, GL_INVALID_OPERATION,
                            "glDrawPixels(PBO is mapped)");
-               return;
+               goto end;
             }
          }
 
@@ -116,6 +134,9 @@ _mesa_DrawPixels( GLsizei width, GLsizei height,
       ASSERT(ctx->RenderMode == GL_SELECT);
       /* Do nothing.  See OpenGL Spec, Appendix B, Corollary 6. */
    }
+
+end:
+   _mesa_set_vp_override(ctx, GL_FALSE);
 }
 
 
@@ -126,37 +147,48 @@ _mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height,
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
+   if (width < 0 || height < 0) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glCopyPixels(width or height < 0)");
+      return;
+   }
+
+   if (type != GL_COLOR && type != GL_DEPTH && type != GL_STENCIL) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glCopyPixels(type=%s)",
+                  _mesa_lookup_enum_by_nr(type));
+      return;
+   }
+
+   /* We're not using the current vertex program, and the driver may install
+    * it's own.
+    */
+   _mesa_set_vp_override(ctx, GL_TRUE);
+
    if (ctx->NewState) {
       _mesa_update_state(ctx);
    }
 
-   if (ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled) {
+   if (!valid_fragment_program(ctx)) {
       _mesa_error(ctx, GL_INVALID_OPERATION,
                   "glCopyPixels (invalid fragment program)");
-      return;
-   }
-
-   if (width < 0 || height < 0) {
-      _mesa_error(ctx, GL_INVALID_VALUE, "glCopyPixels(width or height < 0)");
-      return;
+      goto end;
    }
 
    if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT ||
        ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
       _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
                   "glCopyPixels(incomplete framebuffer)" );
-      return;
+      goto end;
    }
 
    if (!_mesa_source_buffer_exists(ctx, type) ||
        !_mesa_dest_buffer_exists(ctx, type)) {
       _mesa_error(ctx, GL_INVALID_OPERATION,
                   "glCopyPixels(missing source or dest buffer)");
-      return;
+      goto end;
    }
 
    if (!ctx->Current.RasterPosValid || width ==0 || height == 0) {
-      return;
+      goto end; /* no-op, not an error */
    }
 
    if (ctx->RenderMode == GL_RENDER) {
@@ -181,6 +213,9 @@ _mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height,
       ASSERT(ctx->RenderMode == GL_SELECT);
       /* Do nothing.  See OpenGL Spec, Appendix B, Corollary 6. */
    }
+
+end:
+   _mesa_set_vp_override(ctx, GL_FALSE);
 }
 
 #endif /* _HAVE_FULL_GL */
@@ -208,7 +243,7 @@ _mesa_Bitmap( GLsizei width, GLsizei height,
       _mesa_update_state(ctx);
    }
 
-   if (ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled) {
+   if (!valid_fragment_program(ctx)) {
       _mesa_error(ctx, GL_INVALID_OPERATION,
                   "glBitmap (invalid fragment program)");
       return;
@@ -235,7 +270,7 @@ _mesa_Bitmap( GLsizei width, GLsizei height,
                         "glBitmap(invalid PBO access)");
             return;
          }
-         if (ctx->Unpack.BufferObj->Pointer) {
+         if (_mesa_bufferobj_mapped(ctx->Unpack.BufferObj)) {
             /* buffer is mapped - that's an error */
             _mesa_error(ctx, GL_INVALID_OPERATION, "glBitmap(PBO is mapped)");
             return;
@@ -264,68 +299,3 @@ _mesa_Bitmap( GLsizei width, GLsizei height,
    ctx->Current.RasterPos[0] += xmove;
    ctx->Current.RasterPos[1] += ymove;
 }
-
-
-
-#if 0  /* experimental */
-/*
- * Execute glDrawDepthPixelsMESA().  This function accepts both a color
- * image and depth (Z) image.  Rasterization produces fragments with
- * color and Z taken from these images.  This function is intended for
- * Z-compositing.  Normally, this operation requires two glDrawPixels
- * calls with stencil testing.
- */
-void GLAPIENTRY
-_mesa_DrawDepthPixelsMESA( GLsizei width, GLsizei height,
-                           GLenum colorFormat, GLenum colorType,
-                           const GLvoid *colors,
-                           GLenum depthType, const GLvoid *depths )
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
-
-   if (width < 0 || height < 0) {
-      _mesa_error( ctx, GL_INVALID_VALUE,
-                   "glDrawDepthPixelsMESA(width or height < 0" );
-      return;
-   }
-
-   if (!ctx->Current.RasterPosValid) {
-      return;
-   }
-
-   if (ctx->NewState) {
-      _mesa_update_state(ctx);
-   }
-
-   if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
-      _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
-                  "glDrawDepthPixelsMESA(incomplete framebuffer)");
-      return;
-   }
-
-   if (ctx->RenderMode == GL_RENDER) {
-      /* Round, to satisfy conformance tests (matches SGI's OpenGL) */
-      GLint x = IROUND(ctx->Current.RasterPos[0]);
-      GLint y = IROUND(ctx->Current.RasterPos[1]);
-      ctx->Driver.DrawDepthPixelsMESA(ctx, x, y, width, height,
-                                      colorFormat, colorType, colors,
-                                      depthType, depths, &ctx->Unpack);
-   }
-   else if (ctx->RenderMode == GL_FEEDBACK) {
-      /* Feedback the current raster pos info */
-      FLUSH_CURRENT( ctx, 0 );
-      _mesa_feedback_token( ctx, (GLfloat) (GLint) GL_DRAW_PIXEL_TOKEN );
-      _mesa_feedback_vertex( ctx,
-                             ctx->Current.RasterPos,
-                             ctx->Current.RasterColor,
-                             ctx->Current.RasterIndex,
-                             ctx->Current.RasterTexCoords[0] );
-   }
-   else {
-      ASSERT(ctx->RenderMode == GL_SELECT);
-      /* Do nothing.  See OpenGL Spec, Appendix B, Corollary 6. */
-   }
-}
-
-#endif
index 48268fc..4bc5477 100644 (file)
@@ -972,6 +972,11 @@ _mesa_set_enable(GLcontext *ctx, GLenum cap, GLboolean state)
          }
          break;
 
+      case GL_TEXTURE_CUBE_MAP_SEAMLESS:
+        CHECK_EXTENSION(ARB_seamless_cube_map, cap);
+        ctx->Texture.CubeMapSeamless = state;
+        break;
+
       default:
          _mesa_error(ctx, GL_INVALID_ENUM,
                      "%s(0x%x)", state ? "glEnable" : "glDisable", cap);
@@ -1395,6 +1400,11 @@ _mesa_IsEnabled( GLenum cap )
         CHECK_EXTENSION(ATI_fragment_shader);
         return ctx->ATIFragmentShader.Enabled;
 #endif /* FEATURE_ATI_fragment_shader */
+
+      case GL_TEXTURE_CUBE_MAP_SEAMLESS:
+        CHECK_EXTENSION(ARB_seamless_cube_map);
+        return ctx->Texture.CubeMapSeamless;
+
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glIsEnabled(0x%x)", (int) cap);
         return GL_FALSE;
index 6e2adea..ad40bb6 100644 (file)
@@ -139,10 +139,12 @@ LONGSTRING static const char enum_string_table[] =
    "GL_BOOL_VEC4_ARB\0"
    "GL_BUFFER_ACCESS\0"
    "GL_BUFFER_ACCESS_ARB\0"
+   "GL_BUFFER_FLUSHING_UNMAP_APPLE\0"
    "GL_BUFFER_MAPPED\0"
    "GL_BUFFER_MAPPED_ARB\0"
    "GL_BUFFER_MAP_POINTER\0"
    "GL_BUFFER_MAP_POINTER_ARB\0"
+   "GL_BUFFER_SERIALIZED_MODIFY_APPLE\0"
    "GL_BUFFER_SIZE\0"
    "GL_BUFFER_SIZE_ARB\0"
    "GL_BUFFER_USAGE\0"
@@ -1542,6 +1544,9 @@ LONGSTRING static const char enum_string_table[] =
    "GL_STENCIL_VALUE_MASK\0"
    "GL_STENCIL_WRITEMASK\0"
    "GL_STEREO\0"
+   "GL_STORAGE_CACHED_APPLE\0"
+   "GL_STORAGE_PRIVATE_APPLE\0"
+   "GL_STORAGE_SHARED_APPLE\0"
    "GL_STREAM_COPY\0"
    "GL_STREAM_COPY_ARB\0"
    "GL_STREAM_DRAW\0"
@@ -1691,6 +1696,7 @@ LONGSTRING static const char enum_string_table[] =
    "GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB\0"
    "GL_TEXTURE_CUBE_MAP_POSITIVE_Z\0"
    "GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB\0"
+   "GL_TEXTURE_CUBE_MAP_SEAMLESS\0"
    "GL_TEXTURE_DEPTH\0"
    "GL_TEXTURE_DEPTH_SIZE\0"
    "GL_TEXTURE_DEPTH_SIZE_ARB\0"
@@ -1730,6 +1736,8 @@ LONGSTRING static const char enum_string_table[] =
    "GL_TEXTURE_MIN_FILTER\0"
    "GL_TEXTURE_MIN_LOD\0"
    "GL_TEXTURE_PRIORITY\0"
+   "GL_TEXTURE_RANGE_LENGTH_APPLE\0"
+   "GL_TEXTURE_RANGE_POINTER_APPLE\0"
    "GL_TEXTURE_RECTANGLE_ARB\0"
    "GL_TEXTURE_RECTANGLE_NV\0"
    "GL_TEXTURE_RED_SIZE\0"
@@ -1737,6 +1745,7 @@ LONGSTRING static const char enum_string_table[] =
    "GL_TEXTURE_RESIDENT\0"
    "GL_TEXTURE_STACK_DEPTH\0"
    "GL_TEXTURE_STENCIL_SIZE\0"
+   "GL_TEXTURE_STORAGE_HINT_APPLE\0"
    "GL_TEXTURE_TOO_LARGE_EXT\0"
    "GL_TEXTURE_UNSIGNED_REMAP_MODE_NV\0"
    "GL_TEXTURE_WIDTH\0"
@@ -1871,7 +1880,7 @@ LONGSTRING static const char enum_string_table[] =
    "GL_ZOOM_Y\0"
    ;
 
-static const enum_elt all_enums[1833] =
+static const enum_elt all_enums[1842] =
 {
    {     0, 0x00000600 }, /* GL_2D */
    {     6, 0x00001407 }, /* GL_2_BYTES */
@@ -1976,3064 +1985,3081 @@ static const enum_elt all_enums[1833] =
    {  1632, 0x00008B59 }, /* GL_BOOL_VEC4_ARB */
    {  1649, 0x000088BB }, /* GL_BUFFER_ACCESS */
    {  1666, 0x000088BB }, /* GL_BUFFER_ACCESS_ARB */
-   {  1687, 0x000088BC }, /* GL_BUFFER_MAPPED */
-   {  1704, 0x000088BC }, /* GL_BUFFER_MAPPED_ARB */
-   {  1725, 0x000088BD }, /* GL_BUFFER_MAP_POINTER */
-   {  1747, 0x000088BD }, /* GL_BUFFER_MAP_POINTER_ARB */
-   {  1773, 0x00008764 }, /* GL_BUFFER_SIZE */
-   {  1788, 0x00008764 }, /* GL_BUFFER_SIZE_ARB */
-   {  1807, 0x00008765 }, /* GL_BUFFER_USAGE */
-   {  1823, 0x00008765 }, /* GL_BUFFER_USAGE_ARB */
-   {  1843, 0x0000877B }, /* GL_BUMP_ENVMAP_ATI */
-   {  1862, 0x00008777 }, /* GL_BUMP_NUM_TEX_UNITS_ATI */
-   {  1888, 0x00008775 }, /* GL_BUMP_ROT_MATRIX_ATI */
-   {  1911, 0x00008776 }, /* GL_BUMP_ROT_MATRIX_SIZE_ATI */
-   {  1939, 0x0000877C }, /* GL_BUMP_TARGET_ATI */
-   {  1958, 0x00008778 }, /* GL_BUMP_TEX_UNITS_ATI */
-   {  1980, 0x00001400 }, /* GL_BYTE */
-   {  1988, 0x00002A24 }, /* GL_C3F_V3F */
-   {  1999, 0x00002A26 }, /* GL_C4F_N3F_V3F */
-   {  2014, 0x00002A22 }, /* GL_C4UB_V2F */
-   {  2026, 0x00002A23 }, /* GL_C4UB_V3F */
-   {  2038, 0x00000901 }, /* GL_CCW */
-   {  2045, 0x00002900 }, /* GL_CLAMP */
-   {  2054, 0x0000812D }, /* GL_CLAMP_TO_BORDER */
-   {  2073, 0x0000812D }, /* GL_CLAMP_TO_BORDER_ARB */
-   {  2096, 0x0000812D }, /* GL_CLAMP_TO_BORDER_SGIS */
-   {  2120, 0x0000812F }, /* GL_CLAMP_TO_EDGE */
-   {  2137, 0x0000812F }, /* GL_CLAMP_TO_EDGE_SGIS */
-   {  2159, 0x00001500 }, /* GL_CLEAR */
-   {  2168, 0x000084E1 }, /* GL_CLIENT_ACTIVE_TEXTURE */
-   {  2193, 0x000084E1 }, /* GL_CLIENT_ACTIVE_TEXTURE_ARB */
-   {  2222, 0xFFFFFFFF }, /* GL_CLIENT_ALL_ATTRIB_BITS */
-   {  2248, 0x00000BB1 }, /* GL_CLIENT_ATTRIB_STACK_DEPTH */
-   {  2277, 0x00000001 }, /* GL_CLIENT_PIXEL_STORE_BIT */
-   {  2303, 0x00000002 }, /* GL_CLIENT_VERTEX_ARRAY_BIT */
-   {  2330, 0x00003000 }, /* GL_CLIP_PLANE0 */
-   {  2345, 0x00003001 }, /* GL_CLIP_PLANE1 */
-   {  2360, 0x00003002 }, /* GL_CLIP_PLANE2 */
-   {  2375, 0x00003003 }, /* GL_CLIP_PLANE3 */
-   {  2390, 0x00003004 }, /* GL_CLIP_PLANE4 */
-   {  2405, 0x00003005 }, /* GL_CLIP_PLANE5 */
-   {  2420, 0x000080F0 }, /* GL_CLIP_VOLUME_CLIPPING_HINT_EXT */
-   {  2453, 0x00000A00 }, /* GL_COEFF */
-   {  2462, 0x00001800 }, /* GL_COLOR */
-   {  2471, 0x00008076 }, /* GL_COLOR_ARRAY */
-   {  2486, 0x00008898 }, /* GL_COLOR_ARRAY_BUFFER_BINDING */
-   {  2516, 0x00008898 }, /* GL_COLOR_ARRAY_BUFFER_BINDING_ARB */
-   {  2550, 0x00008090 }, /* GL_COLOR_ARRAY_POINTER */
-   {  2573, 0x00008081 }, /* GL_COLOR_ARRAY_SIZE */
-   {  2593, 0x00008083 }, /* GL_COLOR_ARRAY_STRIDE */
-   {  2615, 0x00008082 }, /* GL_COLOR_ARRAY_TYPE */
-   {  2635, 0x00008CE0 }, /* GL_COLOR_ATTACHMENT0 */
-   {  2656, 0x00008CE0 }, /* GL_COLOR_ATTACHMENT0_EXT */
-   {  2681, 0x00008CE1 }, /* GL_COLOR_ATTACHMENT1 */
-   {  2702, 0x00008CEA }, /* GL_COLOR_ATTACHMENT10 */
-   {  2724, 0x00008CEA }, /* GL_COLOR_ATTACHMENT10_EXT */
-   {  2750, 0x00008CEB }, /* GL_COLOR_ATTACHMENT11 */
-   {  2772, 0x00008CEB }, /* GL_COLOR_ATTACHMENT11_EXT */
-   {  2798, 0x00008CEC }, /* GL_COLOR_ATTACHMENT12 */
-   {  2820, 0x00008CEC }, /* GL_COLOR_ATTACHMENT12_EXT */
-   {  2846, 0x00008CED }, /* GL_COLOR_ATTACHMENT13 */
-   {  2868, 0x00008CED }, /* GL_COLOR_ATTACHMENT13_EXT */
-   {  2894, 0x00008CEE }, /* GL_COLOR_ATTACHMENT14 */
-   {  2916, 0x00008CEE }, /* GL_COLOR_ATTACHMENT14_EXT */
-   {  2942, 0x00008CEF }, /* GL_COLOR_ATTACHMENT15 */
-   {  2964, 0x00008CEF }, /* GL_COLOR_ATTACHMENT15_EXT */
-   {  2990, 0x00008CE1 }, /* GL_COLOR_ATTACHMENT1_EXT */
-   {  3015, 0x00008CE2 }, /* GL_COLOR_ATTACHMENT2 */
-   {  3036, 0x00008CE2 }, /* GL_COLOR_ATTACHMENT2_EXT */
-   {  3061, 0x00008CE3 }, /* GL_COLOR_ATTACHMENT3 */
-   {  3082, 0x00008CE3 }, /* GL_COLOR_ATTACHMENT3_EXT */
-   {  3107, 0x00008CE4 }, /* GL_COLOR_ATTACHMENT4 */
-   {  3128, 0x00008CE4 }, /* GL_COLOR_ATTACHMENT4_EXT */
-   {  3153, 0x00008CE5 }, /* GL_COLOR_ATTACHMENT5 */
-   {  3174, 0x00008CE5 }, /* GL_COLOR_ATTACHMENT5_EXT */
-   {  3199, 0x00008CE6 }, /* GL_COLOR_ATTACHMENT6 */
-   {  3220, 0x00008CE6 }, /* GL_COLOR_ATTACHMENT6_EXT */
-   {  3245, 0x00008CE7 }, /* GL_COLOR_ATTACHMENT7 */
-   {  3266, 0x00008CE7 }, /* GL_COLOR_ATTACHMENT7_EXT */
-   {  3291, 0x00008CE8 }, /* GL_COLOR_ATTACHMENT8 */
-   {  3312, 0x00008CE8 }, /* GL_COLOR_ATTACHMENT8_EXT */
-   {  3337, 0x00008CE9 }, /* GL_COLOR_ATTACHMENT9 */
-   {  3358, 0x00008CE9 }, /* GL_COLOR_ATTACHMENT9_EXT */
-   {  3383, 0x00004000 }, /* GL_COLOR_BUFFER_BIT */
-   {  3403, 0x00000C22 }, /* GL_COLOR_CLEAR_VALUE */
-   {  3424, 0x00001900 }, /* GL_COLOR_INDEX */
-   {  3439, 0x00001603 }, /* GL_COLOR_INDEXES */
-   {  3456, 0x00000BF2 }, /* GL_COLOR_LOGIC_OP */
-   {  3474, 0x00000B57 }, /* GL_COLOR_MATERIAL */
-   {  3492, 0x00000B55 }, /* GL_COLOR_MATERIAL_FACE */
-   {  3515, 0x00000B56 }, /* GL_COLOR_MATERIAL_PARAMETER */
-   {  3543, 0x000080B1 }, /* GL_COLOR_MATRIX */
-   {  3559, 0x000080B1 }, /* GL_COLOR_MATRIX_SGI */
-   {  3579, 0x000080B2 }, /* GL_COLOR_MATRIX_STACK_DEPTH */
-   {  3607, 0x000080B2 }, /* GL_COLOR_MATRIX_STACK_DEPTH_SGI */
-   {  3639, 0x00008458 }, /* GL_COLOR_SUM */
-   {  3652, 0x00008458 }, /* GL_COLOR_SUM_ARB */
-   {  3669, 0x000080D0 }, /* GL_COLOR_TABLE */
-   {  3684, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE */
-   {  3710, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE_EXT */
-   {  3740, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE_SGI */
-   {  3770, 0x000080D7 }, /* GL_COLOR_TABLE_BIAS */
-   {  3790, 0x000080D7 }, /* GL_COLOR_TABLE_BIAS_SGI */
-   {  3814, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE */
-   {  3839, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE_EXT */
-   {  3868, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE_SGI */
-   {  3897, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT */
-   {  3919, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT_EXT */
-   {  3945, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT_SGI */
-   {  3971, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE */
-   {  3997, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE_EXT */
-   {  4027, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE_SGI */
-   {  4057, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE */
-   {  4087, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE_EXT */
-   {  4121, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE_SGI */
-   {  4155, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE */
-   {  4185, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE_EXT */
-   {  4219, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE_SGI */
-   {  4253, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE */
-   {  4277, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE_EXT */
-   {  4305, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE_SGI */
-   {  4333, 0x000080D6 }, /* GL_COLOR_TABLE_SCALE */
-   {  4354, 0x000080D6 }, /* GL_COLOR_TABLE_SCALE_SGI */
-   {  4379, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH */
-   {  4400, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH_EXT */
-   {  4425, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH_SGI */
-   {  4450, 0x00000C23 }, /* GL_COLOR_WRITEMASK */
-   {  4469, 0x00008570 }, /* GL_COMBINE */
-   {  4480, 0x00008503 }, /* GL_COMBINE4 */
-   {  4492, 0x00008572 }, /* GL_COMBINE_ALPHA */
-   {  4509, 0x00008572 }, /* GL_COMBINE_ALPHA_ARB */
-   {  4530, 0x00008572 }, /* GL_COMBINE_ALPHA_EXT */
-   {  4551, 0x00008570 }, /* GL_COMBINE_ARB */
-   {  4566, 0x00008570 }, /* GL_COMBINE_EXT */
-   {  4581, 0x00008571 }, /* GL_COMBINE_RGB */
-   {  4596, 0x00008571 }, /* GL_COMBINE_RGB_ARB */
-   {  4615, 0x00008571 }, /* GL_COMBINE_RGB_EXT */
-   {  4634, 0x0000884E }, /* GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT */
-   {  4670, 0x0000884E }, /* GL_COMPARE_R_TO_TEXTURE */
-   {  4694, 0x0000884E }, /* GL_COMPARE_R_TO_TEXTURE_ARB */
-   {  4722, 0x00001300 }, /* GL_COMPILE */
-   {  4733, 0x00001301 }, /* GL_COMPILE_AND_EXECUTE */
-   {  4756, 0x00008B81 }, /* GL_COMPILE_STATUS */
-   {  4774, 0x000084E9 }, /* GL_COMPRESSED_ALPHA */
-   {  4794, 0x000084E9 }, /* GL_COMPRESSED_ALPHA_ARB */
-   {  4818, 0x000084EC }, /* GL_COMPRESSED_INTENSITY */
-   {  4842, 0x000084EC }, /* GL_COMPRESSED_INTENSITY_ARB */
-   {  4870, 0x000084EA }, /* GL_COMPRESSED_LUMINANCE */
-   {  4894, 0x000084EB }, /* GL_COMPRESSED_LUMINANCE_ALPHA */
-   {  4924, 0x000084EB }, /* GL_COMPRESSED_LUMINANCE_ALPHA_ARB */
-   {  4958, 0x000084EA }, /* GL_COMPRESSED_LUMINANCE_ARB */
-   {  4986, 0x000084ED }, /* GL_COMPRESSED_RGB */
-   {  5004, 0x000084EE }, /* GL_COMPRESSED_RGBA */
-   {  5023, 0x000084EE }, /* GL_COMPRESSED_RGBA_ARB */
-   {  5046, 0x000086B1 }, /* GL_COMPRESSED_RGBA_FXT1_3DFX */
-   {  5075, 0x000083F1 }, /* GL_COMPRESSED_RGBA_S3TC_DXT1_EXT */
-   {  5108, 0x000083F2 }, /* GL_COMPRESSED_RGBA_S3TC_DXT3_EXT */
-   {  5141, 0x000083F3 }, /* GL_COMPRESSED_RGBA_S3TC_DXT5_EXT */
-   {  5174, 0x000084ED }, /* GL_COMPRESSED_RGB_ARB */
-   {  5196, 0x000086B0 }, /* GL_COMPRESSED_RGB_FXT1_3DFX */
-   {  5224, 0x000083F0 }, /* GL_COMPRESSED_RGB_S3TC_DXT1_EXT */
-   {  5256, 0x00008C4A }, /* GL_COMPRESSED_SLUMINANCE */
-   {  5281, 0x00008C4B }, /* GL_COMPRESSED_SLUMINANCE_ALPHA */
-   {  5312, 0x00008C48 }, /* GL_COMPRESSED_SRGB */
-   {  5331, 0x00008C49 }, /* GL_COMPRESSED_SRGB_ALPHA */
-   {  5356, 0x000086A3 }, /* GL_COMPRESSED_TEXTURE_FORMATS */
-   {  5386, 0x00008576 }, /* GL_CONSTANT */
-   {  5398, 0x00008003 }, /* GL_CONSTANT_ALPHA */
-   {  5416, 0x00008003 }, /* GL_CONSTANT_ALPHA_EXT */
-   {  5438, 0x00008576 }, /* GL_CONSTANT_ARB */
-   {  5454, 0x00001207 }, /* GL_CONSTANT_ATTENUATION */
-   {  5478, 0x00008151 }, /* GL_CONSTANT_BORDER_HP */
-   {  5500, 0x00008001 }, /* GL_CONSTANT_COLOR */
-   {  5518, 0x00008001 }, /* GL_CONSTANT_COLOR_EXT */
-   {  5540, 0x00008576 }, /* GL_CONSTANT_EXT */
-   {  5556, 0x00008010 }, /* GL_CONVOLUTION_1D */
-   {  5574, 0x00008011 }, /* GL_CONVOLUTION_2D */
-   {  5592, 0x00008154 }, /* GL_CONVOLUTION_BORDER_COLOR */
-   {  5620, 0x00008154 }, /* GL_CONVOLUTION_BORDER_COLOR_HP */
-   {  5651, 0x00008013 }, /* GL_CONVOLUTION_BORDER_MODE */
-   {  5678, 0x00008013 }, /* GL_CONVOLUTION_BORDER_MODE_EXT */
-   {  5709, 0x00008015 }, /* GL_CONVOLUTION_FILTER_BIAS */
-   {  5736, 0x00008015 }, /* GL_CONVOLUTION_FILTER_BIAS_EXT */
-   {  5767, 0x00008014 }, /* GL_CONVOLUTION_FILTER_SCALE */
-   {  5795, 0x00008014 }, /* GL_CONVOLUTION_FILTER_SCALE_EXT */
-   {  5827, 0x00008017 }, /* GL_CONVOLUTION_FORMAT */
-   {  5849, 0x00008017 }, /* GL_CONVOLUTION_FORMAT_EXT */
-   {  5875, 0x00008019 }, /* GL_CONVOLUTION_HEIGHT */
-   {  5897, 0x00008019 }, /* GL_CONVOLUTION_HEIGHT_EXT */
-   {  5923, 0x00008018 }, /* GL_CONVOLUTION_WIDTH */
-   {  5944, 0x00008018 }, /* GL_CONVOLUTION_WIDTH_EXT */
-   {  5969, 0x00008862 }, /* GL_COORD_REPLACE */
-   {  5986, 0x00008862 }, /* GL_COORD_REPLACE_ARB */
-   {  6007, 0x00008862 }, /* GL_COORD_REPLACE_NV */
-   {  6027, 0x00001503 }, /* GL_COPY */
-   {  6035, 0x0000150C }, /* GL_COPY_INVERTED */
-   {  6052, 0x00000706 }, /* GL_COPY_PIXEL_TOKEN */
-   {  6072, 0x00008F36 }, /* GL_COPY_READ_BUFFER */
-   {  6092, 0x00008F37 }, /* GL_COPY_WRITE_BUFFER */
-   {  6113, 0x00000B44 }, /* GL_CULL_FACE */
-   {  6126, 0x00000B45 }, /* GL_CULL_FACE_MODE */
-   {  6144, 0x000081AA }, /* GL_CULL_VERTEX_EXT */
-   {  6163, 0x000081AC }, /* GL_CULL_VERTEX_EYE_POSITION_EXT */
-   {  6195, 0x000081AB }, /* GL_CULL_VERTEX_OBJECT_POSITION_EXT */
-   {  6230, 0x00008626 }, /* GL_CURRENT_ATTRIB_NV */
-   {  6251, 0x00000001 }, /* GL_CURRENT_BIT */
-   {  6266, 0x00000B00 }, /* GL_CURRENT_COLOR */
-   {  6283, 0x00008453 }, /* GL_CURRENT_FOG_COORD */
-   {  6304, 0x00008453 }, /* GL_CURRENT_FOG_COORDINATE */
-   {  6330, 0x00000B01 }, /* GL_CURRENT_INDEX */
-   {  6347, 0x00008641 }, /* GL_CURRENT_MATRIX_ARB */
-   {  6369, 0x00008845 }, /* GL_CURRENT_MATRIX_INDEX_ARB */
-   {  6397, 0x00008641 }, /* GL_CURRENT_MATRIX_NV */
-   {  6418, 0x00008640 }, /* GL_CURRENT_MATRIX_STACK_DEPTH_ARB */
-   {  6452, 0x00008640 }, /* GL_CURRENT_MATRIX_STACK_DEPTH_NV */
-   {  6485, 0x00000B02 }, /* GL_CURRENT_NORMAL */
-   {  6503, 0x00008843 }, /* GL_CURRENT_PALETTE_MATRIX_ARB */
-   {  6533, 0x00008B8D }, /* GL_CURRENT_PROGRAM */
-   {  6552, 0x00008865 }, /* GL_CURRENT_QUERY */
-   {  6569, 0x00008865 }, /* GL_CURRENT_QUERY_ARB */
-   {  6590, 0x00000B04 }, /* GL_CURRENT_RASTER_COLOR */
-   {  6614, 0x00000B09 }, /* GL_CURRENT_RASTER_DISTANCE */
-   {  6641, 0x00000B05 }, /* GL_CURRENT_RASTER_INDEX */
-   {  6665, 0x00000B07 }, /* GL_CURRENT_RASTER_POSITION */
-   {  6692, 0x00000B08 }, /* GL_CURRENT_RASTER_POSITION_VALID */
-   {  6725, 0x0000845F }, /* GL_CURRENT_RASTER_SECONDARY_COLOR */
-   {  6759, 0x00000B06 }, /* GL_CURRENT_RASTER_TEXTURE_COORDS */
-   {  6792, 0x00008459 }, /* GL_CURRENT_SECONDARY_COLOR */
-   {  6819, 0x00000B03 }, /* GL_CURRENT_TEXTURE_COORDS */
-   {  6845, 0x00008626 }, /* GL_CURRENT_VERTEX_ATTRIB */
-   {  6870, 0x00008626 }, /* GL_CURRENT_VERTEX_ATTRIB_ARB */
-   {  6899, 0x000086A8 }, /* GL_CURRENT_WEIGHT_ARB */
-   {  6921, 0x00000900 }, /* GL_CW */
-   {  6927, 0x0000875B }, /* GL_DEBUG_ASSERT_MESA */
-   {  6948, 0x00008759 }, /* GL_DEBUG_OBJECT_MESA */
-   {  6969, 0x0000875A }, /* GL_DEBUG_PRINT_MESA */
-   {  6989, 0x00002101 }, /* GL_DECAL */
-   {  6998, 0x00001E03 }, /* GL_DECR */
-   {  7006, 0x00008508 }, /* GL_DECR_WRAP */
-   {  7019, 0x00008508 }, /* GL_DECR_WRAP_EXT */
-   {  7036, 0x00008B80 }, /* GL_DELETE_STATUS */
-   {  7053, 0x00001801 }, /* GL_DEPTH */
-   {  7062, 0x000088F0 }, /* GL_DEPTH24_STENCIL8 */
-   {  7082, 0x00008D00 }, /* GL_DEPTH_ATTACHMENT */
-   {  7102, 0x00008D00 }, /* GL_DEPTH_ATTACHMENT_EXT */
-   {  7126, 0x00000D1F }, /* GL_DEPTH_BIAS */
-   {  7140, 0x00000D56 }, /* GL_DEPTH_BITS */
-   {  7154, 0x00008891 }, /* GL_DEPTH_BOUNDS_EXT */
-   {  7174, 0x00008890 }, /* GL_DEPTH_BOUNDS_TEST_EXT */
-   {  7199, 0x00000100 }, /* GL_DEPTH_BUFFER_BIT */
-   {  7219, 0x0000864F }, /* GL_DEPTH_CLAMP_NV */
-   {  7237, 0x00000B73 }, /* GL_DEPTH_CLEAR_VALUE */
-   {  7258, 0x00001902 }, /* GL_DEPTH_COMPONENT */
-   {  7277, 0x000081A5 }, /* GL_DEPTH_COMPONENT16 */
-   {  7298, 0x000081A5 }, /* GL_DEPTH_COMPONENT16_ARB */
-   {  7323, 0x000081A5 }, /* GL_DEPTH_COMPONENT16_SGIX */
-   {  7349, 0x000081A6 }, /* GL_DEPTH_COMPONENT24 */
-   {  7370, 0x000081A6 }, /* GL_DEPTH_COMPONENT24_ARB */
-   {  7395, 0x000081A6 }, /* GL_DEPTH_COMPONENT24_SGIX */
-   {  7421, 0x000081A7 }, /* GL_DEPTH_COMPONENT32 */
-   {  7442, 0x000081A7 }, /* GL_DEPTH_COMPONENT32_ARB */
-   {  7467, 0x000081A7 }, /* GL_DEPTH_COMPONENT32_SGIX */
-   {  7493, 0x00000B74 }, /* GL_DEPTH_FUNC */
-   {  7507, 0x00000B70 }, /* GL_DEPTH_RANGE */
-   {  7522, 0x00000D1E }, /* GL_DEPTH_SCALE */
-   {  7537, 0x000084F9 }, /* GL_DEPTH_STENCIL */
-   {  7554, 0x0000821A }, /* GL_DEPTH_STENCIL_ATTACHMENT */
-   {  7582, 0x000084F9 }, /* GL_DEPTH_STENCIL_NV */
-   {  7602, 0x0000886F }, /* GL_DEPTH_STENCIL_TO_BGRA_NV */
-   {  7630, 0x0000886E }, /* GL_DEPTH_STENCIL_TO_RGBA_NV */
-   {  7658, 0x00000B71 }, /* GL_DEPTH_TEST */
-   {  7672, 0x0000884B }, /* GL_DEPTH_TEXTURE_MODE */
-   {  7694, 0x0000884B }, /* GL_DEPTH_TEXTURE_MODE_ARB */
-   {  7720, 0x00000B72 }, /* GL_DEPTH_WRITEMASK */
-   {  7739, 0x00001201 }, /* GL_DIFFUSE */
-   {  7750, 0x00000BD0 }, /* GL_DITHER */
-   {  7760, 0x00000A02 }, /* GL_DOMAIN */
-   {  7770, 0x00001100 }, /* GL_DONT_CARE */
-   {  7783, 0x000086AE }, /* GL_DOT3_RGB */
-   {  7795, 0x000086AF }, /* GL_DOT3_RGBA */
-   {  7808, 0x000086AF }, /* GL_DOT3_RGBA_ARB */
-   {  7825, 0x00008741 }, /* GL_DOT3_RGBA_EXT */
-   {  7842, 0x000086AE }, /* GL_DOT3_RGB_ARB */
-   {  7858, 0x00008740 }, /* GL_DOT3_RGB_EXT */
-   {  7874, 0x0000140A }, /* GL_DOUBLE */
-   {  7884, 0x00000C32 }, /* GL_DOUBLEBUFFER */
-   {  7900, 0x00000C01 }, /* GL_DRAW_BUFFER */
-   {  7915, 0x00008825 }, /* GL_DRAW_BUFFER0 */
-   {  7931, 0x00008825 }, /* GL_DRAW_BUFFER0_ARB */
-   {  7951, 0x00008825 }, /* GL_DRAW_BUFFER0_ATI */
-   {  7971, 0x00008826 }, /* GL_DRAW_BUFFER1 */
-   {  7987, 0x0000882F }, /* GL_DRAW_BUFFER10 */
-   {  8004, 0x0000882F }, /* GL_DRAW_BUFFER10_ARB */
-   {  8025, 0x0000882F }, /* GL_DRAW_BUFFER10_ATI */
-   {  8046, 0x00008830 }, /* GL_DRAW_BUFFER11 */
-   {  8063, 0x00008830 }, /* GL_DRAW_BUFFER11_ARB */
-   {  8084, 0x00008830 }, /* GL_DRAW_BUFFER11_ATI */
-   {  8105, 0x00008831 }, /* GL_DRAW_BUFFER12 */
-   {  8122, 0x00008831 }, /* GL_DRAW_BUFFER12_ARB */
-   {  8143, 0x00008831 }, /* GL_DRAW_BUFFER12_ATI */
-   {  8164, 0x00008832 }, /* GL_DRAW_BUFFER13 */
-   {  8181, 0x00008832 }, /* GL_DRAW_BUFFER13_ARB */
-   {  8202, 0x00008832 }, /* GL_DRAW_BUFFER13_ATI */
-   {  8223, 0x00008833 }, /* GL_DRAW_BUFFER14 */
-   {  8240, 0x00008833 }, /* GL_DRAW_BUFFER14_ARB */
-   {  8261, 0x00008833 }, /* GL_DRAW_BUFFER14_ATI */
-   {  8282, 0x00008834 }, /* GL_DRAW_BUFFER15 */
-   {  8299, 0x00008834 }, /* GL_DRAW_BUFFER15_ARB */
-   {  8320, 0x00008834 }, /* GL_DRAW_BUFFER15_ATI */
-   {  8341, 0x00008826 }, /* GL_DRAW_BUFFER1_ARB */
-   {  8361, 0x00008826 }, /* GL_DRAW_BUFFER1_ATI */
-   {  8381, 0x00008827 }, /* GL_DRAW_BUFFER2 */
-   {  8397, 0x00008827 }, /* GL_DRAW_BUFFER2_ARB */
-   {  8417, 0x00008827 }, /* GL_DRAW_BUFFER2_ATI */
-   {  8437, 0x00008828 }, /* GL_DRAW_BUFFER3 */
-   {  8453, 0x00008828 }, /* GL_DRAW_BUFFER3_ARB */
-   {  8473, 0x00008828 }, /* GL_DRAW_BUFFER3_ATI */
-   {  8493, 0x00008829 }, /* GL_DRAW_BUFFER4 */
-   {  8509, 0x00008829 }, /* GL_DRAW_BUFFER4_ARB */
-   {  8529, 0x00008829 }, /* GL_DRAW_BUFFER4_ATI */
-   {  8549, 0x0000882A }, /* GL_DRAW_BUFFER5 */
-   {  8565, 0x0000882A }, /* GL_DRAW_BUFFER5_ARB */
-   {  8585, 0x0000882A }, /* GL_DRAW_BUFFER5_ATI */
-   {  8605, 0x0000882B }, /* GL_DRAW_BUFFER6 */
-   {  8621, 0x0000882B }, /* GL_DRAW_BUFFER6_ARB */
-   {  8641, 0x0000882B }, /* GL_DRAW_BUFFER6_ATI */
-   {  8661, 0x0000882C }, /* GL_DRAW_BUFFER7 */
-   {  8677, 0x0000882C }, /* GL_DRAW_BUFFER7_ARB */
-   {  8697, 0x0000882C }, /* GL_DRAW_BUFFER7_ATI */
-   {  8717, 0x0000882D }, /* GL_DRAW_BUFFER8 */
-   {  8733, 0x0000882D }, /* GL_DRAW_BUFFER8_ARB */
-   {  8753, 0x0000882D }, /* GL_DRAW_BUFFER8_ATI */
-   {  8773, 0x0000882E }, /* GL_DRAW_BUFFER9 */
-   {  8789, 0x0000882E }, /* GL_DRAW_BUFFER9_ARB */
-   {  8809, 0x0000882E }, /* GL_DRAW_BUFFER9_ATI */
-   {  8829, 0x00008CA9 }, /* GL_DRAW_FRAMEBUFFER */
-   {  8849, 0x00008CA6 }, /* GL_DRAW_FRAMEBUFFER_BINDING_EXT */
-   {  8881, 0x00008CA9 }, /* GL_DRAW_FRAMEBUFFER_EXT */
-   {  8905, 0x00000705 }, /* GL_DRAW_PIXEL_TOKEN */
-   {  8925, 0x00000304 }, /* GL_DST_ALPHA */
-   {  8938, 0x00000306 }, /* GL_DST_COLOR */
-   {  8951, 0x0000877A }, /* GL_DU8DV8_ATI */
-   {  8965, 0x00008779 }, /* GL_DUDV_ATI */
-   {  8977, 0x000088EA }, /* GL_DYNAMIC_COPY */
-   {  8993, 0x000088EA }, /* GL_DYNAMIC_COPY_ARB */
-   {  9013, 0x000088E8 }, /* GL_DYNAMIC_DRAW */
-   {  9029, 0x000088E8 }, /* GL_DYNAMIC_DRAW_ARB */
-   {  9049, 0x000088E9 }, /* GL_DYNAMIC_READ */
-   {  9065, 0x000088E9 }, /* GL_DYNAMIC_READ_ARB */
-   {  9085, 0x00000B43 }, /* GL_EDGE_FLAG */
-   {  9098, 0x00008079 }, /* GL_EDGE_FLAG_ARRAY */
-   {  9117, 0x0000889B }, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING */
-   {  9151, 0x0000889B }, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB */
-   {  9189, 0x00008093 }, /* GL_EDGE_FLAG_ARRAY_POINTER */
-   {  9216, 0x0000808C }, /* GL_EDGE_FLAG_ARRAY_STRIDE */
-   {  9242, 0x00008893 }, /* GL_ELEMENT_ARRAY_BUFFER */
-   {  9266, 0x00008895 }, /* GL_ELEMENT_ARRAY_BUFFER_BINDING */
-   {  9298, 0x00008895 }, /* GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB */
-   {  9334, 0x00001600 }, /* GL_EMISSION */
-   {  9346, 0x00002000 }, /* GL_ENABLE_BIT */
-   {  9360, 0x00000202 }, /* GL_EQUAL */
-   {  9369, 0x00001509 }, /* GL_EQUIV */
-   {  9378, 0x00010000 }, /* GL_EVAL_BIT */
-   {  9390, 0x00000800 }, /* GL_EXP */
-   {  9397, 0x00000801 }, /* GL_EXP2 */
-   {  9405, 0x00001F03 }, /* GL_EXTENSIONS */
-   {  9419, 0x00002400 }, /* GL_EYE_LINEAR */
-   {  9433, 0x00002502 }, /* GL_EYE_PLANE */
-   {  9446, 0x0000855C }, /* GL_EYE_PLANE_ABSOLUTE_NV */
-   {  9471, 0x0000855B }, /* GL_EYE_RADIAL_NV */
-   {  9488, 0x00000000 }, /* GL_FALSE */
-   {  9497, 0x00001101 }, /* GL_FASTEST */
-   {  9508, 0x00001C01 }, /* GL_FEEDBACK */
-   {  9520, 0x00000DF0 }, /* GL_FEEDBACK_BUFFER_POINTER */
-   {  9547, 0x00000DF1 }, /* GL_FEEDBACK_BUFFER_SIZE */
-   {  9571, 0x00000DF2 }, /* GL_FEEDBACK_BUFFER_TYPE */
-   {  9595, 0x00001B02 }, /* GL_FILL */
-   {  9603, 0x00008E4D }, /* GL_FIRST_VERTEX_CONVENTION_EXT */
-   {  9634, 0x00001D00 }, /* GL_FLAT */
-   {  9642, 0x00001406 }, /* GL_FLOAT */
-   {  9651, 0x00008B5A }, /* GL_FLOAT_MAT2 */
-   {  9665, 0x00008B5A }, /* GL_FLOAT_MAT2_ARB */
-   {  9683, 0x00008B65 }, /* GL_FLOAT_MAT2x3 */
-   {  9699, 0x00008B66 }, /* GL_FLOAT_MAT2x4 */
-   {  9715, 0x00008B5B }, /* GL_FLOAT_MAT3 */
-   {  9729, 0x00008B5B }, /* GL_FLOAT_MAT3_ARB */
-   {  9747, 0x00008B67 }, /* GL_FLOAT_MAT3x2 */
-   {  9763, 0x00008B68 }, /* GL_FLOAT_MAT3x4 */
-   {  9779, 0x00008B5C }, /* GL_FLOAT_MAT4 */
-   {  9793, 0x00008B5C }, /* GL_FLOAT_MAT4_ARB */
-   {  9811, 0x00008B69 }, /* GL_FLOAT_MAT4x2 */
-   {  9827, 0x00008B6A }, /* GL_FLOAT_MAT4x3 */
-   {  9843, 0x00008B50 }, /* GL_FLOAT_VEC2 */
-   {  9857, 0x00008B50 }, /* GL_FLOAT_VEC2_ARB */
-   {  9875, 0x00008B51 }, /* GL_FLOAT_VEC3 */
-   {  9889, 0x00008B51 }, /* GL_FLOAT_VEC3_ARB */
-   {  9907, 0x00008B52 }, /* GL_FLOAT_VEC4 */
-   {  9921, 0x00008B52 }, /* GL_FLOAT_VEC4_ARB */
-   {  9939, 0x00000B60 }, /* GL_FOG */
-   {  9946, 0x00000080 }, /* GL_FOG_BIT */
-   {  9957, 0x00000B66 }, /* GL_FOG_COLOR */
-   {  9970, 0x00008451 }, /* GL_FOG_COORD */
-   {  9983, 0x00008451 }, /* GL_FOG_COORDINATE */
-   { 10001, 0x00008457 }, /* GL_FOG_COORDINATE_ARRAY */
-   { 10025, 0x0000889D }, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING */
-   { 10064, 0x0000889D }, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB */
-   { 10107, 0x00008456 }, /* GL_FOG_COORDINATE_ARRAY_POINTER */
-   { 10139, 0x00008455 }, /* GL_FOG_COORDINATE_ARRAY_STRIDE */
-   { 10170, 0x00008454 }, /* GL_FOG_COORDINATE_ARRAY_TYPE */
-   { 10199, 0x00008450 }, /* GL_FOG_COORDINATE_SOURCE */
-   { 10224, 0x00008457 }, /* GL_FOG_COORD_ARRAY */
-   { 10243, 0x0000889D }, /* GL_FOG_COORD_ARRAY_BUFFER_BINDING */
-   { 10277, 0x00008456 }, /* GL_FOG_COORD_ARRAY_POINTER */
-   { 10304, 0x00008455 }, /* GL_FOG_COORD_ARRAY_STRIDE */
-   { 10330, 0x00008454 }, /* GL_FOG_COORD_ARRAY_TYPE */
-   { 10354, 0x00008450 }, /* GL_FOG_COORD_SRC */
-   { 10371, 0x00000B62 }, /* GL_FOG_DENSITY */
-   { 10386, 0x0000855A }, /* GL_FOG_DISTANCE_MODE_NV */
-   { 10410, 0x00000B64 }, /* GL_FOG_END */
-   { 10421, 0x00000C54 }, /* GL_FOG_HINT */
-   { 10433, 0x00000B61 }, /* GL_FOG_INDEX */
-   { 10446, 0x00000B65 }, /* GL_FOG_MODE */
-   { 10458, 0x00008198 }, /* GL_FOG_OFFSET_SGIX */
-   { 10477, 0x00008199 }, /* GL_FOG_OFFSET_VALUE_SGIX */
-   { 10502, 0x00000B63 }, /* GL_FOG_START */
-   { 10515, 0x00008452 }, /* GL_FRAGMENT_DEPTH */
-   { 10533, 0x00008804 }, /* GL_FRAGMENT_PROGRAM_ARB */
-   { 10557, 0x00008B30 }, /* GL_FRAGMENT_SHADER */
-   { 10576, 0x00008B30 }, /* GL_FRAGMENT_SHADER_ARB */
-   { 10599, 0x00008B8B }, /* GL_FRAGMENT_SHADER_DERIVATIVE_HINT */
-   { 10634, 0x00008D40 }, /* GL_FRAMEBUFFER */
-   { 10649, 0x00008215 }, /* GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE */
-   { 10686, 0x00008214 }, /* GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE */
-   { 10722, 0x00008210 }, /* GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING */
-   { 10763, 0x00008211 }, /* GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE */
-   { 10804, 0x00008216 }, /* GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE */
-   { 10841, 0x00008213 }, /* GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE */
-   { 10878, 0x00008CD1 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME */
-   { 10916, 0x00008CD1 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT */
-   { 10958, 0x00008CD0 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE */
-   { 10996, 0x00008CD0 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT */
-   { 11038, 0x00008212 }, /* GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE */
-   { 11073, 0x00008217 }, /* GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE */
-   { 11112, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT */
-   { 11161, 0x00008CD3 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE */
-   { 11209, 0x00008CD3 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT */
-   { 11261, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */
-   { 11301, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */
-   { 11345, 0x00008CD2 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL */
-   { 11385, 0x00008CD2 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT */
-   { 11429, 0x00008CA6 }, /* GL_FRAMEBUFFER_BINDING_EXT */
-   { 11456, 0x00008CD5 }, /* GL_FRAMEBUFFER_COMPLETE */
-   { 11480, 0x00008CD5 }, /* GL_FRAMEBUFFER_COMPLETE_EXT */
-   { 11508, 0x00008218 }, /* GL_FRAMEBUFFER_DEFAULT */
-   { 11531, 0x00008D40 }, /* GL_FRAMEBUFFER_EXT */
-   { 11550, 0x00008CD6 }, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT */
-   { 11587, 0x00008CD6 }, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT */
-   { 11628, 0x00008CD9 }, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT */
-   { 11669, 0x00008CDB }, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT */
-   { 11711, 0x00008CD8 }, /* GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT */
-   { 11762, 0x00008CDA }, /* GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT */
-   { 11800, 0x00008CD7 }, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT */
-   { 11845, 0x00008CD7 }, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT */
-   { 11894, 0x00008D56 }, /* GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE */
-   { 11932, 0x00008CDC }, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT */
-   { 11974, 0x00008CDE }, /* GL_FRAMEBUFFER_STATUS_ERROR_EXT */
-   { 12006, 0x00008219 }, /* GL_FRAMEBUFFER_UNDEFINED */
-   { 12031, 0x00008CDD }, /* GL_FRAMEBUFFER_UNSUPPORTED */
-   { 12058, 0x00008CDD }, /* GL_FRAMEBUFFER_UNSUPPORTED_EXT */
-   { 12089, 0x00000404 }, /* GL_FRONT */
-   { 12098, 0x00000408 }, /* GL_FRONT_AND_BACK */
-   { 12116, 0x00000B46 }, /* GL_FRONT_FACE */
-   { 12130, 0x00000400 }, /* GL_FRONT_LEFT */
-   { 12144, 0x00000401 }, /* GL_FRONT_RIGHT */
-   { 12159, 0x00008006 }, /* GL_FUNC_ADD */
-   { 12171, 0x00008006 }, /* GL_FUNC_ADD_EXT */
-   { 12187, 0x0000800B }, /* GL_FUNC_REVERSE_SUBTRACT */
-   { 12212, 0x0000800B }, /* GL_FUNC_REVERSE_SUBTRACT_EXT */
-   { 12241, 0x0000800A }, /* GL_FUNC_SUBTRACT */
-   { 12258, 0x0000800A }, /* GL_FUNC_SUBTRACT_EXT */
-   { 12279, 0x00008191 }, /* GL_GENERATE_MIPMAP */
-   { 12298, 0x00008192 }, /* GL_GENERATE_MIPMAP_HINT */
-   { 12322, 0x00008192 }, /* GL_GENERATE_MIPMAP_HINT_SGIS */
-   { 12351, 0x00008191 }, /* GL_GENERATE_MIPMAP_SGIS */
-   { 12375, 0x00000206 }, /* GL_GEQUAL */
-   { 12385, 0x00000204 }, /* GL_GREATER */
-   { 12396, 0x00001904 }, /* GL_GREEN */
-   { 12405, 0x00000D19 }, /* GL_GREEN_BIAS */
-   { 12419, 0x00000D53 }, /* GL_GREEN_BITS */
-   { 12433, 0x00000D18 }, /* GL_GREEN_SCALE */
-   { 12448, 0x00008000 }, /* GL_HINT_BIT */
-   { 12460, 0x00008024 }, /* GL_HISTOGRAM */
-   { 12473, 0x0000802B }, /* GL_HISTOGRAM_ALPHA_SIZE */
-   { 12497, 0x0000802B }, /* GL_HISTOGRAM_ALPHA_SIZE_EXT */
-   { 12525, 0x0000802A }, /* GL_HISTOGRAM_BLUE_SIZE */
-   { 12548, 0x0000802A }, /* GL_HISTOGRAM_BLUE_SIZE_EXT */
-   { 12575, 0x00008024 }, /* GL_HISTOGRAM_EXT */
-   { 12592, 0x00008027 }, /* GL_HISTOGRAM_FORMAT */
-   { 12612, 0x00008027 }, /* GL_HISTOGRAM_FORMAT_EXT */
-   { 12636, 0x00008029 }, /* GL_HISTOGRAM_GREEN_SIZE */
-   { 12660, 0x00008029 }, /* GL_HISTOGRAM_GREEN_SIZE_EXT */
-   { 12688, 0x0000802C }, /* GL_HISTOGRAM_LUMINANCE_SIZE */
-   { 12716, 0x0000802C }, /* GL_HISTOGRAM_LUMINANCE_SIZE_EXT */
-   { 12748, 0x00008028 }, /* GL_HISTOGRAM_RED_SIZE */
-   { 12770, 0x00008028 }, /* GL_HISTOGRAM_RED_SIZE_EXT */
-   { 12796, 0x0000802D }, /* GL_HISTOGRAM_SINK */
-   { 12814, 0x0000802D }, /* GL_HISTOGRAM_SINK_EXT */
-   { 12836, 0x00008026 }, /* GL_HISTOGRAM_WIDTH */
-   { 12855, 0x00008026 }, /* GL_HISTOGRAM_WIDTH_EXT */
-   { 12878, 0x0000862A }, /* GL_IDENTITY_NV */
-   { 12893, 0x00008150 }, /* GL_IGNORE_BORDER_HP */
-   { 12913, 0x00008B9B }, /* GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES */
-   { 12953, 0x00008B9A }, /* GL_IMPLEMENTATION_COLOR_READ_TYPE_OES */
-   { 12991, 0x00001E02 }, /* GL_INCR */
-   { 12999, 0x00008507 }, /* GL_INCR_WRAP */
-   { 13012, 0x00008507 }, /* GL_INCR_WRAP_EXT */
-   { 13029, 0x00008222 }, /* GL_INDEX */
-   { 13038, 0x00008077 }, /* GL_INDEX_ARRAY */
-   { 13053, 0x00008899 }, /* GL_INDEX_ARRAY_BUFFER_BINDING */
-   { 13083, 0x00008899 }, /* GL_INDEX_ARRAY_BUFFER_BINDING_ARB */
-   { 13117, 0x00008091 }, /* GL_INDEX_ARRAY_POINTER */
-   { 13140, 0x00008086 }, /* GL_INDEX_ARRAY_STRIDE */
-   { 13162, 0x00008085 }, /* GL_INDEX_ARRAY_TYPE */
-   { 13182, 0x00000D51 }, /* GL_INDEX_BITS */
-   { 13196, 0x00000C20 }, /* GL_INDEX_CLEAR_VALUE */
-   { 13217, 0x00000BF1 }, /* GL_INDEX_LOGIC_OP */
-   { 13235, 0x00000C30 }, /* GL_INDEX_MODE */
-   { 13249, 0x00000D13 }, /* GL_INDEX_OFFSET */
-   { 13265, 0x00000D12 }, /* GL_INDEX_SHIFT */
-   { 13280, 0x00000C21 }, /* GL_INDEX_WRITEMASK */
-   { 13299, 0x00008B84 }, /* GL_INFO_LOG_LENGTH */
-   { 13318, 0x00001404 }, /* GL_INT */
-   { 13325, 0x00008049 }, /* GL_INTENSITY */
-   { 13338, 0x0000804C }, /* GL_INTENSITY12 */
-   { 13353, 0x0000804C }, /* GL_INTENSITY12_EXT */
-   { 13372, 0x0000804D }, /* GL_INTENSITY16 */
-   { 13387, 0x0000804D }, /* GL_INTENSITY16_EXT */
-   { 13406, 0x0000804A }, /* GL_INTENSITY4 */
-   { 13420, 0x0000804A }, /* GL_INTENSITY4_EXT */
-   { 13438, 0x0000804B }, /* GL_INTENSITY8 */
-   { 13452, 0x0000804B }, /* GL_INTENSITY8_EXT */
-   { 13470, 0x00008049 }, /* GL_INTENSITY_EXT */
-   { 13487, 0x00008575 }, /* GL_INTERPOLATE */
-   { 13502, 0x00008575 }, /* GL_INTERPOLATE_ARB */
-   { 13521, 0x00008575 }, /* GL_INTERPOLATE_EXT */
-   { 13540, 0x00008B53 }, /* GL_INT_VEC2 */
-   { 13552, 0x00008B53 }, /* GL_INT_VEC2_ARB */
-   { 13568, 0x00008B54 }, /* GL_INT_VEC3 */
-   { 13580, 0x00008B54 }, /* GL_INT_VEC3_ARB */
-   { 13596, 0x00008B55 }, /* GL_INT_VEC4 */
-   { 13608, 0x00008B55 }, /* GL_INT_VEC4_ARB */
-   { 13624, 0x00000500 }, /* GL_INVALID_ENUM */
-   { 13640, 0x00000506 }, /* GL_INVALID_FRAMEBUFFER_OPERATION */
-   { 13673, 0x00000506 }, /* GL_INVALID_FRAMEBUFFER_OPERATION_EXT */
-   { 13710, 0x00000502 }, /* GL_INVALID_OPERATION */
-   { 13731, 0x00000501 }, /* GL_INVALID_VALUE */
-   { 13748, 0x0000862B }, /* GL_INVERSE_NV */
-   { 13762, 0x0000862D }, /* GL_INVERSE_TRANSPOSE_NV */
-   { 13786, 0x0000150A }, /* GL_INVERT */
-   { 13796, 0x00001E00 }, /* GL_KEEP */
-   { 13804, 0x00008E4E }, /* GL_LAST_VERTEX_CONVENTION_EXT */
-   { 13834, 0x00000406 }, /* GL_LEFT */
-   { 13842, 0x00000203 }, /* GL_LEQUAL */
-   { 13852, 0x00000201 }, /* GL_LESS */
-   { 13860, 0x00004000 }, /* GL_LIGHT0 */
-   { 13870, 0x00004001 }, /* GL_LIGHT1 */
-   { 13880, 0x00004002 }, /* GL_LIGHT2 */
-   { 13890, 0x00004003 }, /* GL_LIGHT3 */
-   { 13900, 0x00004004 }, /* GL_LIGHT4 */
-   { 13910, 0x00004005 }, /* GL_LIGHT5 */
-   { 13920, 0x00004006 }, /* GL_LIGHT6 */
-   { 13930, 0x00004007 }, /* GL_LIGHT7 */
-   { 13940, 0x00000B50 }, /* GL_LIGHTING */
-   { 13952, 0x00000040 }, /* GL_LIGHTING_BIT */
-   { 13968, 0x00000B53 }, /* GL_LIGHT_MODEL_AMBIENT */
-   { 13991, 0x000081F8 }, /* GL_LIGHT_MODEL_COLOR_CONTROL */
-   { 14020, 0x000081F8 }, /* GL_LIGHT_MODEL_COLOR_CONTROL_EXT */
-   { 14053, 0x00000B51 }, /* GL_LIGHT_MODEL_LOCAL_VIEWER */
-   { 14081, 0x00000B52 }, /* GL_LIGHT_MODEL_TWO_SIDE */
-   { 14105, 0x00001B01 }, /* GL_LINE */
-   { 14113, 0x00002601 }, /* GL_LINEAR */
-   { 14123, 0x00001208 }, /* GL_LINEAR_ATTENUATION */
-   { 14145, 0x00008170 }, /* GL_LINEAR_CLIPMAP_LINEAR_SGIX */
-   { 14175, 0x0000844F }, /* GL_LINEAR_CLIPMAP_NEAREST_SGIX */
-   { 14206, 0x00002703 }, /* GL_LINEAR_MIPMAP_LINEAR */
-   { 14230, 0x00002701 }, /* GL_LINEAR_MIPMAP_NEAREST */
-   { 14255, 0x00000001 }, /* GL_LINES */
-   { 14264, 0x00000004 }, /* GL_LINE_BIT */
-   { 14276, 0x00000002 }, /* GL_LINE_LOOP */
-   { 14289, 0x00000707 }, /* GL_LINE_RESET_TOKEN */
-   { 14309, 0x00000B20 }, /* GL_LINE_SMOOTH */
-   { 14324, 0x00000C52 }, /* GL_LINE_SMOOTH_HINT */
-   { 14344, 0x00000B24 }, /* GL_LINE_STIPPLE */
-   { 14360, 0x00000B25 }, /* GL_LINE_STIPPLE_PATTERN */
-   { 14384, 0x00000B26 }, /* GL_LINE_STIPPLE_REPEAT */
-   { 14407, 0x00000003 }, /* GL_LINE_STRIP */
-   { 14421, 0x00000702 }, /* GL_LINE_TOKEN */
-   { 14435, 0x00000B21 }, /* GL_LINE_WIDTH */
-   { 14449, 0x00000B23 }, /* GL_LINE_WIDTH_GRANULARITY */
-   { 14475, 0x00000B22 }, /* GL_LINE_WIDTH_RANGE */
-   { 14495, 0x00008B82 }, /* GL_LINK_STATUS */
-   { 14510, 0x00000B32 }, /* GL_LIST_BASE */
-   { 14523, 0x00020000 }, /* GL_LIST_BIT */
-   { 14535, 0x00000B33 }, /* GL_LIST_INDEX */
-   { 14549, 0x00000B30 }, /* GL_LIST_MODE */
-   { 14562, 0x00000101 }, /* GL_LOAD */
-   { 14570, 0x00000BF1 }, /* GL_LOGIC_OP */
-   { 14582, 0x00000BF0 }, /* GL_LOGIC_OP_MODE */
-   { 14599, 0x00008CA1 }, /* GL_LOWER_LEFT */
-   { 14613, 0x00001909 }, /* GL_LUMINANCE */
-   { 14626, 0x00008041 }, /* GL_LUMINANCE12 */
-   { 14641, 0x00008047 }, /* GL_LUMINANCE12_ALPHA12 */
-   { 14664, 0x00008047 }, /* GL_LUMINANCE12_ALPHA12_EXT */
-   { 14691, 0x00008046 }, /* GL_LUMINANCE12_ALPHA4 */
-   { 14713, 0x00008046 }, /* GL_LUMINANCE12_ALPHA4_EXT */
-   { 14739, 0x00008041 }, /* GL_LUMINANCE12_EXT */
-   { 14758, 0x00008042 }, /* GL_LUMINANCE16 */
-   { 14773, 0x00008048 }, /* GL_LUMINANCE16_ALPHA16 */
-   { 14796, 0x00008048 }, /* GL_LUMINANCE16_ALPHA16_EXT */
-   { 14823, 0x00008042 }, /* GL_LUMINANCE16_EXT */
-   { 14842, 0x0000803F }, /* GL_LUMINANCE4 */
-   { 14856, 0x00008043 }, /* GL_LUMINANCE4_ALPHA4 */
-   { 14877, 0x00008043 }, /* GL_LUMINANCE4_ALPHA4_EXT */
-   { 14902, 0x0000803F }, /* GL_LUMINANCE4_EXT */
-   { 14920, 0x00008044 }, /* GL_LUMINANCE6_ALPHA2 */
-   { 14941, 0x00008044 }, /* GL_LUMINANCE6_ALPHA2_EXT */
-   { 14966, 0x00008040 }, /* GL_LUMINANCE8 */
-   { 14980, 0x00008045 }, /* GL_LUMINANCE8_ALPHA8 */
-   { 15001, 0x00008045 }, /* GL_LUMINANCE8_ALPHA8_EXT */
-   { 15026, 0x00008040 }, /* GL_LUMINANCE8_EXT */
-   { 15044, 0x0000190A }, /* GL_LUMINANCE_ALPHA */
-   { 15063, 0x00000D90 }, /* GL_MAP1_COLOR_4 */
-   { 15079, 0x00000DD0 }, /* GL_MAP1_GRID_DOMAIN */
-   { 15099, 0x00000DD1 }, /* GL_MAP1_GRID_SEGMENTS */
-   { 15121, 0x00000D91 }, /* GL_MAP1_INDEX */
-   { 15135, 0x00000D92 }, /* GL_MAP1_NORMAL */
-   { 15150, 0x00000D93 }, /* GL_MAP1_TEXTURE_COORD_1 */
-   { 15174, 0x00000D94 }, /* GL_MAP1_TEXTURE_COORD_2 */
-   { 15198, 0x00000D95 }, /* GL_MAP1_TEXTURE_COORD_3 */
-   { 15222, 0x00000D96 }, /* GL_MAP1_TEXTURE_COORD_4 */
-   { 15246, 0x00000D97 }, /* GL_MAP1_VERTEX_3 */
-   { 15263, 0x00000D98 }, /* GL_MAP1_VERTEX_4 */
-   { 15280, 0x00008660 }, /* GL_MAP1_VERTEX_ATTRIB0_4_NV */
-   { 15308, 0x0000866A }, /* GL_MAP1_VERTEX_ATTRIB10_4_NV */
-   { 15337, 0x0000866B }, /* GL_MAP1_VERTEX_ATTRIB11_4_NV */
-   { 15366, 0x0000866C }, /* GL_MAP1_VERTEX_ATTRIB12_4_NV */
-   { 15395, 0x0000866D }, /* GL_MAP1_VERTEX_ATTRIB13_4_NV */
-   { 15424, 0x0000866E }, /* GL_MAP1_VERTEX_ATTRIB14_4_NV */
-   { 15453, 0x0000866F }, /* GL_MAP1_VERTEX_ATTRIB15_4_NV */
-   { 15482, 0x00008661 }, /* GL_MAP1_VERTEX_ATTRIB1_4_NV */
-   { 15510, 0x00008662 }, /* GL_MAP1_VERTEX_ATTRIB2_4_NV */
-   { 15538, 0x00008663 }, /* GL_MAP1_VERTEX_ATTRIB3_4_NV */
-   { 15566, 0x00008664 }, /* GL_MAP1_VERTEX_ATTRIB4_4_NV */
-   { 15594, 0x00008665 }, /* GL_MAP1_VERTEX_ATTRIB5_4_NV */
-   { 15622, 0x00008666 }, /* GL_MAP1_VERTEX_ATTRIB6_4_NV */
-   { 15650, 0x00008667 }, /* GL_MAP1_VERTEX_ATTRIB7_4_NV */
-   { 15678, 0x00008668 }, /* GL_MAP1_VERTEX_ATTRIB8_4_NV */
-   { 15706, 0x00008669 }, /* GL_MAP1_VERTEX_ATTRIB9_4_NV */
-   { 15734, 0x00000DB0 }, /* GL_MAP2_COLOR_4 */
-   { 15750, 0x00000DD2 }, /* GL_MAP2_GRID_DOMAIN */
-   { 15770, 0x00000DD3 }, /* GL_MAP2_GRID_SEGMENTS */
-   { 15792, 0x00000DB1 }, /* GL_MAP2_INDEX */
-   { 15806, 0x00000DB2 }, /* GL_MAP2_NORMAL */
-   { 15821, 0x00000DB3 }, /* GL_MAP2_TEXTURE_COORD_1 */
-   { 15845, 0x00000DB4 }, /* GL_MAP2_TEXTURE_COORD_2 */
-   { 15869, 0x00000DB5 }, /* GL_MAP2_TEXTURE_COORD_3 */
-   { 15893, 0x00000DB6 }, /* GL_MAP2_TEXTURE_COORD_4 */
-   { 15917, 0x00000DB7 }, /* GL_MAP2_VERTEX_3 */
-   { 15934, 0x00000DB8 }, /* GL_MAP2_VERTEX_4 */
-   { 15951, 0x00008670 }, /* GL_MAP2_VERTEX_ATTRIB0_4_NV */
-   { 15979, 0x0000867A }, /* GL_MAP2_VERTEX_ATTRIB10_4_NV */
-   { 16008, 0x0000867B }, /* GL_MAP2_VERTEX_ATTRIB11_4_NV */
-   { 16037, 0x0000867C }, /* GL_MAP2_VERTEX_ATTRIB12_4_NV */
-   { 16066, 0x0000867D }, /* GL_MAP2_VERTEX_ATTRIB13_4_NV */
-   { 16095, 0x0000867E }, /* GL_MAP2_VERTEX_ATTRIB14_4_NV */
-   { 16124, 0x0000867F }, /* GL_MAP2_VERTEX_ATTRIB15_4_NV */
-   { 16153, 0x00008671 }, /* GL_MAP2_VERTEX_ATTRIB1_4_NV */
-   { 16181, 0x00008672 }, /* GL_MAP2_VERTEX_ATTRIB2_4_NV */
-   { 16209, 0x00008673 }, /* GL_MAP2_VERTEX_ATTRIB3_4_NV */
-   { 16237, 0x00008674 }, /* GL_MAP2_VERTEX_ATTRIB4_4_NV */
-   { 16265, 0x00008675 }, /* GL_MAP2_VERTEX_ATTRIB5_4_NV */
-   { 16293, 0x00008676 }, /* GL_MAP2_VERTEX_ATTRIB6_4_NV */
-   { 16321, 0x00008677 }, /* GL_MAP2_VERTEX_ATTRIB7_4_NV */
-   { 16349, 0x00008678 }, /* GL_MAP2_VERTEX_ATTRIB8_4_NV */
-   { 16377, 0x00008679 }, /* GL_MAP2_VERTEX_ATTRIB9_4_NV */
-   { 16405, 0x00000D10 }, /* GL_MAP_COLOR */
-   { 16418, 0x00000010 }, /* GL_MAP_FLUSH_EXPLICIT_BIT */
-   { 16444, 0x00000008 }, /* GL_MAP_INVALIDATE_BUFFER_BIT */
-   { 16473, 0x00000004 }, /* GL_MAP_INVALIDATE_RANGE_BIT */
-   { 16501, 0x00000001 }, /* GL_MAP_READ_BIT */
-   { 16517, 0x00000D11 }, /* GL_MAP_STENCIL */
-   { 16532, 0x00000020 }, /* GL_MAP_UNSYNCHRONIZED_BIT */
-   { 16558, 0x00000002 }, /* GL_MAP_WRITE_BIT */
-   { 16575, 0x000088C0 }, /* GL_MATRIX0_ARB */
-   { 16590, 0x00008630 }, /* GL_MATRIX0_NV */
-   { 16604, 0x000088CA }, /* GL_MATRIX10_ARB */
-   { 16620, 0x000088CB }, /* GL_MATRIX11_ARB */
-   { 16636, 0x000088CC }, /* GL_MATRIX12_ARB */
-   { 16652, 0x000088CD }, /* GL_MATRIX13_ARB */
-   { 16668, 0x000088CE }, /* GL_MATRIX14_ARB */
-   { 16684, 0x000088CF }, /* GL_MATRIX15_ARB */
-   { 16700, 0x000088D0 }, /* GL_MATRIX16_ARB */
-   { 16716, 0x000088D1 }, /* GL_MATRIX17_ARB */
-   { 16732, 0x000088D2 }, /* GL_MATRIX18_ARB */
-   { 16748, 0x000088D3 }, /* GL_MATRIX19_ARB */
-   { 16764, 0x000088C1 }, /* GL_MATRIX1_ARB */
-   { 16779, 0x00008631 }, /* GL_MATRIX1_NV */
-   { 16793, 0x000088D4 }, /* GL_MATRIX20_ARB */
-   { 16809, 0x000088D5 }, /* GL_MATRIX21_ARB */
-   { 16825, 0x000088D6 }, /* GL_MATRIX22_ARB */
-   { 16841, 0x000088D7 }, /* GL_MATRIX23_ARB */
-   { 16857, 0x000088D8 }, /* GL_MATRIX24_ARB */
-   { 16873, 0x000088D9 }, /* GL_MATRIX25_ARB */
-   { 16889, 0x000088DA }, /* GL_MATRIX26_ARB */
-   { 16905, 0x000088DB }, /* GL_MATRIX27_ARB */
-   { 16921, 0x000088DC }, /* GL_MATRIX28_ARB */
-   { 16937, 0x000088DD }, /* GL_MATRIX29_ARB */
-   { 16953, 0x000088C2 }, /* GL_MATRIX2_ARB */
-   { 16968, 0x00008632 }, /* GL_MATRIX2_NV */
-   { 16982, 0x000088DE }, /* GL_MATRIX30_ARB */
-   { 16998, 0x000088DF }, /* GL_MATRIX31_ARB */
-   { 17014, 0x000088C3 }, /* GL_MATRIX3_ARB */
-   { 17029, 0x00008633 }, /* GL_MATRIX3_NV */
-   { 17043, 0x000088C4 }, /* GL_MATRIX4_ARB */
-   { 17058, 0x00008634 }, /* GL_MATRIX4_NV */
-   { 17072, 0x000088C5 }, /* GL_MATRIX5_ARB */
-   { 17087, 0x00008635 }, /* GL_MATRIX5_NV */
-   { 17101, 0x000088C6 }, /* GL_MATRIX6_ARB */
-   { 17116, 0x00008636 }, /* GL_MATRIX6_NV */
-   { 17130, 0x000088C7 }, /* GL_MATRIX7_ARB */
-   { 17145, 0x00008637 }, /* GL_MATRIX7_NV */
-   { 17159, 0x000088C8 }, /* GL_MATRIX8_ARB */
-   { 17174, 0x000088C9 }, /* GL_MATRIX9_ARB */
-   { 17189, 0x00008844 }, /* GL_MATRIX_INDEX_ARRAY_ARB */
-   { 17215, 0x00008849 }, /* GL_MATRIX_INDEX_ARRAY_POINTER_ARB */
-   { 17249, 0x00008846 }, /* GL_MATRIX_INDEX_ARRAY_SIZE_ARB */
-   { 17280, 0x00008848 }, /* GL_MATRIX_INDEX_ARRAY_STRIDE_ARB */
-   { 17313, 0x00008847 }, /* GL_MATRIX_INDEX_ARRAY_TYPE_ARB */
-   { 17344, 0x00000BA0 }, /* GL_MATRIX_MODE */
-   { 17359, 0x00008840 }, /* GL_MATRIX_PALETTE_ARB */
-   { 17381, 0x00008008 }, /* GL_MAX */
-   { 17388, 0x00008073 }, /* GL_MAX_3D_TEXTURE_SIZE */
-   { 17411, 0x000088FF }, /* GL_MAX_ARRAY_TEXTURE_LAYERS_EXT */
-   { 17443, 0x00000D35 }, /* GL_MAX_ATTRIB_STACK_DEPTH */
-   { 17469, 0x00000D3B }, /* GL_MAX_CLIENT_ATTRIB_STACK_DEPTH */
-   { 17502, 0x00008177 }, /* GL_MAX_CLIPMAP_DEPTH_SGIX */
-   { 17528, 0x00008178 }, /* GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX */
-   { 17562, 0x00000D32 }, /* GL_MAX_CLIP_PLANES */
-   { 17581, 0x00008CDF }, /* GL_MAX_COLOR_ATTACHMENTS_EXT */
-   { 17610, 0x000080B3 }, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH */
-   { 17642, 0x000080B3 }, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI */
-   { 17678, 0x00008B4D }, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS */
-   { 17714, 0x00008B4D }, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB */
-   { 17754, 0x0000801B }, /* GL_MAX_CONVOLUTION_HEIGHT */
-   { 17780, 0x0000801B }, /* GL_MAX_CONVOLUTION_HEIGHT_EXT */
-   { 17810, 0x0000801A }, /* GL_MAX_CONVOLUTION_WIDTH */
-   { 17835, 0x0000801A }, /* GL_MAX_CONVOLUTION_WIDTH_EXT */
-   { 17864, 0x0000851C }, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE */
-   { 17893, 0x0000851C }, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB */
-   { 17926, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS */
-   { 17946, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS_ARB */
-   { 17970, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS_ATI */
-   { 17994, 0x000080E9 }, /* GL_MAX_ELEMENTS_INDICES */
-   { 18018, 0x000080E8 }, /* GL_MAX_ELEMENTS_VERTICES */
-   { 18043, 0x00000D30 }, /* GL_MAX_EVAL_ORDER */
-   { 18061, 0x00008008 }, /* GL_MAX_EXT */
-   { 18072, 0x00008B49 }, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS */
-   { 18107, 0x00008B49 }, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB */
-   { 18146, 0x00000D31 }, /* GL_MAX_LIGHTS */
-   { 18160, 0x00000B31 }, /* GL_MAX_LIST_NESTING */
-   { 18180, 0x00008841 }, /* GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB */
-   { 18218, 0x00000D36 }, /* GL_MAX_MODELVIEW_STACK_DEPTH */
-   { 18247, 0x00000D37 }, /* GL_MAX_NAME_STACK_DEPTH */
-   { 18271, 0x00008842 }, /* GL_MAX_PALETTE_MATRICES_ARB */
-   { 18299, 0x00000D34 }, /* GL_MAX_PIXEL_MAP_TABLE */
-   { 18322, 0x000088B1 }, /* GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB */
-   { 18359, 0x0000880B }, /* GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB */
-   { 18395, 0x000088AD }, /* GL_MAX_PROGRAM_ATTRIBS_ARB */
-   { 18422, 0x000088F5 }, /* GL_MAX_PROGRAM_CALL_DEPTH_NV */
-   { 18451, 0x000088B5 }, /* GL_MAX_PROGRAM_ENV_PARAMETERS_ARB */
-   { 18485, 0x000088F4 }, /* GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */
-   { 18521, 0x000088F6 }, /* GL_MAX_PROGRAM_IF_DEPTH_NV */
-   { 18548, 0x000088A1 }, /* GL_MAX_PROGRAM_INSTRUCTIONS_ARB */
-   { 18580, 0x000088B4 }, /* GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB */
-   { 18616, 0x000088F8 }, /* GL_MAX_PROGRAM_LOOP_COUNT_NV */
-   { 18645, 0x000088F7 }, /* GL_MAX_PROGRAM_LOOP_DEPTH_NV */
-   { 18674, 0x0000862F }, /* GL_MAX_PROGRAM_MATRICES_ARB */
-   { 18702, 0x0000862E }, /* GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB */
-   { 18740, 0x000088B3 }, /* GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
-   { 18784, 0x0000880E }, /* GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
-   { 18827, 0x000088AF }, /* GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB */
-   { 18861, 0x000088A3 }, /* GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
-   { 18900, 0x000088AB }, /* GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB */
-   { 18937, 0x000088A7 }, /* GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB */
-   { 18975, 0x00008810 }, /* GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
-   { 19018, 0x0000880F }, /* GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
-   { 19061, 0x000088A9 }, /* GL_MAX_PROGRAM_PARAMETERS_ARB */
-   { 19091, 0x000088A5 }, /* GL_MAX_PROGRAM_TEMPORARIES_ARB */
-   { 19122, 0x0000880D }, /* GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB */
-   { 19158, 0x0000880C }, /* GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB */
-   { 19194, 0x00000D38 }, /* GL_MAX_PROJECTION_STACK_DEPTH */
-   { 19224, 0x000084F8 }, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB */
-   { 19258, 0x000084F8 }, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_NV */
-   { 19291, 0x000084E8 }, /* GL_MAX_RENDERBUFFER_SIZE_EXT */
-   { 19320, 0x00008D57 }, /* GL_MAX_SAMPLES */
-   { 19335, 0x00008504 }, /* GL_MAX_SHININESS_NV */
-   { 19355, 0x00008505 }, /* GL_MAX_SPOT_EXPONENT_NV */
-   { 19379, 0x00008871 }, /* GL_MAX_TEXTURE_COORDS */
-   { 19401, 0x00008871 }, /* GL_MAX_TEXTURE_COORDS_ARB */
-   { 19427, 0x00008872 }, /* GL_MAX_TEXTURE_IMAGE_UNITS */
-   { 19454, 0x00008872 }, /* GL_MAX_TEXTURE_IMAGE_UNITS_ARB */
-   { 19485, 0x000084FD }, /* GL_MAX_TEXTURE_LOD_BIAS */
-   { 19509, 0x000084FF }, /* GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT */
-   { 19543, 0x00000D33 }, /* GL_MAX_TEXTURE_SIZE */
-   { 19563, 0x00000D39 }, /* GL_MAX_TEXTURE_STACK_DEPTH */
-   { 19590, 0x000084E2 }, /* GL_MAX_TEXTURE_UNITS */
-   { 19611, 0x000084E2 }, /* GL_MAX_TEXTURE_UNITS_ARB */
-   { 19636, 0x0000862F }, /* GL_MAX_TRACK_MATRICES_NV */
-   { 19661, 0x0000862E }, /* GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV */
-   { 19696, 0x00008B4B }, /* GL_MAX_VARYING_FLOATS */
-   { 19718, 0x00008B4B }, /* GL_MAX_VARYING_FLOATS_ARB */
-   { 19744, 0x00008869 }, /* GL_MAX_VERTEX_ATTRIBS */
-   { 19766, 0x00008869 }, /* GL_MAX_VERTEX_ATTRIBS_ARB */
-   { 19792, 0x00008B4C }, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS */
-   { 19826, 0x00008B4C }, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */
-   { 19864, 0x00008B4A }, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS */
-   { 19897, 0x00008B4A }, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB */
-   { 19934, 0x000086A4 }, /* GL_MAX_VERTEX_UNITS_ARB */
-   { 19958, 0x00000D3A }, /* GL_MAX_VIEWPORT_DIMS */
-   { 19979, 0x00008007 }, /* GL_MIN */
-   { 19986, 0x0000802E }, /* GL_MINMAX */
-   { 19996, 0x0000802E }, /* GL_MINMAX_EXT */
-   { 20010, 0x0000802F }, /* GL_MINMAX_FORMAT */
-   { 20027, 0x0000802F }, /* GL_MINMAX_FORMAT_EXT */
-   { 20048, 0x00008030 }, /* GL_MINMAX_SINK */
-   { 20063, 0x00008030 }, /* GL_MINMAX_SINK_EXT */
-   { 20082, 0x00008007 }, /* GL_MIN_EXT */
-   { 20093, 0x00008370 }, /* GL_MIRRORED_REPEAT */
-   { 20112, 0x00008370 }, /* GL_MIRRORED_REPEAT_ARB */
-   { 20135, 0x00008370 }, /* GL_MIRRORED_REPEAT_IBM */
-   { 20158, 0x00008742 }, /* GL_MIRROR_CLAMP_ATI */
-   { 20178, 0x00008742 }, /* GL_MIRROR_CLAMP_EXT */
-   { 20198, 0x00008912 }, /* GL_MIRROR_CLAMP_TO_BORDER_EXT */
-   { 20228, 0x00008743 }, /* GL_MIRROR_CLAMP_TO_EDGE_ATI */
-   { 20256, 0x00008743 }, /* GL_MIRROR_CLAMP_TO_EDGE_EXT */
-   { 20284, 0x00001700 }, /* GL_MODELVIEW */
-   { 20297, 0x00001700 }, /* GL_MODELVIEW0_ARB */
-   { 20315, 0x0000872A }, /* GL_MODELVIEW10_ARB */
-   { 20334, 0x0000872B }, /* GL_MODELVIEW11_ARB */
-   { 20353, 0x0000872C }, /* GL_MODELVIEW12_ARB */
-   { 20372, 0x0000872D }, /* GL_MODELVIEW13_ARB */
-   { 20391, 0x0000872E }, /* GL_MODELVIEW14_ARB */
-   { 20410, 0x0000872F }, /* GL_MODELVIEW15_ARB */
-   { 20429, 0x00008730 }, /* GL_MODELVIEW16_ARB */
-   { 20448, 0x00008731 }, /* GL_MODELVIEW17_ARB */
-   { 20467, 0x00008732 }, /* GL_MODELVIEW18_ARB */
-   { 20486, 0x00008733 }, /* GL_MODELVIEW19_ARB */
-   { 20505, 0x0000850A }, /* GL_MODELVIEW1_ARB */
-   { 20523, 0x00008734 }, /* GL_MODELVIEW20_ARB */
-   { 20542, 0x00008735 }, /* GL_MODELVIEW21_ARB */
-   { 20561, 0x00008736 }, /* GL_MODELVIEW22_ARB */
-   { 20580, 0x00008737 }, /* GL_MODELVIEW23_ARB */
-   { 20599, 0x00008738 }, /* GL_MODELVIEW24_ARB */
-   { 20618, 0x00008739 }, /* GL_MODELVIEW25_ARB */
-   { 20637, 0x0000873A }, /* GL_MODELVIEW26_ARB */
-   { 20656, 0x0000873B }, /* GL_MODELVIEW27_ARB */
-   { 20675, 0x0000873C }, /* GL_MODELVIEW28_ARB */
-   { 20694, 0x0000873D }, /* GL_MODELVIEW29_ARB */
-   { 20713, 0x00008722 }, /* GL_MODELVIEW2_ARB */
-   { 20731, 0x0000873E }, /* GL_MODELVIEW30_ARB */
-   { 20750, 0x0000873F }, /* GL_MODELVIEW31_ARB */
-   { 20769, 0x00008723 }, /* GL_MODELVIEW3_ARB */
-   { 20787, 0x00008724 }, /* GL_MODELVIEW4_ARB */
-   { 20805, 0x00008725 }, /* GL_MODELVIEW5_ARB */
-   { 20823, 0x00008726 }, /* GL_MODELVIEW6_ARB */
-   { 20841, 0x00008727 }, /* GL_MODELVIEW7_ARB */
-   { 20859, 0x00008728 }, /* GL_MODELVIEW8_ARB */
-   { 20877, 0x00008729 }, /* GL_MODELVIEW9_ARB */
-   { 20895, 0x00000BA6 }, /* GL_MODELVIEW_MATRIX */
-   { 20915, 0x00008629 }, /* GL_MODELVIEW_PROJECTION_NV */
-   { 20942, 0x00000BA3 }, /* GL_MODELVIEW_STACK_DEPTH */
-   { 20967, 0x00002100 }, /* GL_MODULATE */
-   { 20979, 0x00008744 }, /* GL_MODULATE_ADD_ATI */
-   { 20999, 0x00008745 }, /* GL_MODULATE_SIGNED_ADD_ATI */
-   { 21026, 0x00008746 }, /* GL_MODULATE_SUBTRACT_ATI */
-   { 21051, 0x00000103 }, /* GL_MULT */
-   { 21059, 0x0000809D }, /* GL_MULTISAMPLE */
-   { 21074, 0x000086B2 }, /* GL_MULTISAMPLE_3DFX */
-   { 21094, 0x0000809D }, /* GL_MULTISAMPLE_ARB */
-   { 21113, 0x20000000 }, /* GL_MULTISAMPLE_BIT */
-   { 21132, 0x20000000 }, /* GL_MULTISAMPLE_BIT_3DFX */
-   { 21156, 0x20000000 }, /* GL_MULTISAMPLE_BIT_ARB */
-   { 21179, 0x00008534 }, /* GL_MULTISAMPLE_FILTER_HINT_NV */
-   { 21209, 0x00002A25 }, /* GL_N3F_V3F */
-   { 21220, 0x00000D70 }, /* GL_NAME_STACK_DEPTH */
-   { 21240, 0x0000150E }, /* GL_NAND */
-   { 21248, 0x00002600 }, /* GL_NEAREST */
-   { 21259, 0x0000844E }, /* GL_NEAREST_CLIPMAP_LINEAR_SGIX */
-   { 21290, 0x0000844D }, /* GL_NEAREST_CLIPMAP_NEAREST_SGIX */
-   { 21322, 0x00002702 }, /* GL_NEAREST_MIPMAP_LINEAR */
-   { 21347, 0x00002700 }, /* GL_NEAREST_MIPMAP_NEAREST */
-   { 21373, 0x00000200 }, /* GL_NEVER */
-   { 21382, 0x00001102 }, /* GL_NICEST */
-   { 21392, 0x00000000 }, /* GL_NONE */
-   { 21400, 0x00001505 }, /* GL_NOOP */
-   { 21408, 0x00001508 }, /* GL_NOR */
-   { 21415, 0x00000BA1 }, /* GL_NORMALIZE */
-   { 21428, 0x00008075 }, /* GL_NORMAL_ARRAY */
-   { 21444, 0x00008897 }, /* GL_NORMAL_ARRAY_BUFFER_BINDING */
-   { 21475, 0x00008897 }, /* GL_NORMAL_ARRAY_BUFFER_BINDING_ARB */
-   { 21510, 0x0000808F }, /* GL_NORMAL_ARRAY_POINTER */
-   { 21534, 0x0000807F }, /* GL_NORMAL_ARRAY_STRIDE */
-   { 21557, 0x0000807E }, /* GL_NORMAL_ARRAY_TYPE */
-   { 21578, 0x00008511 }, /* GL_NORMAL_MAP */
-   { 21592, 0x00008511 }, /* GL_NORMAL_MAP_ARB */
-   { 21610, 0x00008511 }, /* GL_NORMAL_MAP_NV */
-   { 21627, 0x00000205 }, /* GL_NOTEQUAL */
-   { 21639, 0x00000000 }, /* GL_NO_ERROR */
-   { 21651, 0x000086A2 }, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS */
-   { 21685, 0x000086A2 }, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB */
-   { 21723, 0x00008B89 }, /* GL_OBJECT_ACTIVE_ATTRIBUTES_ARB */
-   { 21755, 0x00008B8A }, /* GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB */
-   { 21797, 0x00008B86 }, /* GL_OBJECT_ACTIVE_UNIFORMS_ARB */
-   { 21827, 0x00008B87 }, /* GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB */
-   { 21867, 0x00008B85 }, /* GL_OBJECT_ATTACHED_OBJECTS_ARB */
-   { 21898, 0x00008B81 }, /* GL_OBJECT_COMPILE_STATUS_ARB */
-   { 21927, 0x00008B80 }, /* GL_OBJECT_DELETE_STATUS_ARB */
-   { 21955, 0x00008B84 }, /* GL_OBJECT_INFO_LOG_LENGTH_ARB */
-   { 21985, 0x00002401 }, /* GL_OBJECT_LINEAR */
-   { 22002, 0x00008B82 }, /* GL_OBJECT_LINK_STATUS_ARB */
-   { 22028, 0x00002501 }, /* GL_OBJECT_PLANE */
-   { 22044, 0x00008B88 }, /* GL_OBJECT_SHADER_SOURCE_LENGTH_ARB */
-   { 22079, 0x00008B4F }, /* GL_OBJECT_SUBTYPE_ARB */
-   { 22101, 0x00008B4E }, /* GL_OBJECT_TYPE_ARB */
-   { 22120, 0x00008B83 }, /* GL_OBJECT_VALIDATE_STATUS_ARB */
-   { 22150, 0x00008165 }, /* GL_OCCLUSION_TEST_HP */
-   { 22171, 0x00008166 }, /* GL_OCCLUSION_TEST_RESULT_HP */
-   { 22199, 0x00000001 }, /* GL_ONE */
-   { 22206, 0x00008004 }, /* GL_ONE_MINUS_CONSTANT_ALPHA */
-   { 22234, 0x00008004 }, /* GL_ONE_MINUS_CONSTANT_ALPHA_EXT */
-   { 22266, 0x00008002 }, /* GL_ONE_MINUS_CONSTANT_COLOR */
-   { 22294, 0x00008002 }, /* GL_ONE_MINUS_CONSTANT_COLOR_EXT */
-   { 22326, 0x00000305 }, /* GL_ONE_MINUS_DST_ALPHA */
-   { 22349, 0x00000307 }, /* GL_ONE_MINUS_DST_COLOR */
-   { 22372, 0x00000303 }, /* GL_ONE_MINUS_SRC_ALPHA */
-   { 22395, 0x00000301 }, /* GL_ONE_MINUS_SRC_COLOR */
-   { 22418, 0x00008598 }, /* GL_OPERAND0_ALPHA */
-   { 22436, 0x00008598 }, /* GL_OPERAND0_ALPHA_ARB */
-   { 22458, 0x00008598 }, /* GL_OPERAND0_ALPHA_EXT */
-   { 22480, 0x00008590 }, /* GL_OPERAND0_RGB */
-   { 22496, 0x00008590 }, /* GL_OPERAND0_RGB_ARB */
-   { 22516, 0x00008590 }, /* GL_OPERAND0_RGB_EXT */
-   { 22536, 0x00008599 }, /* GL_OPERAND1_ALPHA */
-   { 22554, 0x00008599 }, /* GL_OPERAND1_ALPHA_ARB */
-   { 22576, 0x00008599 }, /* GL_OPERAND1_ALPHA_EXT */
-   { 22598, 0x00008591 }, /* GL_OPERAND1_RGB */
-   { 22614, 0x00008591 }, /* GL_OPERAND1_RGB_ARB */
-   { 22634, 0x00008591 }, /* GL_OPERAND1_RGB_EXT */
-   { 22654, 0x0000859A }, /* GL_OPERAND2_ALPHA */
-   { 22672, 0x0000859A }, /* GL_OPERAND2_ALPHA_ARB */
-   { 22694, 0x0000859A }, /* GL_OPERAND2_ALPHA_EXT */
-   { 22716, 0x00008592 }, /* GL_OPERAND2_RGB */
-   { 22732, 0x00008592 }, /* GL_OPERAND2_RGB_ARB */
-   { 22752, 0x00008592 }, /* GL_OPERAND2_RGB_EXT */
-   { 22772, 0x0000859B }, /* GL_OPERAND3_ALPHA_NV */
-   { 22793, 0x00008593 }, /* GL_OPERAND3_RGB_NV */
-   { 22812, 0x00001507 }, /* GL_OR */
-   { 22818, 0x00000A01 }, /* GL_ORDER */
-   { 22827, 0x0000150D }, /* GL_OR_INVERTED */
-   { 22842, 0x0000150B }, /* GL_OR_REVERSE */
-   { 22856, 0x00000505 }, /* GL_OUT_OF_MEMORY */
-   { 22873, 0x00000D05 }, /* GL_PACK_ALIGNMENT */
-   { 22891, 0x0000806C }, /* GL_PACK_IMAGE_HEIGHT */
-   { 22912, 0x00008758 }, /* GL_PACK_INVERT_MESA */
-   { 22932, 0x00000D01 }, /* GL_PACK_LSB_FIRST */
-   { 22950, 0x00000D02 }, /* GL_PACK_ROW_LENGTH */
-   { 22969, 0x0000806B }, /* GL_PACK_SKIP_IMAGES */
-   { 22989, 0x00000D04 }, /* GL_PACK_SKIP_PIXELS */
-   { 23009, 0x00000D03 }, /* GL_PACK_SKIP_ROWS */
-   { 23027, 0x00000D00 }, /* GL_PACK_SWAP_BYTES */
-   { 23046, 0x00008B92 }, /* GL_PALETTE4_R5_G6_B5_OES */
-   { 23071, 0x00008B94 }, /* GL_PALETTE4_RGB5_A1_OES */
-   { 23095, 0x00008B90 }, /* GL_PALETTE4_RGB8_OES */
-   { 23116, 0x00008B93 }, /* GL_PALETTE4_RGBA4_OES */
-   { 23138, 0x00008B91 }, /* GL_PALETTE4_RGBA8_OES */
-   { 23160, 0x00008B97 }, /* GL_PALETTE8_R5_G6_B5_OES */
-   { 23185, 0x00008B99 }, /* GL_PALETTE8_RGB5_A1_OES */
-   { 23209, 0x00008B95 }, /* GL_PALETTE8_RGB8_OES */
-   { 23230, 0x00008B98 }, /* GL_PALETTE8_RGBA4_OES */
-   { 23252, 0x00008B96 }, /* GL_PALETTE8_RGBA8_OES */
-   { 23274, 0x00000700 }, /* GL_PASS_THROUGH_TOKEN */
-   { 23296, 0x00000C50 }, /* GL_PERSPECTIVE_CORRECTION_HINT */
-   { 23327, 0x00000C79 }, /* GL_PIXEL_MAP_A_TO_A */
-   { 23347, 0x00000CB9 }, /* GL_PIXEL_MAP_A_TO_A_SIZE */
-   { 23372, 0x00000C78 }, /* GL_PIXEL_MAP_B_TO_B */
-   { 23392, 0x00000CB8 }, /* GL_PIXEL_MAP_B_TO_B_SIZE */
-   { 23417, 0x00000C77 }, /* GL_PIXEL_MAP_G_TO_G */
-   { 23437, 0x00000CB7 }, /* GL_PIXEL_MAP_G_TO_G_SIZE */
-   { 23462, 0x00000C75 }, /* GL_PIXEL_MAP_I_TO_A */
-   { 23482, 0x00000CB5 }, /* GL_PIXEL_MAP_I_TO_A_SIZE */
-   { 23507, 0x00000C74 }, /* GL_PIXEL_MAP_I_TO_B */
-   { 23527, 0x00000CB4 }, /* GL_PIXEL_MAP_I_TO_B_SIZE */
-   { 23552, 0x00000C73 }, /* GL_PIXEL_MAP_I_TO_G */
-   { 23572, 0x00000CB3 }, /* GL_PIXEL_MAP_I_TO_G_SIZE */
-   { 23597, 0x00000C70 }, /* GL_PIXEL_MAP_I_TO_I */
-   { 23617, 0x00000CB0 }, /* GL_PIXEL_MAP_I_TO_I_SIZE */
-   { 23642, 0x00000C72 }, /* GL_PIXEL_MAP_I_TO_R */
-   { 23662, 0x00000CB2 }, /* GL_PIXEL_MAP_I_TO_R_SIZE */
-   { 23687, 0x00000C76 }, /* GL_PIXEL_MAP_R_TO_R */
-   { 23707, 0x00000CB6 }, /* GL_PIXEL_MAP_R_TO_R_SIZE */
-   { 23732, 0x00000C71 }, /* GL_PIXEL_MAP_S_TO_S */
-   { 23752, 0x00000CB1 }, /* GL_PIXEL_MAP_S_TO_S_SIZE */
-   { 23777, 0x00000020 }, /* GL_PIXEL_MODE_BIT */
-   { 23795, 0x000088EB }, /* GL_PIXEL_PACK_BUFFER */
-   { 23816, 0x000088ED }, /* GL_PIXEL_PACK_BUFFER_BINDING */
-   { 23845, 0x000088ED }, /* GL_PIXEL_PACK_BUFFER_BINDING_EXT */
-   { 23878, 0x000088EB }, /* GL_PIXEL_PACK_BUFFER_EXT */
-   { 23903, 0x000088EC }, /* GL_PIXEL_UNPACK_BUFFER */
-   { 23926, 0x000088EF }, /* GL_PIXEL_UNPACK_BUFFER_BINDING */
-   { 23957, 0x000088EF }, /* GL_PIXEL_UNPACK_BUFFER_BINDING_EXT */
-   { 23992, 0x000088EC }, /* GL_PIXEL_UNPACK_BUFFER_EXT */
-   { 24019, 0x00001B00 }, /* GL_POINT */
-   { 24028, 0x00000000 }, /* GL_POINTS */
-   { 24038, 0x00000002 }, /* GL_POINT_BIT */
-   { 24051, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION */
-   { 24081, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_ARB */
-   { 24115, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_EXT */
-   { 24149, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_SGIS */
-   { 24184, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE */
-   { 24213, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_ARB */
-   { 24246, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_EXT */
-   { 24279, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_SGIS */
-   { 24313, 0x00000B11 }, /* GL_POINT_SIZE */
-   { 24327, 0x00000B13 }, /* GL_POINT_SIZE_GRANULARITY */
-   { 24353, 0x00008127 }, /* GL_POINT_SIZE_MAX */
-   { 24371, 0x00008127 }, /* GL_POINT_SIZE_MAX_ARB */
-   { 24393, 0x00008127 }, /* GL_POINT_SIZE_MAX_EXT */
-   { 24415, 0x00008127 }, /* GL_POINT_SIZE_MAX_SGIS */
-   { 24438, 0x00008126 }, /* GL_POINT_SIZE_MIN */
-   { 24456, 0x00008126 }, /* GL_POINT_SIZE_MIN_ARB */
-   { 24478, 0x00008126 }, /* GL_POINT_SIZE_MIN_EXT */
-   { 24500, 0x00008126 }, /* GL_POINT_SIZE_MIN_SGIS */
-   { 24523, 0x00000B12 }, /* GL_POINT_SIZE_RANGE */
-   { 24543, 0x00000B10 }, /* GL_POINT_SMOOTH */
-   { 24559, 0x00000C51 }, /* GL_POINT_SMOOTH_HINT */
-   { 24580, 0x00008861 }, /* GL_POINT_SPRITE */
-   { 24596, 0x00008861 }, /* GL_POINT_SPRITE_ARB */
-   { 24616, 0x00008CA0 }, /* GL_POINT_SPRITE_COORD_ORIGIN */
-   { 24645, 0x00008861 }, /* GL_POINT_SPRITE_NV */
-   { 24664, 0x00008863 }, /* GL_POINT_SPRITE_R_MODE_NV */
-   { 24690, 0x00000701 }, /* GL_POINT_TOKEN */
-   { 24705, 0x00000009 }, /* GL_POLYGON */
-   { 24716, 0x00000008 }, /* GL_POLYGON_BIT */
-   { 24731, 0x00000B40 }, /* GL_POLYGON_MODE */
-   { 24747, 0x00008039 }, /* GL_POLYGON_OFFSET_BIAS */
-   { 24770, 0x00008038 }, /* GL_POLYGON_OFFSET_FACTOR */
-   { 24795, 0x00008037 }, /* GL_POLYGON_OFFSET_FILL */
-   { 24818, 0x00002A02 }, /* GL_POLYGON_OFFSET_LINE */
-   { 24841, 0x00002A01 }, /* GL_POLYGON_OFFSET_POINT */
-   { 24865, 0x00002A00 }, /* GL_POLYGON_OFFSET_UNITS */
-   { 24889, 0x00000B41 }, /* GL_POLYGON_SMOOTH */
-   { 24907, 0x00000C53 }, /* GL_POLYGON_SMOOTH_HINT */
-   { 24930, 0x00000B42 }, /* GL_POLYGON_STIPPLE */
-   { 24949, 0x00000010 }, /* GL_POLYGON_STIPPLE_BIT */
-   { 24972, 0x00000703 }, /* GL_POLYGON_TOKEN */
-   { 24989, 0x00001203 }, /* GL_POSITION */
-   { 25001, 0x000080BB }, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS */
-   { 25033, 0x000080BB }, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI */
-   { 25069, 0x000080B7 }, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE */
-   { 25102, 0x000080B7 }, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI */
-   { 25139, 0x000080BA }, /* GL_POST_COLOR_MATRIX_BLUE_BIAS */
-   { 25170, 0x000080BA }, /* GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI */
-   { 25205, 0x000080B6 }, /* GL_POST_COLOR_MATRIX_BLUE_SCALE */
-   { 25237, 0x000080B6 }, /* GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI */
-   { 25273, 0x000080D2 }, /* GL_POST_COLOR_MATRIX_COLOR_TABLE */
-   { 25306, 0x000080B9 }, /* GL_POST_COLOR_MATRIX_GREEN_BIAS */
-   { 25338, 0x000080B9 }, /* GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI */
-   { 25374, 0x000080B5 }, /* GL_POST_COLOR_MATRIX_GREEN_SCALE */
-   { 25407, 0x000080B5 }, /* GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI */
-   { 25444, 0x000080B8 }, /* GL_POST_COLOR_MATRIX_RED_BIAS */
-   { 25474, 0x000080B8 }, /* GL_POST_COLOR_MATRIX_RED_BIAS_SGI */
-   { 25508, 0x000080B4 }, /* GL_POST_COLOR_MATRIX_RED_SCALE */
-   { 25539, 0x000080B4 }, /* GL_POST_COLOR_MATRIX_RED_SCALE_SGI */
-   { 25574, 0x00008023 }, /* GL_POST_CONVOLUTION_ALPHA_BIAS */
-   { 25605, 0x00008023 }, /* GL_POST_CONVOLUTION_ALPHA_BIAS_EXT */
-   { 25640, 0x0000801F }, /* GL_POST_CONVOLUTION_ALPHA_SCALE */
-   { 25672, 0x0000801F }, /* GL_POST_CONVOLUTION_ALPHA_SCALE_EXT */
-   { 25708, 0x00008022 }, /* GL_POST_CONVOLUTION_BLUE_BIAS */
-   { 25738, 0x00008022 }, /* GL_POST_CONVOLUTION_BLUE_BIAS_EXT */
-   { 25772, 0x0000801E }, /* GL_POST_CONVOLUTION_BLUE_SCALE */
-   { 25803, 0x0000801E }, /* GL_POST_CONVOLUTION_BLUE_SCALE_EXT */
-   { 25838, 0x000080D1 }, /* GL_POST_CONVOLUTION_COLOR_TABLE */
-   { 25870, 0x00008021 }, /* GL_POST_CONVOLUTION_GREEN_BIAS */
-   { 25901, 0x00008021 }, /* GL_POST_CONVOLUTION_GREEN_BIAS_EXT */
-   { 25936, 0x0000801D }, /* GL_POST_CONVOLUTION_GREEN_SCALE */
-   { 25968, 0x0000801D }, /* GL_POST_CONVOLUTION_GREEN_SCALE_EXT */
-   { 26004, 0x00008020 }, /* GL_POST_CONVOLUTION_RED_BIAS */
-   { 26033, 0x00008020 }, /* GL_POST_CONVOLUTION_RED_BIAS_EXT */
-   { 26066, 0x0000801C }, /* GL_POST_CONVOLUTION_RED_SCALE */
-   { 26096, 0x0000801C }, /* GL_POST_CONVOLUTION_RED_SCALE_EXT */
-   { 26130, 0x0000817B }, /* GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX */
-   { 26169, 0x00008179 }, /* GL_POST_TEXTURE_FILTER_BIAS_SGIX */
-   { 26202, 0x0000817C }, /* GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX */
-   { 26242, 0x0000817A }, /* GL_POST_TEXTURE_FILTER_SCALE_SGIX */
-   { 26276, 0x00008578 }, /* GL_PREVIOUS */
-   { 26288, 0x00008578 }, /* GL_PREVIOUS_ARB */
-   { 26304, 0x00008578 }, /* GL_PREVIOUS_EXT */
-   { 26320, 0x00008577 }, /* GL_PRIMARY_COLOR */
-   { 26337, 0x00008577 }, /* GL_PRIMARY_COLOR_ARB */
-   { 26358, 0x00008577 }, /* GL_PRIMARY_COLOR_EXT */
-   { 26379, 0x000088B0 }, /* GL_PROGRAM_ADDRESS_REGISTERS_ARB */
-   { 26412, 0x00008805 }, /* GL_PROGRAM_ALU_INSTRUCTIONS_ARB */
-   { 26444, 0x000088AC }, /* GL_PROGRAM_ATTRIBS_ARB */
-   { 26467, 0x00008677 }, /* GL_PROGRAM_BINDING_ARB */
-   { 26490, 0x0000864B }, /* GL_PROGRAM_ERROR_POSITION_ARB */
-   { 26520, 0x0000864B }, /* GL_PROGRAM_ERROR_POSITION_NV */
-   { 26549, 0x00008874 }, /* GL_PROGRAM_ERROR_STRING_ARB */
-   { 26577, 0x00008876 }, /* GL_PROGRAM_FORMAT_ARB */
-   { 26599, 0x00008875 }, /* GL_PROGRAM_FORMAT_ASCII_ARB */
-   { 26627, 0x000088A0 }, /* GL_PROGRAM_INSTRUCTIONS_ARB */
-   { 26655, 0x00008627 }, /* GL_PROGRAM_LENGTH_ARB */
-   { 26677, 0x00008627 }, /* GL_PROGRAM_LENGTH_NV */
-   { 26698, 0x000088B2 }, /* GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
-   { 26738, 0x00008808 }, /* GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
-   { 26777, 0x000088AE }, /* GL_PROGRAM_NATIVE_ATTRIBS_ARB */
-   { 26807, 0x000088A2 }, /* GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
-   { 26842, 0x000088AA }, /* GL_PROGRAM_NATIVE_PARAMETERS_ARB */
-   { 26875, 0x000088A6 }, /* GL_PROGRAM_NATIVE_TEMPORARIES_ARB */
-   { 26909, 0x0000880A }, /* GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
-   { 26948, 0x00008809 }, /* GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
-   { 26987, 0x00008B40 }, /* GL_PROGRAM_OBJECT_ARB */
-   { 27009, 0x000088A8 }, /* GL_PROGRAM_PARAMETERS_ARB */
-   { 27035, 0x00008644 }, /* GL_PROGRAM_PARAMETER_NV */
-   { 27059, 0x00008647 }, /* GL_PROGRAM_RESIDENT_NV */
-   { 27082, 0x00008628 }, /* GL_PROGRAM_STRING_ARB */
-   { 27104, 0x00008628 }, /* GL_PROGRAM_STRING_NV */
-   { 27125, 0x00008646 }, /* GL_PROGRAM_TARGET_NV */
-   { 27146, 0x000088A4 }, /* GL_PROGRAM_TEMPORARIES_ARB */
-   { 27173, 0x00008807 }, /* GL_PROGRAM_TEX_INDIRECTIONS_ARB */
-   { 27205, 0x00008806 }, /* GL_PROGRAM_TEX_INSTRUCTIONS_ARB */
-   { 27237, 0x000088B6 }, /* GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB */
-   { 27272, 0x00001701 }, /* GL_PROJECTION */
-   { 27286, 0x00000BA7 }, /* GL_PROJECTION_MATRIX */
-   { 27307, 0x00000BA4 }, /* GL_PROJECTION_STACK_DEPTH */
-   { 27333, 0x00008E4F }, /* GL_PROVOKING_VERTEX_EXT */
-   { 27357, 0x000080D3 }, /* GL_PROXY_COLOR_TABLE */
-   { 27378, 0x00008025 }, /* GL_PROXY_HISTOGRAM */
-   { 27397, 0x00008025 }, /* GL_PROXY_HISTOGRAM_EXT */
-   { 27420, 0x000080D5 }, /* GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE */
-   { 27459, 0x000080D4 }, /* GL_PROXY_POST_CONVOLUTION_COLOR_TABLE */
-   { 27497, 0x00008063 }, /* GL_PROXY_TEXTURE_1D */
-   { 27517, 0x00008C19 }, /* GL_PROXY_TEXTURE_1D_ARRAY_EXT */
-   { 27547, 0x00008063 }, /* GL_PROXY_TEXTURE_1D_EXT */
-   { 27571, 0x00008064 }, /* GL_PROXY_TEXTURE_2D */
-   { 27591, 0x00008C1B }, /* GL_PROXY_TEXTURE_2D_ARRAY_EXT */
-   { 27621, 0x00008064 }, /* GL_PROXY_TEXTURE_2D_EXT */
-   { 27645, 0x00008070 }, /* GL_PROXY_TEXTURE_3D */
-   { 27665, 0x000080BD }, /* GL_PROXY_TEXTURE_COLOR_TABLE_SGI */
-   { 27698, 0x0000851B }, /* GL_PROXY_TEXTURE_CUBE_MAP */
-   { 27724, 0x0000851B }, /* GL_PROXY_TEXTURE_CUBE_MAP_ARB */
-   { 27754, 0x000084F7 }, /* GL_PROXY_TEXTURE_RECTANGLE_ARB */
-   { 27785, 0x000084F7 }, /* GL_PROXY_TEXTURE_RECTANGLE_NV */
-   { 27815, 0x00002003 }, /* GL_Q */
-   { 27820, 0x00001209 }, /* GL_QUADRATIC_ATTENUATION */
-   { 27845, 0x00000007 }, /* GL_QUADS */
-   { 27854, 0x00008E4C }, /* GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT */
-   { 27902, 0x00008614 }, /* GL_QUAD_MESH_SUN */
-   { 27919, 0x00000008 }, /* GL_QUAD_STRIP */
-   { 27933, 0x00008864 }, /* GL_QUERY_COUNTER_BITS */
-   { 27955, 0x00008864 }, /* GL_QUERY_COUNTER_BITS_ARB */
-   { 27981, 0x00008866 }, /* GL_QUERY_RESULT */
-   { 27997, 0x00008866 }, /* GL_QUERY_RESULT_ARB */
-   { 28017, 0x00008867 }, /* GL_QUERY_RESULT_AVAILABLE */
-   { 28043, 0x00008867 }, /* GL_QUERY_RESULT_AVAILABLE_ARB */
-   { 28073, 0x00002002 }, /* GL_R */
-   { 28078, 0x00002A10 }, /* GL_R3_G3_B2 */
-   { 28090, 0x00019262 }, /* GL_RASTER_POSITION_UNCLIPPED_IBM */
-   { 28123, 0x00000C02 }, /* GL_READ_BUFFER */
-   { 28138, 0x00008CA8 }, /* GL_READ_FRAMEBUFFER */
-   { 28158, 0x00008CAA }, /* GL_READ_FRAMEBUFFER_BINDING_EXT */
-   { 28190, 0x00008CA8 }, /* GL_READ_FRAMEBUFFER_EXT */
-   { 28214, 0x000088B8 }, /* GL_READ_ONLY */
-   { 28227, 0x000088B8 }, /* GL_READ_ONLY_ARB */
-   { 28244, 0x000088BA }, /* GL_READ_WRITE */
-   { 28258, 0x000088BA }, /* GL_READ_WRITE_ARB */
-   { 28276, 0x00001903 }, /* GL_RED */
-   { 28283, 0x00008016 }, /* GL_REDUCE */
-   { 28293, 0x00008016 }, /* GL_REDUCE_EXT */
-   { 28307, 0x00000D15 }, /* GL_RED_BIAS */
-   { 28319, 0x00000D52 }, /* GL_RED_BITS */
-   { 28331, 0x00000D14 }, /* GL_RED_SCALE */
-   { 28344, 0x00008512 }, /* GL_REFLECTION_MAP */
-   { 28362, 0x00008512 }, /* GL_REFLECTION_MAP_ARB */
-   { 28384, 0x00008512 }, /* GL_REFLECTION_MAP_NV */
-   { 28405, 0x00001C00 }, /* GL_RENDER */
-   { 28415, 0x00008D41 }, /* GL_RENDERBUFFER */
-   { 28431, 0x00008D53 }, /* GL_RENDERBUFFER_ALPHA_SIZE */
-   { 28458, 0x00008CA7 }, /* GL_RENDERBUFFER_BINDING_EXT */
-   { 28486, 0x00008D52 }, /* GL_RENDERBUFFER_BLUE_SIZE */
-   { 28512, 0x00008D54 }, /* GL_RENDERBUFFER_DEPTH_SIZE */
-   { 28539, 0x00008D41 }, /* GL_RENDERBUFFER_EXT */
-   { 28559, 0x00008D51 }, /* GL_RENDERBUFFER_GREEN_SIZE */
-   { 28586, 0x00008D43 }, /* GL_RENDERBUFFER_HEIGHT */
-   { 28609, 0x00008D43 }, /* GL_RENDERBUFFER_HEIGHT_EXT */
-   { 28636, 0x00008D44 }, /* GL_RENDERBUFFER_INTERNAL_FORMAT */
-   { 28668, 0x00008D44 }, /* GL_RENDERBUFFER_INTERNAL_FORMAT_EXT */
-   { 28704, 0x00008D50 }, /* GL_RENDERBUFFER_RED_SIZE */
-   { 28729, 0x00008CAB }, /* GL_RENDERBUFFER_SAMPLES */
-   { 28753, 0x00008D55 }, /* GL_RENDERBUFFER_STENCIL_SIZE */
-   { 28782, 0x00008D42 }, /* GL_RENDERBUFFER_WIDTH */
-   { 28804, 0x00008D42 }, /* GL_RENDERBUFFER_WIDTH_EXT */
-   { 28830, 0x00001F01 }, /* GL_RENDERER */
-   { 28842, 0x00000C40 }, /* GL_RENDER_MODE */
-   { 28857, 0x00002901 }, /* GL_REPEAT */
-   { 28867, 0x00001E01 }, /* GL_REPLACE */
-   { 28878, 0x00008062 }, /* GL_REPLACE_EXT */
-   { 28893, 0x00008153 }, /* GL_REPLICATE_BORDER_HP */
-   { 28916, 0x0000803A }, /* GL_RESCALE_NORMAL */
-   { 28934, 0x0000803A }, /* GL_RESCALE_NORMAL_EXT */
-   { 28956, 0x00000102 }, /* GL_RETURN */
-   { 28966, 0x00001907 }, /* GL_RGB */
-   { 28973, 0x00008052 }, /* GL_RGB10 */
-   { 28982, 0x00008059 }, /* GL_RGB10_A2 */
-   { 28994, 0x00008059 }, /* GL_RGB10_A2_EXT */
-   { 29010, 0x00008052 }, /* GL_RGB10_EXT */
-   { 29023, 0x00008053 }, /* GL_RGB12 */
-   { 29032, 0x00008053 }, /* GL_RGB12_EXT */
-   { 29045, 0x00008054 }, /* GL_RGB16 */
-   { 29054, 0x00008054 }, /* GL_RGB16_EXT */
-   { 29067, 0x0000804E }, /* GL_RGB2_EXT */
-   { 29079, 0x0000804F }, /* GL_RGB4 */
-   { 29087, 0x0000804F }, /* GL_RGB4_EXT */
-   { 29099, 0x000083A1 }, /* GL_RGB4_S3TC */
-   { 29112, 0x00008050 }, /* GL_RGB5 */
-   { 29120, 0x00008057 }, /* GL_RGB5_A1 */
-   { 29131, 0x00008057 }, /* GL_RGB5_A1_EXT */
-   { 29146, 0x00008050 }, /* GL_RGB5_EXT */
-   { 29158, 0x00008051 }, /* GL_RGB8 */
-   { 29166, 0x00008051 }, /* GL_RGB8_EXT */
-   { 29178, 0x00001908 }, /* GL_RGBA */
-   { 29186, 0x0000805A }, /* GL_RGBA12 */
-   { 29196, 0x0000805A }, /* GL_RGBA12_EXT */
-   { 29210, 0x0000805B }, /* GL_RGBA16 */
-   { 29220, 0x0000805B }, /* GL_RGBA16_EXT */
-   { 29234, 0x00008055 }, /* GL_RGBA2 */
-   { 29243, 0x00008055 }, /* GL_RGBA2_EXT */
-   { 29256, 0x00008056 }, /* GL_RGBA4 */
-   { 29265, 0x000083A5 }, /* GL_RGBA4_DXT5_S3TC */
-   { 29284, 0x00008056 }, /* GL_RGBA4_EXT */
-   { 29297, 0x000083A3 }, /* GL_RGBA4_S3TC */
-   { 29311, 0x00008058 }, /* GL_RGBA8 */
-   { 29320, 0x00008058 }, /* GL_RGBA8_EXT */
-   { 29333, 0x00008F97 }, /* GL_RGBA8_SNORM */
-   { 29348, 0x000083A4 }, /* GL_RGBA_DXT5_S3TC */
-   { 29366, 0x00000C31 }, /* GL_RGBA_MODE */
-   { 29379, 0x000083A2 }, /* GL_RGBA_S3TC */
-   { 29392, 0x00008F93 }, /* GL_RGBA_SNORM */
-   { 29406, 0x000083A0 }, /* GL_RGB_S3TC */
-   { 29418, 0x00008573 }, /* GL_RGB_SCALE */
-   { 29431, 0x00008573 }, /* GL_RGB_SCALE_ARB */
-   { 29448, 0x00008573 }, /* GL_RGB_SCALE_EXT */
-   { 29465, 0x00000407 }, /* GL_RIGHT */
-   { 29474, 0x00002000 }, /* GL_S */
-   { 29479, 0x00008B5D }, /* GL_SAMPLER_1D */
-   { 29493, 0x00008B61 }, /* GL_SAMPLER_1D_SHADOW */
-   { 29514, 0x00008B5E }, /* GL_SAMPLER_2D */
-   { 29528, 0x00008B62 }, /* GL_SAMPLER_2D_SHADOW */
-   { 29549, 0x00008B5F }, /* GL_SAMPLER_3D */
-   { 29563, 0x00008B60 }, /* GL_SAMPLER_CUBE */
-   { 29579, 0x000080A9 }, /* GL_SAMPLES */
-   { 29590, 0x000086B4 }, /* GL_SAMPLES_3DFX */
-   { 29606, 0x000080A9 }, /* GL_SAMPLES_ARB */
-   { 29621, 0x00008914 }, /* GL_SAMPLES_PASSED */
-   { 29639, 0x00008914 }, /* GL_SAMPLES_PASSED_ARB */
-   { 29661, 0x0000809E }, /* GL_SAMPLE_ALPHA_TO_COVERAGE */
-   { 29689, 0x0000809E }, /* GL_SAMPLE_ALPHA_TO_COVERAGE_ARB */
-   { 29721, 0x0000809F }, /* GL_SAMPLE_ALPHA_TO_ONE */
-   { 29744, 0x0000809F }, /* GL_SAMPLE_ALPHA_TO_ONE_ARB */
-   { 29771, 0x000080A8 }, /* GL_SAMPLE_BUFFERS */
-   { 29789, 0x000086B3 }, /* GL_SAMPLE_BUFFERS_3DFX */
-   { 29812, 0x000080A8 }, /* GL_SAMPLE_BUFFERS_ARB */
-   { 29834, 0x000080A0 }, /* GL_SAMPLE_COVERAGE */
-   { 29853, 0x000080A0 }, /* GL_SAMPLE_COVERAGE_ARB */
-   { 29876, 0x000080AB }, /* GL_SAMPLE_COVERAGE_INVERT */
-   { 29902, 0x000080AB }, /* GL_SAMPLE_COVERAGE_INVERT_ARB */
-   { 29932, 0x000080AA }, /* GL_SAMPLE_COVERAGE_VALUE */
-   { 29957, 0x000080AA }, /* GL_SAMPLE_COVERAGE_VALUE_ARB */
-   { 29986, 0x00080000 }, /* GL_SCISSOR_BIT */
-   { 30001, 0x00000C10 }, /* GL_SCISSOR_BOX */
-   { 30016, 0x00000C11 }, /* GL_SCISSOR_TEST */
-   { 30032, 0x0000845E }, /* GL_SECONDARY_COLOR_ARRAY */
-   { 30057, 0x0000889C }, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING */
-   { 30097, 0x0000889C }, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB */
-   { 30141, 0x0000845D }, /* GL_SECONDARY_COLOR_ARRAY_POINTER */
-   { 30174, 0x0000845A }, /* GL_SECONDARY_COLOR_ARRAY_SIZE */
-   { 30204, 0x0000845C }, /* GL_SECONDARY_COLOR_ARRAY_STRIDE */
-   { 30236, 0x0000845B }, /* GL_SECONDARY_COLOR_ARRAY_TYPE */
-   { 30266, 0x00001C02 }, /* GL_SELECT */
-   { 30276, 0x00000DF3 }, /* GL_SELECTION_BUFFER_POINTER */
-   { 30304, 0x00000DF4 }, /* GL_SELECTION_BUFFER_SIZE */
-   { 30329, 0x00008012 }, /* GL_SEPARABLE_2D */
-   { 30345, 0x000081FA }, /* GL_SEPARATE_SPECULAR_COLOR */
-   { 30372, 0x000081FA }, /* GL_SEPARATE_SPECULAR_COLOR_EXT */
-   { 30403, 0x0000150F }, /* GL_SET */
-   { 30410, 0x00008B48 }, /* GL_SHADER_OBJECT_ARB */
-   { 30431, 0x00008B88 }, /* GL_SHADER_SOURCE_LENGTH */
-   { 30455, 0x00008B4F }, /* GL_SHADER_TYPE */
-   { 30470, 0x00000B54 }, /* GL_SHADE_MODEL */
-   { 30485, 0x00008B8C }, /* GL_SHADING_LANGUAGE_VERSION */
-   { 30513, 0x000080BF }, /* GL_SHADOW_AMBIENT_SGIX */
-   { 30536, 0x000081FB }, /* GL_SHARED_TEXTURE_PALETTE_EXT */
-   { 30566, 0x00001601 }, /* GL_SHININESS */
-   { 30579, 0x00001402 }, /* GL_SHORT */
-   { 30588, 0x00008F9C }, /* GL_SIGNED_NORMALIZED */
-   { 30609, 0x000081F9 }, /* GL_SINGLE_COLOR */
-   { 30625, 0x000081F9 }, /* GL_SINGLE_COLOR_EXT */
-   { 30645, 0x000085CC }, /* GL_SLICE_ACCUM_SUN */
-   { 30664, 0x00008C46 }, /* GL_SLUMINANCE */
-   { 30678, 0x00008C47 }, /* GL_SLUMINANCE8 */
-   { 30693, 0x00008C45 }, /* GL_SLUMINANCE8_ALPHA8 */
-   { 30715, 0x00008C44 }, /* GL_SLUMINANCE_ALPHA */
-   { 30735, 0x00001D01 }, /* GL_SMOOTH */
-   { 30745, 0x00000B23 }, /* GL_SMOOTH_LINE_WIDTH_GRANULARITY */
-   { 30778, 0x00000B22 }, /* GL_SMOOTH_LINE_WIDTH_RANGE */
-   { 30805, 0x00000B13 }, /* GL_SMOOTH_POINT_SIZE_GRANULARITY */
-   { 30838, 0x00000B12 }, /* GL_SMOOTH_POINT_SIZE_RANGE */
-   { 30865, 0x00008588 }, /* GL_SOURCE0_ALPHA */
-   { 30882, 0x00008588 }, /* GL_SOURCE0_ALPHA_ARB */
-   { 30903, 0x00008588 }, /* GL_SOURCE0_ALPHA_EXT */
-   { 30924, 0x00008580 }, /* GL_SOURCE0_RGB */
-   { 30939, 0x00008580 }, /* GL_SOURCE0_RGB_ARB */
-   { 30958, 0x00008580 }, /* GL_SOURCE0_RGB_EXT */
-   { 30977, 0x00008589 }, /* GL_SOURCE1_ALPHA */
-   { 30994, 0x00008589 }, /* GL_SOURCE1_ALPHA_ARB */
-   { 31015, 0x00008589 }, /* GL_SOURCE1_ALPHA_EXT */
-   { 31036, 0x00008581 }, /* GL_SOURCE1_RGB */
-   { 31051, 0x00008581 }, /* GL_SOURCE1_RGB_ARB */
-   { 31070, 0x00008581 }, /* GL_SOURCE1_RGB_EXT */
-   { 31089, 0x0000858A }, /* GL_SOURCE2_ALPHA */
-   { 31106, 0x0000858A }, /* GL_SOURCE2_ALPHA_ARB */
-   { 31127, 0x0000858A }, /* GL_SOURCE2_ALPHA_EXT */
-   { 31148, 0x00008582 }, /* GL_SOURCE2_RGB */
-   { 31163, 0x00008582 }, /* GL_SOURCE2_RGB_ARB */
-   { 31182, 0x00008582 }, /* GL_SOURCE2_RGB_EXT */
-   { 31201, 0x0000858B }, /* GL_SOURCE3_ALPHA_NV */
-   { 31221, 0x00008583 }, /* GL_SOURCE3_RGB_NV */
-   { 31239, 0x00001202 }, /* GL_SPECULAR */
-   { 31251, 0x00002402 }, /* GL_SPHERE_MAP */
-   { 31265, 0x00001206 }, /* GL_SPOT_CUTOFF */
-   { 31280, 0x00001204 }, /* GL_SPOT_DIRECTION */
-   { 31298, 0x00001205 }, /* GL_SPOT_EXPONENT */
-   { 31315, 0x00008588 }, /* GL_SRC0_ALPHA */
-   { 31329, 0x00008580 }, /* GL_SRC0_RGB */
-   { 31341, 0x00008589 }, /* GL_SRC1_ALPHA */
-   { 31355, 0x00008581 }, /* GL_SRC1_RGB */
-   { 31367, 0x0000858A }, /* GL_SRC2_ALPHA */
-   { 31381, 0x00008582 }, /* GL_SRC2_RGB */
-   { 31393, 0x00000302 }, /* GL_SRC_ALPHA */
-   { 31406, 0x00000308 }, /* GL_SRC_ALPHA_SATURATE */
-   { 31428, 0x00000300 }, /* GL_SRC_COLOR */
-   { 31441, 0x00008C40 }, /* GL_SRGB */
-   { 31449, 0x00008C41 }, /* GL_SRGB8 */
-   { 31458, 0x00008C43 }, /* GL_SRGB8_ALPHA8 */
-   { 31474, 0x00008C42 }, /* GL_SRGB_ALPHA */
-   { 31488, 0x00000503 }, /* GL_STACK_OVERFLOW */
-   { 31506, 0x00000504 }, /* GL_STACK_UNDERFLOW */
-   { 31525, 0x000088E6 }, /* GL_STATIC_COPY */
-   { 31540, 0x000088E6 }, /* GL_STATIC_COPY_ARB */
-   { 31559, 0x000088E4 }, /* GL_STATIC_DRAW */
-   { 31574, 0x000088E4 }, /* GL_STATIC_DRAW_ARB */
-   { 31593, 0x000088E5 }, /* GL_STATIC_READ */
-   { 31608, 0x000088E5 }, /* GL_STATIC_READ_ARB */
-   { 31627, 0x00001802 }, /* GL_STENCIL */
-   { 31638, 0x00008D20 }, /* GL_STENCIL_ATTACHMENT */
-   { 31660, 0x00008D20 }, /* GL_STENCIL_ATTACHMENT_EXT */
-   { 31686, 0x00008801 }, /* GL_STENCIL_BACK_FAIL */
-   { 31707, 0x00008801 }, /* GL_STENCIL_BACK_FAIL_ATI */
-   { 31732, 0x00008800 }, /* GL_STENCIL_BACK_FUNC */
-   { 31753, 0x00008800 }, /* GL_STENCIL_BACK_FUNC_ATI */
-   { 31778, 0x00008802 }, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL */
-   { 31810, 0x00008802 }, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI */
-   { 31846, 0x00008803 }, /* GL_STENCIL_BACK_PASS_DEPTH_PASS */
-   { 31878, 0x00008803 }, /* GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI */
-   { 31914, 0x00008CA3 }, /* GL_STENCIL_BACK_REF */
-   { 31934, 0x00008CA4 }, /* GL_STENCIL_BACK_VALUE_MASK */
-   { 31961, 0x00008CA5 }, /* GL_STENCIL_BACK_WRITEMASK */
-   { 31987, 0x00000D57 }, /* GL_STENCIL_BITS */
-   { 32003, 0x00000400 }, /* GL_STENCIL_BUFFER_BIT */
-   { 32025, 0x00000B91 }, /* GL_STENCIL_CLEAR_VALUE */
-   { 32048, 0x00000B94 }, /* GL_STENCIL_FAIL */
-   { 32064, 0x00000B92 }, /* GL_STENCIL_FUNC */
-   { 32080, 0x00001901 }, /* GL_STENCIL_INDEX */
-   { 32097, 0x00008D49 }, /* GL_STENCIL_INDEX16_EXT */
-   { 32120, 0x00008D46 }, /* GL_STENCIL_INDEX1_EXT */
-   { 32142, 0x00008D47 }, /* GL_STENCIL_INDEX4_EXT */
-   { 32164, 0x00008D48 }, /* GL_STENCIL_INDEX8_EXT */
-   { 32186, 0x00008D45 }, /* GL_STENCIL_INDEX_EXT */
-   { 32207, 0x00000B95 }, /* GL_STENCIL_PASS_DEPTH_FAIL */
-   { 32234, 0x00000B96 }, /* GL_STENCIL_PASS_DEPTH_PASS */
-   { 32261, 0x00000B97 }, /* GL_STENCIL_REF */
-   { 32276, 0x00000B90 }, /* GL_STENCIL_TEST */
-   { 32292, 0x00008910 }, /* GL_STENCIL_TEST_TWO_SIDE_EXT */
-   { 32321, 0x00000B93 }, /* GL_STENCIL_VALUE_MASK */
-   { 32343, 0x00000B98 }, /* GL_STENCIL_WRITEMASK */
-   { 32364, 0x00000C33 }, /* GL_STEREO */
-   { 32374, 0x000088E2 }, /* GL_STREAM_COPY */
-   { 32389, 0x000088E2 }, /* GL_STREAM_COPY_ARB */
-   { 32408, 0x000088E0 }, /* GL_STREAM_DRAW */
-   { 32423, 0x000088E0 }, /* GL_STREAM_DRAW_ARB */
-   { 32442, 0x000088E1 }, /* GL_STREAM_READ */
-   { 32457, 0x000088E1 }, /* GL_STREAM_READ_ARB */
-   { 32476, 0x00000D50 }, /* GL_SUBPIXEL_BITS */
-   { 32493, 0x000084E7 }, /* GL_SUBTRACT */
-   { 32505, 0x000084E7 }, /* GL_SUBTRACT_ARB */
-   { 32521, 0x00002001 }, /* GL_T */
-   { 32526, 0x00002A2A }, /* GL_T2F_C3F_V3F */
-   { 32541, 0x00002A2C }, /* GL_T2F_C4F_N3F_V3F */
-   { 32560, 0x00002A29 }, /* GL_T2F_C4UB_V3F */
-   { 32576, 0x00002A2B }, /* GL_T2F_N3F_V3F */
-   { 32591, 0x00002A27 }, /* GL_T2F_V3F */
-   { 32602, 0x00002A2D }, /* GL_T4F_C4F_N3F_V4F */
-   { 32621, 0x00002A28 }, /* GL_T4F_V4F */
-   { 32632, 0x00008031 }, /* GL_TABLE_TOO_LARGE_EXT */
-   { 32655, 0x00001702 }, /* GL_TEXTURE */
-   { 32666, 0x000084C0 }, /* GL_TEXTURE0 */
-   { 32678, 0x000084C0 }, /* GL_TEXTURE0_ARB */
-   { 32694, 0x000084C1 }, /* GL_TEXTURE1 */
-   { 32706, 0x000084CA }, /* GL_TEXTURE10 */
-   { 32719, 0x000084CA }, /* GL_TEXTURE10_ARB */
-   { 32736, 0x000084CB }, /* GL_TEXTURE11 */
-   { 32749, 0x000084CB }, /* GL_TEXTURE11_ARB */
-   { 32766, 0x000084CC }, /* GL_TEXTURE12 */
-   { 32779, 0x000084CC }, /* GL_TEXTURE12_ARB */
-   { 32796, 0x000084CD }, /* GL_TEXTURE13 */
-   { 32809, 0x000084CD }, /* GL_TEXTURE13_ARB */
-   { 32826, 0x000084CE }, /* GL_TEXTURE14 */
-   { 32839, 0x000084CE }, /* GL_TEXTURE14_ARB */
-   { 32856, 0x000084CF }, /* GL_TEXTURE15 */
-   { 32869, 0x000084CF }, /* GL_TEXTURE15_ARB */
-   { 32886, 0x000084D0 }, /* GL_TEXTURE16 */
-   { 32899, 0x000084D0 }, /* GL_TEXTURE16_ARB */
-   { 32916, 0x000084D1 }, /* GL_TEXTURE17 */
-   { 32929, 0x000084D1 }, /* GL_TEXTURE17_ARB */
-   { 32946, 0x000084D2 }, /* GL_TEXTURE18 */
-   { 32959, 0x000084D2 }, /* GL_TEXTURE18_ARB */
-   { 32976, 0x000084D3 }, /* GL_TEXTURE19 */
-   { 32989, 0x000084D3 }, /* GL_TEXTURE19_ARB */
-   { 33006, 0x000084C1 }, /* GL_TEXTURE1_ARB */
-   { 33022, 0x000084C2 }, /* GL_TEXTURE2 */
-   { 33034, 0x000084D4 }, /* GL_TEXTURE20 */
-   { 33047, 0x000084D4 }, /* GL_TEXTURE20_ARB */
-   { 33064, 0x000084D5 }, /* GL_TEXTURE21 */
-   { 33077, 0x000084D5 }, /* GL_TEXTURE21_ARB */
-   { 33094, 0x000084D6 }, /* GL_TEXTURE22 */
-   { 33107, 0x000084D6 }, /* GL_TEXTURE22_ARB */
-   { 33124, 0x000084D7 }, /* GL_TEXTURE23 */
-   { 33137, 0x000084D7 }, /* GL_TEXTURE23_ARB */
-   { 33154, 0x000084D8 }, /* GL_TEXTURE24 */
-   { 33167, 0x000084D8 }, /* GL_TEXTURE24_ARB */
-   { 33184, 0x000084D9 }, /* GL_TEXTURE25 */
-   { 33197, 0x000084D9 }, /* GL_TEXTURE25_ARB */
-   { 33214, 0x000084DA }, /* GL_TEXTURE26 */
-   { 33227, 0x000084DA }, /* GL_TEXTURE26_ARB */
-   { 33244, 0x000084DB }, /* GL_TEXTURE27 */
-   { 33257, 0x000084DB }, /* GL_TEXTURE27_ARB */
-   { 33274, 0x000084DC }, /* GL_TEXTURE28 */
-   { 33287, 0x000084DC }, /* GL_TEXTURE28_ARB */
-   { 33304, 0x000084DD }, /* GL_TEXTURE29 */
-   { 33317, 0x000084DD }, /* GL_TEXTURE29_ARB */
-   { 33334, 0x000084C2 }, /* GL_TEXTURE2_ARB */
-   { 33350, 0x000084C3 }, /* GL_TEXTURE3 */
-   { 33362, 0x000084DE }, /* GL_TEXTURE30 */
-   { 33375, 0x000084DE }, /* GL_TEXTURE30_ARB */
-   { 33392, 0x000084DF }, /* GL_TEXTURE31 */
-   { 33405, 0x000084DF }, /* GL_TEXTURE31_ARB */
-   { 33422, 0x000084C3 }, /* GL_TEXTURE3_ARB */
-   { 33438, 0x000084C4 }, /* GL_TEXTURE4 */
-   { 33450, 0x000084C4 }, /* GL_TEXTURE4_ARB */
-   { 33466, 0x000084C5 }, /* GL_TEXTURE5 */
-   { 33478, 0x000084C5 }, /* GL_TEXTURE5_ARB */
-   { 33494, 0x000084C6 }, /* GL_TEXTURE6 */
-   { 33506, 0x000084C6 }, /* GL_TEXTURE6_ARB */
-   { 33522, 0x000084C7 }, /* GL_TEXTURE7 */
-   { 33534, 0x000084C7 }, /* GL_TEXTURE7_ARB */
-   { 33550, 0x000084C8 }, /* GL_TEXTURE8 */
-   { 33562, 0x000084C8 }, /* GL_TEXTURE8_ARB */
-   { 33578, 0x000084C9 }, /* GL_TEXTURE9 */
-   { 33590, 0x000084C9 }, /* GL_TEXTURE9_ARB */
-   { 33606, 0x00000DE0 }, /* GL_TEXTURE_1D */
-   { 33620, 0x00008C18 }, /* GL_TEXTURE_1D_ARRAY_EXT */
-   { 33644, 0x00000DE1 }, /* GL_TEXTURE_2D */
-   { 33658, 0x00008C1A }, /* GL_TEXTURE_2D_ARRAY_EXT */
-   { 33682, 0x0000806F }, /* GL_TEXTURE_3D */
-   { 33696, 0x0000805F }, /* GL_TEXTURE_ALPHA_SIZE */
-   { 33718, 0x0000805F }, /* GL_TEXTURE_ALPHA_SIZE_EXT */
-   { 33744, 0x0000813C }, /* GL_TEXTURE_BASE_LEVEL */
-   { 33766, 0x00008068 }, /* GL_TEXTURE_BINDING_1D */
-   { 33788, 0x00008C1C }, /* GL_TEXTURE_BINDING_1D_ARRAY_EXT */
-   { 33820, 0x00008069 }, /* GL_TEXTURE_BINDING_2D */
-   { 33842, 0x00008C1D }, /* GL_TEXTURE_BINDING_2D_ARRAY_EXT */
-   { 33874, 0x0000806A }, /* GL_TEXTURE_BINDING_3D */
-   { 33896, 0x00008514 }, /* GL_TEXTURE_BINDING_CUBE_MAP */
-   { 33924, 0x00008514 }, /* GL_TEXTURE_BINDING_CUBE_MAP_ARB */
-   { 33956, 0x000084F6 }, /* GL_TEXTURE_BINDING_RECTANGLE_ARB */
-   { 33989, 0x000084F6 }, /* GL_TEXTURE_BINDING_RECTANGLE_NV */
-   { 34021, 0x00040000 }, /* GL_TEXTURE_BIT */
-   { 34036, 0x0000805E }, /* GL_TEXTURE_BLUE_SIZE */
-   { 34057, 0x0000805E }, /* GL_TEXTURE_BLUE_SIZE_EXT */
-   { 34082, 0x00001005 }, /* GL_TEXTURE_BORDER */
-   { 34100, 0x00001004 }, /* GL_TEXTURE_BORDER_COLOR */
-   { 34124, 0x00008171 }, /* GL_TEXTURE_CLIPMAP_CENTER_SGIX */
-   { 34155, 0x00008176 }, /* GL_TEXTURE_CLIPMAP_DEPTH_SGIX */
-   { 34185, 0x00008172 }, /* GL_TEXTURE_CLIPMAP_FRAME_SGIX */
-   { 34215, 0x00008175 }, /* GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX */
-   { 34250, 0x00008173 }, /* GL_TEXTURE_CLIPMAP_OFFSET_SGIX */
-   { 34281, 0x00008174 }, /* GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX */
-   { 34319, 0x000080BC }, /* GL_TEXTURE_COLOR_TABLE_SGI */
-   { 34346, 0x000081EF }, /* GL_TEXTURE_COLOR_WRITEMASK_SGIS */
-   { 34378, 0x000080BF }, /* GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
-   { 34412, 0x0000884D }, /* GL_TEXTURE_COMPARE_FUNC */
-   { 34436, 0x0000884D }, /* GL_TEXTURE_COMPARE_FUNC_ARB */
-   { 34464, 0x0000884C }, /* GL_TEXTURE_COMPARE_MODE */
-   { 34488, 0x0000884C }, /* GL_TEXTURE_COMPARE_MODE_ARB */
-   { 34516, 0x0000819B }, /* GL_TEXTURE_COMPARE_OPERATOR_SGIX */
-   { 34549, 0x0000819A }, /* GL_TEXTURE_COMPARE_SGIX */
-   { 34573, 0x00001003 }, /* GL_TEXTURE_COMPONENTS */
-   { 34595, 0x000086A1 }, /* GL_TEXTURE_COMPRESSED */
-   { 34617, 0x000086A1 }, /* GL_TEXTURE_COMPRESSED_ARB */
-   { 34643, 0x000086A3 }, /* GL_TEXTURE_COMPRESSED_FORMATS_ARB */
-   { 34677, 0x000086A0 }, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE */
-   { 34710, 0x000086A0 }, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB */
-   { 34747, 0x000084EF }, /* GL_TEXTURE_COMPRESSION_HINT */
-   { 34775, 0x000084EF }, /* GL_TEXTURE_COMPRESSION_HINT_ARB */
-   { 34807, 0x00008078 }, /* GL_TEXTURE_COORD_ARRAY */
-   { 34830, 0x0000889A }, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING */
-   { 34868, 0x0000889A }, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB */
-   { 34910, 0x00008092 }, /* GL_TEXTURE_COORD_ARRAY_POINTER */
-   { 34941, 0x00008088 }, /* GL_TEXTURE_COORD_ARRAY_SIZE */
-   { 34969, 0x0000808A }, /* GL_TEXTURE_COORD_ARRAY_STRIDE */
-   { 34999, 0x00008089 }, /* GL_TEXTURE_COORD_ARRAY_TYPE */
-   { 35027, 0x00008513 }, /* GL_TEXTURE_CUBE_MAP */
-   { 35047, 0x00008513 }, /* GL_TEXTURE_CUBE_MAP_ARB */
-   { 35071, 0x00008516 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X */
-   { 35102, 0x00008516 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB */
-   { 35137, 0x00008518 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y */
-   { 35168, 0x00008518 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB */
-   { 35203, 0x0000851A }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z */
-   { 35234, 0x0000851A }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB */
-   { 35269, 0x00008515 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X */
-   { 35300, 0x00008515 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB */
-   { 35335, 0x00008517 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y */
-   { 35366, 0x00008517 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB */
-   { 35401, 0x00008519 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z */
-   { 35432, 0x00008519 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB */
-   { 35467, 0x00008071 }, /* GL_TEXTURE_DEPTH */
-   { 35484, 0x0000884A }, /* GL_TEXTURE_DEPTH_SIZE */
-   { 35506, 0x0000884A }, /* GL_TEXTURE_DEPTH_SIZE_ARB */
-   { 35532, 0x00002300 }, /* GL_TEXTURE_ENV */
-   { 35547, 0x00002201 }, /* GL_TEXTURE_ENV_COLOR */
-   { 35568, 0x00002200 }, /* GL_TEXTURE_ENV_MODE */
-   { 35588, 0x00008500 }, /* GL_TEXTURE_FILTER_CONTROL */
-   { 35614, 0x00002500 }, /* GL_TEXTURE_GEN_MODE */
-   { 35634, 0x00000C63 }, /* GL_TEXTURE_GEN_Q */
-   { 35651, 0x00000C62 }, /* GL_TEXTURE_GEN_R */
-   { 35668, 0x00000C60 }, /* GL_TEXTURE_GEN_S */
-   { 35685, 0x00000C61 }, /* GL_TEXTURE_GEN_T */
-   { 35702, 0x0000819D }, /* GL_TEXTURE_GEQUAL_R_SGIX */
-   { 35727, 0x0000805D }, /* GL_TEXTURE_GREEN_SIZE */
-   { 35749, 0x0000805D }, /* GL_TEXTURE_GREEN_SIZE_EXT */
-   { 35775, 0x00001001 }, /* GL_TEXTURE_HEIGHT */
-   { 35793, 0x000080ED }, /* GL_TEXTURE_INDEX_SIZE_EXT */
-   { 35819, 0x00008061 }, /* GL_TEXTURE_INTENSITY_SIZE */
-   { 35845, 0x00008061 }, /* GL_TEXTURE_INTENSITY_SIZE_EXT */
-   { 35875, 0x00001003 }, /* GL_TEXTURE_INTERNAL_FORMAT */
-   { 35902, 0x0000819C }, /* GL_TEXTURE_LEQUAL_R_SGIX */
-   { 35927, 0x00008501 }, /* GL_TEXTURE_LOD_BIAS */
-   { 35947, 0x00008501 }, /* GL_TEXTURE_LOD_BIAS_EXT */
-   { 35971, 0x00008190 }, /* GL_TEXTURE_LOD_BIAS_R_SGIX */
-   { 35998, 0x0000818E }, /* GL_TEXTURE_LOD_BIAS_S_SGIX */
-   { 36025, 0x0000818F }, /* GL_TEXTURE_LOD_BIAS_T_SGIX */
-   { 36052, 0x00008060 }, /* GL_TEXTURE_LUMINANCE_SIZE */
-   { 36078, 0x00008060 }, /* GL_TEXTURE_LUMINANCE_SIZE_EXT */
-   { 36108, 0x00002800 }, /* GL_TEXTURE_MAG_FILTER */
-   { 36130, 0x00000BA8 }, /* GL_TEXTURE_MATRIX */
-   { 36148, 0x000084FE }, /* GL_TEXTURE_MAX_ANISOTROPY_EXT */
-   { 36178, 0x0000836B }, /* GL_TEXTURE_MAX_CLAMP_R_SGIX */
-   { 36206, 0x00008369 }, /* GL_TEXTURE_MAX_CLAMP_S_SGIX */
-   { 36234, 0x0000836A }, /* GL_TEXTURE_MAX_CLAMP_T_SGIX */
-   { 36262, 0x0000813D }, /* GL_TEXTURE_MAX_LEVEL */
-   { 36283, 0x0000813B }, /* GL_TEXTURE_MAX_LOD */
-   { 36302, 0x00002801 }, /* GL_TEXTURE_MIN_FILTER */
-   { 36324, 0x0000813A }, /* GL_TEXTURE_MIN_LOD */
-   { 36343, 0x00008066 }, /* GL_TEXTURE_PRIORITY */
-   { 36363, 0x000084F5 }, /* GL_TEXTURE_RECTANGLE_ARB */
-   { 36388, 0x000084F5 }, /* GL_TEXTURE_RECTANGLE_NV */
-   { 36412, 0x0000805C }, /* GL_TEXTURE_RED_SIZE */
-   { 36432, 0x0000805C }, /* GL_TEXTURE_RED_SIZE_EXT */
-   { 36456, 0x00008067 }, /* GL_TEXTURE_RESIDENT */
-   { 36476, 0x00000BA5 }, /* GL_TEXTURE_STACK_DEPTH */
-   { 36499, 0x000088F1 }, /* GL_TEXTURE_STENCIL_SIZE */
-   { 36523, 0x00008065 }, /* GL_TEXTURE_TOO_LARGE_EXT */
-   { 36548, 0x0000888F }, /* GL_TEXTURE_UNSIGNED_REMAP_MODE_NV */
-   { 36582, 0x00001000 }, /* GL_TEXTURE_WIDTH */
-   { 36599, 0x00008072 }, /* GL_TEXTURE_WRAP_R */
-   { 36617, 0x00002802 }, /* GL_TEXTURE_WRAP_S */
-   { 36635, 0x00002803 }, /* GL_TEXTURE_WRAP_T */
-   { 36653, 0x000088BF }, /* GL_TIME_ELAPSED_EXT */
-   { 36673, 0x00008648 }, /* GL_TRACK_MATRIX_NV */
-   { 36692, 0x00008649 }, /* GL_TRACK_MATRIX_TRANSFORM_NV */
-   { 36721, 0x00001000 }, /* GL_TRANSFORM_BIT */
-   { 36738, 0x000084E6 }, /* GL_TRANSPOSE_COLOR_MATRIX */
-   { 36764, 0x000084E6 }, /* GL_TRANSPOSE_COLOR_MATRIX_ARB */
-   { 36794, 0x000088B7 }, /* GL_TRANSPOSE_CURRENT_MATRIX_ARB */
-   { 36826, 0x000084E3 }, /* GL_TRANSPOSE_MODELVIEW_MATRIX */
-   { 36856, 0x000084E3 }, /* GL_TRANSPOSE_MODELVIEW_MATRIX_ARB */
-   { 36890, 0x0000862C }, /* GL_TRANSPOSE_NV */
-   { 36906, 0x000084E4 }, /* GL_TRANSPOSE_PROJECTION_MATRIX */
-   { 36937, 0x000084E4 }, /* GL_TRANSPOSE_PROJECTION_MATRIX_ARB */
-   { 36972, 0x000084E5 }, /* GL_TRANSPOSE_TEXTURE_MATRIX */
-   { 37000, 0x000084E5 }, /* GL_TRANSPOSE_TEXTURE_MATRIX_ARB */
-   { 37032, 0x00000004 }, /* GL_TRIANGLES */
-   { 37045, 0x00000006 }, /* GL_TRIANGLE_FAN */
-   { 37061, 0x00008615 }, /* GL_TRIANGLE_MESH_SUN */
-   { 37082, 0x00000005 }, /* GL_TRIANGLE_STRIP */
-   { 37100, 0x00000001 }, /* GL_TRUE */
-   { 37108, 0x00000CF5 }, /* GL_UNPACK_ALIGNMENT */
-   { 37128, 0x0000806E }, /* GL_UNPACK_IMAGE_HEIGHT */
-   { 37151, 0x00000CF1 }, /* GL_UNPACK_LSB_FIRST */
-   { 37171, 0x00000CF2 }, /* GL_UNPACK_ROW_LENGTH */
-   { 37192, 0x0000806D }, /* GL_UNPACK_SKIP_IMAGES */
-   { 37214, 0x00000CF4 }, /* GL_UNPACK_SKIP_PIXELS */
-   { 37236, 0x00000CF3 }, /* GL_UNPACK_SKIP_ROWS */
-   { 37256, 0x00000CF0 }, /* GL_UNPACK_SWAP_BYTES */
-   { 37277, 0x00001401 }, /* GL_UNSIGNED_BYTE */
-   { 37294, 0x00008362 }, /* GL_UNSIGNED_BYTE_2_3_3_REV */
-   { 37321, 0x00008032 }, /* GL_UNSIGNED_BYTE_3_3_2 */
-   { 37344, 0x00001405 }, /* GL_UNSIGNED_INT */
-   { 37360, 0x00008036 }, /* GL_UNSIGNED_INT_10_10_10_2 */
-   { 37387, 0x000084FA }, /* GL_UNSIGNED_INT_24_8 */
-   { 37408, 0x000084FA }, /* GL_UNSIGNED_INT_24_8_NV */
-   { 37432, 0x00008368 }, /* GL_UNSIGNED_INT_2_10_10_10_REV */
-   { 37463, 0x00008035 }, /* GL_UNSIGNED_INT_8_8_8_8 */
-   { 37487, 0x00008367 }, /* GL_UNSIGNED_INT_8_8_8_8_REV */
-   { 37515, 0x00008C17 }, /* GL_UNSIGNED_NORMALIZED */
-   { 37538, 0x00001403 }, /* GL_UNSIGNED_SHORT */
-   { 37556, 0x00008366 }, /* GL_UNSIGNED_SHORT_1_5_5_5_REV */
-   { 37586, 0x00008033 }, /* GL_UNSIGNED_SHORT_4_4_4_4 */
-   { 37612, 0x00008365 }, /* GL_UNSIGNED_SHORT_4_4_4_4_REV */
-   { 37642, 0x00008034 }, /* GL_UNSIGNED_SHORT_5_5_5_1 */
-   { 37668, 0x00008363 }, /* GL_UNSIGNED_SHORT_5_6_5 */
-   { 37692, 0x00008364 }, /* GL_UNSIGNED_SHORT_5_6_5_REV */
-   { 37720, 0x000085BA }, /* GL_UNSIGNED_SHORT_8_8_APPLE */
-   { 37748, 0x000085BA }, /* GL_UNSIGNED_SHORT_8_8_MESA */
-   { 37775, 0x000085BB }, /* GL_UNSIGNED_SHORT_8_8_REV_APPLE */
-   { 37807, 0x000085BB }, /* GL_UNSIGNED_SHORT_8_8_REV_MESA */
-   { 37838, 0x00008CA2 }, /* GL_UPPER_LEFT */
-   { 37852, 0x00002A20 }, /* GL_V2F */
-   { 37859, 0x00002A21 }, /* GL_V3F */
-   { 37866, 0x00008B83 }, /* GL_VALIDATE_STATUS */
-   { 37885, 0x00001F00 }, /* GL_VENDOR */
-   { 37895, 0x00001F02 }, /* GL_VERSION */
-   { 37906, 0x00008074 }, /* GL_VERTEX_ARRAY */
-   { 37922, 0x000085B5 }, /* GL_VERTEX_ARRAY_BINDING */
-   { 37946, 0x000085B5 }, /* GL_VERTEX_ARRAY_BINDING_APPLE */
-   { 37976, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING */
-   { 38007, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING_ARB */
-   { 38042, 0x0000808E }, /* GL_VERTEX_ARRAY_POINTER */
-   { 38066, 0x0000807A }, /* GL_VERTEX_ARRAY_SIZE */
-   { 38087, 0x0000807C }, /* GL_VERTEX_ARRAY_STRIDE */
-   { 38110, 0x0000807B }, /* GL_VERTEX_ARRAY_TYPE */
-   { 38131, 0x00008650 }, /* GL_VERTEX_ATTRIB_ARRAY0_NV */
-   { 38158, 0x0000865A }, /* GL_VERTEX_ATTRIB_ARRAY10_NV */
-   { 38186, 0x0000865B }, /* GL_VERTEX_ATTRIB_ARRAY11_NV */
-   { 38214, 0x0000865C }, /* GL_VERTEX_ATTRIB_ARRAY12_NV */
-   { 38242, 0x0000865D }, /* GL_VERTEX_ATTRIB_ARRAY13_NV */
-   { 38270, 0x0000865E }, /* GL_VERTEX_ATTRIB_ARRAY14_NV */
-   { 38298, 0x0000865F }, /* GL_VERTEX_ATTRIB_ARRAY15_NV */
-   { 38326, 0x00008651 }, /* GL_VERTEX_ATTRIB_ARRAY1_NV */
-   { 38353, 0x00008652 }, /* GL_VERTEX_ATTRIB_ARRAY2_NV */
-   { 38380, 0x00008653 }, /* GL_VERTEX_ATTRIB_ARRAY3_NV */
-   { 38407, 0x00008654 }, /* GL_VERTEX_ATTRIB_ARRAY4_NV */
-   { 38434, 0x00008655 }, /* GL_VERTEX_ATTRIB_ARRAY5_NV */
-   { 38461, 0x00008656 }, /* GL_VERTEX_ATTRIB_ARRAY6_NV */
-   { 38488, 0x00008657 }, /* GL_VERTEX_ATTRIB_ARRAY7_NV */
-   { 38515, 0x00008658 }, /* GL_VERTEX_ATTRIB_ARRAY8_NV */
-   { 38542, 0x00008659 }, /* GL_VERTEX_ATTRIB_ARRAY9_NV */
-   { 38569, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */
-   { 38607, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB */
-   { 38649, 0x00008622 }, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED */
-   { 38680, 0x00008622 }, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB */
-   { 38715, 0x0000886A }, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED */
-   { 38749, 0x0000886A }, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB */
-   { 38787, 0x00008645 }, /* GL_VERTEX_ATTRIB_ARRAY_POINTER */
-   { 38818, 0x00008645 }, /* GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB */
-   { 38853, 0x00008623 }, /* GL_VERTEX_ATTRIB_ARRAY_SIZE */
-   { 38881, 0x00008623 }, /* GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB */
-   { 38913, 0x00008624 }, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE */
-   { 38943, 0x00008624 }, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB */
-   { 38977, 0x00008625 }, /* GL_VERTEX_ATTRIB_ARRAY_TYPE */
-   { 39005, 0x00008625 }, /* GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB */
-   { 39037, 0x000086A7 }, /* GL_VERTEX_BLEND_ARB */
-   { 39057, 0x00008620 }, /* GL_VERTEX_PROGRAM_ARB */
-   { 39079, 0x0000864A }, /* GL_VERTEX_PROGRAM_BINDING_NV */
-   { 39108, 0x00008620 }, /* GL_VERTEX_PROGRAM_NV */
-   { 39129, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE */
-   { 39158, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_ARB */
-   { 39191, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_NV */
-   { 39223, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE */
-   { 39250, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_ARB */
-   { 39281, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_NV */
-   { 39311, 0x00008B31 }, /* GL_VERTEX_SHADER */
-   { 39328, 0x00008B31 }, /* GL_VERTEX_SHADER_ARB */
-   { 39349, 0x00008621 }, /* GL_VERTEX_STATE_PROGRAM_NV */
-   { 39376, 0x00000BA2 }, /* GL_VIEWPORT */
-   { 39388, 0x00000800 }, /* GL_VIEWPORT_BIT */
-   { 39404, 0x000086AD }, /* GL_WEIGHT_ARRAY_ARB */
-   { 39424, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */
-   { 39455, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB */
-   { 39490, 0x000086AC }, /* GL_WEIGHT_ARRAY_POINTER_ARB */
-   { 39518, 0x000086AB }, /* GL_WEIGHT_ARRAY_SIZE_ARB */
-   { 39543, 0x000086AA }, /* GL_WEIGHT_ARRAY_STRIDE_ARB */
-   { 39570, 0x000086A9 }, /* GL_WEIGHT_ARRAY_TYPE_ARB */
-   { 39595, 0x000086A6 }, /* GL_WEIGHT_SUM_UNITY_ARB */
-   { 39619, 0x000081D4 }, /* GL_WRAP_BORDER_SUN */
-   { 39638, 0x000088B9 }, /* GL_WRITE_ONLY */
-   { 39652, 0x000088B9 }, /* GL_WRITE_ONLY_ARB */
-   { 39670, 0x00001506 }, /* GL_XOR */
-   { 39677, 0x000085B9 }, /* GL_YCBCR_422_APPLE */
-   { 39696, 0x00008757 }, /* GL_YCBCR_MESA */
-   { 39710, 0x00000000 }, /* GL_ZERO */
-   { 39718, 0x00000D16 }, /* GL_ZOOM_X */
-   { 39728, 0x00000D17 }, /* GL_ZOOM_Y */
+   {  1687, 0x00008A13 }, /* GL_BUFFER_FLUSHING_UNMAP_APPLE */
+   {  1718, 0x000088BC }, /* GL_BUFFER_MAPPED */
+   {  1735, 0x000088BC }, /* GL_BUFFER_MAPPED_ARB */
+   {  1756, 0x000088BD }, /* GL_BUFFER_MAP_POINTER */
+   {  1778, 0x000088BD }, /* GL_BUFFER_MAP_POINTER_ARB */
+   {  1804, 0x00008A12 }, /* GL_BUFFER_SERIALIZED_MODIFY_APPLE */
+   {  1838, 0x00008764 }, /* GL_BUFFER_SIZE */
+   {  1853, 0x00008764 }, /* GL_BUFFER_SIZE_ARB */
+   {  1872, 0x00008765 }, /* GL_BUFFER_USAGE */
+   {  1888, 0x00008765 }, /* GL_BUFFER_USAGE_ARB */
+   {  1908, 0x0000877B }, /* GL_BUMP_ENVMAP_ATI */
+   {  1927, 0x00008777 }, /* GL_BUMP_NUM_TEX_UNITS_ATI */
+   {  1953, 0x00008775 }, /* GL_BUMP_ROT_MATRIX_ATI */
+   {  1976, 0x00008776 }, /* GL_BUMP_ROT_MATRIX_SIZE_ATI */
+   {  2004, 0x0000877C }, /* GL_BUMP_TARGET_ATI */
+   {  2023, 0x00008778 }, /* GL_BUMP_TEX_UNITS_ATI */
+   {  2045, 0x00001400 }, /* GL_BYTE */
+   {  2053, 0x00002A24 }, /* GL_C3F_V3F */
+   {  2064, 0x00002A26 }, /* GL_C4F_N3F_V3F */
+   {  2079, 0x00002A22 }, /* GL_C4UB_V2F */
+   {  2091, 0x00002A23 }, /* GL_C4UB_V3F */
+   {  2103, 0x00000901 }, /* GL_CCW */
+   {  2110, 0x00002900 }, /* GL_CLAMP */
+   {  2119, 0x0000812D }, /* GL_CLAMP_TO_BORDER */
+   {  2138, 0x0000812D }, /* GL_CLAMP_TO_BORDER_ARB */
+   {  2161, 0x0000812D }, /* GL_CLAMP_TO_BORDER_SGIS */
+   {  2185, 0x0000812F }, /* GL_CLAMP_TO_EDGE */
+   {  2202, 0x0000812F }, /* GL_CLAMP_TO_EDGE_SGIS */
+   {  2224, 0x00001500 }, /* GL_CLEAR */
+   {  2233, 0x000084E1 }, /* GL_CLIENT_ACTIVE_TEXTURE */
+   {  2258, 0x000084E1 }, /* GL_CLIENT_ACTIVE_TEXTURE_ARB */
+   {  2287, 0xFFFFFFFF }, /* GL_CLIENT_ALL_ATTRIB_BITS */
+   {  2313, 0x00000BB1 }, /* GL_CLIENT_ATTRIB_STACK_DEPTH */
+   {  2342, 0x00000001 }, /* GL_CLIENT_PIXEL_STORE_BIT */
+   {  2368, 0x00000002 }, /* GL_CLIENT_VERTEX_ARRAY_BIT */
+   {  2395, 0x00003000 }, /* GL_CLIP_PLANE0 */
+   {  2410, 0x00003001 }, /* GL_CLIP_PLANE1 */
+   {  2425, 0x00003002 }, /* GL_CLIP_PLANE2 */
+   {  2440, 0x00003003 }, /* GL_CLIP_PLANE3 */
+   {  2455, 0x00003004 }, /* GL_CLIP_PLANE4 */
+   {  2470, 0x00003005 }, /* GL_CLIP_PLANE5 */
+   {  2485, 0x000080F0 }, /* GL_CLIP_VOLUME_CLIPPING_HINT_EXT */
+   {  2518, 0x00000A00 }, /* GL_COEFF */
+   {  2527, 0x00001800 }, /* GL_COLOR */
+   {  2536, 0x00008076 }, /* GL_COLOR_ARRAY */
+   {  2551, 0x00008898 }, /* GL_COLOR_ARRAY_BUFFER_BINDING */
+   {  2581, 0x00008898 }, /* GL_COLOR_ARRAY_BUFFER_BINDING_ARB */
+   {  2615, 0x00008090 }, /* GL_COLOR_ARRAY_POINTER */
+   {  2638, 0x00008081 }, /* GL_COLOR_ARRAY_SIZE */
+   {  2658, 0x00008083 }, /* GL_COLOR_ARRAY_STRIDE */
+   {  2680, 0x00008082 }, /* GL_COLOR_ARRAY_TYPE */
+   {  2700, 0x00008CE0 }, /* GL_COLOR_ATTACHMENT0 */
+   {  2721, 0x00008CE0 }, /* GL_COLOR_ATTACHMENT0_EXT */
+   {  2746, 0x00008CE1 }, /* GL_COLOR_ATTACHMENT1 */
+   {  2767, 0x00008CEA }, /* GL_COLOR_ATTACHMENT10 */
+   {  2789, 0x00008CEA }, /* GL_COLOR_ATTACHMENT10_EXT */
+   {  2815, 0x00008CEB }, /* GL_COLOR_ATTACHMENT11 */
+   {  2837, 0x00008CEB }, /* GL_COLOR_ATTACHMENT11_EXT */
+   {  2863, 0x00008CEC }, /* GL_COLOR_ATTACHMENT12 */
+   {  2885, 0x00008CEC }, /* GL_COLOR_ATTACHMENT12_EXT */
+   {  2911, 0x00008CED }, /* GL_COLOR_ATTACHMENT13 */
+   {  2933, 0x00008CED }, /* GL_COLOR_ATTACHMENT13_EXT */
+   {  2959, 0x00008CEE }, /* GL_COLOR_ATTACHMENT14 */
+   {  2981, 0x00008CEE }, /* GL_COLOR_ATTACHMENT14_EXT */
+   {  3007, 0x00008CEF }, /* GL_COLOR_ATTACHMENT15 */
+   {  3029, 0x00008CEF }, /* GL_COLOR_ATTACHMENT15_EXT */
+   {  3055, 0x00008CE1 }, /* GL_COLOR_ATTACHMENT1_EXT */
+   {  3080, 0x00008CE2 }, /* GL_COLOR_ATTACHMENT2 */
+   {  3101, 0x00008CE2 }, /* GL_COLOR_ATTACHMENT2_EXT */
+   {  3126, 0x00008CE3 }, /* GL_COLOR_ATTACHMENT3 */
+   {  3147, 0x00008CE3 }, /* GL_COLOR_ATTACHMENT3_EXT */
+   {  3172, 0x00008CE4 }, /* GL_COLOR_ATTACHMENT4 */
+   {  3193, 0x00008CE4 }, /* GL_COLOR_ATTACHMENT4_EXT */
+   {  3218, 0x00008CE5 }, /* GL_COLOR_ATTACHMENT5 */
+   {  3239, 0x00008CE5 }, /* GL_COLOR_ATTACHMENT5_EXT */
+   {  3264, 0x00008CE6 }, /* GL_COLOR_ATTACHMENT6 */
+   {  3285, 0x00008CE6 }, /* GL_COLOR_ATTACHMENT6_EXT */
+   {  3310, 0x00008CE7 }, /* GL_COLOR_ATTACHMENT7 */
+   {  3331, 0x00008CE7 }, /* GL_COLOR_ATTACHMENT7_EXT */
+   {  3356, 0x00008CE8 }, /* GL_COLOR_ATTACHMENT8 */
+   {  3377, 0x00008CE8 }, /* GL_COLOR_ATTACHMENT8_EXT */
+   {  3402, 0x00008CE9 }, /* GL_COLOR_ATTACHMENT9 */
+   {  3423, 0x00008CE9 }, /* GL_COLOR_ATTACHMENT9_EXT */
+   {  3448, 0x00004000 }, /* GL_COLOR_BUFFER_BIT */
+   {  3468, 0x00000C22 }, /* GL_COLOR_CLEAR_VALUE */
+   {  3489, 0x00001900 }, /* GL_COLOR_INDEX */
+   {  3504, 0x00001603 }, /* GL_COLOR_INDEXES */
+   {  3521, 0x00000BF2 }, /* GL_COLOR_LOGIC_OP */
+   {  3539, 0x00000B57 }, /* GL_COLOR_MATERIAL */
+   {  3557, 0x00000B55 }, /* GL_COLOR_MATERIAL_FACE */
+   {  3580, 0x00000B56 }, /* GL_COLOR_MATERIAL_PARAMETER */
+   {  3608, 0x000080B1 }, /* GL_COLOR_MATRIX */
+   {  3624, 0x000080B1 }, /* GL_COLOR_MATRIX_SGI */
+   {  3644, 0x000080B2 }, /* GL_COLOR_MATRIX_STACK_DEPTH */
+   {  3672, 0x000080B2 }, /* GL_COLOR_MATRIX_STACK_DEPTH_SGI */
+   {  3704, 0x00008458 }, /* GL_COLOR_SUM */
+   {  3717, 0x00008458 }, /* GL_COLOR_SUM_ARB */
+   {  3734, 0x000080D0 }, /* GL_COLOR_TABLE */
+   {  3749, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE */
+   {  3775, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE_EXT */
+   {  3805, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE_SGI */
+   {  3835, 0x000080D7 }, /* GL_COLOR_TABLE_BIAS */
+   {  3855, 0x000080D7 }, /* GL_COLOR_TABLE_BIAS_SGI */
+   {  3879, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE */
+   {  3904, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE_EXT */
+   {  3933, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE_SGI */
+   {  3962, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT */
+   {  3984, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT_EXT */
+   {  4010, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT_SGI */
+   {  4036, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE */
+   {  4062, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE_EXT */
+   {  4092, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE_SGI */
+   {  4122, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE */
+   {  4152, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE_EXT */
+   {  4186, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE_SGI */
+   {  4220, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE */
+   {  4250, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE_EXT */
+   {  4284, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE_SGI */
+   {  4318, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE */
+   {  4342, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE_EXT */
+   {  4370, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE_SGI */
+   {  4398, 0x000080D6 }, /* GL_COLOR_TABLE_SCALE */
+   {  4419, 0x000080D6 }, /* GL_COLOR_TABLE_SCALE_SGI */
+   {  4444, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH */
+   {  4465, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH_EXT */
+   {  4490, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH_SGI */
+   {  4515, 0x00000C23 }, /* GL_COLOR_WRITEMASK */
+   {  4534, 0x00008570 }, /* GL_COMBINE */
+   {  4545, 0x00008503 }, /* GL_COMBINE4 */
+   {  4557, 0x00008572 }, /* GL_COMBINE_ALPHA */
+   {  4574, 0x00008572 }, /* GL_COMBINE_ALPHA_ARB */
+   {  4595, 0x00008572 }, /* GL_COMBINE_ALPHA_EXT */
+   {  4616, 0x00008570 }, /* GL_COMBINE_ARB */
+   {  4631, 0x00008570 }, /* GL_COMBINE_EXT */
+   {  4646, 0x00008571 }, /* GL_COMBINE_RGB */
+   {  4661, 0x00008571 }, /* GL_COMBINE_RGB_ARB */
+   {  4680, 0x00008571 }, /* GL_COMBINE_RGB_EXT */
+   {  4699, 0x0000884E }, /* GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT */
+   {  4735, 0x0000884E }, /* GL_COMPARE_R_TO_TEXTURE */
+   {  4759, 0x0000884E }, /* GL_COMPARE_R_TO_TEXTURE_ARB */
+   {  4787, 0x00001300 }, /* GL_COMPILE */
+   {  4798, 0x00001301 }, /* GL_COMPILE_AND_EXECUTE */
+   {  4821, 0x00008B81 }, /* GL_COMPILE_STATUS */
+   {  4839, 0x000084E9 }, /* GL_COMPRESSED_ALPHA */
+   {  4859, 0x000084E9 }, /* GL_COMPRESSED_ALPHA_ARB */
+   {  4883, 0x000084EC }, /* GL_COMPRESSED_INTENSITY */
+   {  4907, 0x000084EC }, /* GL_COMPRESSED_INTENSITY_ARB */
+   {  4935, 0x000084EA }, /* GL_COMPRESSED_LUMINANCE */
+   {  4959, 0x000084EB }, /* GL_COMPRESSED_LUMINANCE_ALPHA */
+   {  4989, 0x000084EB }, /* GL_COMPRESSED_LUMINANCE_ALPHA_ARB */
+   {  5023, 0x000084EA }, /* GL_COMPRESSED_LUMINANCE_ARB */
+   {  5051, 0x000084ED }, /* GL_COMPRESSED_RGB */
+   {  5069, 0x000084EE }, /* GL_COMPRESSED_RGBA */
+   {  5088, 0x000084EE }, /* GL_COMPRESSED_RGBA_ARB */
+   {  5111, 0x000086B1 }, /* GL_COMPRESSED_RGBA_FXT1_3DFX */
+   {  5140, 0x000083F1 }, /* GL_COMPRESSED_RGBA_S3TC_DXT1_EXT */
+   {  5173, 0x000083F2 }, /* GL_COMPRESSED_RGBA_S3TC_DXT3_EXT */
+   {  5206, 0x000083F3 }, /* GL_COMPRESSED_RGBA_S3TC_DXT5_EXT */
+   {  5239, 0x000084ED }, /* GL_COMPRESSED_RGB_ARB */
+   {  5261, 0x000086B0 }, /* GL_COMPRESSED_RGB_FXT1_3DFX */
+   {  5289, 0x000083F0 }, /* GL_COMPRESSED_RGB_S3TC_DXT1_EXT */
+   {  5321, 0x00008C4A }, /* GL_COMPRESSED_SLUMINANCE */
+   {  5346, 0x00008C4B }, /* GL_COMPRESSED_SLUMINANCE_ALPHA */
+   {  5377, 0x00008C48 }, /* GL_COMPRESSED_SRGB */
+   {  5396, 0x00008C49 }, /* GL_COMPRESSED_SRGB_ALPHA */
+   {  5421, 0x000086A3 }, /* GL_COMPRESSED_TEXTURE_FORMATS */
+   {  5451, 0x00008576 }, /* GL_CONSTANT */
+   {  5463, 0x00008003 }, /* GL_CONSTANT_ALPHA */
+   {  5481, 0x00008003 }, /* GL_CONSTANT_ALPHA_EXT */
+   {  5503, 0x00008576 }, /* GL_CONSTANT_ARB */
+   {  5519, 0x00001207 }, /* GL_CONSTANT_ATTENUATION */
+   {  5543, 0x00008151 }, /* GL_CONSTANT_BORDER_HP */
+   {  5565, 0x00008001 }, /* GL_CONSTANT_COLOR */
+   {  5583, 0x00008001 }, /* GL_CONSTANT_COLOR_EXT */
+   {  5605, 0x00008576 }, /* GL_CONSTANT_EXT */
+   {  5621, 0x00008010 }, /* GL_CONVOLUTION_1D */
+   {  5639, 0x00008011 }, /* GL_CONVOLUTION_2D */
+   {  5657, 0x00008154 }, /* GL_CONVOLUTION_BORDER_COLOR */
+   {  5685, 0x00008154 }, /* GL_CONVOLUTION_BORDER_COLOR_HP */
+   {  5716, 0x00008013 }, /* GL_CONVOLUTION_BORDER_MODE */
+   {  5743, 0x00008013 }, /* GL_CONVOLUTION_BORDER_MODE_EXT */
+   {  5774, 0x00008015 }, /* GL_CONVOLUTION_FILTER_BIAS */
+   {  5801, 0x00008015 }, /* GL_CONVOLUTION_FILTER_BIAS_EXT */
+   {  5832, 0x00008014 }, /* GL_CONVOLUTION_FILTER_SCALE */
+   {  5860, 0x00008014 }, /* GL_CONVOLUTION_FILTER_SCALE_EXT */
+   {  5892, 0x00008017 }, /* GL_CONVOLUTION_FORMAT */
+   {  5914, 0x00008017 }, /* GL_CONVOLUTION_FORMAT_EXT */
+   {  5940, 0x00008019 }, /* GL_CONVOLUTION_HEIGHT */
+   {  5962, 0x00008019 }, /* GL_CONVOLUTION_HEIGHT_EXT */
+   {  5988, 0x00008018 }, /* GL_CONVOLUTION_WIDTH */
+   {  6009, 0x00008018 }, /* GL_CONVOLUTION_WIDTH_EXT */
+   {  6034, 0x00008862 }, /* GL_COORD_REPLACE */
+   {  6051, 0x00008862 }, /* GL_COORD_REPLACE_ARB */
+   {  6072, 0x00008862 }, /* GL_COORD_REPLACE_NV */
+   {  6092, 0x00001503 }, /* GL_COPY */
+   {  6100, 0x0000150C }, /* GL_COPY_INVERTED */
+   {  6117, 0x00000706 }, /* GL_COPY_PIXEL_TOKEN */
+   {  6137, 0x00008F36 }, /* GL_COPY_READ_BUFFER */
+   {  6157, 0x00008F37 }, /* GL_COPY_WRITE_BUFFER */
+   {  6178, 0x00000B44 }, /* GL_CULL_FACE */
+   {  6191, 0x00000B45 }, /* GL_CULL_FACE_MODE */
+   {  6209, 0x000081AA }, /* GL_CULL_VERTEX_EXT */
+   {  6228, 0x000081AC }, /* GL_CULL_VERTEX_EYE_POSITION_EXT */
+   {  6260, 0x000081AB }, /* GL_CULL_VERTEX_OBJECT_POSITION_EXT */
+   {  6295, 0x00008626 }, /* GL_CURRENT_ATTRIB_NV */
+   {  6316, 0x00000001 }, /* GL_CURRENT_BIT */
+   {  6331, 0x00000B00 }, /* GL_CURRENT_COLOR */
+   {  6348, 0x00008453 }, /* GL_CURRENT_FOG_COORD */
+   {  6369, 0x00008453 }, /* GL_CURRENT_FOG_COORDINATE */
+   {  6395, 0x00000B01 }, /* GL_CURRENT_INDEX */
+   {  6412, 0x00008641 }, /* GL_CURRENT_MATRIX_ARB */
+   {  6434, 0x00008845 }, /* GL_CURRENT_MATRIX_INDEX_ARB */
+   {  6462, 0x00008641 }, /* GL_CURRENT_MATRIX_NV */
+   {  6483, 0x00008640 }, /* GL_CURRENT_MATRIX_STACK_DEPTH_ARB */
+   {  6517, 0x00008640 }, /* GL_CURRENT_MATRIX_STACK_DEPTH_NV */
+   {  6550, 0x00000B02 }, /* GL_CURRENT_NORMAL */
+   {  6568, 0x00008843 }, /* GL_CURRENT_PALETTE_MATRIX_ARB */
+   {  6598, 0x00008B8D }, /* GL_CURRENT_PROGRAM */
+   {  6617, 0x00008865 }, /* GL_CURRENT_QUERY */
+   {  6634, 0x00008865 }, /* GL_CURRENT_QUERY_ARB */
+   {  6655, 0x00000B04 }, /* GL_CURRENT_RASTER_COLOR */
+   {  6679, 0x00000B09 }, /* GL_CURRENT_RASTER_DISTANCE */
+   {  6706, 0x00000B05 }, /* GL_CURRENT_RASTER_INDEX */
+   {  6730, 0x00000B07 }, /* GL_CURRENT_RASTER_POSITION */
+   {  6757, 0x00000B08 }, /* GL_CURRENT_RASTER_POSITION_VALID */
+   {  6790, 0x0000845F }, /* GL_CURRENT_RASTER_SECONDARY_COLOR */
+   {  6824, 0x00000B06 }, /* GL_CURRENT_RASTER_TEXTURE_COORDS */
+   {  6857, 0x00008459 }, /* GL_CURRENT_SECONDARY_COLOR */
+   {  6884, 0x00000B03 }, /* GL_CURRENT_TEXTURE_COORDS */
+   {  6910, 0x00008626 }, /* GL_CURRENT_VERTEX_ATTRIB */
+   {  6935, 0x00008626 }, /* GL_CURRENT_VERTEX_ATTRIB_ARB */
+   {  6964, 0x000086A8 }, /* GL_CURRENT_WEIGHT_ARB */
+   {  6986, 0x00000900 }, /* GL_CW */
+   {  6992, 0x0000875B }, /* GL_DEBUG_ASSERT_MESA */
+   {  7013, 0x00008759 }, /* GL_DEBUG_OBJECT_MESA */
+   {  7034, 0x0000875A }, /* GL_DEBUG_PRINT_MESA */
+   {  7054, 0x00002101 }, /* GL_DECAL */
+   {  7063, 0x00001E03 }, /* GL_DECR */
+   {  7071, 0x00008508 }, /* GL_DECR_WRAP */
+   {  7084, 0x00008508 }, /* GL_DECR_WRAP_EXT */
+   {  7101, 0x00008B80 }, /* GL_DELETE_STATUS */
+   {  7118, 0x00001801 }, /* GL_DEPTH */
+   {  7127, 0x000088F0 }, /* GL_DEPTH24_STENCIL8 */
+   {  7147, 0x00008D00 }, /* GL_DEPTH_ATTACHMENT */
+   {  7167, 0x00008D00 }, /* GL_DEPTH_ATTACHMENT_EXT */
+   {  7191, 0x00000D1F }, /* GL_DEPTH_BIAS */
+   {  7205, 0x00000D56 }, /* GL_DEPTH_BITS */
+   {  7219, 0x00008891 }, /* GL_DEPTH_BOUNDS_EXT */
+   {  7239, 0x00008890 }, /* GL_DEPTH_BOUNDS_TEST_EXT */
+   {  7264, 0x00000100 }, /* GL_DEPTH_BUFFER_BIT */
+   {  7284, 0x0000864F }, /* GL_DEPTH_CLAMP_NV */
+   {  7302, 0x00000B73 }, /* GL_DEPTH_CLEAR_VALUE */
+   {  7323, 0x00001902 }, /* GL_DEPTH_COMPONENT */
+   {  7342, 0x000081A5 }, /* GL_DEPTH_COMPONENT16 */
+   {  7363, 0x000081A5 }, /* GL_DEPTH_COMPONENT16_ARB */
+   {  7388, 0x000081A5 }, /* GL_DEPTH_COMPONENT16_SGIX */
+   {  7414, 0x000081A6 }, /* GL_DEPTH_COMPONENT24 */
+   {  7435, 0x000081A6 }, /* GL_DEPTH_COMPONENT24_ARB */
+   {  7460, 0x000081A6 }, /* GL_DEPTH_COMPONENT24_SGIX */
+   {  7486, 0x000081A7 }, /* GL_DEPTH_COMPONENT32 */
+   {  7507, 0x000081A7 }, /* GL_DEPTH_COMPONENT32_ARB */
+   {  7532, 0x000081A7 }, /* GL_DEPTH_COMPONENT32_SGIX */
+   {  7558, 0x00000B74 }, /* GL_DEPTH_FUNC */
+   {  7572, 0x00000B70 }, /* GL_DEPTH_RANGE */
+   {  7587, 0x00000D1E }, /* GL_DEPTH_SCALE */
+   {  7602, 0x000084F9 }, /* GL_DEPTH_STENCIL */
+   {  7619, 0x0000821A }, /* GL_DEPTH_STENCIL_ATTACHMENT */
+   {  7647, 0x000084F9 }, /* GL_DEPTH_STENCIL_NV */
+   {  7667, 0x0000886F }, /* GL_DEPTH_STENCIL_TO_BGRA_NV */
+   {  7695, 0x0000886E }, /* GL_DEPTH_STENCIL_TO_RGBA_NV */
+   {  7723, 0x00000B71 }, /* GL_DEPTH_TEST */
+   {  7737, 0x0000884B }, /* GL_DEPTH_TEXTURE_MODE */
+   {  7759, 0x0000884B }, /* GL_DEPTH_TEXTURE_MODE_ARB */
+   {  7785, 0x00000B72 }, /* GL_DEPTH_WRITEMASK */
+   {  7804, 0x00001201 }, /* GL_DIFFUSE */
+   {  7815, 0x00000BD0 }, /* GL_DITHER */
+   {  7825, 0x00000A02 }, /* GL_DOMAIN */
+   {  7835, 0x00001100 }, /* GL_DONT_CARE */
+   {  7848, 0x000086AE }, /* GL_DOT3_RGB */
+   {  7860, 0x000086AF }, /* GL_DOT3_RGBA */
+   {  7873, 0x000086AF }, /* GL_DOT3_RGBA_ARB */
+   {  7890, 0x00008741 }, /* GL_DOT3_RGBA_EXT */
+   {  7907, 0x000086AE }, /* GL_DOT3_RGB_ARB */
+   {  7923, 0x00008740 }, /* GL_DOT3_RGB_EXT */
+   {  7939, 0x0000140A }, /* GL_DOUBLE */
+   {  7949, 0x00000C32 }, /* GL_DOUBLEBUFFER */
+   {  7965, 0x00000C01 }, /* GL_DRAW_BUFFER */
+   {  7980, 0x00008825 }, /* GL_DRAW_BUFFER0 */
+   {  7996, 0x00008825 }, /* GL_DRAW_BUFFER0_ARB */
+   {  8016, 0x00008825 }, /* GL_DRAW_BUFFER0_ATI */
+   {  8036, 0x00008826 }, /* GL_DRAW_BUFFER1 */
+   {  8052, 0x0000882F }, /* GL_DRAW_BUFFER10 */
+   {  8069, 0x0000882F }, /* GL_DRAW_BUFFER10_ARB */
+   {  8090, 0x0000882F }, /* GL_DRAW_BUFFER10_ATI */
+   {  8111, 0x00008830 }, /* GL_DRAW_BUFFER11 */
+   {  8128, 0x00008830 }, /* GL_DRAW_BUFFER11_ARB */
+   {  8149, 0x00008830 }, /* GL_DRAW_BUFFER11_ATI */
+   {  8170, 0x00008831 }, /* GL_DRAW_BUFFER12 */
+   {  8187, 0x00008831 }, /* GL_DRAW_BUFFER12_ARB */
+   {  8208, 0x00008831 }, /* GL_DRAW_BUFFER12_ATI */
+   {  8229, 0x00008832 }, /* GL_DRAW_BUFFER13 */
+   {  8246, 0x00008832 }, /* GL_DRAW_BUFFER13_ARB */
+   {  8267, 0x00008832 }, /* GL_DRAW_BUFFER13_ATI */
+   {  8288, 0x00008833 }, /* GL_DRAW_BUFFER14 */
+   {  8305, 0x00008833 }, /* GL_DRAW_BUFFER14_ARB */
+   {  8326, 0x00008833 }, /* GL_DRAW_BUFFER14_ATI */
+   {  8347, 0x00008834 }, /* GL_DRAW_BUFFER15 */
+   {  8364, 0x00008834 }, /* GL_DRAW_BUFFER15_ARB */
+   {  8385, 0x00008834 }, /* GL_DRAW_BUFFER15_ATI */
+   {  8406, 0x00008826 }, /* GL_DRAW_BUFFER1_ARB */
+   {  8426, 0x00008826 }, /* GL_DRAW_BUFFER1_ATI */
+   {  8446, 0x00008827 }, /* GL_DRAW_BUFFER2 */
+   {  8462, 0x00008827 }, /* GL_DRAW_BUFFER2_ARB */
+   {  8482, 0x00008827 }, /* GL_DRAW_BUFFER2_ATI */
+   {  8502, 0x00008828 }, /* GL_DRAW_BUFFER3 */
+   {  8518, 0x00008828 }, /* GL_DRAW_BUFFER3_ARB */
+   {  8538, 0x00008828 }, /* GL_DRAW_BUFFER3_ATI */
+   {  8558, 0x00008829 }, /* GL_DRAW_BUFFER4 */
+   {  8574, 0x00008829 }, /* GL_DRAW_BUFFER4_ARB */
+   {  8594, 0x00008829 }, /* GL_DRAW_BUFFER4_ATI */
+   {  8614, 0x0000882A }, /* GL_DRAW_BUFFER5 */
+   {  8630, 0x0000882A }, /* GL_DRAW_BUFFER5_ARB */
+   {  8650, 0x0000882A }, /* GL_DRAW_BUFFER5_ATI */
+   {  8670, 0x0000882B }, /* GL_DRAW_BUFFER6 */
+   {  8686, 0x0000882B }, /* GL_DRAW_BUFFER6_ARB */
+   {  8706, 0x0000882B }, /* GL_DRAW_BUFFER6_ATI */
+   {  8726, 0x0000882C }, /* GL_DRAW_BUFFER7 */
+   {  8742, 0x0000882C }, /* GL_DRAW_BUFFER7_ARB */
+   {  8762, 0x0000882C }, /* GL_DRAW_BUFFER7_ATI */
+   {  8782, 0x0000882D }, /* GL_DRAW_BUFFER8 */
+   {  8798, 0x0000882D }, /* GL_DRAW_BUFFER8_ARB */
+   {  8818, 0x0000882D }, /* GL_DRAW_BUFFER8_ATI */
+   {  8838, 0x0000882E }, /* GL_DRAW_BUFFER9 */
+   {  8854, 0x0000882E }, /* GL_DRAW_BUFFER9_ARB */
+   {  8874, 0x0000882E }, /* GL_DRAW_BUFFER9_ATI */
+   {  8894, 0x00008CA9 }, /* GL_DRAW_FRAMEBUFFER */
+   {  8914, 0x00008CA6 }, /* GL_DRAW_FRAMEBUFFER_BINDING_EXT */
+   {  8946, 0x00008CA9 }, /* GL_DRAW_FRAMEBUFFER_EXT */
+   {  8970, 0x00000705 }, /* GL_DRAW_PIXEL_TOKEN */
+   {  8990, 0x00000304 }, /* GL_DST_ALPHA */
+   {  9003, 0x00000306 }, /* GL_DST_COLOR */
+   {  9016, 0x0000877A }, /* GL_DU8DV8_ATI */
+   {  9030, 0x00008779 }, /* GL_DUDV_ATI */
+   {  9042, 0x000088EA }, /* GL_DYNAMIC_COPY */
+   {  9058, 0x000088EA }, /* GL_DYNAMIC_COPY_ARB */
+   {  9078, 0x000088E8 }, /* GL_DYNAMIC_DRAW */
+   {  9094, 0x000088E8 }, /* GL_DYNAMIC_DRAW_ARB */
+   {  9114, 0x000088E9 }, /* GL_DYNAMIC_READ */
+   {  9130, 0x000088E9 }, /* GL_DYNAMIC_READ_ARB */
+   {  9150, 0x00000B43 }, /* GL_EDGE_FLAG */
+   {  9163, 0x00008079 }, /* GL_EDGE_FLAG_ARRAY */
+   {  9182, 0x0000889B }, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING */
+   {  9216, 0x0000889B }, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB */
+   {  9254, 0x00008093 }, /* GL_EDGE_FLAG_ARRAY_POINTER */
+   {  9281, 0x0000808C }, /* GL_EDGE_FLAG_ARRAY_STRIDE */
+   {  9307, 0x00008893 }, /* GL_ELEMENT_ARRAY_BUFFER */
+   {  9331, 0x00008895 }, /* GL_ELEMENT_ARRAY_BUFFER_BINDING */
+   {  9363, 0x00008895 }, /* GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB */
+   {  9399, 0x00001600 }, /* GL_EMISSION */
+   {  9411, 0x00002000 }, /* GL_ENABLE_BIT */
+   {  9425, 0x00000202 }, /* GL_EQUAL */
+   {  9434, 0x00001509 }, /* GL_EQUIV */
+   {  9443, 0x00010000 }, /* GL_EVAL_BIT */
+   {  9455, 0x00000800 }, /* GL_EXP */
+   {  9462, 0x00000801 }, /* GL_EXP2 */
+   {  9470, 0x00001F03 }, /* GL_EXTENSIONS */
+   {  9484, 0x00002400 }, /* GL_EYE_LINEAR */
+   {  9498, 0x00002502 }, /* GL_EYE_PLANE */
+   {  9511, 0x0000855C }, /* GL_EYE_PLANE_ABSOLUTE_NV */
+   {  9536, 0x0000855B }, /* GL_EYE_RADIAL_NV */
+   {  9553, 0x00000000 }, /* GL_FALSE */
+   {  9562, 0x00001101 }, /* GL_FASTEST */
+   {  9573, 0x00001C01 }, /* GL_FEEDBACK */
+   {  9585, 0x00000DF0 }, /* GL_FEEDBACK_BUFFER_POINTER */
+   {  9612, 0x00000DF1 }, /* GL_FEEDBACK_BUFFER_SIZE */
+   {  9636, 0x00000DF2 }, /* GL_FEEDBACK_BUFFER_TYPE */
+   {  9660, 0x00001B02 }, /* GL_FILL */
+   {  9668, 0x00008E4D }, /* GL_FIRST_VERTEX_CONVENTION_EXT */
+   {  9699, 0x00001D00 }, /* GL_FLAT */
+   {  9707, 0x00001406 }, /* GL_FLOAT */
+   {  9716, 0x00008B5A }, /* GL_FLOAT_MAT2 */
+   {  9730, 0x00008B5A }, /* GL_FLOAT_MAT2_ARB */
+   {  9748, 0x00008B65 }, /* GL_FLOAT_MAT2x3 */
+   {  9764, 0x00008B66 }, /* GL_FLOAT_MAT2x4 */
+   {  9780, 0x00008B5B }, /* GL_FLOAT_MAT3 */
+   {  9794, 0x00008B5B }, /* GL_FLOAT_MAT3_ARB */
+   {  9812, 0x00008B67 }, /* GL_FLOAT_MAT3x2 */
+   {  9828, 0x00008B68 }, /* GL_FLOAT_MAT3x4 */
+   {  9844, 0x00008B5C }, /* GL_FLOAT_MAT4 */
+   {  9858, 0x00008B5C }, /* GL_FLOAT_MAT4_ARB */
+   {  9876, 0x00008B69 }, /* GL_FLOAT_MAT4x2 */
+   {  9892, 0x00008B6A }, /* GL_FLOAT_MAT4x3 */
+   {  9908, 0x00008B50 }, /* GL_FLOAT_VEC2 */
+   {  9922, 0x00008B50 }, /* GL_FLOAT_VEC2_ARB */
+   {  9940, 0x00008B51 }, /* GL_FLOAT_VEC3 */
+   {  9954, 0x00008B51 }, /* GL_FLOAT_VEC3_ARB */
+   {  9972, 0x00008B52 }, /* GL_FLOAT_VEC4 */
+   {  9986, 0x00008B52 }, /* GL_FLOAT_VEC4_ARB */
+   { 10004, 0x00000B60 }, /* GL_FOG */
+   { 10011, 0x00000080 }, /* GL_FOG_BIT */
+   { 10022, 0x00000B66 }, /* GL_FOG_COLOR */
+   { 10035, 0x00008451 }, /* GL_FOG_COORD */
+   { 10048, 0x00008451 }, /* GL_FOG_COORDINATE */
+   { 10066, 0x00008457 }, /* GL_FOG_COORDINATE_ARRAY */
+   { 10090, 0x0000889D }, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING */
+   { 10129, 0x0000889D }, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB */
+   { 10172, 0x00008456 }, /* GL_FOG_COORDINATE_ARRAY_POINTER */
+   { 10204, 0x00008455 }, /* GL_FOG_COORDINATE_ARRAY_STRIDE */
+   { 10235, 0x00008454 }, /* GL_FOG_COORDINATE_ARRAY_TYPE */
+   { 10264, 0x00008450 }, /* GL_FOG_COORDINATE_SOURCE */
+   { 10289, 0x00008457 }, /* GL_FOG_COORD_ARRAY */
+   { 10308, 0x0000889D }, /* GL_FOG_COORD_ARRAY_BUFFER_BINDING */
+   { 10342, 0x00008456 }, /* GL_FOG_COORD_ARRAY_POINTER */
+   { 10369, 0x00008455 }, /* GL_FOG_COORD_ARRAY_STRIDE */
+   { 10395, 0x00008454 }, /* GL_FOG_COORD_ARRAY_TYPE */
+   { 10419, 0x00008450 }, /* GL_FOG_COORD_SRC */
+   { 10436, 0x00000B62 }, /* GL_FOG_DENSITY */
+   { 10451, 0x0000855A }, /* GL_FOG_DISTANCE_MODE_NV */
+   { 10475, 0x00000B64 }, /* GL_FOG_END */
+   { 10486, 0x00000C54 }, /* GL_FOG_HINT */
+   { 10498, 0x00000B61 }, /* GL_FOG_INDEX */
+   { 10511, 0x00000B65 }, /* GL_FOG_MODE */
+   { 10523, 0x00008198 }, /* GL_FOG_OFFSET_SGIX */
+   { 10542, 0x00008199 }, /* GL_FOG_OFFSET_VALUE_SGIX */
+   { 10567, 0x00000B63 }, /* GL_FOG_START */
+   { 10580, 0x00008452 }, /* GL_FRAGMENT_DEPTH */
+   { 10598, 0x00008804 }, /* GL_FRAGMENT_PROGRAM_ARB */
+   { 10622, 0x00008B30 }, /* GL_FRAGMENT_SHADER */
+   { 10641, 0x00008B30 }, /* GL_FRAGMENT_SHADER_ARB */
+   { 10664, 0x00008B8B }, /* GL_FRAGMENT_SHADER_DERIVATIVE_HINT */
+   { 10699, 0x00008D40 }, /* GL_FRAMEBUFFER */
+   { 10714, 0x00008215 }, /* GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE */
+   { 10751, 0x00008214 }, /* GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE */
+   { 10787, 0x00008210 }, /* GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING */
+   { 10828, 0x00008211 }, /* GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE */
+   { 10869, 0x00008216 }, /* GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE */
+   { 10906, 0x00008213 }, /* GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE */
+   { 10943, 0x00008CD1 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME */
+   { 10981, 0x00008CD1 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT */
+   { 11023, 0x00008CD0 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE */
+   { 11061, 0x00008CD0 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT */
+   { 11103, 0x00008212 }, /* GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE */
+   { 11138, 0x00008217 }, /* GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE */
+   { 11177, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT */
+   { 11226, 0x00008CD3 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE */
+   { 11274, 0x00008CD3 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT */
+   { 11326, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */
+   { 11366, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */
+   { 11410, 0x00008CD2 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL */
+   { 11450, 0x00008CD2 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT */
+   { 11494, 0x00008CA6 }, /* GL_FRAMEBUFFER_BINDING_EXT */
+   { 11521, 0x00008CD5 }, /* GL_FRAMEBUFFER_COMPLETE */
+   { 11545, 0x00008CD5 }, /* GL_FRAMEBUFFER_COMPLETE_EXT */
+   { 11573, 0x00008218 }, /* GL_FRAMEBUFFER_DEFAULT */
+   { 11596, 0x00008D40 }, /* GL_FRAMEBUFFER_EXT */
+   { 11615, 0x00008CD6 }, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT */
+   { 11652, 0x00008CD6 }, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT */
+   { 11693, 0x00008CD9 }, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT */
+   { 11734, 0x00008CDB }, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT */
+   { 11776, 0x00008CD8 }, /* GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT */
+   { 11827, 0x00008CDA }, /* GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT */
+   { 11865, 0x00008CD7 }, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT */
+   { 11910, 0x00008CD7 }, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT */
+   { 11959, 0x00008D56 }, /* GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE */
+   { 11997, 0x00008CDC }, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT */
+   { 12039, 0x00008CDE }, /* GL_FRAMEBUFFER_STATUS_ERROR_EXT */
+   { 12071, 0x00008219 }, /* GL_FRAMEBUFFER_UNDEFINED */
+   { 12096, 0x00008CDD }, /* GL_FRAMEBUFFER_UNSUPPORTED */
+   { 12123, 0x00008CDD }, /* GL_FRAMEBUFFER_UNSUPPORTED_EXT */
+   { 12154, 0x00000404 }, /* GL_FRONT */
+   { 12163, 0x00000408 }, /* GL_FRONT_AND_BACK */
+   { 12181, 0x00000B46 }, /* GL_FRONT_FACE */
+   { 12195, 0x00000400 }, /* GL_FRONT_LEFT */
+   { 12209, 0x00000401 }, /* GL_FRONT_RIGHT */
+   { 12224, 0x00008006 }, /* GL_FUNC_ADD */
+   { 12236, 0x00008006 }, /* GL_FUNC_ADD_EXT */
+   { 12252, 0x0000800B }, /* GL_FUNC_REVERSE_SUBTRACT */
+   { 12277, 0x0000800B }, /* GL_FUNC_REVERSE_SUBTRACT_EXT */
+   { 12306, 0x0000800A }, /* GL_FUNC_SUBTRACT */
+   { 12323, 0x0000800A }, /* GL_FUNC_SUBTRACT_EXT */
+   { 12344, 0x00008191 }, /* GL_GENERATE_MIPMAP */
+   { 12363, 0x00008192 }, /* GL_GENERATE_MIPMAP_HINT */
+   { 12387, 0x00008192 }, /* GL_GENERATE_MIPMAP_HINT_SGIS */
+   { 12416, 0x00008191 }, /* GL_GENERATE_MIPMAP_SGIS */
+   { 12440, 0x00000206 }, /* GL_GEQUAL */
+   { 12450, 0x00000204 }, /* GL_GREATER */
+   { 12461, 0x00001904 }, /* GL_GREEN */
+   { 12470, 0x00000D19 }, /* GL_GREEN_BIAS */
+   { 12484, 0x00000D53 }, /* GL_GREEN_BITS */
+   { 12498, 0x00000D18 }, /* GL_GREEN_SCALE */
+   { 12513, 0x00008000 }, /* GL_HINT_BIT */
+   { 12525, 0x00008024 }, /* GL_HISTOGRAM */
+   { 12538, 0x0000802B }, /* GL_HISTOGRAM_ALPHA_SIZE */
+   { 12562, 0x0000802B }, /* GL_HISTOGRAM_ALPHA_SIZE_EXT */
+   { 12590, 0x0000802A }, /* GL_HISTOGRAM_BLUE_SIZE */
+   { 12613, 0x0000802A }, /* GL_HISTOGRAM_BLUE_SIZE_EXT */
+   { 12640, 0x00008024 }, /* GL_HISTOGRAM_EXT */
+   { 12657, 0x00008027 }, /* GL_HISTOGRAM_FORMAT */
+   { 12677, 0x00008027 }, /* GL_HISTOGRAM_FORMAT_EXT */
+   { 12701, 0x00008029 }, /* GL_HISTOGRAM_GREEN_SIZE */
+   { 12725, 0x00008029 }, /* GL_HISTOGRAM_GREEN_SIZE_EXT */
+   { 12753, 0x0000802C }, /* GL_HISTOGRAM_LUMINANCE_SIZE */
+   { 12781, 0x0000802C }, /* GL_HISTOGRAM_LUMINANCE_SIZE_EXT */
+   { 12813, 0x00008028 }, /* GL_HISTOGRAM_RED_SIZE */
+   { 12835, 0x00008028 }, /* GL_HISTOGRAM_RED_SIZE_EXT */
+   { 12861, 0x0000802D }, /* GL_HISTOGRAM_SINK */
+   { 12879, 0x0000802D }, /* GL_HISTOGRAM_SINK_EXT */
+   { 12901, 0x00008026 }, /* GL_HISTOGRAM_WIDTH */
+   { 12920, 0x00008026 }, /* GL_HISTOGRAM_WIDTH_EXT */
+   { 12943, 0x0000862A }, /* GL_IDENTITY_NV */
+   { 12958, 0x00008150 }, /* GL_IGNORE_BORDER_HP */
+   { 12978, 0x00008B9B }, /* GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES */
+   { 13018, 0x00008B9A }, /* GL_IMPLEMENTATION_COLOR_READ_TYPE_OES */
+   { 13056, 0x00001E02 }, /* GL_INCR */
+   { 13064, 0x00008507 }, /* GL_INCR_WRAP */
+   { 13077, 0x00008507 }, /* GL_INCR_WRAP_EXT */
+   { 13094, 0x00008222 }, /* GL_INDEX */
+   { 13103, 0x00008077 }, /* GL_INDEX_ARRAY */
+   { 13118, 0x00008899 }, /* GL_INDEX_ARRAY_BUFFER_BINDING */
+   { 13148, 0x00008899 }, /* GL_INDEX_ARRAY_BUFFER_BINDING_ARB */
+   { 13182, 0x00008091 }, /* GL_INDEX_ARRAY_POINTER */
+   { 13205, 0x00008086 }, /* GL_INDEX_ARRAY_STRIDE */
+   { 13227, 0x00008085 }, /* GL_INDEX_ARRAY_TYPE */
+   { 13247, 0x00000D51 }, /* GL_INDEX_BITS */
+   { 13261, 0x00000C20 }, /* GL_INDEX_CLEAR_VALUE */
+   { 13282, 0x00000BF1 }, /* GL_INDEX_LOGIC_OP */
+   { 13300, 0x00000C30 }, /* GL_INDEX_MODE */
+   { 13314, 0x00000D13 }, /* GL_INDEX_OFFSET */
+   { 13330, 0x00000D12 }, /* GL_INDEX_SHIFT */
+   { 13345, 0x00000C21 }, /* GL_INDEX_WRITEMASK */
+   { 13364, 0x00008B84 }, /* GL_INFO_LOG_LENGTH */
+   { 13383, 0x00001404 }, /* GL_INT */
+   { 13390, 0x00008049 }, /* GL_INTENSITY */
+   { 13403, 0x0000804C }, /* GL_INTENSITY12 */
+   { 13418, 0x0000804C }, /* GL_INTENSITY12_EXT */
+   { 13437, 0x0000804D }, /* GL_INTENSITY16 */
+   { 13452, 0x0000804D }, /* GL_INTENSITY16_EXT */
+   { 13471, 0x0000804A }, /* GL_INTENSITY4 */
+   { 13485, 0x0000804A }, /* GL_INTENSITY4_EXT */
+   { 13503, 0x0000804B }, /* GL_INTENSITY8 */
+   { 13517, 0x0000804B }, /* GL_INTENSITY8_EXT */
+   { 13535, 0x00008049 }, /* GL_INTENSITY_EXT */
+   { 13552, 0x00008575 }, /* GL_INTERPOLATE */
+   { 13567, 0x00008575 }, /* GL_INTERPOLATE_ARB */
+   { 13586, 0x00008575 }, /* GL_INTERPOLATE_EXT */
+   { 13605, 0x00008B53 }, /* GL_INT_VEC2 */
+   { 13617, 0x00008B53 }, /* GL_INT_VEC2_ARB */
+   { 13633, 0x00008B54 }, /* GL_INT_VEC3 */
+   { 13645, 0x00008B54 }, /* GL_INT_VEC3_ARB */
+   { 13661, 0x00008B55 }, /* GL_INT_VEC4 */
+   { 13673, 0x00008B55 }, /* GL_INT_VEC4_ARB */
+   { 13689, 0x00000500 }, /* GL_INVALID_ENUM */
+   { 13705, 0x00000506 }, /* GL_INVALID_FRAMEBUFFER_OPERATION */
+   { 13738, 0x00000506 }, /* GL_INVALID_FRAMEBUFFER_OPERATION_EXT */
+   { 13775, 0x00000502 }, /* GL_INVALID_OPERATION */
+   { 13796, 0x00000501 }, /* GL_INVALID_VALUE */
+   { 13813, 0x0000862B }, /* GL_INVERSE_NV */
+   { 13827, 0x0000862D }, /* GL_INVERSE_TRANSPOSE_NV */
+   { 13851, 0x0000150A }, /* GL_INVERT */
+   { 13861, 0x00001E00 }, /* GL_KEEP */
+   { 13869, 0x00008E4E }, /* GL_LAST_VERTEX_CONVENTION_EXT */
+   { 13899, 0x00000406 }, /* GL_LEFT */
+   { 13907, 0x00000203 }, /* GL_LEQUAL */
+   { 13917, 0x00000201 }, /* GL_LESS */
+   { 13925, 0x00004000 }, /* GL_LIGHT0 */
+   { 13935, 0x00004001 }, /* GL_LIGHT1 */
+   { 13945, 0x00004002 }, /* GL_LIGHT2 */
+   { 13955, 0x00004003 }, /* GL_LIGHT3 */
+   { 13965, 0x00004004 }, /* GL_LIGHT4 */
+   { 13975, 0x00004005 }, /* GL_LIGHT5 */
+   { 13985, 0x00004006 }, /* GL_LIGHT6 */
+   { 13995, 0x00004007 }, /* GL_LIGHT7 */
+   { 14005, 0x00000B50 }, /* GL_LIGHTING */
+   { 14017, 0x00000040 }, /* GL_LIGHTING_BIT */
+   { 14033, 0x00000B53 }, /* GL_LIGHT_MODEL_AMBIENT */
+   { 14056, 0x000081F8 }, /* GL_LIGHT_MODEL_COLOR_CONTROL */
+   { 14085, 0x000081F8 }, /* GL_LIGHT_MODEL_COLOR_CONTROL_EXT */
+   { 14118, 0x00000B51 }, /* GL_LIGHT_MODEL_LOCAL_VIEWER */
+   { 14146, 0x00000B52 }, /* GL_LIGHT_MODEL_TWO_SIDE */
+   { 14170, 0x00001B01 }, /* GL_LINE */
+   { 14178, 0x00002601 }, /* GL_LINEAR */
+   { 14188, 0x00001208 }, /* GL_LINEAR_ATTENUATION */
+   { 14210, 0x00008170 }, /* GL_LINEAR_CLIPMAP_LINEAR_SGIX */
+   { 14240, 0x0000844F }, /* GL_LINEAR_CLIPMAP_NEAREST_SGIX */
+   { 14271, 0x00002703 }, /* GL_LINEAR_MIPMAP_LINEAR */
+   { 14295, 0x00002701 }, /* GL_LINEAR_MIPMAP_NEAREST */
+   { 14320, 0x00000001 }, /* GL_LINES */
+   { 14329, 0x00000004 }, /* GL_LINE_BIT */
+   { 14341, 0x00000002 }, /* GL_LINE_LOOP */
+   { 14354, 0x00000707 }, /* GL_LINE_RESET_TOKEN */
+   { 14374, 0x00000B20 }, /* GL_LINE_SMOOTH */
+   { 14389, 0x00000C52 }, /* GL_LINE_SMOOTH_HINT */
+   { 14409, 0x00000B24 }, /* GL_LINE_STIPPLE */
+   { 14425, 0x00000B25 }, /* GL_LINE_STIPPLE_PATTERN */
+   { 14449, 0x00000B26 }, /* GL_LINE_STIPPLE_REPEAT */
+   { 14472, 0x00000003 }, /* GL_LINE_STRIP */
+   { 14486, 0x00000702 }, /* GL_LINE_TOKEN */
+   { 14500, 0x00000B21 }, /* GL_LINE_WIDTH */
+   { 14514, 0x00000B23 }, /* GL_LINE_WIDTH_GRANULARITY */
+   { 14540, 0x00000B22 }, /* GL_LINE_WIDTH_RANGE */
+   { 14560, 0x00008B82 }, /* GL_LINK_STATUS */
+   { 14575, 0x00000B32 }, /* GL_LIST_BASE */
+   { 14588, 0x00020000 }, /* GL_LIST_BIT */
+   { 14600, 0x00000B33 }, /* GL_LIST_INDEX */
+   { 14614, 0x00000B30 }, /* GL_LIST_MODE */
+   { 14627, 0x00000101 }, /* GL_LOAD */
+   { 14635, 0x00000BF1 }, /* GL_LOGIC_OP */
+   { 14647, 0x00000BF0 }, /* GL_LOGIC_OP_MODE */
+   { 14664, 0x00008CA1 }, /* GL_LOWER_LEFT */
+   { 14678, 0x00001909 }, /* GL_LUMINANCE */
+   { 14691, 0x00008041 }, /* GL_LUMINANCE12 */
+   { 14706, 0x00008047 }, /* GL_LUMINANCE12_ALPHA12 */
+   { 14729, 0x00008047 }, /* GL_LUMINANCE12_ALPHA12_EXT */
+   { 14756, 0x00008046 }, /* GL_LUMINANCE12_ALPHA4 */
+   { 14778, 0x00008046 }, /* GL_LUMINANCE12_ALPHA4_EXT */
+   { 14804, 0x00008041 }, /* GL_LUMINANCE12_EXT */
+   { 14823, 0x00008042 }, /* GL_LUMINANCE16 */
+   { 14838, 0x00008048 }, /* GL_LUMINANCE16_ALPHA16 */
+   { 14861, 0x00008048 }, /* GL_LUMINANCE16_ALPHA16_EXT */
+   { 14888, 0x00008042 }, /* GL_LUMINANCE16_EXT */
+   { 14907, 0x0000803F }, /* GL_LUMINANCE4 */
+   { 14921, 0x00008043 }, /* GL_LUMINANCE4_ALPHA4 */
+   { 14942, 0x00008043 }, /* GL_LUMINANCE4_ALPHA4_EXT */
+   { 14967, 0x0000803F }, /* GL_LUMINANCE4_EXT */
+   { 14985, 0x00008044 }, /* GL_LUMINANCE6_ALPHA2 */
+   { 15006, 0x00008044 }, /* GL_LUMINANCE6_ALPHA2_EXT */
+   { 15031, 0x00008040 }, /* GL_LUMINANCE8 */
+   { 15045, 0x00008045 }, /* GL_LUMINANCE8_ALPHA8 */
+   { 15066, 0x00008045 }, /* GL_LUMINANCE8_ALPHA8_EXT */
+   { 15091, 0x00008040 }, /* GL_LUMINANCE8_EXT */
+   { 15109, 0x0000190A }, /* GL_LUMINANCE_ALPHA */
+   { 15128, 0x00000D90 }, /* GL_MAP1_COLOR_4 */
+   { 15144, 0x00000DD0 }, /* GL_MAP1_GRID_DOMAIN */
+   { 15164, 0x00000DD1 }, /* GL_MAP1_GRID_SEGMENTS */
+   { 15186, 0x00000D91 }, /* GL_MAP1_INDEX */
+   { 15200, 0x00000D92 }, /* GL_MAP1_NORMAL */
+   { 15215, 0x00000D93 }, /* GL_MAP1_TEXTURE_COORD_1 */
+   { 15239, 0x00000D94 }, /* GL_MAP1_TEXTURE_COORD_2 */
+   { 15263, 0x00000D95 }, /* GL_MAP1_TEXTURE_COORD_3 */
+   { 15287, 0x00000D96 }, /* GL_MAP1_TEXTURE_COORD_4 */
+   { 15311, 0x00000D97 }, /* GL_MAP1_VERTEX_3 */
+   { 15328, 0x00000D98 }, /* GL_MAP1_VERTEX_4 */
+   { 15345, 0x00008660 }, /* GL_MAP1_VERTEX_ATTRIB0_4_NV */
+   { 15373, 0x0000866A }, /* GL_MAP1_VERTEX_ATTRIB10_4_NV */
+   { 15402, 0x0000866B }, /* GL_MAP1_VERTEX_ATTRIB11_4_NV */
+   { 15431, 0x0000866C }, /* GL_MAP1_VERTEX_ATTRIB12_4_NV */
+   { 15460, 0x0000866D }, /* GL_MAP1_VERTEX_ATTRIB13_4_NV */
+   { 15489, 0x0000866E }, /* GL_MAP1_VERTEX_ATTRIB14_4_NV */
+   { 15518, 0x0000866F }, /* GL_MAP1_VERTEX_ATTRIB15_4_NV */
+   { 15547, 0x00008661 }, /* GL_MAP1_VERTEX_ATTRIB1_4_NV */
+   { 15575, 0x00008662 }, /* GL_MAP1_VERTEX_ATTRIB2_4_NV */
+   { 15603, 0x00008663 }, /* GL_MAP1_VERTEX_ATTRIB3_4_NV */
+   { 15631, 0x00008664 }, /* GL_MAP1_VERTEX_ATTRIB4_4_NV */
+   { 15659, 0x00008665 }, /* GL_MAP1_VERTEX_ATTRIB5_4_NV */
+   { 15687, 0x00008666 }, /* GL_MAP1_VERTEX_ATTRIB6_4_NV */
+   { 15715, 0x00008667 }, /* GL_MAP1_VERTEX_ATTRIB7_4_NV */
+   { 15743, 0x00008668 }, /* GL_MAP1_VERTEX_ATTRIB8_4_NV */
+   { 15771, 0x00008669 }, /* GL_MAP1_VERTEX_ATTRIB9_4_NV */
+   { 15799, 0x00000DB0 }, /* GL_MAP2_COLOR_4 */
+   { 15815, 0x00000DD2 }, /* GL_MAP2_GRID_DOMAIN */
+   { 15835, 0x00000DD3 }, /* GL_MAP2_GRID_SEGMENTS */
+   { 15857, 0x00000DB1 }, /* GL_MAP2_INDEX */
+   { 15871, 0x00000DB2 }, /* GL_MAP2_NORMAL */
+   { 15886, 0x00000DB3 }, /* GL_MAP2_TEXTURE_COORD_1 */
+   { 15910, 0x00000DB4 }, /* GL_MAP2_TEXTURE_COORD_2 */
+   { 15934, 0x00000DB5 }, /* GL_MAP2_TEXTURE_COORD_3 */
+   { 15958, 0x00000DB6 }, /* GL_MAP2_TEXTURE_COORD_4 */
+   { 15982, 0x00000DB7 }, /* GL_MAP2_VERTEX_3 */
+   { 15999, 0x00000DB8 }, /* GL_MAP2_VERTEX_4 */
+   { 16016, 0x00008670 }, /* GL_MAP2_VERTEX_ATTRIB0_4_NV */
+   { 16044, 0x0000867A }, /* GL_MAP2_VERTEX_ATTRIB10_4_NV */
+   { 16073, 0x0000867B }, /* GL_MAP2_VERTEX_ATTRIB11_4_NV */
+   { 16102, 0x0000867C }, /* GL_MAP2_VERTEX_ATTRIB12_4_NV */
+   { 16131, 0x0000867D }, /* GL_MAP2_VERTEX_ATTRIB13_4_NV */
+   { 16160, 0x0000867E }, /* GL_MAP2_VERTEX_ATTRIB14_4_NV */
+   { 16189, 0x0000867F }, /* GL_MAP2_VERTEX_ATTRIB15_4_NV */
+   { 16218, 0x00008671 }, /* GL_MAP2_VERTEX_ATTRIB1_4_NV */
+   { 16246, 0x00008672 }, /* GL_MAP2_VERTEX_ATTRIB2_4_NV */
+   { 16274, 0x00008673 }, /* GL_MAP2_VERTEX_ATTRIB3_4_NV */
+   { 16302, 0x00008674 }, /* GL_MAP2_VERTEX_ATTRIB4_4_NV */
+   { 16330, 0x00008675 }, /* GL_MAP2_VERTEX_ATTRIB5_4_NV */
+   { 16358, 0x00008676 }, /* GL_MAP2_VERTEX_ATTRIB6_4_NV */
+   { 16386, 0x00008677 }, /* GL_MAP2_VERTEX_ATTRIB7_4_NV */
+   { 16414, 0x00008678 }, /* GL_MAP2_VERTEX_ATTRIB8_4_NV */
+   { 16442, 0x00008679 }, /* GL_MAP2_VERTEX_ATTRIB9_4_NV */
+   { 16470, 0x00000D10 }, /* GL_MAP_COLOR */
+   { 16483, 0x00000010 }, /* GL_MAP_FLUSH_EXPLICIT_BIT */
+   { 16509, 0x00000008 }, /* GL_MAP_INVALIDATE_BUFFER_BIT */
+   { 16538, 0x00000004 }, /* GL_MAP_INVALIDATE_RANGE_BIT */
+   { 16566, 0x00000001 }, /* GL_MAP_READ_BIT */
+   { 16582, 0x00000D11 }, /* GL_MAP_STENCIL */
+   { 16597, 0x00000020 }, /* GL_MAP_UNSYNCHRONIZED_BIT */
+   { 16623, 0x00000002 }, /* GL_MAP_WRITE_BIT */
+   { 16640, 0x000088C0 }, /* GL_MATRIX0_ARB */
+   { 16655, 0x00008630 }, /* GL_MATRIX0_NV */
+   { 16669, 0x000088CA }, /* GL_MATRIX10_ARB */
+   { 16685, 0x000088CB }, /* GL_MATRIX11_ARB */
+   { 16701, 0x000088CC }, /* GL_MATRIX12_ARB */
+   { 16717, 0x000088CD }, /* GL_MATRIX13_ARB */
+   { 16733, 0x000088CE }, /* GL_MATRIX14_ARB */
+   { 16749, 0x000088CF }, /* GL_MATRIX15_ARB */
+   { 16765, 0x000088D0 }, /* GL_MATRIX16_ARB */
+   { 16781, 0x000088D1 }, /* GL_MATRIX17_ARB */
+   { 16797, 0x000088D2 }, /* GL_MATRIX18_ARB */
+   { 16813, 0x000088D3 }, /* GL_MATRIX19_ARB */
+   { 16829, 0x000088C1 }, /* GL_MATRIX1_ARB */
+   { 16844, 0x00008631 }, /* GL_MATRIX1_NV */
+   { 16858, 0x000088D4 }, /* GL_MATRIX20_ARB */
+   { 16874, 0x000088D5 }, /* GL_MATRIX21_ARB */
+   { 16890, 0x000088D6 }, /* GL_MATRIX22_ARB */
+   { 16906, 0x000088D7 }, /* GL_MATRIX23_ARB */
+   { 16922, 0x000088D8 }, /* GL_MATRIX24_ARB */
+   { 16938, 0x000088D9 }, /* GL_MATRIX25_ARB */
+   { 16954, 0x000088DA }, /* GL_MATRIX26_ARB */
+   { 16970, 0x000088DB }, /* GL_MATRIX27_ARB */
+   { 16986, 0x000088DC }, /* GL_MATRIX28_ARB */
+   { 17002, 0x000088DD }, /* GL_MATRIX29_ARB */
+   { 17018, 0x000088C2 }, /* GL_MATRIX2_ARB */
+   { 17033, 0x00008632 }, /* GL_MATRIX2_NV */
+   { 17047, 0x000088DE }, /* GL_MATRIX30_ARB */
+   { 17063, 0x000088DF }, /* GL_MATRIX31_ARB */
+   { 17079, 0x000088C3 }, /* GL_MATRIX3_ARB */
+   { 17094, 0x00008633 }, /* GL_MATRIX3_NV */
+   { 17108, 0x000088C4 }, /* GL_MATRIX4_ARB */
+   { 17123, 0x00008634 }, /* GL_MATRIX4_NV */
+   { 17137, 0x000088C5 }, /* GL_MATRIX5_ARB */
+   { 17152, 0x00008635 }, /* GL_MATRIX5_NV */
+   { 17166, 0x000088C6 }, /* GL_MATRIX6_ARB */
+   { 17181, 0x00008636 }, /* GL_MATRIX6_NV */
+   { 17195, 0x000088C7 }, /* GL_MATRIX7_ARB */
+   { 17210, 0x00008637 }, /* GL_MATRIX7_NV */
+   { 17224, 0x000088C8 }, /* GL_MATRIX8_ARB */
+   { 17239, 0x000088C9 }, /* GL_MATRIX9_ARB */
+   { 17254, 0x00008844 }, /* GL_MATRIX_INDEX_ARRAY_ARB */
+   { 17280, 0x00008849 }, /* GL_MATRIX_INDEX_ARRAY_POINTER_ARB */
+   { 17314, 0x00008846 }, /* GL_MATRIX_INDEX_ARRAY_SIZE_ARB */
+   { 17345, 0x00008848 }, /* GL_MATRIX_INDEX_ARRAY_STRIDE_ARB */
+   { 17378, 0x00008847 }, /* GL_MATRIX_INDEX_ARRAY_TYPE_ARB */
+   { 17409, 0x00000BA0 }, /* GL_MATRIX_MODE */
+   { 17424, 0x00008840 }, /* GL_MATRIX_PALETTE_ARB */
+   { 17446, 0x00008008 }, /* GL_MAX */
+   { 17453, 0x00008073 }, /* GL_MAX_3D_TEXTURE_SIZE */
+   { 17476, 0x000088FF }, /* GL_MAX_ARRAY_TEXTURE_LAYERS_EXT */
+   { 17508, 0x00000D35 }, /* GL_MAX_ATTRIB_STACK_DEPTH */
+   { 17534, 0x00000D3B }, /* GL_MAX_CLIENT_ATTRIB_STACK_DEPTH */
+   { 17567, 0x00008177 }, /* GL_MAX_CLIPMAP_DEPTH_SGIX */
+   { 17593, 0x00008178 }, /* GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX */
+   { 17627, 0x00000D32 }, /* GL_MAX_CLIP_PLANES */
+   { 17646, 0x00008CDF }, /* GL_MAX_COLOR_ATTACHMENTS_EXT */
+   { 17675, 0x000080B3 }, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH */
+   { 17707, 0x000080B3 }, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI */
+   { 17743, 0x00008B4D }, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS */
+   { 17779, 0x00008B4D }, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB */
+   { 17819, 0x0000801B }, /* GL_MAX_CONVOLUTION_HEIGHT */
+   { 17845, 0x0000801B }, /* GL_MAX_CONVOLUTION_HEIGHT_EXT */
+   { 17875, 0x0000801A }, /* GL_MAX_CONVOLUTION_WIDTH */
+   { 17900, 0x0000801A }, /* GL_MAX_CONVOLUTION_WIDTH_EXT */
+   { 17929, 0x0000851C }, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE */
+   { 17958, 0x0000851C }, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB */
+   { 17991, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS */
+   { 18011, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS_ARB */
+   { 18035, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS_ATI */
+   { 18059, 0x000080E9 }, /* GL_MAX_ELEMENTS_INDICES */
+   { 18083, 0x000080E8 }, /* GL_MAX_ELEMENTS_VERTICES */
+   { 18108, 0x00000D30 }, /* GL_MAX_EVAL_ORDER */
+   { 18126, 0x00008008 }, /* GL_MAX_EXT */
+   { 18137, 0x00008B49 }, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS */
+   { 18172, 0x00008B49 }, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB */
+   { 18211, 0x00000D31 }, /* GL_MAX_LIGHTS */
+   { 18225, 0x00000B31 }, /* GL_MAX_LIST_NESTING */
+   { 18245, 0x00008841 }, /* GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB */
+   { 18283, 0x00000D36 }, /* GL_MAX_MODELVIEW_STACK_DEPTH */
+   { 18312, 0x00000D37 }, /* GL_MAX_NAME_STACK_DEPTH */
+   { 18336, 0x00008842 }, /* GL_MAX_PALETTE_MATRICES_ARB */
+   { 18364, 0x00000D34 }, /* GL_MAX_PIXEL_MAP_TABLE */
+   { 18387, 0x000088B1 }, /* GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB */
+   { 18424, 0x0000880B }, /* GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB */
+   { 18460, 0x000088AD }, /* GL_MAX_PROGRAM_ATTRIBS_ARB */
+   { 18487, 0x000088F5 }, /* GL_MAX_PROGRAM_CALL_DEPTH_NV */
+   { 18516, 0x000088B5 }, /* GL_MAX_PROGRAM_ENV_PARAMETERS_ARB */
+   { 18550, 0x000088F4 }, /* GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */
+   { 18586, 0x000088F6 }, /* GL_MAX_PROGRAM_IF_DEPTH_NV */
+   { 18613, 0x000088A1 }, /* GL_MAX_PROGRAM_INSTRUCTIONS_ARB */
+   { 18645, 0x000088B4 }, /* GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB */
+   { 18681, 0x000088F8 }, /* GL_MAX_PROGRAM_LOOP_COUNT_NV */
+   { 18710, 0x000088F7 }, /* GL_MAX_PROGRAM_LOOP_DEPTH_NV */
+   { 18739, 0x0000862F }, /* GL_MAX_PROGRAM_MATRICES_ARB */
+   { 18767, 0x0000862E }, /* GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB */
+   { 18805, 0x000088B3 }, /* GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
+   { 18849, 0x0000880E }, /* GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
+   { 18892, 0x000088AF }, /* GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB */
+   { 18926, 0x000088A3 }, /* GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
+   { 18965, 0x000088AB }, /* GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB */
+   { 19002, 0x000088A7 }, /* GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB */
+   { 19040, 0x00008810 }, /* GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
+   { 19083, 0x0000880F }, /* GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
+   { 19126, 0x000088A9 }, /* GL_MAX_PROGRAM_PARAMETERS_ARB */
+   { 19156, 0x000088A5 }, /* GL_MAX_PROGRAM_TEMPORARIES_ARB */
+   { 19187, 0x0000880D }, /* GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB */
+   { 19223, 0x0000880C }, /* GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB */
+   { 19259, 0x00000D38 }, /* GL_MAX_PROJECTION_STACK_DEPTH */
+   { 19289, 0x000084F8 }, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB */
+   { 19323, 0x000084F8 }, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_NV */
+   { 19356, 0x000084E8 }, /* GL_MAX_RENDERBUFFER_SIZE_EXT */
+   { 19385, 0x00008D57 }, /* GL_MAX_SAMPLES */
+   { 19400, 0x00008504 }, /* GL_MAX_SHININESS_NV */
+   { 19420, 0x00008505 }, /* GL_MAX_SPOT_EXPONENT_NV */
+   { 19444, 0x00008871 }, /* GL_MAX_TEXTURE_COORDS */
+   { 19466, 0x00008871 }, /* GL_MAX_TEXTURE_COORDS_ARB */
+   { 19492, 0x00008872 }, /* GL_MAX_TEXTURE_IMAGE_UNITS */
+   { 19519, 0x00008872 }, /* GL_MAX_TEXTURE_IMAGE_UNITS_ARB */
+   { 19550, 0x000084FD }, /* GL_MAX_TEXTURE_LOD_BIAS */
+   { 19574, 0x000084FF }, /* GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT */
+   { 19608, 0x00000D33 }, /* GL_MAX_TEXTURE_SIZE */
+   { 19628, 0x00000D39 }, /* GL_MAX_TEXTURE_STACK_DEPTH */
+   { 19655, 0x000084E2 }, /* GL_MAX_TEXTURE_UNITS */
+   { 19676, 0x000084E2 }, /* GL_MAX_TEXTURE_UNITS_ARB */
+   { 19701, 0x0000862F }, /* GL_MAX_TRACK_MATRICES_NV */
+   { 19726, 0x0000862E }, /* GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV */
+   { 19761, 0x00008B4B }, /* GL_MAX_VARYING_FLOATS */
+   { 19783, 0x00008B4B }, /* GL_MAX_VARYING_FLOATS_ARB */
+   { 19809, 0x00008869 }, /* GL_MAX_VERTEX_ATTRIBS */
+   { 19831, 0x00008869 }, /* GL_MAX_VERTEX_ATTRIBS_ARB */
+   { 19857, 0x00008B4C }, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS */
+   { 19891, 0x00008B4C }, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */
+   { 19929, 0x00008B4A }, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS */
+   { 19962, 0x00008B4A }, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB */
+   { 19999, 0x000086A4 }, /* GL_MAX_VERTEX_UNITS_ARB */
+   { 20023, 0x00000D3A }, /* GL_MAX_VIEWPORT_DIMS */
+   { 20044, 0x00008007 }, /* GL_MIN */
+   { 20051, 0x0000802E }, /* GL_MINMAX */
+   { 20061, 0x0000802E }, /* GL_MINMAX_EXT */
+   { 20075, 0x0000802F }, /* GL_MINMAX_FORMAT */
+   { 20092, 0x0000802F }, /* GL_MINMAX_FORMAT_EXT */
+   { 20113, 0x00008030 }, /* GL_MINMAX_SINK */
+   { 20128, 0x00008030 }, /* GL_MINMAX_SINK_EXT */
+   { 20147, 0x00008007 }, /* GL_MIN_EXT */
+   { 20158, 0x00008370 }, /* GL_MIRRORED_REPEAT */
+   { 20177, 0x00008370 }, /* GL_MIRRORED_REPEAT_ARB */
+   { 20200, 0x00008370 }, /* GL_MIRRORED_REPEAT_IBM */
+   { 20223, 0x00008742 }, /* GL_MIRROR_CLAMP_ATI */
+   { 20243, 0x00008742 }, /* GL_MIRROR_CLAMP_EXT */
+   { 20263, 0x00008912 }, /* GL_MIRROR_CLAMP_TO_BORDER_EXT */
+   { 20293, 0x00008743 }, /* GL_MIRROR_CLAMP_TO_EDGE_ATI */
+   { 20321, 0x00008743 }, /* GL_MIRROR_CLAMP_TO_EDGE_EXT */
+   { 20349, 0x00001700 }, /* GL_MODELVIEW */
+   { 20362, 0x00001700 }, /* GL_MODELVIEW0_ARB */
+   { 20380, 0x0000872A }, /* GL_MODELVIEW10_ARB */
+   { 20399, 0x0000872B }, /* GL_MODELVIEW11_ARB */
+   { 20418, 0x0000872C }, /* GL_MODELVIEW12_ARB */
+   { 20437, 0x0000872D }, /* GL_MODELVIEW13_ARB */
+   { 20456, 0x0000872E }, /* GL_MODELVIEW14_ARB */
+   { 20475, 0x0000872F }, /* GL_MODELVIEW15_ARB */
+   { 20494, 0x00008730 }, /* GL_MODELVIEW16_ARB */
+   { 20513, 0x00008731 }, /* GL_MODELVIEW17_ARB */
+   { 20532, 0x00008732 }, /* GL_MODELVIEW18_ARB */
+   { 20551, 0x00008733 }, /* GL_MODELVIEW19_ARB */
+   { 20570, 0x0000850A }, /* GL_MODELVIEW1_ARB */
+   { 20588, 0x00008734 }, /* GL_MODELVIEW20_ARB */
+   { 20607, 0x00008735 }, /* GL_MODELVIEW21_ARB */
+   { 20626, 0x00008736 }, /* GL_MODELVIEW22_ARB */
+   { 20645, 0x00008737 }, /* GL_MODELVIEW23_ARB */
+   { 20664, 0x00008738 }, /* GL_MODELVIEW24_ARB */
+   { 20683, 0x00008739 }, /* GL_MODELVIEW25_ARB */
+   { 20702, 0x0000873A }, /* GL_MODELVIEW26_ARB */
+   { 20721, 0x0000873B }, /* GL_MODELVIEW27_ARB */
+   { 20740, 0x0000873C }, /* GL_MODELVIEW28_ARB */
+   { 20759, 0x0000873D }, /* GL_MODELVIEW29_ARB */
+   { 20778, 0x00008722 }, /* GL_MODELVIEW2_ARB */
+   { 20796, 0x0000873E }, /* GL_MODELVIEW30_ARB */
+   { 20815, 0x0000873F }, /* GL_MODELVIEW31_ARB */
+   { 20834, 0x00008723 }, /* GL_MODELVIEW3_ARB */
+   { 20852, 0x00008724 }, /* GL_MODELVIEW4_ARB */
+   { 20870, 0x00008725 }, /* GL_MODELVIEW5_ARB */
+   { 20888, 0x00008726 }, /* GL_MODELVIEW6_ARB */
+   { 20906, 0x00008727 }, /* GL_MODELVIEW7_ARB */
+   { 20924, 0x00008728 }, /* GL_MODELVIEW8_ARB */
+   { 20942, 0x00008729 }, /* GL_MODELVIEW9_ARB */
+   { 20960, 0x00000BA6 }, /* GL_MODELVIEW_MATRIX */
+   { 20980, 0x00008629 }, /* GL_MODELVIEW_PROJECTION_NV */
+   { 21007, 0x00000BA3 }, /* GL_MODELVIEW_STACK_DEPTH */
+   { 21032, 0x00002100 }, /* GL_MODULATE */
+   { 21044, 0x00008744 }, /* GL_MODULATE_ADD_ATI */
+   { 21064, 0x00008745 }, /* GL_MODULATE_SIGNED_ADD_ATI */
+   { 21091, 0x00008746 }, /* GL_MODULATE_SUBTRACT_ATI */
+   { 21116, 0x00000103 }, /* GL_MULT */
+   { 21124, 0x0000809D }, /* GL_MULTISAMPLE */
+   { 21139, 0x000086B2 }, /* GL_MULTISAMPLE_3DFX */
+   { 21159, 0x0000809D }, /* GL_MULTISAMPLE_ARB */
+   { 21178, 0x20000000 }, /* GL_MULTISAMPLE_BIT */
+   { 21197, 0x20000000 }, /* GL_MULTISAMPLE_BIT_3DFX */
+   { 21221, 0x20000000 }, /* GL_MULTISAMPLE_BIT_ARB */
+   { 21244, 0x00008534 }, /* GL_MULTISAMPLE_FILTER_HINT_NV */
+   { 21274, 0x00002A25 }, /* GL_N3F_V3F */
+   { 21285, 0x00000D70 }, /* GL_NAME_STACK_DEPTH */
+   { 21305, 0x0000150E }, /* GL_NAND */
+   { 21313, 0x00002600 }, /* GL_NEAREST */
+   { 21324, 0x0000844E }, /* GL_NEAREST_CLIPMAP_LINEAR_SGIX */
+   { 21355, 0x0000844D }, /* GL_NEAREST_CLIPMAP_NEAREST_SGIX */
+   { 21387, 0x00002702 }, /* GL_NEAREST_MIPMAP_LINEAR */
+   { 21412, 0x00002700 }, /* GL_NEAREST_MIPMAP_NEAREST */
+   { 21438, 0x00000200 }, /* GL_NEVER */
+   { 21447, 0x00001102 }, /* GL_NICEST */
+   { 21457, 0x00000000 }, /* GL_NONE */
+   { 21465, 0x00001505 }, /* GL_NOOP */
+   { 21473, 0x00001508 }, /* GL_NOR */
+   { 21480, 0x00000BA1 }, /* GL_NORMALIZE */
+   { 21493, 0x00008075 }, /* GL_NORMAL_ARRAY */
+   { 21509, 0x00008897 }, /* GL_NORMAL_ARRAY_BUFFER_BINDING */
+   { 21540, 0x00008897 }, /* GL_NORMAL_ARRAY_BUFFER_BINDING_ARB */
+   { 21575, 0x0000808F }, /* GL_NORMAL_ARRAY_POINTER */
+   { 21599, 0x0000807F }, /* GL_NORMAL_ARRAY_STRIDE */
+   { 21622, 0x0000807E }, /* GL_NORMAL_ARRAY_TYPE */
+   { 21643, 0x00008511 }, /* GL_NORMAL_MAP */
+   { 21657, 0x00008511 }, /* GL_NORMAL_MAP_ARB */
+   { 21675, 0x00008511 }, /* GL_NORMAL_MAP_NV */
+   { 21692, 0x00000205 }, /* GL_NOTEQUAL */
+   { 21704, 0x00000000 }, /* GL_NO_ERROR */
+   { 21716, 0x000086A2 }, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS */
+   { 21750, 0x000086A2 }, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB */
+   { 21788, 0x00008B89 }, /* GL_OBJECT_ACTIVE_ATTRIBUTES_ARB */
+   { 21820, 0x00008B8A }, /* GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB */
+   { 21862, 0x00008B86 }, /* GL_OBJECT_ACTIVE_UNIFORMS_ARB */
+   { 21892, 0x00008B87 }, /* GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB */
+   { 21932, 0x00008B85 }, /* GL_OBJECT_ATTACHED_OBJECTS_ARB */
+   { 21963, 0x00008B81 }, /* GL_OBJECT_COMPILE_STATUS_ARB */
+   { 21992, 0x00008B80 }, /* GL_OBJECT_DELETE_STATUS_ARB */
+   { 22020, 0x00008B84 }, /* GL_OBJECT_INFO_LOG_LENGTH_ARB */
+   { 22050, 0x00002401 }, /* GL_OBJECT_LINEAR */
+   { 22067, 0x00008B82 }, /* GL_OBJECT_LINK_STATUS_ARB */
+   { 22093, 0x00002501 }, /* GL_OBJECT_PLANE */
+   { 22109, 0x00008B88 }, /* GL_OBJECT_SHADER_SOURCE_LENGTH_ARB */
+   { 22144, 0x00008B4F }, /* GL_OBJECT_SUBTYPE_ARB */
+   { 22166, 0x00008B4E }, /* GL_OBJECT_TYPE_ARB */
+   { 22185, 0x00008B83 }, /* GL_OBJECT_VALIDATE_STATUS_ARB */
+   { 22215, 0x00008165 }, /* GL_OCCLUSION_TEST_HP */
+   { 22236, 0x00008166 }, /* GL_OCCLUSION_TEST_RESULT_HP */
+   { 22264, 0x00000001 }, /* GL_ONE */
+   { 22271, 0x00008004 }, /* GL_ONE_MINUS_CONSTANT_ALPHA */
+   { 22299, 0x00008004 }, /* GL_ONE_MINUS_CONSTANT_ALPHA_EXT */
+   { 22331, 0x00008002 }, /* GL_ONE_MINUS_CONSTANT_COLOR */
+   { 22359, 0x00008002 }, /* GL_ONE_MINUS_CONSTANT_COLOR_EXT */
+   { 22391, 0x00000305 }, /* GL_ONE_MINUS_DST_ALPHA */
+   { 22414, 0x00000307 }, /* GL_ONE_MINUS_DST_COLOR */
+   { 22437, 0x00000303 }, /* GL_ONE_MINUS_SRC_ALPHA */
+   { 22460, 0x00000301 }, /* GL_ONE_MINUS_SRC_COLOR */
+   { 22483, 0x00008598 }, /* GL_OPERAND0_ALPHA */
+   { 22501, 0x00008598 }, /* GL_OPERAND0_ALPHA_ARB */
+   { 22523, 0x00008598 }, /* GL_OPERAND0_ALPHA_EXT */
+   { 22545, 0x00008590 }, /* GL_OPERAND0_RGB */
+   { 22561, 0x00008590 }, /* GL_OPERAND0_RGB_ARB */
+   { 22581, 0x00008590 }, /* GL_OPERAND0_RGB_EXT */
+   { 22601, 0x00008599 }, /* GL_OPERAND1_ALPHA */
+   { 22619, 0x00008599 }, /* GL_OPERAND1_ALPHA_ARB */
+   { 22641, 0x00008599 }, /* GL_OPERAND1_ALPHA_EXT */
+   { 22663, 0x00008591 }, /* GL_OPERAND1_RGB */
+   { 22679, 0x00008591 }, /* GL_OPERAND1_RGB_ARB */
+   { 22699, 0x00008591 }, /* GL_OPERAND1_RGB_EXT */
+   { 22719, 0x0000859A }, /* GL_OPERAND2_ALPHA */
+   { 22737, 0x0000859A }, /* GL_OPERAND2_ALPHA_ARB */
+   { 22759, 0x0000859A }, /* GL_OPERAND2_ALPHA_EXT */
+   { 22781, 0x00008592 }, /* GL_OPERAND2_RGB */
+   { 22797, 0x00008592 }, /* GL_OPERAND2_RGB_ARB */
+   { 22817, 0x00008592 }, /* GL_OPERAND2_RGB_EXT */
+   { 22837, 0x0000859B }, /* GL_OPERAND3_ALPHA_NV */
+   { 22858, 0x00008593 }, /* GL_OPERAND3_RGB_NV */
+   { 22877, 0x00001507 }, /* GL_OR */
+   { 22883, 0x00000A01 }, /* GL_ORDER */
+   { 22892, 0x0000150D }, /* GL_OR_INVERTED */
+   { 22907, 0x0000150B }, /* GL_OR_REVERSE */
+   { 22921, 0x00000505 }, /* GL_OUT_OF_MEMORY */
+   { 22938, 0x00000D05 }, /* GL_PACK_ALIGNMENT */
+   { 22956, 0x0000806C }, /* GL_PACK_IMAGE_HEIGHT */
+   { 22977, 0x00008758 }, /* GL_PACK_INVERT_MESA */
+   { 22997, 0x00000D01 }, /* GL_PACK_LSB_FIRST */
+   { 23015, 0x00000D02 }, /* GL_PACK_ROW_LENGTH */
+   { 23034, 0x0000806B }, /* GL_PACK_SKIP_IMAGES */
+   { 23054, 0x00000D04 }, /* GL_PACK_SKIP_PIXELS */
+   { 23074, 0x00000D03 }, /* GL_PACK_SKIP_ROWS */
+   { 23092, 0x00000D00 }, /* GL_PACK_SWAP_BYTES */
+   { 23111, 0x00008B92 }, /* GL_PALETTE4_R5_G6_B5_OES */
+   { 23136, 0x00008B94 }, /* GL_PALETTE4_RGB5_A1_OES */
+   { 23160, 0x00008B90 }, /* GL_PALETTE4_RGB8_OES */
+   { 23181, 0x00008B93 }, /* GL_PALETTE4_RGBA4_OES */
+   { 23203, 0x00008B91 }, /* GL_PALETTE4_RGBA8_OES */
+   { 23225, 0x00008B97 }, /* GL_PALETTE8_R5_G6_B5_OES */
+   { 23250, 0x00008B99 }, /* GL_PALETTE8_RGB5_A1_OES */
+   { 23274, 0x00008B95 }, /* GL_PALETTE8_RGB8_OES */
+   { 23295, 0x00008B98 }, /* GL_PALETTE8_RGBA4_OES */
+   { 23317, 0x00008B96 }, /* GL_PALETTE8_RGBA8_OES */
+   { 23339, 0x00000700 }, /* GL_PASS_THROUGH_TOKEN */
+   { 23361, 0x00000C50 }, /* GL_PERSPECTIVE_CORRECTION_HINT */
+   { 23392, 0x00000C79 }, /* GL_PIXEL_MAP_A_TO_A */
+   { 23412, 0x00000CB9 }, /* GL_PIXEL_MAP_A_TO_A_SIZE */
+   { 23437, 0x00000C78 }, /* GL_PIXEL_MAP_B_TO_B */
+   { 23457, 0x00000CB8 }, /* GL_PIXEL_MAP_B_TO_B_SIZE */
+   { 23482, 0x00000C77 }, /* GL_PIXEL_MAP_G_TO_G */
+   { 23502, 0x00000CB7 }, /* GL_PIXEL_MAP_G_TO_G_SIZE */
+   { 23527, 0x00000C75 }, /* GL_PIXEL_MAP_I_TO_A */
+   { 23547, 0x00000CB5 }, /* GL_PIXEL_MAP_I_TO_A_SIZE */
+   { 23572, 0x00000C74 }, /* GL_PIXEL_MAP_I_TO_B */
+   { 23592, 0x00000CB4 }, /* GL_PIXEL_MAP_I_TO_B_SIZE */
+   { 23617, 0x00000C73 }, /* GL_PIXEL_MAP_I_TO_G */
+   { 23637, 0x00000CB3 }, /* GL_PIXEL_MAP_I_TO_G_SIZE */
+   { 23662, 0x00000C70 }, /* GL_PIXEL_MAP_I_TO_I */
+   { 23682, 0x00000CB0 }, /* GL_PIXEL_MAP_I_TO_I_SIZE */
+   { 23707, 0x00000C72 }, /* GL_PIXEL_MAP_I_TO_R */
+   { 23727, 0x00000CB2 }, /* GL_PIXEL_MAP_I_TO_R_SIZE */
+   { 23752, 0x00000C76 }, /* GL_PIXEL_MAP_R_TO_R */
+   { 23772, 0x00000CB6 }, /* GL_PIXEL_MAP_R_TO_R_SIZE */
+   { 23797, 0x00000C71 }, /* GL_PIXEL_MAP_S_TO_S */
+   { 23817, 0x00000CB1 }, /* GL_PIXEL_MAP_S_TO_S_SIZE */
+   { 23842, 0x00000020 }, /* GL_PIXEL_MODE_BIT */
+   { 23860, 0x000088EB }, /* GL_PIXEL_PACK_BUFFER */
+   { 23881, 0x000088ED }, /* GL_PIXEL_PACK_BUFFER_BINDING */
+   { 23910, 0x000088ED }, /* GL_PIXEL_PACK_BUFFER_BINDING_EXT */
+   { 23943, 0x000088EB }, /* GL_PIXEL_PACK_BUFFER_EXT */
+   { 23968, 0x000088EC }, /* GL_PIXEL_UNPACK_BUFFER */
+   { 23991, 0x000088EF }, /* GL_PIXEL_UNPACK_BUFFER_BINDING */
+   { 24022, 0x000088EF }, /* GL_PIXEL_UNPACK_BUFFER_BINDING_EXT */
+   { 24057, 0x000088EC }, /* GL_PIXEL_UNPACK_BUFFER_EXT */
+   { 24084, 0x00001B00 }, /* GL_POINT */
+   { 24093, 0x00000000 }, /* GL_POINTS */
+   { 24103, 0x00000002 }, /* GL_POINT_BIT */
+   { 24116, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION */
+   { 24146, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_ARB */
+   { 24180, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_EXT */
+   { 24214, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_SGIS */
+   { 24249, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE */
+   { 24278, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_ARB */
+   { 24311, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_EXT */
+   { 24344, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_SGIS */
+   { 24378, 0x00000B11 }, /* GL_POINT_SIZE */
+   { 24392, 0x00000B13 }, /* GL_POINT_SIZE_GRANULARITY */
+   { 24418, 0x00008127 }, /* GL_POINT_SIZE_MAX */
+   { 24436, 0x00008127 }, /* GL_POINT_SIZE_MAX_ARB */
+   { 24458, 0x00008127 }, /* GL_POINT_SIZE_MAX_EXT */
+   { 24480, 0x00008127 }, /* GL_POINT_SIZE_MAX_SGIS */
+   { 24503, 0x00008126 }, /* GL_POINT_SIZE_MIN */
+   { 24521, 0x00008126 }, /* GL_POINT_SIZE_MIN_ARB */
+   { 24543, 0x00008126 }, /* GL_POINT_SIZE_MIN_EXT */
+   { 24565, 0x00008126 }, /* GL_POINT_SIZE_MIN_SGIS */
+   { 24588, 0x00000B12 }, /* GL_POINT_SIZE_RANGE */
+   { 24608, 0x00000B10 }, /* GL_POINT_SMOOTH */
+   { 24624, 0x00000C51 }, /* GL_POINT_SMOOTH_HINT */
+   { 24645, 0x00008861 }, /* GL_POINT_SPRITE */
+   { 24661, 0x00008861 }, /* GL_POINT_SPRITE_ARB */
+   { 24681, 0x00008CA0 }, /* GL_POINT_SPRITE_COORD_ORIGIN */
+   { 24710, 0x00008861 }, /* GL_POINT_SPRITE_NV */
+   { 24729, 0x00008863 }, /* GL_POINT_SPRITE_R_MODE_NV */
+   { 24755, 0x00000701 }, /* GL_POINT_TOKEN */
+   { 24770, 0x00000009 }, /* GL_POLYGON */
+   { 24781, 0x00000008 }, /* GL_POLYGON_BIT */
+   { 24796, 0x00000B40 }, /* GL_POLYGON_MODE */
+   { 24812, 0x00008039 }, /* GL_POLYGON_OFFSET_BIAS */
+   { 24835, 0x00008038 }, /* GL_POLYGON_OFFSET_FACTOR */
+   { 24860, 0x00008037 }, /* GL_POLYGON_OFFSET_FILL */
+   { 24883, 0x00002A02 }, /* GL_POLYGON_OFFSET_LINE */
+   { 24906, 0x00002A01 }, /* GL_POLYGON_OFFSET_POINT */
+   { 24930, 0x00002A00 }, /* GL_POLYGON_OFFSET_UNITS */
+   { 24954, 0x00000B41 }, /* GL_POLYGON_SMOOTH */
+   { 24972, 0x00000C53 }, /* GL_POLYGON_SMOOTH_HINT */
+   { 24995, 0x00000B42 }, /* GL_POLYGON_STIPPLE */
+   { 25014, 0x00000010 }, /* GL_POLYGON_STIPPLE_BIT */
+   { 25037, 0x00000703 }, /* GL_POLYGON_TOKEN */
+   { 25054, 0x00001203 }, /* GL_POSITION */
+   { 25066, 0x000080BB }, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS */
+   { 25098, 0x000080BB }, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI */
+   { 25134, 0x000080B7 }, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE */
+   { 25167, 0x000080B7 }, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI */
+   { 25204, 0x000080BA }, /* GL_POST_COLOR_MATRIX_BLUE_BIAS */
+   { 25235, 0x000080BA }, /* GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI */
+   { 25270, 0x000080B6 }, /* GL_POST_COLOR_MATRIX_BLUE_SCALE */
+   { 25302, 0x000080B6 }, /* GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI */
+   { 25338, 0x000080D2 }, /* GL_POST_COLOR_MATRIX_COLOR_TABLE */
+   { 25371, 0x000080B9 }, /* GL_POST_COLOR_MATRIX_GREEN_BIAS */
+   { 25403, 0x000080B9 }, /* GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI */
+   { 25439, 0x000080B5 }, /* GL_POST_COLOR_MATRIX_GREEN_SCALE */
+   { 25472, 0x000080B5 }, /* GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI */
+   { 25509, 0x000080B8 }, /* GL_POST_COLOR_MATRIX_RED_BIAS */
+   { 25539, 0x000080B8 }, /* GL_POST_COLOR_MATRIX_RED_BIAS_SGI */
+   { 25573, 0x000080B4 }, /* GL_POST_COLOR_MATRIX_RED_SCALE */
+   { 25604, 0x000080B4 }, /* GL_POST_COLOR_MATRIX_RED_SCALE_SGI */
+   { 25639, 0x00008023 }, /* GL_POST_CONVOLUTION_ALPHA_BIAS */
+   { 25670, 0x00008023 }, /* GL_POST_CONVOLUTION_ALPHA_BIAS_EXT */
+   { 25705, 0x0000801F }, /* GL_POST_CONVOLUTION_ALPHA_SCALE */
+   { 25737, 0x0000801F }, /* GL_POST_CONVOLUTION_ALPHA_SCALE_EXT */
+   { 25773, 0x00008022 }, /* GL_POST_CONVOLUTION_BLUE_BIAS */
+   { 25803, 0x00008022 }, /* GL_POST_CONVOLUTION_BLUE_BIAS_EXT */
+   { 25837, 0x0000801E }, /* GL_POST_CONVOLUTION_BLUE_SCALE */
+   { 25868, 0x0000801E }, /* GL_POST_CONVOLUTION_BLUE_SCALE_EXT */
+   { 25903, 0x000080D1 }, /* GL_POST_CONVOLUTION_COLOR_TABLE */
+   { 25935, 0x00008021 }, /* GL_POST_CONVOLUTION_GREEN_BIAS */
+   { 25966, 0x00008021 }, /* GL_POST_CONVOLUTION_GREEN_BIAS_EXT */
+   { 26001, 0x0000801D }, /* GL_POST_CONVOLUTION_GREEN_SCALE */
+   { 26033, 0x0000801D }, /* GL_POST_CONVOLUTION_GREEN_SCALE_EXT */
+   { 26069, 0x00008020 }, /* GL_POST_CONVOLUTION_RED_BIAS */
+   { 26098, 0x00008020 }, /* GL_POST_CONVOLUTION_RED_BIAS_EXT */
+   { 26131, 0x0000801C }, /* GL_POST_CONVOLUTION_RED_SCALE */
+   { 26161, 0x0000801C }, /* GL_POST_CONVOLUTION_RED_SCALE_EXT */
+   { 26195, 0x0000817B }, /* GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX */
+   { 26234, 0x00008179 }, /* GL_POST_TEXTURE_FILTER_BIAS_SGIX */
+   { 26267, 0x0000817C }, /* GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX */
+   { 26307, 0x0000817A }, /* GL_POST_TEXTURE_FILTER_SCALE_SGIX */
+   { 26341, 0x00008578 }, /* GL_PREVIOUS */
+   { 26353, 0x00008578 }, /* GL_PREVIOUS_ARB */
+   { 26369, 0x00008578 }, /* GL_PREVIOUS_EXT */
+   { 26385, 0x00008577 }, /* GL_PRIMARY_COLOR */
+   { 26402, 0x00008577 }, /* GL_PRIMARY_COLOR_ARB */
+   { 26423, 0x00008577 }, /* GL_PRIMARY_COLOR_EXT */
+   { 26444, 0x000088B0 }, /* GL_PROGRAM_ADDRESS_REGISTERS_ARB */
+   { 26477, 0x00008805 }, /* GL_PROGRAM_ALU_INSTRUCTIONS_ARB */
+   { 26509, 0x000088AC }, /* GL_PROGRAM_ATTRIBS_ARB */
+   { 26532, 0x00008677 }, /* GL_PROGRAM_BINDING_ARB */
+   { 26555, 0x0000864B }, /* GL_PROGRAM_ERROR_POSITION_ARB */
+   { 26585, 0x0000864B }, /* GL_PROGRAM_ERROR_POSITION_NV */
+   { 26614, 0x00008874 }, /* GL_PROGRAM_ERROR_STRING_ARB */
+   { 26642, 0x00008876 }, /* GL_PROGRAM_FORMAT_ARB */
+   { 26664, 0x00008875 }, /* GL_PROGRAM_FORMAT_ASCII_ARB */
+   { 26692, 0x000088A0 }, /* GL_PROGRAM_INSTRUCTIONS_ARB */
+   { 26720, 0x00008627 }, /* GL_PROGRAM_LENGTH_ARB */
+   { 26742, 0x00008627 }, /* GL_PROGRAM_LENGTH_NV */
+   { 26763, 0x000088B2 }, /* GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
+   { 26803, 0x00008808 }, /* GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
+   { 26842, 0x000088AE }, /* GL_PROGRAM_NATIVE_ATTRIBS_ARB */
+   { 26872, 0x000088A2 }, /* GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
+   { 26907, 0x000088AA }, /* GL_PROGRAM_NATIVE_PARAMETERS_ARB */
+   { 26940, 0x000088A6 }, /* GL_PROGRAM_NATIVE_TEMPORARIES_ARB */
+   { 26974, 0x0000880A }, /* GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
+   { 27013, 0x00008809 }, /* GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
+   { 27052, 0x00008B40 }, /* GL_PROGRAM_OBJECT_ARB */
+   { 27074, 0x000088A8 }, /* GL_PROGRAM_PARAMETERS_ARB */
+   { 27100, 0x00008644 }, /* GL_PROGRAM_PARAMETER_NV */
+   { 27124, 0x00008647 }, /* GL_PROGRAM_RESIDENT_NV */
+   { 27147, 0x00008628 }, /* GL_PROGRAM_STRING_ARB */
+   { 27169, 0x00008628 }, /* GL_PROGRAM_STRING_NV */
+   { 27190, 0x00008646 }, /* GL_PROGRAM_TARGET_NV */
+   { 27211, 0x000088A4 }, /* GL_PROGRAM_TEMPORARIES_ARB */
+   { 27238, 0x00008807 }, /* GL_PROGRAM_TEX_INDIRECTIONS_ARB */
+   { 27270, 0x00008806 }, /* GL_PROGRAM_TEX_INSTRUCTIONS_ARB */
+   { 27302, 0x000088B6 }, /* GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB */
+   { 27337, 0x00001701 }, /* GL_PROJECTION */
+   { 27351, 0x00000BA7 }, /* GL_PROJECTION_MATRIX */
+   { 27372, 0x00000BA4 }, /* GL_PROJECTION_STACK_DEPTH */
+   { 27398, 0x00008E4F }, /* GL_PROVOKING_VERTEX_EXT */
+   { 27422, 0x000080D3 }, /* GL_PROXY_COLOR_TABLE */
+   { 27443, 0x00008025 }, /* GL_PROXY_HISTOGRAM */
+   { 27462, 0x00008025 }, /* GL_PROXY_HISTOGRAM_EXT */
+   { 27485, 0x000080D5 }, /* GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE */
+   { 27524, 0x000080D4 }, /* GL_PROXY_POST_CONVOLUTION_COLOR_TABLE */
+   { 27562, 0x00008063 }, /* GL_PROXY_TEXTURE_1D */
+   { 27582, 0x00008C19 }, /* GL_PROXY_TEXTURE_1D_ARRAY_EXT */
+   { 27612, 0x00008063 }, /* GL_PROXY_TEXTURE_1D_EXT */
+   { 27636, 0x00008064 }, /* GL_PROXY_TEXTURE_2D */
+   { 27656, 0x00008C1B }, /* GL_PROXY_TEXTURE_2D_ARRAY_EXT */
+   { 27686, 0x00008064 }, /* GL_PROXY_TEXTURE_2D_EXT */
+   { 27710, 0x00008070 }, /* GL_PROXY_TEXTURE_3D */
+   { 27730, 0x000080BD }, /* GL_PROXY_TEXTURE_COLOR_TABLE_SGI */
+   { 27763, 0x0000851B }, /* GL_PROXY_TEXTURE_CUBE_MAP */
+   { 27789, 0x0000851B }, /* GL_PROXY_TEXTURE_CUBE_MAP_ARB */
+   { 27819, 0x000084F7 }, /* GL_PROXY_TEXTURE_RECTANGLE_ARB */
+   { 27850, 0x000084F7 }, /* GL_PROXY_TEXTURE_RECTANGLE_NV */
+   { 27880, 0x00002003 }, /* GL_Q */
+   { 27885, 0x00001209 }, /* GL_QUADRATIC_ATTENUATION */
+   { 27910, 0x00000007 }, /* GL_QUADS */
+   { 27919, 0x00008E4C }, /* GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT */
+   { 27967, 0x00008614 }, /* GL_QUAD_MESH_SUN */
+   { 27984, 0x00000008 }, /* GL_QUAD_STRIP */
+   { 27998, 0x00008864 }, /* GL_QUERY_COUNTER_BITS */
+   { 28020, 0x00008864 }, /* GL_QUERY_COUNTER_BITS_ARB */
+   { 28046, 0x00008866 }, /* GL_QUERY_RESULT */
+   { 28062, 0x00008866 }, /* GL_QUERY_RESULT_ARB */
+   { 28082, 0x00008867 }, /* GL_QUERY_RESULT_AVAILABLE */
+   { 28108, 0x00008867 }, /* GL_QUERY_RESULT_AVAILABLE_ARB */
+   { 28138, 0x00002002 }, /* GL_R */
+   { 28143, 0x00002A10 }, /* GL_R3_G3_B2 */
+   { 28155, 0x00019262 }, /* GL_RASTER_POSITION_UNCLIPPED_IBM */
+   { 28188, 0x00000C02 }, /* GL_READ_BUFFER */
+   { 28203, 0x00008CA8 }, /* GL_READ_FRAMEBUFFER */
+   { 28223, 0x00008CAA }, /* GL_READ_FRAMEBUFFER_BINDING_EXT */
+   { 28255, 0x00008CA8 }, /* GL_READ_FRAMEBUFFER_EXT */
+   { 28279, 0x000088B8 }, /* GL_READ_ONLY */
+   { 28292, 0x000088B8 }, /* GL_READ_ONLY_ARB */
+   { 28309, 0x000088BA }, /* GL_READ_WRITE */
+   { 28323, 0x000088BA }, /* GL_READ_WRITE_ARB */
+   { 28341, 0x00001903 }, /* GL_RED */
+   { 28348, 0x00008016 }, /* GL_REDUCE */
+   { 28358, 0x00008016 }, /* GL_REDUCE_EXT */
+   { 28372, 0x00000D15 }, /* GL_RED_BIAS */
+   { 28384, 0x00000D52 }, /* GL_RED_BITS */
+   { 28396, 0x00000D14 }, /* GL_RED_SCALE */
+   { 28409, 0x00008512 }, /* GL_REFLECTION_MAP */
+   { 28427, 0x00008512 }, /* GL_REFLECTION_MAP_ARB */
+   { 28449, 0x00008512 }, /* GL_REFLECTION_MAP_NV */
+   { 28470, 0x00001C00 }, /* GL_RENDER */
+   { 28480, 0x00008D41 }, /* GL_RENDERBUFFER */
+   { 28496, 0x00008D53 }, /* GL_RENDERBUFFER_ALPHA_SIZE */
+   { 28523, 0x00008CA7 }, /* GL_RENDERBUFFER_BINDING_EXT */
+   { 28551, 0x00008D52 }, /* GL_RENDERBUFFER_BLUE_SIZE */
+   { 28577, 0x00008D54 }, /* GL_RENDERBUFFER_DEPTH_SIZE */
+   { 28604, 0x00008D41 }, /* GL_RENDERBUFFER_EXT */
+   { 28624, 0x00008D51 }, /* GL_RENDERBUFFER_GREEN_SIZE */
+   { 28651, 0x00008D43 }, /* GL_RENDERBUFFER_HEIGHT */
+   { 28674, 0x00008D43 }, /* GL_RENDERBUFFER_HEIGHT_EXT */
+   { 28701, 0x00008D44 }, /* GL_RENDERBUFFER_INTERNAL_FORMAT */
+   { 28733, 0x00008D44 }, /* GL_RENDERBUFFER_INTERNAL_FORMAT_EXT */
+   { 28769, 0x00008D50 }, /* GL_RENDERBUFFER_RED_SIZE */
+   { 28794, 0x00008CAB }, /* GL_RENDERBUFFER_SAMPLES */
+   { 28818, 0x00008D55 }, /* GL_RENDERBUFFER_STENCIL_SIZE */
+   { 28847, 0x00008D42 }, /* GL_RENDERBUFFER_WIDTH */
+   { 28869, 0x00008D42 }, /* GL_RENDERBUFFER_WIDTH_EXT */
+   { 28895, 0x00001F01 }, /* GL_RENDERER */
+   { 28907, 0x00000C40 }, /* GL_RENDER_MODE */
+   { 28922, 0x00002901 }, /* GL_REPEAT */
+   { 28932, 0x00001E01 }, /* GL_REPLACE */
+   { 28943, 0x00008062 }, /* GL_REPLACE_EXT */
+   { 28958, 0x00008153 }, /* GL_REPLICATE_BORDER_HP */
+   { 28981, 0x0000803A }, /* GL_RESCALE_NORMAL */
+   { 28999, 0x0000803A }, /* GL_RESCALE_NORMAL_EXT */
+   { 29021, 0x00000102 }, /* GL_RETURN */
+   { 29031, 0x00001907 }, /* GL_RGB */
+   { 29038, 0x00008052 }, /* GL_RGB10 */
+   { 29047, 0x00008059 }, /* GL_RGB10_A2 */
+   { 29059, 0x00008059 }, /* GL_RGB10_A2_EXT */
+   { 29075, 0x00008052 }, /* GL_RGB10_EXT */
+   { 29088, 0x00008053 }, /* GL_RGB12 */
+   { 29097, 0x00008053 }, /* GL_RGB12_EXT */
+   { 29110, 0x00008054 }, /* GL_RGB16 */
+   { 29119, 0x00008054 }, /* GL_RGB16_EXT */
+   { 29132, 0x0000804E }, /* GL_RGB2_EXT */
+   { 29144, 0x0000804F }, /* GL_RGB4 */
+   { 29152, 0x0000804F }, /* GL_RGB4_EXT */
+   { 29164, 0x000083A1 }, /* GL_RGB4_S3TC */
+   { 29177, 0x00008050 }, /* GL_RGB5 */
+   { 29185, 0x00008057 }, /* GL_RGB5_A1 */
+   { 29196, 0x00008057 }, /* GL_RGB5_A1_EXT */
+   { 29211, 0x00008050 }, /* GL_RGB5_EXT */
+   { 29223, 0x00008051 }, /* GL_RGB8 */
+   { 29231, 0x00008051 }, /* GL_RGB8_EXT */
+   { 29243, 0x00001908 }, /* GL_RGBA */
+   { 29251, 0x0000805A }, /* GL_RGBA12 */
+   { 29261, 0x0000805A }, /* GL_RGBA12_EXT */
+   { 29275, 0x0000805B }, /* GL_RGBA16 */
+   { 29285, 0x0000805B }, /* GL_RGBA16_EXT */
+   { 29299, 0x00008055 }, /* GL_RGBA2 */
+   { 29308, 0x00008055 }, /* GL_RGBA2_EXT */
+   { 29321, 0x00008056 }, /* GL_RGBA4 */
+   { 29330, 0x000083A5 }, /* GL_RGBA4_DXT5_S3TC */
+   { 29349, 0x00008056 }, /* GL_RGBA4_EXT */
+   { 29362, 0x000083A3 }, /* GL_RGBA4_S3TC */
+   { 29376, 0x00008058 }, /* GL_RGBA8 */
+   { 29385, 0x00008058 }, /* GL_RGBA8_EXT */
+   { 29398, 0x00008F97 }, /* GL_RGBA8_SNORM */
+   { 29413, 0x000083A4 }, /* GL_RGBA_DXT5_S3TC */
+   { 29431, 0x00000C31 }, /* GL_RGBA_MODE */
+   { 29444, 0x000083A2 }, /* GL_RGBA_S3TC */
+   { 29457, 0x00008F93 }, /* GL_RGBA_SNORM */
+   { 29471, 0x000083A0 }, /* GL_RGB_S3TC */
+   { 29483, 0x00008573 }, /* GL_RGB_SCALE */
+   { 29496, 0x00008573 }, /* GL_RGB_SCALE_ARB */
+   { 29513, 0x00008573 }, /* GL_RGB_SCALE_EXT */
+   { 29530, 0x00000407 }, /* GL_RIGHT */
+   { 29539, 0x00002000 }, /* GL_S */
+   { 29544, 0x00008B5D }, /* GL_SAMPLER_1D */
+   { 29558, 0x00008B61 }, /* GL_SAMPLER_1D_SHADOW */
+   { 29579, 0x00008B5E }, /* GL_SAMPLER_2D */
+   { 29593, 0x00008B62 }, /* GL_SAMPLER_2D_SHADOW */
+   { 29614, 0x00008B5F }, /* GL_SAMPLER_3D */
+   { 29628, 0x00008B60 }, /* GL_SAMPLER_CUBE */
+   { 29644, 0x000080A9 }, /* GL_SAMPLES */
+   { 29655, 0x000086B4 }, /* GL_SAMPLES_3DFX */
+   { 29671, 0x000080A9 }, /* GL_SAMPLES_ARB */
+   { 29686, 0x00008914 }, /* GL_SAMPLES_PASSED */
+   { 29704, 0x00008914 }, /* GL_SAMPLES_PASSED_ARB */
+   { 29726, 0x0000809E }, /* GL_SAMPLE_ALPHA_TO_COVERAGE */
+   { 29754, 0x0000809E }, /* GL_SAMPLE_ALPHA_TO_COVERAGE_ARB */
+   { 29786, 0x0000809F }, /* GL_SAMPLE_ALPHA_TO_ONE */
+   { 29809, 0x0000809F }, /* GL_SAMPLE_ALPHA_TO_ONE_ARB */
+   { 29836, 0x000080A8 }, /* GL_SAMPLE_BUFFERS */
+   { 29854, 0x000086B3 }, /* GL_SAMPLE_BUFFERS_3DFX */
+   { 29877, 0x000080A8 }, /* GL_SAMPLE_BUFFERS_ARB */
+   { 29899, 0x000080A0 }, /* GL_SAMPLE_COVERAGE */
+   { 29918, 0x000080A0 }, /* GL_SAMPLE_COVERAGE_ARB */
+   { 29941, 0x000080AB }, /* GL_SAMPLE_COVERAGE_INVERT */
+   { 29967, 0x000080AB }, /* GL_SAMPLE_COVERAGE_INVERT_ARB */
+   { 29997, 0x000080AA }, /* GL_SAMPLE_COVERAGE_VALUE */
+   { 30022, 0x000080AA }, /* GL_SAMPLE_COVERAGE_VALUE_ARB */
+   { 30051, 0x00080000 }, /* GL_SCISSOR_BIT */
+   { 30066, 0x00000C10 }, /* GL_SCISSOR_BOX */
+   { 30081, 0x00000C11 }, /* GL_SCISSOR_TEST */
+   { 30097, 0x0000845E }, /* GL_SECONDARY_COLOR_ARRAY */
+   { 30122, 0x0000889C }, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING */
+   { 30162, 0x0000889C }, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB */
+   { 30206, 0x0000845D }, /* GL_SECONDARY_COLOR_ARRAY_POINTER */
+   { 30239, 0x0000845A }, /* GL_SECONDARY_COLOR_ARRAY_SIZE */
+   { 30269, 0x0000845C }, /* GL_SECONDARY_COLOR_ARRAY_STRIDE */
+   { 30301, 0x0000845B }, /* GL_SECONDARY_COLOR_ARRAY_TYPE */
+   { 30331, 0x00001C02 }, /* GL_SELECT */
+   { 30341, 0x00000DF3 }, /* GL_SELECTION_BUFFER_POINTER */
+   { 30369, 0x00000DF4 }, /* GL_SELECTION_BUFFER_SIZE */
+   { 30394, 0x00008012 }, /* GL_SEPARABLE_2D */
+   { 30410, 0x000081FA }, /* GL_SEPARATE_SPECULAR_COLOR */
+   { 30437, 0x000081FA }, /* GL_SEPARATE_SPECULAR_COLOR_EXT */
+   { 30468, 0x0000150F }, /* GL_SET */
+   { 30475, 0x00008B48 }, /* GL_SHADER_OBJECT_ARB */
+   { 30496, 0x00008B88 }, /* GL_SHADER_SOURCE_LENGTH */
+   { 30520, 0x00008B4F }, /* GL_SHADER_TYPE */
+   { 30535, 0x00000B54 }, /* GL_SHADE_MODEL */
+   { 30550, 0x00008B8C }, /* GL_SHADING_LANGUAGE_VERSION */
+   { 30578, 0x000080BF }, /* GL_SHADOW_AMBIENT_SGIX */
+   { 30601, 0x000081FB }, /* GL_SHARED_TEXTURE_PALETTE_EXT */
+   { 30631, 0x00001601 }, /* GL_SHININESS */
+   { 30644, 0x00001402 }, /* GL_SHORT */
+   { 30653, 0x00008F9C }, /* GL_SIGNED_NORMALIZED */
+   { 30674, 0x000081F9 }, /* GL_SINGLE_COLOR */
+   { 30690, 0x000081F9 }, /* GL_SINGLE_COLOR_EXT */
+   { 30710, 0x000085CC }, /* GL_SLICE_ACCUM_SUN */
+   { 30729, 0x00008C46 }, /* GL_SLUMINANCE */
+   { 30743, 0x00008C47 }, /* GL_SLUMINANCE8 */
+   { 30758, 0x00008C45 }, /* GL_SLUMINANCE8_ALPHA8 */
+   { 30780, 0x00008C44 }, /* GL_SLUMINANCE_ALPHA */
+   { 30800, 0x00001D01 }, /* GL_SMOOTH */
+   { 30810, 0x00000B23 }, /* GL_SMOOTH_LINE_WIDTH_GRANULARITY */
+   { 30843, 0x00000B22 }, /* GL_SMOOTH_LINE_WIDTH_RANGE */
+   { 30870, 0x00000B13 }, /* GL_SMOOTH_POINT_SIZE_GRANULARITY */
+   { 30903, 0x00000B12 }, /* GL_SMOOTH_POINT_SIZE_RANGE */
+   { 30930, 0x00008588 }, /* GL_SOURCE0_ALPHA */
+   { 30947, 0x00008588 }, /* GL_SOURCE0_ALPHA_ARB */
+   { 30968, 0x00008588 }, /* GL_SOURCE0_ALPHA_EXT */
+   { 30989, 0x00008580 }, /* GL_SOURCE0_RGB */
+   { 31004, 0x00008580 }, /* GL_SOURCE0_RGB_ARB */
+   { 31023, 0x00008580 }, /* GL_SOURCE0_RGB_EXT */
+   { 31042, 0x00008589 }, /* GL_SOURCE1_ALPHA */
+   { 31059, 0x00008589 }, /* GL_SOURCE1_ALPHA_ARB */
+   { 31080, 0x00008589 }, /* GL_SOURCE1_ALPHA_EXT */
+   { 31101, 0x00008581 }, /* GL_SOURCE1_RGB */
+   { 31116, 0x00008581 }, /* GL_SOURCE1_RGB_ARB */
+   { 31135, 0x00008581 }, /* GL_SOURCE1_RGB_EXT */
+   { 31154, 0x0000858A }, /* GL_SOURCE2_ALPHA */
+   { 31171, 0x0000858A }, /* GL_SOURCE2_ALPHA_ARB */
+   { 31192, 0x0000858A }, /* GL_SOURCE2_ALPHA_EXT */
+   { 31213, 0x00008582 }, /* GL_SOURCE2_RGB */
+   { 31228, 0x00008582 }, /* GL_SOURCE2_RGB_ARB */
+   { 31247, 0x00008582 }, /* GL_SOURCE2_RGB_EXT */
+   { 31266, 0x0000858B }, /* GL_SOURCE3_ALPHA_NV */
+   { 31286, 0x00008583 }, /* GL_SOURCE3_RGB_NV */
+   { 31304, 0x00001202 }, /* GL_SPECULAR */
+   { 31316, 0x00002402 }, /* GL_SPHERE_MAP */
+   { 31330, 0x00001206 }, /* GL_SPOT_CUTOFF */
+   { 31345, 0x00001204 }, /* GL_SPOT_DIRECTION */
+   { 31363, 0x00001205 }, /* GL_SPOT_EXPONENT */
+   { 31380, 0x00008588 }, /* GL_SRC0_ALPHA */
+   { 31394, 0x00008580 }, /* GL_SRC0_RGB */
+   { 31406, 0x00008589 }, /* GL_SRC1_ALPHA */
+   { 31420, 0x00008581 }, /* GL_SRC1_RGB */
+   { 31432, 0x0000858A }, /* GL_SRC2_ALPHA */
+   { 31446, 0x00008582 }, /* GL_SRC2_RGB */
+   { 31458, 0x00000302 }, /* GL_SRC_ALPHA */
+   { 31471, 0x00000308 }, /* GL_SRC_ALPHA_SATURATE */
+   { 31493, 0x00000300 }, /* GL_SRC_COLOR */
+   { 31506, 0x00008C40 }, /* GL_SRGB */
+   { 31514, 0x00008C41 }, /* GL_SRGB8 */
+   { 31523, 0x00008C43 }, /* GL_SRGB8_ALPHA8 */
+   { 31539, 0x00008C42 }, /* GL_SRGB_ALPHA */
+   { 31553, 0x00000503 }, /* GL_STACK_OVERFLOW */
+   { 31571, 0x00000504 }, /* GL_STACK_UNDERFLOW */
+   { 31590, 0x000088E6 }, /* GL_STATIC_COPY */
+   { 31605, 0x000088E6 }, /* GL_STATIC_COPY_ARB */
+   { 31624, 0x000088E4 }, /* GL_STATIC_DRAW */
+   { 31639, 0x000088E4 }, /* GL_STATIC_DRAW_ARB */
+   { 31658, 0x000088E5 }, /* GL_STATIC_READ */
+   { 31673, 0x000088E5 }, /* GL_STATIC_READ_ARB */
+   { 31692, 0x00001802 }, /* GL_STENCIL */
+   { 31703, 0x00008D20 }, /* GL_STENCIL_ATTACHMENT */
+   { 31725, 0x00008D20 }, /* GL_STENCIL_ATTACHMENT_EXT */
+   { 31751, 0x00008801 }, /* GL_STENCIL_BACK_FAIL */
+   { 31772, 0x00008801 }, /* GL_STENCIL_BACK_FAIL_ATI */
+   { 31797, 0x00008800 }, /* GL_STENCIL_BACK_FUNC */
+   { 31818, 0x00008800 }, /* GL_STENCIL_BACK_FUNC_ATI */
+   { 31843, 0x00008802 }, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL */
+   { 31875, 0x00008802 }, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI */
+   { 31911, 0x00008803 }, /* GL_STENCIL_BACK_PASS_DEPTH_PASS */
+   { 31943, 0x00008803 }, /* GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI */
+   { 31979, 0x00008CA3 }, /* GL_STENCIL_BACK_REF */
+   { 31999, 0x00008CA4 }, /* GL_STENCIL_BACK_VALUE_MASK */
+   { 32026, 0x00008CA5 }, /* GL_STENCIL_BACK_WRITEMASK */
+   { 32052, 0x00000D57 }, /* GL_STENCIL_BITS */
+   { 32068, 0x00000400 }, /* GL_STENCIL_BUFFER_BIT */
+   { 32090, 0x00000B91 }, /* GL_STENCIL_CLEAR_VALUE */
+   { 32113, 0x00000B94 }, /* GL_STENCIL_FAIL */
+   { 32129, 0x00000B92 }, /* GL_STENCIL_FUNC */
+   { 32145, 0x00001901 }, /* GL_STENCIL_INDEX */
+   { 32162, 0x00008D49 }, /* GL_STENCIL_INDEX16_EXT */
+   { 32185, 0x00008D46 }, /* GL_STENCIL_INDEX1_EXT */
+   { 32207, 0x00008D47 }, /* GL_STENCIL_INDEX4_EXT */
+   { 32229, 0x00008D48 }, /* GL_STENCIL_INDEX8_EXT */
+   { 32251, 0x00008D45 }, /* GL_STENCIL_INDEX_EXT */
+   { 32272, 0x00000B95 }, /* GL_STENCIL_PASS_DEPTH_FAIL */
+   { 32299, 0x00000B96 }, /* GL_STENCIL_PASS_DEPTH_PASS */
+   { 32326, 0x00000B97 }, /* GL_STENCIL_REF */
+   { 32341, 0x00000B90 }, /* GL_STENCIL_TEST */
+   { 32357, 0x00008910 }, /* GL_STENCIL_TEST_TWO_SIDE_EXT */
+   { 32386, 0x00000B93 }, /* GL_STENCIL_VALUE_MASK */
+   { 32408, 0x00000B98 }, /* GL_STENCIL_WRITEMASK */
+   { 32429, 0x00000C33 }, /* GL_STEREO */
+   { 32439, 0x000085BE }, /* GL_STORAGE_CACHED_APPLE */
+   { 32463, 0x000085BD }, /* GL_STORAGE_PRIVATE_APPLE */
+   { 32488, 0x000085BF }, /* GL_STORAGE_SHARED_APPLE */
+   { 32512, 0x000088E2 }, /* GL_STREAM_COPY */
+   { 32527, 0x000088E2 }, /* GL_STREAM_COPY_ARB */
+   { 32546, 0x000088E0 }, /* GL_STREAM_DRAW */
+   { 32561, 0x000088E0 }, /* GL_STREAM_DRAW_ARB */
+   { 32580, 0x000088E1 }, /* GL_STREAM_READ */
+   { 32595, 0x000088E1 }, /* GL_STREAM_READ_ARB */
+   { 32614, 0x00000D50 }, /* GL_SUBPIXEL_BITS */
+   { 32631, 0x000084E7 }, /* GL_SUBTRACT */
+   { 32643, 0x000084E7 }, /* GL_SUBTRACT_ARB */
+   { 32659, 0x00002001 }, /* GL_T */
+   { 32664, 0x00002A2A }, /* GL_T2F_C3F_V3F */
+   { 32679, 0x00002A2C }, /* GL_T2F_C4F_N3F_V3F */
+   { 32698, 0x00002A29 }, /* GL_T2F_C4UB_V3F */
+   { 32714, 0x00002A2B }, /* GL_T2F_N3F_V3F */
+   { 32729, 0x00002A27 }, /* GL_T2F_V3F */
+   { 32740, 0x00002A2D }, /* GL_T4F_C4F_N3F_V4F */
+   { 32759, 0x00002A28 }, /* GL_T4F_V4F */
+   { 32770, 0x00008031 }, /* GL_TABLE_TOO_LARGE_EXT */
+   { 32793, 0x00001702 }, /* GL_TEXTURE */
+   { 32804, 0x000084C0 }, /* GL_TEXTURE0 */
+   { 32816, 0x000084C0 }, /* GL_TEXTURE0_ARB */
+   { 32832, 0x000084C1 }, /* GL_TEXTURE1 */
+   { 32844, 0x000084CA }, /* GL_TEXTURE10 */
+   { 32857, 0x000084CA }, /* GL_TEXTURE10_ARB */
+   { 32874, 0x000084CB }, /* GL_TEXTURE11 */
+   { 32887, 0x000084CB }, /* GL_TEXTURE11_ARB */
+   { 32904, 0x000084CC }, /* GL_TEXTURE12 */
+   { 32917, 0x000084CC }, /* GL_TEXTURE12_ARB */
+   { 32934, 0x000084CD }, /* GL_TEXTURE13 */
+   { 32947, 0x000084CD }, /* GL_TEXTURE13_ARB */
+   { 32964, 0x000084CE }, /* GL_TEXTURE14 */
+   { 32977, 0x000084CE }, /* GL_TEXTURE14_ARB */
+   { 32994, 0x000084CF }, /* GL_TEXTURE15 */
+   { 33007, 0x000084CF }, /* GL_TEXTURE15_ARB */
+   { 33024, 0x000084D0 }, /* GL_TEXTURE16 */
+   { 33037, 0x000084D0 }, /* GL_TEXTURE16_ARB */
+   { 33054, 0x000084D1 }, /* GL_TEXTURE17 */
+   { 33067, 0x000084D1 }, /* GL_TEXTURE17_ARB */
+   { 33084, 0x000084D2 }, /* GL_TEXTURE18 */
+   { 33097, 0x000084D2 }, /* GL_TEXTURE18_ARB */
+   { 33114, 0x000084D3 }, /* GL_TEXTURE19 */
+   { 33127, 0x000084D3 }, /* GL_TEXTURE19_ARB */
+   { 33144, 0x000084C1 }, /* GL_TEXTURE1_ARB */
+   { 33160, 0x000084C2 }, /* GL_TEXTURE2 */
+   { 33172, 0x000084D4 }, /* GL_TEXTURE20 */
+   { 33185, 0x000084D4 }, /* GL_TEXTURE20_ARB */
+   { 33202, 0x000084D5 }, /* GL_TEXTURE21 */
+   { 33215, 0x000084D5 }, /* GL_TEXTURE21_ARB */
+   { 33232, 0x000084D6 }, /* GL_TEXTURE22 */
+   { 33245, 0x000084D6 }, /* GL_TEXTURE22_ARB */
+   { 33262, 0x000084D7 }, /* GL_TEXTURE23 */
+   { 33275, 0x000084D7 }, /* GL_TEXTURE23_ARB */
+   { 33292, 0x000084D8 }, /* GL_TEXTURE24 */
+   { 33305, 0x000084D8 }, /* GL_TEXTURE24_ARB */
+   { 33322, 0x000084D9 }, /* GL_TEXTURE25 */
+   { 33335, 0x000084D9 }, /* GL_TEXTURE25_ARB */
+   { 33352, 0x000084DA }, /* GL_TEXTURE26 */
+   { 33365, 0x000084DA }, /* GL_TEXTURE26_ARB */
+   { 33382, 0x000084DB }, /* GL_TEXTURE27 */
+   { 33395, 0x000084DB }, /* GL_TEXTURE27_ARB */
+   { 33412, 0x000084DC }, /* GL_TEXTURE28 */
+   { 33425, 0x000084DC }, /* GL_TEXTURE28_ARB */
+   { 33442, 0x000084DD }, /* GL_TEXTURE29 */
+   { 33455, 0x000084DD }, /* GL_TEXTURE29_ARB */
+   { 33472, 0x000084C2 }, /* GL_TEXTURE2_ARB */
+   { 33488, 0x000084C3 }, /* GL_TEXTURE3 */
+   { 33500, 0x000084DE }, /* GL_TEXTURE30 */
+   { 33513, 0x000084DE }, /* GL_TEXTURE30_ARB */
+   { 33530, 0x000084DF }, /* GL_TEXTURE31 */
+   { 33543, 0x000084DF }, /* GL_TEXTURE31_ARB */
+   { 33560, 0x000084C3 }, /* GL_TEXTURE3_ARB */
+   { 33576, 0x000084C4 }, /* GL_TEXTURE4 */
+   { 33588, 0x000084C4 }, /* GL_TEXTURE4_ARB */
+   { 33604, 0x000084C5 }, /* GL_TEXTURE5 */
+   { 33616, 0x000084C5 }, /* GL_TEXTURE5_ARB */
+   { 33632, 0x000084C6 }, /* GL_TEXTURE6 */
+   { 33644, 0x000084C6 }, /* GL_TEXTURE6_ARB */
+   { 33660, 0x000084C7 }, /* GL_TEXTURE7 */
+   { 33672, 0x000084C7 }, /* GL_TEXTURE7_ARB */
+   { 33688, 0x000084C8 }, /* GL_TEXTURE8 */
+   { 33700, 0x000084C8 }, /* GL_TEXTURE8_ARB */
+   { 33716, 0x000084C9 }, /* GL_TEXTURE9 */
+   { 33728, 0x000084C9 }, /* GL_TEXTURE9_ARB */
+   { 33744, 0x00000DE0 }, /* GL_TEXTURE_1D */
+   { 33758, 0x00008C18 }, /* GL_TEXTURE_1D_ARRAY_EXT */
+   { 33782, 0x00000DE1 }, /* GL_TEXTURE_2D */
+   { 33796, 0x00008C1A }, /* GL_TEXTURE_2D_ARRAY_EXT */
+   { 33820, 0x0000806F }, /* GL_TEXTURE_3D */
+   { 33834, 0x0000805F }, /* GL_TEXTURE_ALPHA_SIZE */
+   { 33856, 0x0000805F }, /* GL_TEXTURE_ALPHA_SIZE_EXT */
+   { 33882, 0x0000813C }, /* GL_TEXTURE_BASE_LEVEL */
+   { 33904, 0x00008068 }, /* GL_TEXTURE_BINDING_1D */
+   { 33926, 0x00008C1C }, /* GL_TEXTURE_BINDING_1D_ARRAY_EXT */
+   { 33958, 0x00008069 }, /* GL_TEXTURE_BINDING_2D */
+   { 33980, 0x00008C1D }, /* GL_TEXTURE_BINDING_2D_ARRAY_EXT */
+   { 34012, 0x0000806A }, /* GL_TEXTURE_BINDING_3D */
+   { 34034, 0x00008514 }, /* GL_TEXTURE_BINDING_CUBE_MAP */
+   { 34062, 0x00008514 }, /* GL_TEXTURE_BINDING_CUBE_MAP_ARB */
+   { 34094, 0x000084F6 }, /* GL_TEXTURE_BINDING_RECTANGLE_ARB */
+   { 34127, 0x000084F6 }, /* GL_TEXTURE_BINDING_RECTANGLE_NV */
+   { 34159, 0x00040000 }, /* GL_TEXTURE_BIT */
+   { 34174, 0x0000805E }, /* GL_TEXTURE_BLUE_SIZE */
+   { 34195, 0x0000805E }, /* GL_TEXTURE_BLUE_SIZE_EXT */
+   { 34220, 0x00001005 }, /* GL_TEXTURE_BORDER */
+   { 34238, 0x00001004 }, /* GL_TEXTURE_BORDER_COLOR */
+   { 34262, 0x00008171 }, /* GL_TEXTURE_CLIPMAP_CENTER_SGIX */
+   { 34293, 0x00008176 }, /* GL_TEXTURE_CLIPMAP_DEPTH_SGIX */
+   { 34323, 0x00008172 }, /* GL_TEXTURE_CLIPMAP_FRAME_SGIX */
+   { 34353, 0x00008175 }, /* GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX */
+   { 34388, 0x00008173 }, /* GL_TEXTURE_CLIPMAP_OFFSET_SGIX */
+   { 34419, 0x00008174 }, /* GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX */
+   { 34457, 0x000080BC }, /* GL_TEXTURE_COLOR_TABLE_SGI */
+   { 34484, 0x000081EF }, /* GL_TEXTURE_COLOR_WRITEMASK_SGIS */
+   { 34516, 0x000080BF }, /* GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
+   { 34550, 0x0000884D }, /* GL_TEXTURE_COMPARE_FUNC */
+   { 34574, 0x0000884D }, /* GL_TEXTURE_COMPARE_FUNC_ARB */
+   { 34602, 0x0000884C }, /* GL_TEXTURE_COMPARE_MODE */
+   { 34626, 0x0000884C }, /* GL_TEXTURE_COMPARE_MODE_ARB */
+   { 34654, 0x0000819B }, /* GL_TEXTURE_COMPARE_OPERATOR_SGIX */
+   { 34687, 0x0000819A }, /* GL_TEXTURE_COMPARE_SGIX */
+   { 34711, 0x00001003 }, /* GL_TEXTURE_COMPONENTS */
+   { 34733, 0x000086A1 }, /* GL_TEXTURE_COMPRESSED */
+   { 34755, 0x000086A1 }, /* GL_TEXTURE_COMPRESSED_ARB */
+   { 34781, 0x000086A3 }, /* GL_TEXTURE_COMPRESSED_FORMATS_ARB */
+   { 34815, 0x000086A0 }, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE */
+   { 34848, 0x000086A0 }, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB */
+   { 34885, 0x000084EF }, /* GL_TEXTURE_COMPRESSION_HINT */
+   { 34913, 0x000084EF }, /* GL_TEXTURE_COMPRESSION_HINT_ARB */
+   { 34945, 0x00008078 }, /* GL_TEXTURE_COORD_ARRAY */
+   { 34968, 0x0000889A }, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING */
+   { 35006, 0x0000889A }, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB */
+   { 35048, 0x00008092 }, /* GL_TEXTURE_COORD_ARRAY_POINTER */
+   { 35079, 0x00008088 }, /* GL_TEXTURE_COORD_ARRAY_SIZE */
+   { 35107, 0x0000808A }, /* GL_TEXTURE_COORD_ARRAY_STRIDE */
+   { 35137, 0x00008089 }, /* GL_TEXTURE_COORD_ARRAY_TYPE */
+   { 35165, 0x00008513 }, /* GL_TEXTURE_CUBE_MAP */
+   { 35185, 0x00008513 }, /* GL_TEXTURE_CUBE_MAP_ARB */
+   { 35209, 0x00008516 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X */
+   { 35240, 0x00008516 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB */
+   { 35275, 0x00008518 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y */
+   { 35306, 0x00008518 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB */
+   { 35341, 0x0000851A }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z */
+   { 35372, 0x0000851A }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB */
+   { 35407, 0x00008515 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X */
+   { 35438, 0x00008515 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB */
+   { 35473, 0x00008517 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y */
+   { 35504, 0x00008517 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB */
+   { 35539, 0x00008519 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z */
+   { 35570, 0x00008519 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB */
+   { 35605, 0x000088F4 }, /* GL_TEXTURE_CUBE_MAP_SEAMLESS */
+   { 35634, 0x00008071 }, /* GL_TEXTURE_DEPTH */
+   { 35651, 0x0000884A }, /* GL_TEXTURE_DEPTH_SIZE */
+   { 35673, 0x0000884A }, /* GL_TEXTURE_DEPTH_SIZE_ARB */
+   { 35699, 0x00002300 }, /* GL_TEXTURE_ENV */
+   { 35714, 0x00002201 }, /* GL_TEXTURE_ENV_COLOR */
+   { 35735, 0x00002200 }, /* GL_TEXTURE_ENV_MODE */
+   { 35755, 0x00008500 }, /* GL_TEXTURE_FILTER_CONTROL */
+   { 35781, 0x00002500 }, /* GL_TEXTURE_GEN_MODE */
+   { 35801, 0x00000C63 }, /* GL_TEXTURE_GEN_Q */
+   { 35818, 0x00000C62 }, /* GL_TEXTURE_GEN_R */
+   { 35835, 0x00000C60 }, /* GL_TEXTURE_GEN_S */
+   { 35852, 0x00000C61 }, /* GL_TEXTURE_GEN_T */
+   { 35869, 0x0000819D }, /* GL_TEXTURE_GEQUAL_R_SGIX */
+   { 35894, 0x0000805D }, /* GL_TEXTURE_GREEN_SIZE */
+   { 35916, 0x0000805D }, /* GL_TEXTURE_GREEN_SIZE_EXT */
+   { 35942, 0x00001001 }, /* GL_TEXTURE_HEIGHT */
+   { 35960, 0x000080ED }, /* GL_TEXTURE_INDEX_SIZE_EXT */
+   { 35986, 0x00008061 }, /* GL_TEXTURE_INTENSITY_SIZE */
+   { 36012, 0x00008061 }, /* GL_TEXTURE_INTENSITY_SIZE_EXT */
+   { 36042, 0x00001003 }, /* GL_TEXTURE_INTERNAL_FORMAT */
+   { 36069, 0x0000819C }, /* GL_TEXTURE_LEQUAL_R_SGIX */
+   { 36094, 0x00008501 }, /* GL_TEXTURE_LOD_BIAS */
+   { 36114, 0x00008501 }, /* GL_TEXTURE_LOD_BIAS_EXT */
+   { 36138, 0x00008190 }, /* GL_TEXTURE_LOD_BIAS_R_SGIX */
+   { 36165, 0x0000818E }, /* GL_TEXTURE_LOD_BIAS_S_SGIX */
+   { 36192, 0x0000818F }, /* GL_TEXTURE_LOD_BIAS_T_SGIX */
+   { 36219, 0x00008060 }, /* GL_TEXTURE_LUMINANCE_SIZE */
+   { 36245, 0x00008060 }, /* GL_TEXTURE_LUMINANCE_SIZE_EXT */
+   { 36275, 0x00002800 }, /* GL_TEXTURE_MAG_FILTER */
+   { 36297, 0x00000BA8 }, /* GL_TEXTURE_MATRIX */
+   { 36315, 0x000084FE }, /* GL_TEXTURE_MAX_ANISOTROPY_EXT */
+   { 36345, 0x0000836B }, /* GL_TEXTURE_MAX_CLAMP_R_SGIX */
+   { 36373, 0x00008369 }, /* GL_TEXTURE_MAX_CLAMP_S_SGIX */
+   { 36401, 0x0000836A }, /* GL_TEXTURE_MAX_CLAMP_T_SGIX */
+   { 36429, 0x0000813D }, /* GL_TEXTURE_MAX_LEVEL */
+   { 36450, 0x0000813B }, /* GL_TEXTURE_MAX_LOD */
+   { 36469, 0x00002801 }, /* GL_TEXTURE_MIN_FILTER */
+   { 36491, 0x0000813A }, /* GL_TEXTURE_MIN_LOD */
+   { 36510, 0x00008066 }, /* GL_TEXTURE_PRIORITY */
+   { 36530, 0x000085B7 }, /* GL_TEXTURE_RANGE_LENGTH_APPLE */
+   { 36560, 0x000085B8 }, /* GL_TEXTURE_RANGE_POINTER_APPLE */
+   { 36591, 0x000084F5 }, /* GL_TEXTURE_RECTANGLE_ARB */
+   { 36616, 0x000084F5 }, /* GL_TEXTURE_RECTANGLE_NV */
+   { 36640, 0x0000805C }, /* GL_TEXTURE_RED_SIZE */
+   { 36660, 0x0000805C }, /* GL_TEXTURE_RED_SIZE_EXT */
+   { 36684, 0x00008067 }, /* GL_TEXTURE_RESIDENT */
+   { 36704, 0x00000BA5 }, /* GL_TEXTURE_STACK_DEPTH */
+   { 36727, 0x000088F1 }, /* GL_TEXTURE_STENCIL_SIZE */
+   { 36751, 0x000085BC }, /* GL_TEXTURE_STORAGE_HINT_APPLE */
+   { 36781, 0x00008065 }, /* GL_TEXTURE_TOO_LARGE_EXT */
+   { 36806, 0x0000888F }, /* GL_TEXTURE_UNSIGNED_REMAP_MODE_NV */
+   { 36840, 0x00001000 }, /* GL_TEXTURE_WIDTH */
+   { 36857, 0x00008072 }, /* GL_TEXTURE_WRAP_R */
+   { 36875, 0x00002802 }, /* GL_TEXTURE_WRAP_S */
+   { 36893, 0x00002803 }, /* GL_TEXTURE_WRAP_T */
+   { 36911, 0x000088BF }, /* GL_TIME_ELAPSED_EXT */
+   { 36931, 0x00008648 }, /* GL_TRACK_MATRIX_NV */
+   { 36950, 0x00008649 }, /* GL_TRACK_MATRIX_TRANSFORM_NV */
+   { 36979, 0x00001000 }, /* GL_TRANSFORM_BIT */
+   { 36996, 0x000084E6 }, /* GL_TRANSPOSE_COLOR_MATRIX */
+   { 37022, 0x000084E6 }, /* GL_TRANSPOSE_COLOR_MATRIX_ARB */
+   { 37052, 0x000088B7 }, /* GL_TRANSPOSE_CURRENT_MATRIX_ARB */
+   { 37084, 0x000084E3 }, /* GL_TRANSPOSE_MODELVIEW_MATRIX */
+   { 37114, 0x000084E3 }, /* GL_TRANSPOSE_MODELVIEW_MATRIX_ARB */
+   { 37148, 0x0000862C }, /* GL_TRANSPOSE_NV */
+   { 37164, 0x000084E4 }, /* GL_TRANSPOSE_PROJECTION_MATRIX */
+   { 37195, 0x000084E4 }, /* GL_TRANSPOSE_PROJECTION_MATRIX_ARB */
+   { 37230, 0x000084E5 }, /* GL_TRANSPOSE_TEXTURE_MATRIX */
+   { 37258, 0x000084E5 }, /* GL_TRANSPOSE_TEXTURE_MATRIX_ARB */
+   { 37290, 0x00000004 }, /* GL_TRIANGLES */
+   { 37303, 0x00000006 }, /* GL_TRIANGLE_FAN */
+   { 37319, 0x00008615 }, /* GL_TRIANGLE_MESH_SUN */
+   { 37340, 0x00000005 }, /* GL_TRIANGLE_STRIP */
+   { 37358, 0x00000001 }, /* GL_TRUE */
+   { 37366, 0x00000CF5 }, /* GL_UNPACK_ALIGNMENT */
+   { 37386, 0x0000806E }, /* GL_UNPACK_IMAGE_HEIGHT */
+   { 37409, 0x00000CF1 }, /* GL_UNPACK_LSB_FIRST */
+   { 37429, 0x00000CF2 }, /* GL_UNPACK_ROW_LENGTH */
+   { 37450, 0x0000806D }, /* GL_UNPACK_SKIP_IMAGES */
+   { 37472, 0x00000CF4 }, /* GL_UNPACK_SKIP_PIXELS */
+   { 37494, 0x00000CF3 }, /* GL_UNPACK_SKIP_ROWS */
+   { 37514, 0x00000CF0 }, /* GL_UNPACK_SWAP_BYTES */
+   { 37535, 0x00001401 }, /* GL_UNSIGNED_BYTE */
+   { 37552, 0x00008362 }, /* GL_UNSIGNED_BYTE_2_3_3_REV */
+   { 37579, 0x00008032 }, /* GL_UNSIGNED_BYTE_3_3_2 */
+   { 37602, 0x00001405 }, /* GL_UNSIGNED_INT */
+   { 37618, 0x00008036 }, /* GL_UNSIGNED_INT_10_10_10_2 */
+   { 37645, 0x000084FA }, /* GL_UNSIGNED_INT_24_8 */
+   { 37666, 0x000084FA }, /* GL_UNSIGNED_INT_24_8_NV */
+   { 37690, 0x00008368 }, /* GL_UNSIGNED_INT_2_10_10_10_REV */
+   { 37721, 0x00008035 }, /* GL_UNSIGNED_INT_8_8_8_8 */
+   { 37745, 0x00008367 }, /* GL_UNSIGNED_INT_8_8_8_8_REV */
+   { 37773, 0x00008C17 }, /* GL_UNSIGNED_NORMALIZED */
+   { 37796, 0x00001403 }, /* GL_UNSIGNED_SHORT */
+   { 37814, 0x00008366 }, /* GL_UNSIGNED_SHORT_1_5_5_5_REV */
+   { 37844, 0x00008033 }, /* GL_UNSIGNED_SHORT_4_4_4_4 */
+   { 37870, 0x00008365 }, /* GL_UNSIGNED_SHORT_4_4_4_4_REV */
+   { 37900, 0x00008034 }, /* GL_UNSIGNED_SHORT_5_5_5_1 */
+   { 37926, 0x00008363 }, /* GL_UNSIGNED_SHORT_5_6_5 */
+   { 37950, 0x00008364 }, /* GL_UNSIGNED_SHORT_5_6_5_REV */
+   { 37978, 0x000085BA }, /* GL_UNSIGNED_SHORT_8_8_APPLE */
+   { 38006, 0x000085BA }, /* GL_UNSIGNED_SHORT_8_8_MESA */
+   { 38033, 0x000085BB }, /* GL_UNSIGNED_SHORT_8_8_REV_APPLE */
+   { 38065, 0x000085BB }, /* GL_UNSIGNED_SHORT_8_8_REV_MESA */
+   { 38096, 0x00008CA2 }, /* GL_UPPER_LEFT */
+   { 38110, 0x00002A20 }, /* GL_V2F */
+   { 38117, 0x00002A21 }, /* GL_V3F */
+   { 38124, 0x00008B83 }, /* GL_VALIDATE_STATUS */
+   { 38143, 0x00001F00 }, /* GL_VENDOR */
+   { 38153, 0x00001F02 }, /* GL_VERSION */
+   { 38164, 0x00008074 }, /* GL_VERTEX_ARRAY */
+   { 38180, 0x000085B5 }, /* GL_VERTEX_ARRAY_BINDING */
+   { 38204, 0x000085B5 }, /* GL_VERTEX_ARRAY_BINDING_APPLE */
+   { 38234, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING */
+   { 38265, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING_ARB */
+   { 38300, 0x0000808E }, /* GL_VERTEX_ARRAY_POINTER */
+   { 38324, 0x0000807A }, /* GL_VERTEX_ARRAY_SIZE */
+   { 38345, 0x0000807C }, /* GL_VERTEX_ARRAY_STRIDE */
+   { 38368, 0x0000807B }, /* GL_VERTEX_ARRAY_TYPE */
+   { 38389, 0x00008650 }, /* GL_VERTEX_ATTRIB_ARRAY0_NV */
+   { 38416, 0x0000865A }, /* GL_VERTEX_ATTRIB_ARRAY10_NV */
+   { 38444, 0x0000865B }, /* GL_VERTEX_ATTRIB_ARRAY11_NV */
+   { 38472, 0x0000865C }, /* GL_VERTEX_ATTRIB_ARRAY12_NV */
+   { 38500, 0x0000865D }, /* GL_VERTEX_ATTRIB_ARRAY13_NV */
+   { 38528, 0x0000865E }, /* GL_VERTEX_ATTRIB_ARRAY14_NV */
+   { 38556, 0x0000865F }, /* GL_VERTEX_ATTRIB_ARRAY15_NV */
+   { 38584, 0x00008651 }, /* GL_VERTEX_ATTRIB_ARRAY1_NV */
+   { 38611, 0x00008652 }, /* GL_VERTEX_ATTRIB_ARRAY2_NV */
+   { 38638, 0x00008653 }, /* GL_VERTEX_ATTRIB_ARRAY3_NV */
+   { 38665, 0x00008654 }, /* GL_VERTEX_ATTRIB_ARRAY4_NV */
+   { 38692, 0x00008655 }, /* GL_VERTEX_ATTRIB_ARRAY5_NV */
+   { 38719, 0x00008656 }, /* GL_VERTEX_ATTRIB_ARRAY6_NV */
+   { 38746, 0x00008657 }, /* GL_VERTEX_ATTRIB_ARRAY7_NV */
+   { 38773, 0x00008658 }, /* GL_VERTEX_ATTRIB_ARRAY8_NV */
+   { 38800, 0x00008659 }, /* GL_VERTEX_ATTRIB_ARRAY9_NV */
+   { 38827, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */
+   { 38865, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB */
+   { 38907, 0x00008622 }, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED */
+   { 38938, 0x00008622 }, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB */
+   { 38973, 0x0000886A }, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED */
+   { 39007, 0x0000886A }, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB */
+   { 39045, 0x00008645 }, /* GL_VERTEX_ATTRIB_ARRAY_POINTER */
+   { 39076, 0x00008645 }, /* GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB */
+   { 39111, 0x00008623 }, /* GL_VERTEX_ATTRIB_ARRAY_SIZE */
+   { 39139, 0x00008623 }, /* GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB */
+   { 39171, 0x00008624 }, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE */
+   { 39201, 0x00008624 }, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB */
+   { 39235, 0x00008625 }, /* GL_VERTEX_ATTRIB_ARRAY_TYPE */
+   { 39263, 0x00008625 }, /* GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB */
+   { 39295, 0x000086A7 }, /* GL_VERTEX_BLEND_ARB */
+   { 39315, 0x00008620 }, /* GL_VERTEX_PROGRAM_ARB */
+   { 39337, 0x0000864A }, /* GL_VERTEX_PROGRAM_BINDING_NV */
+   { 39366, 0x00008620 }, /* GL_VERTEX_PROGRAM_NV */
+   { 39387, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE */
+   { 39416, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_ARB */
+   { 39449, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_NV */
+   { 39481, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE */
+   { 39508, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_ARB */
+   { 39539, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_NV */
+   { 39569, 0x00008B31 }, /* GL_VERTEX_SHADER */
+   { 39586, 0x00008B31 }, /* GL_VERTEX_SHADER_ARB */
+   { 39607, 0x00008621 }, /* GL_VERTEX_STATE_PROGRAM_NV */
+   { 39634, 0x00000BA2 }, /* GL_VIEWPORT */
+   { 39646, 0x00000800 }, /* GL_VIEWPORT_BIT */
+   { 39662, 0x000086AD }, /* GL_WEIGHT_ARRAY_ARB */
+   { 39682, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */
+   { 39713, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB */
+   { 39748, 0x000086AC }, /* GL_WEIGHT_ARRAY_POINTER_ARB */
+   { 39776, 0x000086AB }, /* GL_WEIGHT_ARRAY_SIZE_ARB */
+   { 39801, 0x000086AA }, /* GL_WEIGHT_ARRAY_STRIDE_ARB */
+   { 39828, 0x000086A9 }, /* GL_WEIGHT_ARRAY_TYPE_ARB */
+   { 39853, 0x000086A6 }, /* GL_WEIGHT_SUM_UNITY_ARB */
+   { 39877, 0x000081D4 }, /* GL_WRAP_BORDER_SUN */
+   { 39896, 0x000088B9 }, /* GL_WRITE_ONLY */
+   { 39910, 0x000088B9 }, /* GL_WRITE_ONLY_ARB */
+   { 39928, 0x00001506 }, /* GL_XOR */
+   { 39935, 0x000085B9 }, /* GL_YCBCR_422_APPLE */
+   { 39954, 0x00008757 }, /* GL_YCBCR_MESA */
+   { 39968, 0x00000000 }, /* GL_ZERO */
+   { 39976, 0x00000D16 }, /* GL_ZOOM_X */
+   { 39986, 0x00000D17 }, /* GL_ZOOM_Y */
 };
 
-static const unsigned reduced_enums[1325] =
+static const unsigned reduced_enums[1333] =
 {
-       471, /* GL_FALSE */
-       687, /* GL_LINES */
-       689, /* GL_LINE_LOOP */
-       696, /* GL_LINE_STRIP */
-      1721, /* GL_TRIANGLES */
-      1724, /* GL_TRIANGLE_STRIP */
-      1722, /* GL_TRIANGLE_FAN */
-      1265, /* GL_QUADS */
-      1268, /* GL_QUAD_STRIP */
-      1152, /* GL_POLYGON */
-      1164, /* GL_POLYGON_STIPPLE_BIT */
-      1113, /* GL_PIXEL_MODE_BIT */
-       674, /* GL_LIGHTING_BIT */
-       500, /* GL_FOG_BIT */
+       473, /* GL_FALSE */
+       689, /* GL_LINES */
+       691, /* GL_LINE_LOOP */
+       698, /* GL_LINE_STRIP */
+      1730, /* GL_TRIANGLES */
+      1733, /* GL_TRIANGLE_STRIP */
+      1731, /* GL_TRIANGLE_FAN */
+      1267, /* GL_QUADS */
+      1270, /* GL_QUAD_STRIP */
+      1154, /* GL_POLYGON */
+      1166, /* GL_POLYGON_STIPPLE_BIT */
+      1115, /* GL_PIXEL_MODE_BIT */
+       676, /* GL_LIGHTING_BIT */
+       502, /* GL_FOG_BIT */
          8, /* GL_ACCUM */
-       706, /* GL_LOAD */
-      1320, /* GL_RETURN */
-       986, /* GL_MULT */
+       708, /* GL_LOAD */
+      1322, /* GL_RETURN */
+       988, /* GL_MULT */
         23, /* GL_ADD */
-      1002, /* GL_NEVER */
-       664, /* GL_LESS */
-       461, /* GL_EQUAL */
-       663, /* GL_LEQUAL */
-       586, /* GL_GREATER */
-      1017, /* GL_NOTEQUAL */
-       585, /* GL_GEQUAL */
+      1004, /* GL_NEVER */
+       666, /* GL_LESS */
+       463, /* GL_EQUAL */
+       665, /* GL_LEQUAL */
+       588, /* GL_GREATER */
+      1019, /* GL_NOTEQUAL */
+       587, /* GL_GEQUAL */
         46, /* GL_ALWAYS */
-      1460, /* GL_SRC_COLOR */
-      1046, /* GL_ONE_MINUS_SRC_COLOR */
-      1458, /* GL_SRC_ALPHA */
-      1045, /* GL_ONE_MINUS_SRC_ALPHA */
-       440, /* GL_DST_ALPHA */
-      1043, /* GL_ONE_MINUS_DST_ALPHA */
-       441, /* GL_DST_COLOR */
-      1044, /* GL_ONE_MINUS_DST_COLOR */
-      1459, /* GL_SRC_ALPHA_SATURATE */
-       573, /* GL_FRONT_LEFT */
-       574, /* GL_FRONT_RIGHT */
+      1462, /* GL_SRC_COLOR */
+      1048, /* GL_ONE_MINUS_SRC_COLOR */
+      1460, /* GL_SRC_ALPHA */
+      1047, /* GL_ONE_MINUS_SRC_ALPHA */
+       442, /* GL_DST_ALPHA */
+      1045, /* GL_ONE_MINUS_DST_ALPHA */
+       443, /* GL_DST_COLOR */
+      1046, /* GL_ONE_MINUS_DST_COLOR */
+      1461, /* GL_SRC_ALPHA_SATURATE */
+       575, /* GL_FRONT_LEFT */
+       576, /* GL_FRONT_RIGHT */
         68, /* GL_BACK_LEFT */
         69, /* GL_BACK_RIGHT */
-       570, /* GL_FRONT */
+       572, /* GL_FRONT */
         67, /* GL_BACK */
-       662, /* GL_LEFT */
-      1362, /* GL_RIGHT */
-       571, /* GL_FRONT_AND_BACK */
+       664, /* GL_LEFT */
+      1364, /* GL_RIGHT */
+       573, /* GL_FRONT_AND_BACK */
         62, /* GL_AUX0 */
         63, /* GL_AUX1 */
         64, /* GL_AUX2 */
         65, /* GL_AUX3 */
-       652, /* GL_INVALID_ENUM */
-       656, /* GL_INVALID_VALUE */
-       655, /* GL_INVALID_OPERATION */
-      1465, /* GL_STACK_OVERFLOW */
-      1466, /* GL_STACK_UNDERFLOW */
-      1071, /* GL_OUT_OF_MEMORY */
-       653, /* GL_INVALID_FRAMEBUFFER_OPERATION */
+       654, /* GL_INVALID_ENUM */
+       658, /* GL_INVALID_VALUE */
+       657, /* GL_INVALID_OPERATION */
+      1467, /* GL_STACK_OVERFLOW */
+      1468, /* GL_STACK_UNDERFLOW */
+      1073, /* GL_OUT_OF_MEMORY */
+       655, /* GL_INVALID_FRAMEBUFFER_OPERATION */
          0, /* GL_2D */
          2, /* GL_3D */
          3, /* GL_3D_COLOR */
          4, /* GL_3D_COLOR_TEXTURE */
          6, /* GL_4D_COLOR_TEXTURE */
-      1091, /* GL_PASS_THROUGH_TOKEN */
-      1151, /* GL_POINT_TOKEN */
-       697, /* GL_LINE_TOKEN */
-      1165, /* GL_POLYGON_TOKEN */
+      1093, /* GL_PASS_THROUGH_TOKEN */
+      1153, /* GL_POINT_TOKEN */
+       699, /* GL_LINE_TOKEN */
+      1167, /* GL_POLYGON_TOKEN */
         73, /* GL_BITMAP_TOKEN */
-       439, /* GL_DRAW_PIXEL_TOKEN */
-       297, /* GL_COPY_PIXEL_TOKEN */
-       690, /* GL_LINE_RESET_TOKEN */
-       464, /* GL_EXP */
-       465, /* GL_EXP2 */
-       333, /* GL_CW */
-       122, /* GL_CCW */
-       143, /* GL_COEFF */
-      1068, /* GL_ORDER */
-       377, /* GL_DOMAIN */
-       307, /* GL_CURRENT_COLOR */
-       310, /* GL_CURRENT_INDEX */
-       316, /* GL_CURRENT_NORMAL */
-       329, /* GL_CURRENT_TEXTURE_COORDS */
-       321, /* GL_CURRENT_RASTER_COLOR */
-       323, /* GL_CURRENT_RASTER_INDEX */
-       327, /* GL_CURRENT_RASTER_TEXTURE_COORDS */
-       324, /* GL_CURRENT_RASTER_POSITION */
-       325, /* GL_CURRENT_RASTER_POSITION_VALID */
-       322, /* GL_CURRENT_RASTER_DISTANCE */
-      1144, /* GL_POINT_SMOOTH */
-      1133, /* GL_POINT_SIZE */
-      1143, /* GL_POINT_SIZE_RANGE */
-      1134, /* GL_POINT_SIZE_GRANULARITY */
-       691, /* GL_LINE_SMOOTH */
-       698, /* GL_LINE_WIDTH */
-       700, /* GL_LINE_WIDTH_RANGE */
-       699, /* GL_LINE_WIDTH_GRANULARITY */
-       693, /* GL_LINE_STIPPLE */
-       694, /* GL_LINE_STIPPLE_PATTERN */
-       695, /* GL_LINE_STIPPLE_REPEAT */
-       705, /* GL_LIST_MODE */
-       870, /* GL_MAX_LIST_NESTING */
-       702, /* GL_LIST_BASE */
-       704, /* GL_LIST_INDEX */
-      1154, /* GL_POLYGON_MODE */
-      1161, /* GL_POLYGON_SMOOTH */
-      1163, /* GL_POLYGON_STIPPLE */
-       450, /* GL_EDGE_FLAG */
-       300, /* GL_CULL_FACE */
-       301, /* GL_CULL_FACE_MODE */
-       572, /* GL_FRONT_FACE */
-       673, /* GL_LIGHTING */
-       678, /* GL_LIGHT_MODEL_LOCAL_VIEWER */
-       679, /* GL_LIGHT_MODEL_TWO_SIDE */
-       675, /* GL_LIGHT_MODEL_AMBIENT */
-      1408, /* GL_SHADE_MODEL */
-       190, /* GL_COLOR_MATERIAL_FACE */
-       191, /* GL_COLOR_MATERIAL_PARAMETER */
-       189, /* GL_COLOR_MATERIAL */
-       499, /* GL_FOG */
-       521, /* GL_FOG_INDEX */
-       517, /* GL_FOG_DENSITY */
-       525, /* GL_FOG_START */
-       519, /* GL_FOG_END */
-       522, /* GL_FOG_MODE */
-       501, /* GL_FOG_COLOR */
-       364, /* GL_DEPTH_RANGE */
-       371, /* GL_DEPTH_TEST */
-       374, /* GL_DEPTH_WRITEMASK */
-       352, /* GL_DEPTH_CLEAR_VALUE */
-       363, /* GL_DEPTH_FUNC */
+       441, /* GL_DRAW_PIXEL_TOKEN */
+       299, /* GL_COPY_PIXEL_TOKEN */
+       692, /* GL_LINE_RESET_TOKEN */
+       466, /* GL_EXP */
+       467, /* GL_EXP2 */
+       335, /* GL_CW */
+       124, /* GL_CCW */
+       145, /* GL_COEFF */
+      1070, /* GL_ORDER */
+       379, /* GL_DOMAIN */
+       309, /* GL_CURRENT_COLOR */
+       312, /* GL_CURRENT_INDEX */
+       318, /* GL_CURRENT_NORMAL */
+       331, /* GL_CURRENT_TEXTURE_COORDS */
+       323, /* GL_CURRENT_RASTER_COLOR */
+       325, /* GL_CURRENT_RASTER_INDEX */
+       329, /* GL_CURRENT_RASTER_TEXTURE_COORDS */
+       326, /* GL_CURRENT_RASTER_POSITION */
+       327, /* GL_CURRENT_RASTER_POSITION_VALID */
+       324, /* GL_CURRENT_RASTER_DISTANCE */
+      1146, /* GL_POINT_SMOOTH */
+      1135, /* GL_POINT_SIZE */
+      1145, /* GL_POINT_SIZE_RANGE */
+      1136, /* GL_POINT_SIZE_GRANULARITY */
+       693, /* GL_LINE_SMOOTH */
+       700, /* GL_LINE_WIDTH */
+       702, /* GL_LINE_WIDTH_RANGE */
+       701, /* GL_LINE_WIDTH_GRANULARITY */
+       695, /* GL_LINE_STIPPLE */
+       696, /* GL_LINE_STIPPLE_PATTERN */
+       697, /* GL_LINE_STIPPLE_REPEAT */
+       707, /* GL_LIST_MODE */
+       872, /* GL_MAX_LIST_NESTING */
+       704, /* GL_LIST_BASE */
+       706, /* GL_LIST_INDEX */
+      1156, /* GL_POLYGON_MODE */
+      1163, /* GL_POLYGON_SMOOTH */
+      1165, /* GL_POLYGON_STIPPLE */
+       452, /* GL_EDGE_FLAG */
+       302, /* GL_CULL_FACE */
+       303, /* GL_CULL_FACE_MODE */
+       574, /* GL_FRONT_FACE */
+       675, /* GL_LIGHTING */
+       680, /* GL_LIGHT_MODEL_LOCAL_VIEWER */
+       681, /* GL_LIGHT_MODEL_TWO_SIDE */
+       677, /* GL_LIGHT_MODEL_AMBIENT */
+      1410, /* GL_SHADE_MODEL */
+       192, /* GL_COLOR_MATERIAL_FACE */
+       193, /* GL_COLOR_MATERIAL_PARAMETER */
+       191, /* GL_COLOR_MATERIAL */
+       501, /* GL_FOG */
+       523, /* GL_FOG_INDEX */
+       519, /* GL_FOG_DENSITY */
+       527, /* GL_FOG_START */
+       521, /* GL_FOG_END */
+       524, /* GL_FOG_MODE */
+       503, /* GL_FOG_COLOR */
+       366, /* GL_DEPTH_RANGE */
+       373, /* GL_DEPTH_TEST */
+       376, /* GL_DEPTH_WRITEMASK */
+       354, /* GL_DEPTH_CLEAR_VALUE */
+       365, /* GL_DEPTH_FUNC */
         12, /* GL_ACCUM_CLEAR_VALUE */
-      1501, /* GL_STENCIL_TEST */
-      1489, /* GL_STENCIL_CLEAR_VALUE */
-      1491, /* GL_STENCIL_FUNC */
-      1503, /* GL_STENCIL_VALUE_MASK */
-      1490, /* GL_STENCIL_FAIL */
-      1498, /* GL_STENCIL_PASS_DEPTH_FAIL */
-      1499, /* GL_STENCIL_PASS_DEPTH_PASS */
-      1500, /* GL_STENCIL_REF */
-      1504, /* GL_STENCIL_WRITEMASK */
-       839, /* GL_MATRIX_MODE */
-      1007, /* GL_NORMALIZE */
-      1814, /* GL_VIEWPORT */
-       981, /* GL_MODELVIEW_STACK_DEPTH */
-      1244, /* GL_PROJECTION_STACK_DEPTH */
-      1699, /* GL_TEXTURE_STACK_DEPTH */
-       979, /* GL_MODELVIEW_MATRIX */
-      1243, /* GL_PROJECTION_MATRIX */
-      1684, /* GL_TEXTURE_MATRIX */
+      1503, /* GL_STENCIL_TEST */
+      1491, /* GL_STENCIL_CLEAR_VALUE */
+      1493, /* GL_STENCIL_FUNC */
+      1505, /* GL_STENCIL_VALUE_MASK */
+      1492, /* GL_STENCIL_FAIL */
+      1500, /* GL_STENCIL_PASS_DEPTH_FAIL */
+      1501, /* GL_STENCIL_PASS_DEPTH_PASS */
+      1502, /* GL_STENCIL_REF */
+      1506, /* GL_STENCIL_WRITEMASK */
+       841, /* GL_MATRIX_MODE */
+      1009, /* GL_NORMALIZE */
+      1823, /* GL_VIEWPORT */
+       983, /* GL_MODELVIEW_STACK_DEPTH */
+      1246, /* GL_PROJECTION_STACK_DEPTH */
+      1707, /* GL_TEXTURE_STACK_DEPTH */
+       981, /* GL_MODELVIEW_MATRIX */
+      1245, /* GL_PROJECTION_MATRIX */
+      1690, /* GL_TEXTURE_MATRIX */
         60, /* GL_ATTRIB_STACK_DEPTH */
-       133, /* GL_CLIENT_ATTRIB_STACK_DEPTH */
+       135, /* GL_CLIENT_ATTRIB_STACK_DEPTH */
         43, /* GL_ALPHA_TEST */
         44, /* GL_ALPHA_TEST_FUNC */
         45, /* GL_ALPHA_TEST_REF */
-       376, /* GL_DITHER */
+       378, /* GL_DITHER */
         77, /* GL_BLEND_DST */
         86, /* GL_BLEND_SRC */
         74, /* GL_BLEND */
-       708, /* GL_LOGIC_OP_MODE */
-       626, /* GL_INDEX_LOGIC_OP */
-       188, /* GL_COLOR_LOGIC_OP */
+       710, /* GL_LOGIC_OP_MODE */
+       628, /* GL_INDEX_LOGIC_OP */
+       190, /* GL_COLOR_LOGIC_OP */
         66, /* GL_AUX_BUFFERS */
-       387, /* GL_DRAW_BUFFER */
-      1278, /* GL_READ_BUFFER */
-      1389, /* GL_SCISSOR_BOX */
-      1390, /* GL_SCISSOR_TEST */
-       625, /* GL_INDEX_CLEAR_VALUE */
-       630, /* GL_INDEX_WRITEMASK */
-       185, /* GL_COLOR_CLEAR_VALUE */
-       227, /* GL_COLOR_WRITEMASK */
-       627, /* GL_INDEX_MODE */
-      1355, /* GL_RGBA_MODE */
-       386, /* GL_DOUBLEBUFFER */
-      1505, /* GL_STEREO */
-      1313, /* GL_RENDER_MODE */
-      1092, /* GL_PERSPECTIVE_CORRECTION_HINT */
-      1145, /* GL_POINT_SMOOTH_HINT */
-       692, /* GL_LINE_SMOOTH_HINT */
-      1162, /* GL_POLYGON_SMOOTH_HINT */
-       520, /* GL_FOG_HINT */
-      1665, /* GL_TEXTURE_GEN_S */
-      1666, /* GL_TEXTURE_GEN_T */
-      1664, /* GL_TEXTURE_GEN_R */
-      1663, /* GL_TEXTURE_GEN_Q */
-      1105, /* GL_PIXEL_MAP_I_TO_I */
-      1111, /* GL_PIXEL_MAP_S_TO_S */
-      1107, /* GL_PIXEL_MAP_I_TO_R */
-      1103, /* GL_PIXEL_MAP_I_TO_G */
-      1101, /* GL_PIXEL_MAP_I_TO_B */
-      1099, /* GL_PIXEL_MAP_I_TO_A */
-      1109, /* GL_PIXEL_MAP_R_TO_R */
-      1097, /* GL_PIXEL_MAP_G_TO_G */
-      1095, /* GL_PIXEL_MAP_B_TO_B */
-      1093, /* GL_PIXEL_MAP_A_TO_A */
-      1106, /* GL_PIXEL_MAP_I_TO_I_SIZE */
-      1112, /* GL_PIXEL_MAP_S_TO_S_SIZE */
-      1108, /* GL_PIXEL_MAP_I_TO_R_SIZE */
-      1104, /* GL_PIXEL_MAP_I_TO_G_SIZE */
-      1102, /* GL_PIXEL_MAP_I_TO_B_SIZE */
-      1100, /* GL_PIXEL_MAP_I_TO_A_SIZE */
-      1110, /* GL_PIXEL_MAP_R_TO_R_SIZE */
-      1098, /* GL_PIXEL_MAP_G_TO_G_SIZE */
-      1096, /* GL_PIXEL_MAP_B_TO_B_SIZE */
-      1094, /* GL_PIXEL_MAP_A_TO_A_SIZE */
-      1733, /* GL_UNPACK_SWAP_BYTES */
-      1728, /* GL_UNPACK_LSB_FIRST */
-      1729, /* GL_UNPACK_ROW_LENGTH */
-      1732, /* GL_UNPACK_SKIP_ROWS */
-      1731, /* GL_UNPACK_SKIP_PIXELS */
-      1726, /* GL_UNPACK_ALIGNMENT */
-      1080, /* GL_PACK_SWAP_BYTES */
-      1075, /* GL_PACK_LSB_FIRST */
-      1076, /* GL_PACK_ROW_LENGTH */
-      1079, /* GL_PACK_SKIP_ROWS */
-      1078, /* GL_PACK_SKIP_PIXELS */
-      1072, /* GL_PACK_ALIGNMENT */
-       786, /* GL_MAP_COLOR */
-       791, /* GL_MAP_STENCIL */
-       629, /* GL_INDEX_SHIFT */
-       628, /* GL_INDEX_OFFSET */
-      1291, /* GL_RED_SCALE */
-      1289, /* GL_RED_BIAS */
-      1831, /* GL_ZOOM_X */
-      1832, /* GL_ZOOM_Y */
-       590, /* GL_GREEN_SCALE */
-       588, /* GL_GREEN_BIAS */
+       389, /* GL_DRAW_BUFFER */
+      1280, /* GL_READ_BUFFER */
+      1391, /* GL_SCISSOR_BOX */
+      1392, /* GL_SCISSOR_TEST */
+       627, /* GL_INDEX_CLEAR_VALUE */
+       632, /* GL_INDEX_WRITEMASK */
+       187, /* GL_COLOR_CLEAR_VALUE */
+       229, /* GL_COLOR_WRITEMASK */
+       629, /* GL_INDEX_MODE */
+      1357, /* GL_RGBA_MODE */
+       388, /* GL_DOUBLEBUFFER */
+      1507, /* GL_STEREO */
+      1315, /* GL_RENDER_MODE */
+      1094, /* GL_PERSPECTIVE_CORRECTION_HINT */
+      1147, /* GL_POINT_SMOOTH_HINT */
+       694, /* GL_LINE_SMOOTH_HINT */
+      1164, /* GL_POLYGON_SMOOTH_HINT */
+       522, /* GL_FOG_HINT */
+      1671, /* GL_TEXTURE_GEN_S */
+      1672, /* GL_TEXTURE_GEN_T */
+      1670, /* GL_TEXTURE_GEN_R */
+      1669, /* GL_TEXTURE_GEN_Q */
+      1107, /* GL_PIXEL_MAP_I_TO_I */
+      1113, /* GL_PIXEL_MAP_S_TO_S */
+      1109, /* GL_PIXEL_MAP_I_TO_R */
+      1105, /* GL_PIXEL_MAP_I_TO_G */
+      1103, /* GL_PIXEL_MAP_I_TO_B */
+      1101, /* GL_PIXEL_MAP_I_TO_A */
+      1111, /* GL_PIXEL_MAP_R_TO_R */
+      1099, /* GL_PIXEL_MAP_G_TO_G */
+      1097, /* GL_PIXEL_MAP_B_TO_B */
+      1095, /* GL_PIXEL_MAP_A_TO_A */
+      1108, /* GL_PIXEL_MAP_I_TO_I_SIZE */
+      1114, /* GL_PIXEL_MAP_S_TO_S_SIZE */
+      1110, /* GL_PIXEL_MAP_I_TO_R_SIZE */
+      1106, /* GL_PIXEL_MAP_I_TO_G_SIZE */
+      1104, /* GL_PIXEL_MAP_I_TO_B_SIZE */
+      1102, /* GL_PIXEL_MAP_I_TO_A_SIZE */
+      1112, /* GL_PIXEL_MAP_R_TO_R_SIZE */
+      1100, /* GL_PIXEL_MAP_G_TO_G_SIZE */
+      1098, /* GL_PIXEL_MAP_B_TO_B_SIZE */
+      1096, /* GL_PIXEL_MAP_A_TO_A_SIZE */
+      1742, /* GL_UNPACK_SWAP_BYTES */
+      1737, /* GL_UNPACK_LSB_FIRST */
+      1738, /* GL_UNPACK_ROW_LENGTH */
+      1741, /* GL_UNPACK_SKIP_ROWS */
+      1740, /* GL_UNPACK_SKIP_PIXELS */
+      1735, /* GL_UNPACK_ALIGNMENT */
+      1082, /* GL_PACK_SWAP_BYTES */
+      1077, /* GL_PACK_LSB_FIRST */
+      1078, /* GL_PACK_ROW_LENGTH */
+      1081, /* GL_PACK_SKIP_ROWS */
+      1080, /* GL_PACK_SKIP_PIXELS */
+      1074, /* GL_PACK_ALIGNMENT */
+       788, /* GL_MAP_COLOR */
+       793, /* GL_MAP_STENCIL */
+       631, /* GL_INDEX_SHIFT */
+       630, /* GL_INDEX_OFFSET */
+      1293, /* GL_RED_SCALE */
+      1291, /* GL_RED_BIAS */
+      1840, /* GL_ZOOM_X */
+      1841, /* GL_ZOOM_Y */
+       592, /* GL_GREEN_SCALE */
+       590, /* GL_GREEN_BIAS */
         92, /* GL_BLUE_SCALE */
         90, /* GL_BLUE_BIAS */
         42, /* GL_ALPHA_SCALE */
         40, /* GL_ALPHA_BIAS */
-       365, /* GL_DEPTH_SCALE */
-       346, /* GL_DEPTH_BIAS */
-       865, /* GL_MAX_EVAL_ORDER */
-       869, /* GL_MAX_LIGHTS */
-       848, /* GL_MAX_CLIP_PLANES */
-       914, /* GL_MAX_TEXTURE_SIZE */
-       875, /* GL_MAX_PIXEL_MAP_TABLE */
-       844, /* GL_MAX_ATTRIB_STACK_DEPTH */
-       872, /* GL_MAX_MODELVIEW_STACK_DEPTH */
-       873, /* GL_MAX_NAME_STACK_DEPTH */
-       901, /* GL_MAX_PROJECTION_STACK_DEPTH */
-       915, /* GL_MAX_TEXTURE_STACK_DEPTH */
-       929, /* GL_MAX_VIEWPORT_DIMS */
-       845, /* GL_MAX_CLIENT_ATTRIB_STACK_DEPTH */
-      1512, /* GL_SUBPIXEL_BITS */
-       624, /* GL_INDEX_BITS */
-      1290, /* GL_RED_BITS */
-       589, /* GL_GREEN_BITS */
+       367, /* GL_DEPTH_SCALE */
+       348, /* GL_DEPTH_BIAS */
+       867, /* GL_MAX_EVAL_ORDER */
+       871, /* GL_MAX_LIGHTS */
+       850, /* GL_MAX_CLIP_PLANES */
+       916, /* GL_MAX_TEXTURE_SIZE */
+       877, /* GL_MAX_PIXEL_MAP_TABLE */
+       846, /* GL_MAX_ATTRIB_STACK_DEPTH */
+       874, /* GL_MAX_MODELVIEW_STACK_DEPTH */
+       875, /* GL_MAX_NAME_STACK_DEPTH */
+       903, /* GL_MAX_PROJECTION_STACK_DEPTH */
+       917, /* GL_MAX_TEXTURE_STACK_DEPTH */
+       931, /* GL_MAX_VIEWPORT_DIMS */
+       847, /* GL_MAX_CLIENT_ATTRIB_STACK_DEPTH */
+      1517, /* GL_SUBPIXEL_BITS */
+       626, /* GL_INDEX_BITS */
+      1292, /* GL_RED_BITS */
+       591, /* GL_GREEN_BITS */
         91, /* GL_BLUE_BITS */
         41, /* GL_ALPHA_BITS */
-       347, /* GL_DEPTH_BITS */
-      1487, /* GL_STENCIL_BITS */
+       349, /* GL_DEPTH_BITS */
+      1489, /* GL_STENCIL_BITS */
         14, /* GL_ACCUM_RED_BITS */
         13, /* GL_ACCUM_GREEN_BITS */
         10, /* GL_ACCUM_BLUE_BITS */
          9, /* GL_ACCUM_ALPHA_BITS */
-       995, /* GL_NAME_STACK_DEPTH */
+       997, /* GL_NAME_STACK_DEPTH */
         61, /* GL_AUTO_NORMAL */
-       732, /* GL_MAP1_COLOR_4 */
-       735, /* GL_MAP1_INDEX */
-       736, /* GL_MAP1_NORMAL */
-       737, /* GL_MAP1_TEXTURE_COORD_1 */
-       738, /* GL_MAP1_TEXTURE_COORD_2 */
-       739, /* GL_MAP1_TEXTURE_COORD_3 */
-       740, /* GL_MAP1_TEXTURE_COORD_4 */
-       741, /* GL_MAP1_VERTEX_3 */
-       742, /* GL_MAP1_VERTEX_4 */
-       759, /* GL_MAP2_COLOR_4 */
-       762, /* GL_MAP2_INDEX */
-       763, /* GL_MAP2_NORMAL */
-       764, /* GL_MAP2_TEXTURE_COORD_1 */
-       765, /* GL_MAP2_TEXTURE_COORD_2 */
-       766, /* GL_MAP2_TEXTURE_COORD_3 */
-       767, /* GL_MAP2_TEXTURE_COORD_4 */
-       768, /* GL_MAP2_VERTEX_3 */
-       769, /* GL_MAP2_VERTEX_4 */
-       733, /* GL_MAP1_GRID_DOMAIN */
-       734, /* GL_MAP1_GRID_SEGMENTS */
-       760, /* GL_MAP2_GRID_DOMAIN */
-       761, /* GL_MAP2_GRID_SEGMENTS */
-      1589, /* GL_TEXTURE_1D */
-      1591, /* GL_TEXTURE_2D */
-       474, /* GL_FEEDBACK_BUFFER_POINTER */
-       475, /* GL_FEEDBACK_BUFFER_SIZE */
-       476, /* GL_FEEDBACK_BUFFER_TYPE */
-      1399, /* GL_SELECTION_BUFFER_POINTER */
-      1400, /* GL_SELECTION_BUFFER_SIZE */
-      1703, /* GL_TEXTURE_WIDTH */
-      1670, /* GL_TEXTURE_HEIGHT */
-      1626, /* GL_TEXTURE_COMPONENTS */
-      1610, /* GL_TEXTURE_BORDER_COLOR */
-      1609, /* GL_TEXTURE_BORDER */
-       378, /* GL_DONT_CARE */
-       472, /* GL_FASTEST */
-      1003, /* GL_NICEST */
+       734, /* GL_MAP1_COLOR_4 */
+       737, /* GL_MAP1_INDEX */
+       738, /* GL_MAP1_NORMAL */
+       739, /* GL_MAP1_TEXTURE_COORD_1 */
+       740, /* GL_MAP1_TEXTURE_COORD_2 */
+       741, /* GL_MAP1_TEXTURE_COORD_3 */
+       742, /* GL_MAP1_TEXTURE_COORD_4 */
+       743, /* GL_MAP1_VERTEX_3 */
+       744, /* GL_MAP1_VERTEX_4 */
+       761, /* GL_MAP2_COLOR_4 */
+       764, /* GL_MAP2_INDEX */
+       765, /* GL_MAP2_NORMAL */
+       766, /* GL_MAP2_TEXTURE_COORD_1 */
+       767, /* GL_MAP2_TEXTURE_COORD_2 */
+       768, /* GL_MAP2_TEXTURE_COORD_3 */
+       769, /* GL_MAP2_TEXTURE_COORD_4 */
+       770, /* GL_MAP2_VERTEX_3 */
+       771, /* GL_MAP2_VERTEX_4 */
+       735, /* GL_MAP1_GRID_DOMAIN */
+       736, /* GL_MAP1_GRID_SEGMENTS */
+       762, /* GL_MAP2_GRID_DOMAIN */
+       763, /* GL_MAP2_GRID_SEGMENTS */
+      1594, /* GL_TEXTURE_1D */
+      1596, /* GL_TEXTURE_2D */
+       476, /* GL_FEEDBACK_BUFFER_POINTER */
+       477, /* GL_FEEDBACK_BUFFER_SIZE */
+       478, /* GL_FEEDBACK_BUFFER_TYPE */
+      1401, /* GL_SELECTION_BUFFER_POINTER */
+      1402, /* GL_SELECTION_BUFFER_SIZE */
+      1712, /* GL_TEXTURE_WIDTH */
+      1676, /* GL_TEXTURE_HEIGHT */
+      1631, /* GL_TEXTURE_COMPONENTS */
+      1615, /* GL_TEXTURE_BORDER_COLOR */
+      1614, /* GL_TEXTURE_BORDER */
+       380, /* GL_DONT_CARE */
+       474, /* GL_FASTEST */
+      1005, /* GL_NICEST */
         47, /* GL_AMBIENT */
-       375, /* GL_DIFFUSE */
-      1447, /* GL_SPECULAR */
-      1166, /* GL_POSITION */
-      1450, /* GL_SPOT_DIRECTION */
-      1451, /* GL_SPOT_EXPONENT */
-      1449, /* GL_SPOT_CUTOFF */
-       271, /* GL_CONSTANT_ATTENUATION */
-       682, /* GL_LINEAR_ATTENUATION */
-      1264, /* GL_QUADRATIC_ATTENUATION */
-       241, /* GL_COMPILE */
-       242, /* GL_COMPILE_AND_EXECUTE */
-       117, /* GL_BYTE */
-      1734, /* GL_UNSIGNED_BYTE */
-      1413, /* GL_SHORT */
-      1745, /* GL_UNSIGNED_SHORT */
-       632, /* GL_INT */
-      1737, /* GL_UNSIGNED_INT */
-       480, /* GL_FLOAT */
+       377, /* GL_DIFFUSE */
+      1449, /* GL_SPECULAR */
+      1168, /* GL_POSITION */
+      1452, /* GL_SPOT_DIRECTION */
+      1453, /* GL_SPOT_EXPONENT */
+      1451, /* GL_SPOT_CUTOFF */
+       273, /* GL_CONSTANT_ATTENUATION */
+       684, /* GL_LINEAR_ATTENUATION */
+      1266, /* GL_QUADRATIC_ATTENUATION */
+       243, /* GL_COMPILE */
+       244, /* GL_COMPILE_AND_EXECUTE */
+       119, /* GL_BYTE */
+      1743, /* GL_UNSIGNED_BYTE */
+      1415, /* GL_SHORT */
+      1754, /* GL_UNSIGNED_SHORT */
+       634, /* GL_INT */
+      1746, /* GL_UNSIGNED_INT */
+       482, /* GL_FLOAT */
          1, /* GL_2_BYTES */
          5, /* GL_3_BYTES */
          7, /* GL_4_BYTES */
-       385, /* GL_DOUBLE */
-       129, /* GL_CLEAR */
+       387, /* GL_DOUBLE */
+       131, /* GL_CLEAR */
         49, /* GL_AND */
         51, /* GL_AND_REVERSE */
-       295, /* GL_COPY */
+       297, /* GL_COPY */
         50, /* GL_AND_INVERTED */
-      1005, /* GL_NOOP */
-      1827, /* GL_XOR */
-      1067, /* GL_OR */
-      1006, /* GL_NOR */
-       462, /* GL_EQUIV */
-       659, /* GL_INVERT */
-      1070, /* GL_OR_REVERSE */
-       296, /* GL_COPY_INVERTED */
-      1069, /* GL_OR_INVERTED */
-       996, /* GL_NAND */
-      1404, /* GL_SET */
-       459, /* GL_EMISSION */
-      1412, /* GL_SHININESS */
+      1007, /* GL_NOOP */
+      1836, /* GL_XOR */
+      1069, /* GL_OR */
+      1008, /* GL_NOR */
+       464, /* GL_EQUIV */
+       661, /* GL_INVERT */
+      1072, /* GL_OR_REVERSE */
+       298, /* GL_COPY_INVERTED */
+      1071, /* GL_OR_INVERTED */
+       998, /* GL_NAND */
+      1406, /* GL_SET */
+       461, /* GL_EMISSION */
+      1414, /* GL_SHININESS */
         48, /* GL_AMBIENT_AND_DIFFUSE */
-       187, /* GL_COLOR_INDEXES */
-       946, /* GL_MODELVIEW */
-      1242, /* GL_PROJECTION */
-      1524, /* GL_TEXTURE */
-       144, /* GL_COLOR */
-       342, /* GL_DEPTH */
-      1473, /* GL_STENCIL */
-       186, /* GL_COLOR_INDEX */
-      1492, /* GL_STENCIL_INDEX */
-       353, /* GL_DEPTH_COMPONENT */
-      1286, /* GL_RED */
-       587, /* GL_GREEN */
+       189, /* GL_COLOR_INDEXES */
+       948, /* GL_MODELVIEW */
+      1244, /* GL_PROJECTION */
+      1529, /* GL_TEXTURE */
+       146, /* GL_COLOR */
+       344, /* GL_DEPTH */
+      1475, /* GL_STENCIL */
+       188, /* GL_COLOR_INDEX */
+      1494, /* GL_STENCIL_INDEX */
+       355, /* GL_DEPTH_COMPONENT */
+      1288, /* GL_RED */
+       589, /* GL_GREEN */
         89, /* GL_BLUE */
         31, /* GL_ALPHA */
-      1321, /* GL_RGB */
-      1340, /* GL_RGBA */
-       710, /* GL_LUMINANCE */
-       731, /* GL_LUMINANCE_ALPHA */
+      1323, /* GL_RGB */
+      1342, /* GL_RGBA */
+       712, /* GL_LUMINANCE */
+       733, /* GL_LUMINANCE_ALPHA */
         72, /* GL_BITMAP */
-      1122, /* GL_POINT */
-       680, /* GL_LINE */
-       477, /* GL_FILL */
-      1295, /* GL_RENDER */
-       473, /* GL_FEEDBACK */
-      1398, /* GL_SELECT */
-       479, /* GL_FLAT */
-      1422, /* GL_SMOOTH */
-       660, /* GL_KEEP */
-      1315, /* GL_REPLACE */
-       614, /* GL_INCR */
-       338, /* GL_DECR */
-      1760, /* GL_VENDOR */
-      1312, /* GL_RENDERER */
-      1761, /* GL_VERSION */
-       466, /* GL_EXTENSIONS */
-      1363, /* GL_S */
-      1515, /* GL_T */
-      1275, /* GL_R */
-      1263, /* GL_Q */
-       982, /* GL_MODULATE */
-       337, /* GL_DECAL */
-      1660, /* GL_TEXTURE_ENV_MODE */
-      1659, /* GL_TEXTURE_ENV_COLOR */
-      1658, /* GL_TEXTURE_ENV */
-       467, /* GL_EYE_LINEAR */
-      1029, /* GL_OBJECT_LINEAR */
-      1448, /* GL_SPHERE_MAP */
-      1662, /* GL_TEXTURE_GEN_MODE */
-      1031, /* GL_OBJECT_PLANE */
-       468, /* GL_EYE_PLANE */
-       997, /* GL_NEAREST */
-       681, /* GL_LINEAR */
-      1001, /* GL_NEAREST_MIPMAP_NEAREST */
-       686, /* GL_LINEAR_MIPMAP_NEAREST */
-      1000, /* GL_NEAREST_MIPMAP_LINEAR */
-       685, /* GL_LINEAR_MIPMAP_LINEAR */
-      1683, /* GL_TEXTURE_MAG_FILTER */
-      1691, /* GL_TEXTURE_MIN_FILTER */
-      1705, /* GL_TEXTURE_WRAP_S */
-      1706, /* GL_TEXTURE_WRAP_T */
-       123, /* GL_CLAMP */
-      1314, /* GL_REPEAT */
-      1160, /* GL_POLYGON_OFFSET_UNITS */
-      1159, /* GL_POLYGON_OFFSET_POINT */
-      1158, /* GL_POLYGON_OFFSET_LINE */
-      1276, /* GL_R3_G3_B2 */
-      1757, /* GL_V2F */
-      1758, /* GL_V3F */
-       120, /* GL_C4UB_V2F */
-       121, /* GL_C4UB_V3F */
-       118, /* GL_C3F_V3F */
-       994, /* GL_N3F_V3F */
-       119, /* GL_C4F_N3F_V3F */
-      1520, /* GL_T2F_V3F */
-      1522, /* GL_T4F_V4F */
-      1518, /* GL_T2F_C4UB_V3F */
-      1516, /* GL_T2F_C3F_V3F */
-      1519, /* GL_T2F_N3F_V3F */
-      1517, /* GL_T2F_C4F_N3F_V3F */
-      1521, /* GL_T4F_C4F_N3F_V4F */
-       136, /* GL_CLIP_PLANE0 */
-       137, /* GL_CLIP_PLANE1 */
-       138, /* GL_CLIP_PLANE2 */
-       139, /* GL_CLIP_PLANE3 */
-       140, /* GL_CLIP_PLANE4 */
-       141, /* GL_CLIP_PLANE5 */
-       665, /* GL_LIGHT0 */
-       666, /* GL_LIGHT1 */
-       667, /* GL_LIGHT2 */
-       668, /* GL_LIGHT3 */
-       669, /* GL_LIGHT4 */
-       670, /* GL_LIGHT5 */
-       671, /* GL_LIGHT6 */
-       672, /* GL_LIGHT7 */
-       591, /* GL_HINT_BIT */
-       273, /* GL_CONSTANT_COLOR */
-      1041, /* GL_ONE_MINUS_CONSTANT_COLOR */
-       268, /* GL_CONSTANT_ALPHA */
-      1039, /* GL_ONE_MINUS_CONSTANT_ALPHA */
+      1124, /* GL_POINT */
+       682, /* GL_LINE */
+       479, /* GL_FILL */
+      1297, /* GL_RENDER */
+       475, /* GL_FEEDBACK */
+      1400, /* GL_SELECT */
+       481, /* GL_FLAT */
+      1424, /* GL_SMOOTH */
+       662, /* GL_KEEP */
+      1317, /* GL_REPLACE */
+       616, /* GL_INCR */
+       340, /* GL_DECR */
+      1769, /* GL_VENDOR */
+      1314, /* GL_RENDERER */
+      1770, /* GL_VERSION */
+       468, /* GL_EXTENSIONS */
+      1365, /* GL_S */
+      1520, /* GL_T */
+      1277, /* GL_R */
+      1265, /* GL_Q */
+       984, /* GL_MODULATE */
+       339, /* GL_DECAL */
+      1666, /* GL_TEXTURE_ENV_MODE */
+      1665, /* GL_TEXTURE_ENV_COLOR */
+      1664, /* GL_TEXTURE_ENV */
+       469, /* GL_EYE_LINEAR */
+      1031, /* GL_OBJECT_LINEAR */
+      1450, /* GL_SPHERE_MAP */
+      1668, /* GL_TEXTURE_GEN_MODE */
+      1033, /* GL_OBJECT_PLANE */
+       470, /* GL_EYE_PLANE */
+       999, /* GL_NEAREST */
+       683, /* GL_LINEAR */
+      1003, /* GL_NEAREST_MIPMAP_NEAREST */
+       688, /* GL_LINEAR_MIPMAP_NEAREST */
+      1002, /* GL_NEAREST_MIPMAP_LINEAR */
+       687, /* GL_LINEAR_MIPMAP_LINEAR */
+      1689, /* GL_TEXTURE_MAG_FILTER */
+      1697, /* GL_TEXTURE_MIN_FILTER */
+      1714, /* GL_TEXTURE_WRAP_S */
+      1715, /* GL_TEXTURE_WRAP_T */
+       125, /* GL_CLAMP */
+      1316, /* GL_REPEAT */
+      1162, /* GL_POLYGON_OFFSET_UNITS */
+      1161, /* GL_POLYGON_OFFSET_POINT */
+      1160, /* GL_POLYGON_OFFSET_LINE */
+      1278, /* GL_R3_G3_B2 */
+      1766, /* GL_V2F */
+      1767, /* GL_V3F */
+       122, /* GL_C4UB_V2F */
+       123, /* GL_C4UB_V3F */
+       120, /* GL_C3F_V3F */
+       996, /* GL_N3F_V3F */
+       121, /* GL_C4F_N3F_V3F */
+      1525, /* GL_T2F_V3F */
+      1527, /* GL_T4F_V4F */
+      1523, /* GL_T2F_C4UB_V3F */
+      1521, /* GL_T2F_C3F_V3F */
+      1524, /* GL_T2F_N3F_V3F */
+      1522, /* GL_T2F_C4F_N3F_V3F */
+      1526, /* GL_T4F_C4F_N3F_V4F */
+       138, /* GL_CLIP_PLANE0 */
+       139, /* GL_CLIP_PLANE1 */
+       140, /* GL_CLIP_PLANE2 */
+       141, /* GL_CLIP_PLANE3 */
+       142, /* GL_CLIP_PLANE4 */
+       143, /* GL_CLIP_PLANE5 */
+       667, /* GL_LIGHT0 */
+       668, /* GL_LIGHT1 */
+       669, /* GL_LIGHT2 */
+       670, /* GL_LIGHT3 */
+       671, /* GL_LIGHT4 */
+       672, /* GL_LIGHT5 */
+       673, /* GL_LIGHT6 */
+       674, /* GL_LIGHT7 */
+       593, /* GL_HINT_BIT */
+       275, /* GL_CONSTANT_COLOR */
+      1043, /* GL_ONE_MINUS_CONSTANT_COLOR */
+       270, /* GL_CONSTANT_ALPHA */
+      1041, /* GL_ONE_MINUS_CONSTANT_ALPHA */
         75, /* GL_BLEND_COLOR */
-       575, /* GL_FUNC_ADD */
-       930, /* GL_MIN */
-       841, /* GL_MAX */
+       577, /* GL_FUNC_ADD */
+       932, /* GL_MIN */
+       843, /* GL_MAX */
         80, /* GL_BLEND_EQUATION */
-       579, /* GL_FUNC_SUBTRACT */
-       577, /* GL_FUNC_REVERSE_SUBTRACT */
-       276, /* GL_CONVOLUTION_1D */
-       277, /* GL_CONVOLUTION_2D */
-      1401, /* GL_SEPARABLE_2D */
-       280, /* GL_CONVOLUTION_BORDER_MODE */
-       284, /* GL_CONVOLUTION_FILTER_SCALE */
-       282, /* GL_CONVOLUTION_FILTER_BIAS */
-      1287, /* GL_REDUCE */
-       286, /* GL_CONVOLUTION_FORMAT */
-       290, /* GL_CONVOLUTION_WIDTH */
-       288, /* GL_CONVOLUTION_HEIGHT */
-       856, /* GL_MAX_CONVOLUTION_WIDTH */
-       854, /* GL_MAX_CONVOLUTION_HEIGHT */
-      1199, /* GL_POST_CONVOLUTION_RED_SCALE */
-      1195, /* GL_POST_CONVOLUTION_GREEN_SCALE */
-      1190, /* GL_POST_CONVOLUTION_BLUE_SCALE */
-      1186, /* GL_POST_CONVOLUTION_ALPHA_SCALE */
-      1197, /* GL_POST_CONVOLUTION_RED_BIAS */
-      1193, /* GL_POST_CONVOLUTION_GREEN_BIAS */
-      1188, /* GL_POST_CONVOLUTION_BLUE_BIAS */
-      1184, /* GL_POST_CONVOLUTION_ALPHA_BIAS */
-       592, /* GL_HISTOGRAM */
-      1247, /* GL_PROXY_HISTOGRAM */
-       608, /* GL_HISTOGRAM_WIDTH */
-       598, /* GL_HISTOGRAM_FORMAT */
-       604, /* GL_HISTOGRAM_RED_SIZE */
-       600, /* GL_HISTOGRAM_GREEN_SIZE */
-       595, /* GL_HISTOGRAM_BLUE_SIZE */
-       593, /* GL_HISTOGRAM_ALPHA_SIZE */
-       602, /* GL_HISTOGRAM_LUMINANCE_SIZE */
-       606, /* GL_HISTOGRAM_SINK */
-       931, /* GL_MINMAX */
-       933, /* GL_MINMAX_FORMAT */
-       935, /* GL_MINMAX_SINK */
-      1523, /* GL_TABLE_TOO_LARGE_EXT */
-      1736, /* GL_UNSIGNED_BYTE_3_3_2 */
-      1747, /* GL_UNSIGNED_SHORT_4_4_4_4 */
-      1749, /* GL_UNSIGNED_SHORT_5_5_5_1 */
-      1742, /* GL_UNSIGNED_INT_8_8_8_8 */
-      1738, /* GL_UNSIGNED_INT_10_10_10_2 */
-      1157, /* GL_POLYGON_OFFSET_FILL */
-      1156, /* GL_POLYGON_OFFSET_FACTOR */
-      1155, /* GL_POLYGON_OFFSET_BIAS */
-      1318, /* GL_RESCALE_NORMAL */
+       581, /* GL_FUNC_SUBTRACT */
+       579, /* GL_FUNC_REVERSE_SUBTRACT */
+       278, /* GL_CONVOLUTION_1D */
+       279, /* GL_CONVOLUTION_2D */
+      1403, /* GL_SEPARABLE_2D */
+       282, /* GL_CONVOLUTION_BORDER_MODE */
+       286, /* GL_CONVOLUTION_FILTER_SCALE */
+       284, /* GL_CONVOLUTION_FILTER_BIAS */
+      1289, /* GL_REDUCE */
+       288, /* GL_CONVOLUTION_FORMAT */
+       292, /* GL_CONVOLUTION_WIDTH */
+       290, /* GL_CONVOLUTION_HEIGHT */
+       858, /* GL_MAX_CONVOLUTION_WIDTH */
+       856, /* GL_MAX_CONVOLUTION_HEIGHT */
+      1201, /* GL_POST_CONVOLUTION_RED_SCALE */
+      1197, /* GL_POST_CONVOLUTION_GREEN_SCALE */
+      1192, /* GL_POST_CONVOLUTION_BLUE_SCALE */
+      1188, /* GL_POST_CONVOLUTION_ALPHA_SCALE */
+      1199, /* GL_POST_CONVOLUTION_RED_BIAS */
+      1195, /* GL_POST_CONVOLUTION_GREEN_BIAS */
+      1190, /* GL_POST_CONVOLUTION_BLUE_BIAS */
+      1186, /* GL_POST_CONVOLUTION_ALPHA_BIAS */
+       594, /* GL_HISTOGRAM */
+      1249, /* GL_PROXY_HISTOGRAM */
+       610, /* GL_HISTOGRAM_WIDTH */
+       600, /* GL_HISTOGRAM_FORMAT */
+       606, /* GL_HISTOGRAM_RED_SIZE */
+       602, /* GL_HISTOGRAM_GREEN_SIZE */
+       597, /* GL_HISTOGRAM_BLUE_SIZE */
+       595, /* GL_HISTOGRAM_ALPHA_SIZE */
+       604, /* GL_HISTOGRAM_LUMINANCE_SIZE */
+       608, /* GL_HISTOGRAM_SINK */
+       933, /* GL_MINMAX */
+       935, /* GL_MINMAX_FORMAT */
+       937, /* GL_MINMAX_SINK */
+      1528, /* GL_TABLE_TOO_LARGE_EXT */
+      1745, /* GL_UNSIGNED_BYTE_3_3_2 */
+      1756, /* GL_UNSIGNED_SHORT_4_4_4_4 */
+      1758, /* GL_UNSIGNED_SHORT_5_5_5_1 */
+      1751, /* GL_UNSIGNED_INT_8_8_8_8 */
+      1747, /* GL_UNSIGNED_INT_10_10_10_2 */
+      1159, /* GL_POLYGON_OFFSET_FILL */
+      1158, /* GL_POLYGON_OFFSET_FACTOR */
+      1157, /* GL_POLYGON_OFFSET_BIAS */
+      1320, /* GL_RESCALE_NORMAL */
         36, /* GL_ALPHA4 */
         38, /* GL_ALPHA8 */
         32, /* GL_ALPHA12 */
         34, /* GL_ALPHA16 */
-       721, /* GL_LUMINANCE4 */
-       727, /* GL_LUMINANCE8 */
-       711, /* GL_LUMINANCE12 */
-       717, /* GL_LUMINANCE16 */
-       722, /* GL_LUMINANCE4_ALPHA4 */
-       725, /* GL_LUMINANCE6_ALPHA2 */
-       728, /* GL_LUMINANCE8_ALPHA8 */
-       714, /* GL_LUMINANCE12_ALPHA4 */
-       712, /* GL_LUMINANCE12_ALPHA12 */
-       718, /* GL_LUMINANCE16_ALPHA16 */
-       633, /* GL_INTENSITY */
-       638, /* GL_INTENSITY4 */
-       640, /* GL_INTENSITY8 */
-       634, /* GL_INTENSITY12 */
-       636, /* GL_INTENSITY16 */
-      1330, /* GL_RGB2_EXT */
-      1331, /* GL_RGB4 */
-      1334, /* GL_RGB5 */
-      1338, /* GL_RGB8 */
-      1322, /* GL_RGB10 */
-      1326, /* GL_RGB12 */
-      1328, /* GL_RGB16 */
-      1345, /* GL_RGBA2 */
-      1347, /* GL_RGBA4 */
-      1335, /* GL_RGB5_A1 */
-      1351, /* GL_RGBA8 */
-      1323, /* GL_RGB10_A2 */
-      1341, /* GL_RGBA12 */
-      1343, /* GL_RGBA16 */
-      1696, /* GL_TEXTURE_RED_SIZE */
-      1668, /* GL_TEXTURE_GREEN_SIZE */
-      1607, /* GL_TEXTURE_BLUE_SIZE */
-      1594, /* GL_TEXTURE_ALPHA_SIZE */
-      1681, /* GL_TEXTURE_LUMINANCE_SIZE */
-      1672, /* GL_TEXTURE_INTENSITY_SIZE */
-      1316, /* GL_REPLACE_EXT */
-      1251, /* GL_PROXY_TEXTURE_1D */
-      1254, /* GL_PROXY_TEXTURE_2D */
-      1701, /* GL_TEXTURE_TOO_LARGE_EXT */
-      1693, /* GL_TEXTURE_PRIORITY */
-      1698, /* GL_TEXTURE_RESIDENT */
-      1597, /* GL_TEXTURE_BINDING_1D */
-      1599, /* GL_TEXTURE_BINDING_2D */
-      1601, /* GL_TEXTURE_BINDING_3D */
-      1077, /* GL_PACK_SKIP_IMAGES */
-      1073, /* GL_PACK_IMAGE_HEIGHT */
-      1730, /* GL_UNPACK_SKIP_IMAGES */
-      1727, /* GL_UNPACK_IMAGE_HEIGHT */
-      1593, /* GL_TEXTURE_3D */
-      1257, /* GL_PROXY_TEXTURE_3D */
-      1655, /* GL_TEXTURE_DEPTH */
-      1704, /* GL_TEXTURE_WRAP_R */
-       842, /* GL_MAX_3D_TEXTURE_SIZE */
-      1762, /* GL_VERTEX_ARRAY */
-      1008, /* GL_NORMAL_ARRAY */
-       145, /* GL_COLOR_ARRAY */
-       618, /* GL_INDEX_ARRAY */
-      1634, /* GL_TEXTURE_COORD_ARRAY */
-       451, /* GL_EDGE_FLAG_ARRAY */
-      1768, /* GL_VERTEX_ARRAY_SIZE */
-      1770, /* GL_VERTEX_ARRAY_TYPE */
-      1769, /* GL_VERTEX_ARRAY_STRIDE */
-      1013, /* GL_NORMAL_ARRAY_TYPE */
-      1012, /* GL_NORMAL_ARRAY_STRIDE */
-       149, /* GL_COLOR_ARRAY_SIZE */
-       151, /* GL_COLOR_ARRAY_TYPE */
-       150, /* GL_COLOR_ARRAY_STRIDE */
-       623, /* GL_INDEX_ARRAY_TYPE */
-       622, /* GL_INDEX_ARRAY_STRIDE */
-      1638, /* GL_TEXTURE_COORD_ARRAY_SIZE */
-      1640, /* GL_TEXTURE_COORD_ARRAY_TYPE */
-      1639, /* GL_TEXTURE_COORD_ARRAY_STRIDE */
-       455, /* GL_EDGE_FLAG_ARRAY_STRIDE */
-      1767, /* GL_VERTEX_ARRAY_POINTER */
-      1011, /* GL_NORMAL_ARRAY_POINTER */
-       148, /* GL_COLOR_ARRAY_POINTER */
-       621, /* GL_INDEX_ARRAY_POINTER */
-      1637, /* GL_TEXTURE_COORD_ARRAY_POINTER */
-       454, /* GL_EDGE_FLAG_ARRAY_POINTER */
-       987, /* GL_MULTISAMPLE */
-      1375, /* GL_SAMPLE_ALPHA_TO_COVERAGE */
-      1377, /* GL_SAMPLE_ALPHA_TO_ONE */
-      1382, /* GL_SAMPLE_COVERAGE */
-      1379, /* GL_SAMPLE_BUFFERS */
-      1370, /* GL_SAMPLES */
-      1386, /* GL_SAMPLE_COVERAGE_VALUE */
-      1384, /* GL_SAMPLE_COVERAGE_INVERT */
-       192, /* GL_COLOR_MATRIX */
-       194, /* GL_COLOR_MATRIX_STACK_DEPTH */
-       850, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH */
-      1182, /* GL_POST_COLOR_MATRIX_RED_SCALE */
-      1178, /* GL_POST_COLOR_MATRIX_GREEN_SCALE */
-      1173, /* GL_POST_COLOR_MATRIX_BLUE_SCALE */
-      1169, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE */
-      1180, /* GL_POST_COLOR_MATRIX_RED_BIAS */
-      1176, /* GL_POST_COLOR_MATRIX_GREEN_BIAS */
-      1171, /* GL_POST_COLOR_MATRIX_BLUE_BIAS */
-      1167, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS */
-      1617, /* GL_TEXTURE_COLOR_TABLE_SGI */
-      1258, /* GL_PROXY_TEXTURE_COLOR_TABLE_SGI */
-      1619, /* GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
+       723, /* GL_LUMINANCE4 */
+       729, /* GL_LUMINANCE8 */
+       713, /* GL_LUMINANCE12 */
+       719, /* GL_LUMINANCE16 */
+       724, /* GL_LUMINANCE4_ALPHA4 */
+       727, /* GL_LUMINANCE6_ALPHA2 */
+       730, /* GL_LUMINANCE8_ALPHA8 */
+       716, /* GL_LUMINANCE12_ALPHA4 */
+       714, /* GL_LUMINANCE12_ALPHA12 */
+       720, /* GL_LUMINANCE16_ALPHA16 */
+       635, /* GL_INTENSITY */
+       640, /* GL_INTENSITY4 */
+       642, /* GL_INTENSITY8 */
+       636, /* GL_INTENSITY12 */
+       638, /* GL_INTENSITY16 */
+      1332, /* GL_RGB2_EXT */
+      1333, /* GL_RGB4 */
+      1336, /* GL_RGB5 */
+      1340, /* GL_RGB8 */
+      1324, /* GL_RGB10 */
+      1328, /* GL_RGB12 */
+      1330, /* GL_RGB16 */
+      1347, /* GL_RGBA2 */
+      1349, /* GL_RGBA4 */
+      1337, /* GL_RGB5_A1 */
+      1353, /* GL_RGBA8 */
+      1325, /* GL_RGB10_A2 */
+      1343, /* GL_RGBA12 */
+      1345, /* GL_RGBA16 */
+      1704, /* GL_TEXTURE_RED_SIZE */
+      1674, /* GL_TEXTURE_GREEN_SIZE */
+      1612, /* GL_TEXTURE_BLUE_SIZE */
+      1599, /* GL_TEXTURE_ALPHA_SIZE */
+      1687, /* GL_TEXTURE_LUMINANCE_SIZE */
+      1678, /* GL_TEXTURE_INTENSITY_SIZE */
+      1318, /* GL_REPLACE_EXT */
+      1253, /* GL_PROXY_TEXTURE_1D */
+      1256, /* GL_PROXY_TEXTURE_2D */
+      1710, /* GL_TEXTURE_TOO_LARGE_EXT */
+      1699, /* GL_TEXTURE_PRIORITY */
+      1706, /* GL_TEXTURE_RESIDENT */
+      1602, /* GL_TEXTURE_BINDING_1D */
+      1604, /* GL_TEXTURE_BINDING_2D */
+      1606, /* GL_TEXTURE_BINDING_3D */
+      1079, /* GL_PACK_SKIP_IMAGES */
+      1075, /* GL_PACK_IMAGE_HEIGHT */
+      1739, /* GL_UNPACK_SKIP_IMAGES */
+      1736, /* GL_UNPACK_IMAGE_HEIGHT */
+      1598, /* GL_TEXTURE_3D */
+      1259, /* GL_PROXY_TEXTURE_3D */
+      1661, /* GL_TEXTURE_DEPTH */
+      1713, /* GL_TEXTURE_WRAP_R */
+       844, /* GL_MAX_3D_TEXTURE_SIZE */
+      1771, /* GL_VERTEX_ARRAY */
+      1010, /* GL_NORMAL_ARRAY */
+       147, /* GL_COLOR_ARRAY */
+       620, /* GL_INDEX_ARRAY */
+      1639, /* GL_TEXTURE_COORD_ARRAY */
+       453, /* GL_EDGE_FLAG_ARRAY */
+      1777, /* GL_VERTEX_ARRAY_SIZE */
+      1779, /* GL_VERTEX_ARRAY_TYPE */
+      1778, /* GL_VERTEX_ARRAY_STRIDE */
+      1015, /* GL_NORMAL_ARRAY_TYPE */
+      1014, /* GL_NORMAL_ARRAY_STRIDE */
+       151, /* GL_COLOR_ARRAY_SIZE */
+       153, /* GL_COLOR_ARRAY_TYPE */
+       152, /* GL_COLOR_ARRAY_STRIDE */
+       625, /* GL_INDEX_ARRAY_TYPE */
+       624, /* GL_INDEX_ARRAY_STRIDE */
+      1643, /* GL_TEXTURE_COORD_ARRAY_SIZE */
+      1645, /* GL_TEXTURE_COORD_ARRAY_TYPE */
+      1644, /* GL_TEXTURE_COORD_ARRAY_STRIDE */
+       457, /* GL_EDGE_FLAG_ARRAY_STRIDE */
+      1776, /* GL_VERTEX_ARRAY_POINTER */
+      1013, /* GL_NORMAL_ARRAY_POINTER */
+       150, /* GL_COLOR_ARRAY_POINTER */
+       623, /* GL_INDEX_ARRAY_POINTER */
+      1642, /* GL_TEXTURE_COORD_ARRAY_POINTER */
+       456, /* GL_EDGE_FLAG_ARRAY_POINTER */
+       989, /* GL_MULTISAMPLE */
+      1377, /* GL_SAMPLE_ALPHA_TO_COVERAGE */
+      1379, /* GL_SAMPLE_ALPHA_TO_ONE */
+      1384, /* GL_SAMPLE_COVERAGE */
+      1381, /* GL_SAMPLE_BUFFERS */
+      1372, /* GL_SAMPLES */
+      1388, /* GL_SAMPLE_COVERAGE_VALUE */
+      1386, /* GL_SAMPLE_COVERAGE_INVERT */
+       194, /* GL_COLOR_MATRIX */
+       196, /* GL_COLOR_MATRIX_STACK_DEPTH */
+       852, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH */
+      1184, /* GL_POST_COLOR_MATRIX_RED_SCALE */
+      1180, /* GL_POST_COLOR_MATRIX_GREEN_SCALE */
+      1175, /* GL_POST_COLOR_MATRIX_BLUE_SCALE */
+      1171, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE */
+      1182, /* GL_POST_COLOR_MATRIX_RED_BIAS */
+      1178, /* GL_POST_COLOR_MATRIX_GREEN_BIAS */
+      1173, /* GL_POST_COLOR_MATRIX_BLUE_BIAS */
+      1169, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS */
+      1622, /* GL_TEXTURE_COLOR_TABLE_SGI */
+      1260, /* GL_PROXY_TEXTURE_COLOR_TABLE_SGI */
+      1624, /* GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
         79, /* GL_BLEND_DST_RGB */
         88, /* GL_BLEND_SRC_RGB */
         78, /* GL_BLEND_DST_ALPHA */
         87, /* GL_BLEND_SRC_ALPHA */
-       198, /* GL_COLOR_TABLE */
-      1192, /* GL_POST_CONVOLUTION_COLOR_TABLE */
-      1175, /* GL_POST_COLOR_MATRIX_COLOR_TABLE */
-      1246, /* GL_PROXY_COLOR_TABLE */
-      1250, /* GL_PROXY_POST_CONVOLUTION_COLOR_TABLE */
-      1249, /* GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE */
-       222, /* GL_COLOR_TABLE_SCALE */
-       202, /* GL_COLOR_TABLE_BIAS */
-       207, /* GL_COLOR_TABLE_FORMAT */
-       224, /* GL_COLOR_TABLE_WIDTH */
-       219, /* GL_COLOR_TABLE_RED_SIZE */
-       210, /* GL_COLOR_TABLE_GREEN_SIZE */
-       204, /* GL_COLOR_TABLE_BLUE_SIZE */
-       199, /* GL_COLOR_TABLE_ALPHA_SIZE */
-       216, /* GL_COLOR_TABLE_LUMINANCE_SIZE */
-       213, /* GL_COLOR_TABLE_INTENSITY_SIZE */
+       200, /* GL_COLOR_TABLE */
+      1194, /* GL_POST_CONVOLUTION_COLOR_TABLE */
+      1177, /* GL_POST_COLOR_MATRIX_COLOR_TABLE */
+      1248, /* GL_PROXY_COLOR_TABLE */
+      1252, /* GL_PROXY_POST_CONVOLUTION_COLOR_TABLE */
+      1251, /* GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE */
+       224, /* GL_COLOR_TABLE_SCALE */
+       204, /* GL_COLOR_TABLE_BIAS */
+       209, /* GL_COLOR_TABLE_FORMAT */
+       226, /* GL_COLOR_TABLE_WIDTH */
+       221, /* GL_COLOR_TABLE_RED_SIZE */
+       212, /* GL_COLOR_TABLE_GREEN_SIZE */
+       206, /* GL_COLOR_TABLE_BLUE_SIZE */
+       201, /* GL_COLOR_TABLE_ALPHA_SIZE */
+       218, /* GL_COLOR_TABLE_LUMINANCE_SIZE */
+       215, /* GL_COLOR_TABLE_INTENSITY_SIZE */
         70, /* GL_BGR */
         71, /* GL_BGRA */
-       864, /* GL_MAX_ELEMENTS_VERTICES */
-       863, /* GL_MAX_ELEMENTS_INDICES */
-      1671, /* GL_TEXTURE_INDEX_SIZE_EXT */
-       142, /* GL_CLIP_VOLUME_CLIPPING_HINT_EXT */
-      1139, /* GL_POINT_SIZE_MIN */
-      1135, /* GL_POINT_SIZE_MAX */
-      1129, /* GL_POINT_FADE_THRESHOLD_SIZE */
-      1125, /* GL_POINT_DISTANCE_ATTENUATION */
-       124, /* GL_CLAMP_TO_BORDER */
-       127, /* GL_CLAMP_TO_EDGE */
-      1692, /* GL_TEXTURE_MIN_LOD */
-      1690, /* GL_TEXTURE_MAX_LOD */
-      1596, /* GL_TEXTURE_BASE_LEVEL */
-      1689, /* GL_TEXTURE_MAX_LEVEL */
-       611, /* GL_IGNORE_BORDER_HP */
-       272, /* GL_CONSTANT_BORDER_HP */
-      1317, /* GL_REPLICATE_BORDER_HP */
-       278, /* GL_CONVOLUTION_BORDER_COLOR */
-      1036, /* GL_OCCLUSION_TEST_HP */
-      1037, /* GL_OCCLUSION_TEST_RESULT_HP */
-       683, /* GL_LINEAR_CLIPMAP_LINEAR_SGIX */
-      1611, /* GL_TEXTURE_CLIPMAP_CENTER_SGIX */
-      1613, /* GL_TEXTURE_CLIPMAP_FRAME_SGIX */
-      1615, /* GL_TEXTURE_CLIPMAP_OFFSET_SGIX */
-      1616, /* GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX */
-      1614, /* GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX */
-      1612, /* GL_TEXTURE_CLIPMAP_DEPTH_SGIX */
-       846, /* GL_MAX_CLIPMAP_DEPTH_SGIX */
-       847, /* GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX */
-      1202, /* GL_POST_TEXTURE_FILTER_BIAS_SGIX */
-      1204, /* GL_POST_TEXTURE_FILTER_SCALE_SGIX */
-      1201, /* GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX */
-      1203, /* GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX */
-      1679, /* GL_TEXTURE_LOD_BIAS_S_SGIX */
-      1680, /* GL_TEXTURE_LOD_BIAS_T_SGIX */
-      1678, /* GL_TEXTURE_LOD_BIAS_R_SGIX */
-       581, /* GL_GENERATE_MIPMAP */
-       582, /* GL_GENERATE_MIPMAP_HINT */
-       523, /* GL_FOG_OFFSET_SGIX */
-       524, /* GL_FOG_OFFSET_VALUE_SGIX */
-      1625, /* GL_TEXTURE_COMPARE_SGIX */
-      1624, /* GL_TEXTURE_COMPARE_OPERATOR_SGIX */
-      1675, /* GL_TEXTURE_LEQUAL_R_SGIX */
-      1667, /* GL_TEXTURE_GEQUAL_R_SGIX */
-       354, /* GL_DEPTH_COMPONENT16 */
-       357, /* GL_DEPTH_COMPONENT24 */
-       360, /* GL_DEPTH_COMPONENT32 */
-       302, /* GL_CULL_VERTEX_EXT */
-       304, /* GL_CULL_VERTEX_OBJECT_POSITION_EXT */
-       303, /* GL_CULL_VERTEX_EYE_POSITION_EXT */
-      1824, /* GL_WRAP_BORDER_SUN */
-      1618, /* GL_TEXTURE_COLOR_WRITEMASK_SGIS */
-       676, /* GL_LIGHT_MODEL_COLOR_CONTROL */
-      1415, /* GL_SINGLE_COLOR */
-      1402, /* GL_SEPARATE_SPECULAR_COLOR */
-      1411, /* GL_SHARED_TEXTURE_PALETTE_EXT */
-       534, /* GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING */
-       535, /* GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE */
-       542, /* GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE */
-       537, /* GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE */
-       533, /* GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE */
-       532, /* GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE */
-       536, /* GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE */
-       543, /* GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE */
-       554, /* GL_FRAMEBUFFER_DEFAULT */
-       567, /* GL_FRAMEBUFFER_UNDEFINED */
-       367, /* GL_DEPTH_STENCIL_ATTACHMENT */
-       617, /* GL_INDEX */
-      1735, /* GL_UNSIGNED_BYTE_2_3_3_REV */
-      1750, /* GL_UNSIGNED_SHORT_5_6_5 */
-      1751, /* GL_UNSIGNED_SHORT_5_6_5_REV */
-      1748, /* GL_UNSIGNED_SHORT_4_4_4_4_REV */
-      1746, /* GL_UNSIGNED_SHORT_1_5_5_5_REV */
-      1743, /* GL_UNSIGNED_INT_8_8_8_8_REV */
-      1741, /* GL_UNSIGNED_INT_2_10_10_10_REV */
-      1687, /* GL_TEXTURE_MAX_CLAMP_S_SGIX */
-      1688, /* GL_TEXTURE_MAX_CLAMP_T_SGIX */
-      1686, /* GL_TEXTURE_MAX_CLAMP_R_SGIX */
-       938, /* GL_MIRRORED_REPEAT */
-      1358, /* GL_RGB_S3TC */
-      1333, /* GL_RGB4_S3TC */
-      1356, /* GL_RGBA_S3TC */
-      1350, /* GL_RGBA4_S3TC */
-      1354, /* GL_RGBA_DXT5_S3TC */
-      1348, /* GL_RGBA4_DXT5_S3TC */
-       261, /* GL_COMPRESSED_RGB_S3TC_DXT1_EXT */
-       256, /* GL_COMPRESSED_RGBA_S3TC_DXT1_EXT */
-       257, /* GL_COMPRESSED_RGBA_S3TC_DXT3_EXT */
-       258, /* GL_COMPRESSED_RGBA_S3TC_DXT5_EXT */
-       999, /* GL_NEAREST_CLIPMAP_NEAREST_SGIX */
-       998, /* GL_NEAREST_CLIPMAP_LINEAR_SGIX */
-       684, /* GL_LINEAR_CLIPMAP_NEAREST_SGIX */
-       510, /* GL_FOG_COORDINATE_SOURCE */
-       502, /* GL_FOG_COORD */
-       526, /* GL_FRAGMENT_DEPTH */
-       308, /* GL_CURRENT_FOG_COORD */
-       509, /* GL_FOG_COORDINATE_ARRAY_TYPE */
-       508, /* GL_FOG_COORDINATE_ARRAY_STRIDE */
-       507, /* GL_FOG_COORDINATE_ARRAY_POINTER */
-       504, /* GL_FOG_COORDINATE_ARRAY */
-       196, /* GL_COLOR_SUM */
-       328, /* GL_CURRENT_SECONDARY_COLOR */
-      1395, /* GL_SECONDARY_COLOR_ARRAY_SIZE */
-      1397, /* GL_SECONDARY_COLOR_ARRAY_TYPE */
-      1396, /* GL_SECONDARY_COLOR_ARRAY_STRIDE */
-      1394, /* GL_SECONDARY_COLOR_ARRAY_POINTER */
-      1391, /* GL_SECONDARY_COLOR_ARRAY */
-       326, /* GL_CURRENT_RASTER_SECONDARY_COLOR */
+       866, /* GL_MAX_ELEMENTS_VERTICES */
+       865, /* GL_MAX_ELEMENTS_INDICES */
+      1677, /* GL_TEXTURE_INDEX_SIZE_EXT */
+       144, /* GL_CLIP_VOLUME_CLIPPING_HINT_EXT */
+      1141, /* GL_POINT_SIZE_MIN */
+      1137, /* GL_POINT_SIZE_MAX */
+      1131, /* GL_POINT_FADE_THRESHOLD_SIZE */
+      1127, /* GL_POINT_DISTANCE_ATTENUATION */
+       126, /* GL_CLAMP_TO_BORDER */
+       129, /* GL_CLAMP_TO_EDGE */
+      1698, /* GL_TEXTURE_MIN_LOD */
+      1696, /* GL_TEXTURE_MAX_LOD */
+      1601, /* GL_TEXTURE_BASE_LEVEL */
+      1695, /* GL_TEXTURE_MAX_LEVEL */
+       613, /* GL_IGNORE_BORDER_HP */
+       274, /* GL_CONSTANT_BORDER_HP */
+      1319, /* GL_REPLICATE_BORDER_HP */
+       280, /* GL_CONVOLUTION_BORDER_COLOR */
+      1038, /* GL_OCCLUSION_TEST_HP */
+      1039, /* GL_OCCLUSION_TEST_RESULT_HP */
+       685, /* GL_LINEAR_CLIPMAP_LINEAR_SGIX */
+      1616, /* GL_TEXTURE_CLIPMAP_CENTER_SGIX */
+      1618, /* GL_TEXTURE_CLIPMAP_FRAME_SGIX */
+      1620, /* GL_TEXTURE_CLIPMAP_OFFSET_SGIX */
+      1621, /* GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX */
+      1619, /* GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX */
+      1617, /* GL_TEXTURE_CLIPMAP_DEPTH_SGIX */
+       848, /* GL_MAX_CLIPMAP_DEPTH_SGIX */
+       849, /* GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX */
+      1204, /* GL_POST_TEXTURE_FILTER_BIAS_SGIX */
+      1206, /* GL_POST_TEXTURE_FILTER_SCALE_SGIX */
+      1203, /* GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX */
+      1205, /* GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX */
+      1685, /* GL_TEXTURE_LOD_BIAS_S_SGIX */
+      1686, /* GL_TEXTURE_LOD_BIAS_T_SGIX */
+      1684, /* GL_TEXTURE_LOD_BIAS_R_SGIX */
+       583, /* GL_GENERATE_MIPMAP */
+       584, /* GL_GENERATE_MIPMAP_HINT */
+       525, /* GL_FOG_OFFSET_SGIX */
+       526, /* GL_FOG_OFFSET_VALUE_SGIX */
+      1630, /* GL_TEXTURE_COMPARE_SGIX */
+      1629, /* GL_TEXTURE_COMPARE_OPERATOR_SGIX */
+      1681, /* GL_TEXTURE_LEQUAL_R_SGIX */
+      1673, /* GL_TEXTURE_GEQUAL_R_SGIX */
+       356, /* GL_DEPTH_COMPONENT16 */
+       359, /* GL_DEPTH_COMPONENT24 */
+       362, /* GL_DEPTH_COMPONENT32 */
+       304, /* GL_CULL_VERTEX_EXT */
+       306, /* GL_CULL_VERTEX_OBJECT_POSITION_EXT */
+       305, /* GL_CULL_VERTEX_EYE_POSITION_EXT */
+      1833, /* GL_WRAP_BORDER_SUN */
+      1623, /* GL_TEXTURE_COLOR_WRITEMASK_SGIS */
+       678, /* GL_LIGHT_MODEL_COLOR_CONTROL */
+      1417, /* GL_SINGLE_COLOR */
+      1404, /* GL_SEPARATE_SPECULAR_COLOR */
+      1413, /* GL_SHARED_TEXTURE_PALETTE_EXT */
+       536, /* GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING */
+       537, /* GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE */
+       544, /* GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE */
+       539, /* GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE */
+       535, /* GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE */
+       534, /* GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE */
+       538, /* GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE */
+       545, /* GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE */
+       556, /* GL_FRAMEBUFFER_DEFAULT */
+       569, /* GL_FRAMEBUFFER_UNDEFINED */
+       369, /* GL_DEPTH_STENCIL_ATTACHMENT */
+       619, /* GL_INDEX */
+      1744, /* GL_UNSIGNED_BYTE_2_3_3_REV */
+      1759, /* GL_UNSIGNED_SHORT_5_6_5 */
+      1760, /* GL_UNSIGNED_SHORT_5_6_5_REV */
+      1757, /* GL_UNSIGNED_SHORT_4_4_4_4_REV */
+      1755, /* GL_UNSIGNED_SHORT_1_5_5_5_REV */
+      1752, /* GL_UNSIGNED_INT_8_8_8_8_REV */
+      1750, /* GL_UNSIGNED_INT_2_10_10_10_REV */
+      1693, /* GL_TEXTURE_MAX_CLAMP_S_SGIX */
+      1694, /* GL_TEXTURE_MAX_CLAMP_T_SGIX */
+      1692, /* GL_TEXTURE_MAX_CLAMP_R_SGIX */
+       940, /* GL_MIRRORED_REPEAT */
+      1360, /* GL_RGB_S3TC */
+      1335, /* GL_RGB4_S3TC */
+      1358, /* GL_RGBA_S3TC */
+      1352, /* GL_RGBA4_S3TC */
+      1356, /* GL_RGBA_DXT5_S3TC */
+      1350, /* GL_RGBA4_DXT5_S3TC */
+       263, /* GL_COMPRESSED_RGB_S3TC_DXT1_EXT */
+       258, /* GL_COMPRESSED_RGBA_S3TC_DXT1_EXT */
+       259, /* GL_COMPRESSED_RGBA_S3TC_DXT3_EXT */
+       260, /* GL_COMPRESSED_RGBA_S3TC_DXT5_EXT */
+      1001, /* GL_NEAREST_CLIPMAP_NEAREST_SGIX */
+      1000, /* GL_NEAREST_CLIPMAP_LINEAR_SGIX */
+       686, /* GL_LINEAR_CLIPMAP_NEAREST_SGIX */
+       512, /* GL_FOG_COORDINATE_SOURCE */
+       504, /* GL_FOG_COORD */
+       528, /* GL_FRAGMENT_DEPTH */
+       310, /* GL_CURRENT_FOG_COORD */
+       511, /* GL_FOG_COORDINATE_ARRAY_TYPE */
+       510, /* GL_FOG_COORDINATE_ARRAY_STRIDE */
+       509, /* GL_FOG_COORDINATE_ARRAY_POINTER */
+       506, /* GL_FOG_COORDINATE_ARRAY */
+       198, /* GL_COLOR_SUM */
+       330, /* GL_CURRENT_SECONDARY_COLOR */
+      1397, /* GL_SECONDARY_COLOR_ARRAY_SIZE */
+      1399, /* GL_SECONDARY_COLOR_ARRAY_TYPE */
+      1398, /* GL_SECONDARY_COLOR_ARRAY_STRIDE */
+      1396, /* GL_SECONDARY_COLOR_ARRAY_POINTER */
+      1393, /* GL_SECONDARY_COLOR_ARRAY */
+       328, /* GL_CURRENT_RASTER_SECONDARY_COLOR */
         28, /* GL_ALIASED_POINT_SIZE_RANGE */
         27, /* GL_ALIASED_LINE_WIDTH_RANGE */
-      1525, /* GL_TEXTURE0 */
-      1527, /* GL_TEXTURE1 */
-      1549, /* GL_TEXTURE2 */
-      1571, /* GL_TEXTURE3 */
-      1577, /* GL_TEXTURE4 */
-      1579, /* GL_TEXTURE5 */
-      1581, /* GL_TEXTURE6 */
-      1583, /* GL_TEXTURE7 */
-      1585, /* GL_TEXTURE8 */
-      1587, /* GL_TEXTURE9 */
-      1528, /* GL_TEXTURE10 */
-      1530, /* GL_TEXTURE11 */
-      1532, /* GL_TEXTURE12 */
-      1534, /* GL_TEXTURE13 */
-      1536, /* GL_TEXTURE14 */
-      1538, /* GL_TEXTURE15 */
-      1540, /* GL_TEXTURE16 */
-      1542, /* GL_TEXTURE17 */
-      1544, /* GL_TEXTURE18 */
-      1546, /* GL_TEXTURE19 */
-      1550, /* GL_TEXTURE20 */
-      1552, /* GL_TEXTURE21 */
-      1554, /* GL_TEXTURE22 */
-      1556, /* GL_TEXTURE23 */
-      1558, /* GL_TEXTURE24 */
-      1560, /* GL_TEXTURE25 */
-      1562, /* GL_TEXTURE26 */
-      1564, /* GL_TEXTURE27 */
-      1566, /* GL_TEXTURE28 */
-      1568, /* GL_TEXTURE29 */
-      1572, /* GL_TEXTURE30 */
-      1574, /* GL_TEXTURE31 */
+      1530, /* GL_TEXTURE0 */
+      1532, /* GL_TEXTURE1 */
+      1554, /* GL_TEXTURE2 */
+      1576, /* GL_TEXTURE3 */
+      1582, /* GL_TEXTURE4 */
+      1584, /* GL_TEXTURE5 */
+      1586, /* GL_TEXTURE6 */
+      1588, /* GL_TEXTURE7 */
+      1590, /* GL_TEXTURE8 */
+      1592, /* GL_TEXTURE9 */
+      1533, /* GL_TEXTURE10 */
+      1535, /* GL_TEXTURE11 */
+      1537, /* GL_TEXTURE12 */
+      1539, /* GL_TEXTURE13 */
+      1541, /* GL_TEXTURE14 */
+      1543, /* GL_TEXTURE15 */
+      1545, /* GL_TEXTURE16 */
+      1547, /* GL_TEXTURE17 */
+      1549, /* GL_TEXTURE18 */
+      1551, /* GL_TEXTURE19 */
+      1555, /* GL_TEXTURE20 */
+      1557, /* GL_TEXTURE21 */
+      1559, /* GL_TEXTURE22 */
+      1561, /* GL_TEXTURE23 */
+      1563, /* GL_TEXTURE24 */
+      1565, /* GL_TEXTURE25 */
+      1567, /* GL_TEXTURE26 */
+      1569, /* GL_TEXTURE27 */
+      1571, /* GL_TEXTURE28 */
+      1573, /* GL_TEXTURE29 */
+      1577, /* GL_TEXTURE30 */
+      1579, /* GL_TEXTURE31 */
         18, /* GL_ACTIVE_TEXTURE */
-       130, /* GL_CLIENT_ACTIVE_TEXTURE */
-       916, /* GL_MAX_TEXTURE_UNITS */
-      1714, /* GL_TRANSPOSE_MODELVIEW_MATRIX */
-      1717, /* GL_TRANSPOSE_PROJECTION_MATRIX */
-      1719, /* GL_TRANSPOSE_TEXTURE_MATRIX */
-      1711, /* GL_TRANSPOSE_COLOR_MATRIX */
-      1513, /* GL_SUBTRACT */
-       904, /* GL_MAX_RENDERBUFFER_SIZE_EXT */
-       244, /* GL_COMPRESSED_ALPHA */
-       248, /* GL_COMPRESSED_LUMINANCE */
-       249, /* GL_COMPRESSED_LUMINANCE_ALPHA */
-       246, /* GL_COMPRESSED_INTENSITY */
-       252, /* GL_COMPRESSED_RGB */
-       253, /* GL_COMPRESSED_RGBA */
-      1632, /* GL_TEXTURE_COMPRESSION_HINT */
-      1694, /* GL_TEXTURE_RECTANGLE_ARB */
-      1604, /* GL_TEXTURE_BINDING_RECTANGLE_ARB */
-      1261, /* GL_PROXY_TEXTURE_RECTANGLE_ARB */
-       902, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB */
-       366, /* GL_DEPTH_STENCIL */
-      1739, /* GL_UNSIGNED_INT_24_8 */
-       912, /* GL_MAX_TEXTURE_LOD_BIAS */
-      1685, /* GL_TEXTURE_MAX_ANISOTROPY_EXT */
-       913, /* GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT */
-      1661, /* GL_TEXTURE_FILTER_CONTROL */
-      1676, /* GL_TEXTURE_LOD_BIAS */
-       229, /* GL_COMBINE4 */
-       906, /* GL_MAX_SHININESS_NV */
-       907, /* GL_MAX_SPOT_EXPONENT_NV */
-       615, /* GL_INCR_WRAP */
-       339, /* GL_DECR_WRAP */
-       958, /* GL_MODELVIEW1_ARB */
-      1014, /* GL_NORMAL_MAP */
-      1292, /* GL_REFLECTION_MAP */
-      1641, /* GL_TEXTURE_CUBE_MAP */
-      1602, /* GL_TEXTURE_BINDING_CUBE_MAP */
-      1649, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X */
-      1643, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X */
-      1651, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y */
-      1645, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y */
-      1653, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z */
-      1647, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z */
-      1259, /* GL_PROXY_TEXTURE_CUBE_MAP */
-       858, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE */
-       993, /* GL_MULTISAMPLE_FILTER_HINT_NV */
-       518, /* GL_FOG_DISTANCE_MODE_NV */
-       470, /* GL_EYE_RADIAL_NV */
-       469, /* GL_EYE_PLANE_ABSOLUTE_NV */
-       228, /* GL_COMBINE */
-       235, /* GL_COMBINE_RGB */
-       230, /* GL_COMBINE_ALPHA */
-      1359, /* GL_RGB_SCALE */
+       132, /* GL_CLIENT_ACTIVE_TEXTURE */
+       918, /* GL_MAX_TEXTURE_UNITS */
+      1723, /* GL_TRANSPOSE_MODELVIEW_MATRIX */
+      1726, /* GL_TRANSPOSE_PROJECTION_MATRIX */
+      1728, /* GL_TRANSPOSE_TEXTURE_MATRIX */
+      1720, /* GL_TRANSPOSE_COLOR_MATRIX */
+      1518, /* GL_SUBTRACT */
+       906, /* GL_MAX_RENDERBUFFER_SIZE_EXT */
+       246, /* GL_COMPRESSED_ALPHA */
+       250, /* GL_COMPRESSED_LUMINANCE */
+       251, /* GL_COMPRESSED_LUMINANCE_ALPHA */
+       248, /* GL_COMPRESSED_INTENSITY */
+       254, /* GL_COMPRESSED_RGB */
+       255, /* GL_COMPRESSED_RGBA */
+      1637, /* GL_TEXTURE_COMPRESSION_HINT */
+      1702, /* GL_TEXTURE_RECTANGLE_ARB */
+      1609, /* GL_TEXTURE_BINDING_RECTANGLE_ARB */
+      1263, /* GL_PROXY_TEXTURE_RECTANGLE_ARB */
+       904, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB */
+       368, /* GL_DEPTH_STENCIL */
+      1748, /* GL_UNSIGNED_INT_24_8 */
+       914, /* GL_MAX_TEXTURE_LOD_BIAS */
+      1691, /* GL_TEXTURE_MAX_ANISOTROPY_EXT */
+       915, /* GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT */
+      1667, /* GL_TEXTURE_FILTER_CONTROL */
+      1682, /* GL_TEXTURE_LOD_BIAS */
+       231, /* GL_COMBINE4 */
+       908, /* GL_MAX_SHININESS_NV */
+       909, /* GL_MAX_SPOT_EXPONENT_NV */
+       617, /* GL_INCR_WRAP */
+       341, /* GL_DECR_WRAP */
+       960, /* GL_MODELVIEW1_ARB */
+      1016, /* GL_NORMAL_MAP */
+      1294, /* GL_REFLECTION_MAP */
+      1646, /* GL_TEXTURE_CUBE_MAP */
+      1607, /* GL_TEXTURE_BINDING_CUBE_MAP */
+      1654, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X */
+      1648, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X */
+      1656, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y */
+      1650, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y */
+      1658, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z */
+      1652, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z */
+      1261, /* GL_PROXY_TEXTURE_CUBE_MAP */
+       860, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE */
+       995, /* GL_MULTISAMPLE_FILTER_HINT_NV */
+       520, /* GL_FOG_DISTANCE_MODE_NV */
+       472, /* GL_EYE_RADIAL_NV */
+       471, /* GL_EYE_PLANE_ABSOLUTE_NV */
+       230, /* GL_COMBINE */
+       237, /* GL_COMBINE_RGB */
+       232, /* GL_COMBINE_ALPHA */
+      1361, /* GL_RGB_SCALE */
         24, /* GL_ADD_SIGNED */
-       643, /* GL_INTERPOLATE */
-       267, /* GL_CONSTANT */
-      1208, /* GL_PRIMARY_COLOR */
-      1205, /* GL_PREVIOUS */
-      1430, /* GL_SOURCE0_RGB */
-      1436, /* GL_SOURCE1_RGB */
-      1442, /* GL_SOURCE2_RGB */
-      1446, /* GL_SOURCE3_RGB_NV */
-      1427, /* GL_SOURCE0_ALPHA */
-      1433, /* GL_SOURCE1_ALPHA */
-      1439, /* GL_SOURCE2_ALPHA */
-      1445, /* GL_SOURCE3_ALPHA_NV */
-      1050, /* GL_OPERAND0_RGB */
-      1056, /* GL_OPERAND1_RGB */
-      1062, /* GL_OPERAND2_RGB */
-      1066, /* GL_OPERAND3_RGB_NV */
-      1047, /* GL_OPERAND0_ALPHA */
-      1053, /* GL_OPERAND1_ALPHA */
-      1059, /* GL_OPERAND2_ALPHA */
-      1065, /* GL_OPERAND3_ALPHA_NV */
-      1763, /* GL_VERTEX_ARRAY_BINDING */
-      1828, /* GL_YCBCR_422_APPLE */
-      1752, /* GL_UNSIGNED_SHORT_8_8_APPLE */
-      1754, /* GL_UNSIGNED_SHORT_8_8_REV_APPLE */
-      1417, /* GL_SLICE_ACCUM_SUN */
-      1267, /* GL_QUAD_MESH_SUN */
-      1723, /* GL_TRIANGLE_MESH_SUN */
-      1802, /* GL_VERTEX_PROGRAM_ARB */
-      1813, /* GL_VERTEX_STATE_PROGRAM_NV */
-      1789, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED */
-      1795, /* GL_VERTEX_ATTRIB_ARRAY_SIZE */
-      1797, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE */
-      1799, /* GL_VERTEX_ATTRIB_ARRAY_TYPE */
-       330, /* GL_CURRENT_VERTEX_ATTRIB */
-      1221, /* GL_PROGRAM_LENGTH_ARB */
-      1235, /* GL_PROGRAM_STRING_ARB */
-       980, /* GL_MODELVIEW_PROJECTION_NV */
-       610, /* GL_IDENTITY_NV */
-       657, /* GL_INVERSE_NV */
-      1716, /* GL_TRANSPOSE_NV */
-       658, /* GL_INVERSE_TRANSPOSE_NV */
-       888, /* GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB */
-       887, /* GL_MAX_PROGRAM_MATRICES_ARB */
-       795, /* GL_MATRIX0_NV */
-       807, /* GL_MATRIX1_NV */
-       819, /* GL_MATRIX2_NV */
-       823, /* GL_MATRIX3_NV */
-       825, /* GL_MATRIX4_NV */
-       827, /* GL_MATRIX5_NV */
-       829, /* GL_MATRIX6_NV */
-       831, /* GL_MATRIX7_NV */
-       314, /* GL_CURRENT_MATRIX_STACK_DEPTH_ARB */
-       311, /* GL_CURRENT_MATRIX_ARB */
-      1805, /* GL_VERTEX_PROGRAM_POINT_SIZE */
-      1808, /* GL_VERTEX_PROGRAM_TWO_SIDE */
-      1233, /* GL_PROGRAM_PARAMETER_NV */
-      1793, /* GL_VERTEX_ATTRIB_ARRAY_POINTER */
-      1237, /* GL_PROGRAM_TARGET_NV */
-      1234, /* GL_PROGRAM_RESIDENT_NV */
-      1708, /* GL_TRACK_MATRIX_NV */
-      1709, /* GL_TRACK_MATRIX_TRANSFORM_NV */
-      1803, /* GL_VERTEX_PROGRAM_BINDING_NV */
-      1215, /* GL_PROGRAM_ERROR_POSITION_ARB */
-       351, /* GL_DEPTH_CLAMP_NV */
-      1771, /* GL_VERTEX_ATTRIB_ARRAY0_NV */
-      1778, /* GL_VERTEX_ATTRIB_ARRAY1_NV */
-      1779, /* GL_VERTEX_ATTRIB_ARRAY2_NV */
-      1780, /* GL_VERTEX_ATTRIB_ARRAY3_NV */
-      1781, /* GL_VERTEX_ATTRIB_ARRAY4_NV */
-      1782, /* GL_VERTEX_ATTRIB_ARRAY5_NV */
-      1783, /* GL_VERTEX_ATTRIB_ARRAY6_NV */
-      1784, /* GL_VERTEX_ATTRIB_ARRAY7_NV */
-      1785, /* GL_VERTEX_ATTRIB_ARRAY8_NV */
-      1786, /* GL_VERTEX_ATTRIB_ARRAY9_NV */
-      1772, /* GL_VERTEX_ATTRIB_ARRAY10_NV */
-      1773, /* GL_VERTEX_ATTRIB_ARRAY11_NV */
-      1774, /* GL_VERTEX_ATTRIB_ARRAY12_NV */
-      1775, /* GL_VERTEX_ATTRIB_ARRAY13_NV */
-      1776, /* GL_VERTEX_ATTRIB_ARRAY14_NV */
-      1777, /* GL_VERTEX_ATTRIB_ARRAY15_NV */
-       743, /* GL_MAP1_VERTEX_ATTRIB0_4_NV */
-       750, /* GL_MAP1_VERTEX_ATTRIB1_4_NV */
-       751, /* GL_MAP1_VERTEX_ATTRIB2_4_NV */
-       752, /* GL_MAP1_VERTEX_ATTRIB3_4_NV */
-       753, /* GL_MAP1_VERTEX_ATTRIB4_4_NV */
-       754, /* GL_MAP1_VERTEX_ATTRIB5_4_NV */
-       755, /* GL_MAP1_VERTEX_ATTRIB6_4_NV */
-       756, /* GL_MAP1_VERTEX_ATTRIB7_4_NV */
-       757, /* GL_MAP1_VERTEX_ATTRIB8_4_NV */
-       758, /* GL_MAP1_VERTEX_ATTRIB9_4_NV */
-       744, /* GL_MAP1_VERTEX_ATTRIB10_4_NV */
-       745, /* GL_MAP1_VERTEX_ATTRIB11_4_NV */
-       746, /* GL_MAP1_VERTEX_ATTRIB12_4_NV */
-       747, /* GL_MAP1_VERTEX_ATTRIB13_4_NV */
-       748, /* GL_MAP1_VERTEX_ATTRIB14_4_NV */
-       749, /* GL_MAP1_VERTEX_ATTRIB15_4_NV */
-       770, /* GL_MAP2_VERTEX_ATTRIB0_4_NV */
-       777, /* GL_MAP2_VERTEX_ATTRIB1_4_NV */
-       778, /* GL_MAP2_VERTEX_ATTRIB2_4_NV */
-       779, /* GL_MAP2_VERTEX_ATTRIB3_4_NV */
-       780, /* GL_MAP2_VERTEX_ATTRIB4_4_NV */
-       781, /* GL_MAP2_VERTEX_ATTRIB5_4_NV */
-       782, /* GL_MAP2_VERTEX_ATTRIB6_4_NV */
-      1214, /* GL_PROGRAM_BINDING_ARB */
-       784, /* GL_MAP2_VERTEX_ATTRIB8_4_NV */
-       785, /* GL_MAP2_VERTEX_ATTRIB9_4_NV */
-       771, /* GL_MAP2_VERTEX_ATTRIB10_4_NV */
-       772, /* GL_MAP2_VERTEX_ATTRIB11_4_NV */
-       773, /* GL_MAP2_VERTEX_ATTRIB12_4_NV */
-       774, /* GL_MAP2_VERTEX_ATTRIB13_4_NV */
-       775, /* GL_MAP2_VERTEX_ATTRIB14_4_NV */
-       776, /* GL_MAP2_VERTEX_ATTRIB15_4_NV */
-      1630, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE */
-      1627, /* GL_TEXTURE_COMPRESSED */
-      1019, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS */
-       266, /* GL_COMPRESSED_TEXTURE_FORMATS */
-       928, /* GL_MAX_VERTEX_UNITS_ARB */
+       645, /* GL_INTERPOLATE */
+       269, /* GL_CONSTANT */
+      1210, /* GL_PRIMARY_COLOR */
+      1207, /* GL_PREVIOUS */
+      1432, /* GL_SOURCE0_RGB */
+      1438, /* GL_SOURCE1_RGB */
+      1444, /* GL_SOURCE2_RGB */
+      1448, /* GL_SOURCE3_RGB_NV */
+      1429, /* GL_SOURCE0_ALPHA */
+      1435, /* GL_SOURCE1_ALPHA */
+      1441, /* GL_SOURCE2_ALPHA */
+      1447, /* GL_SOURCE3_ALPHA_NV */
+      1052, /* GL_OPERAND0_RGB */
+      1058, /* GL_OPERAND1_RGB */
+      1064, /* GL_OPERAND2_RGB */
+      1068, /* GL_OPERAND3_RGB_NV */
+      1049, /* GL_OPERAND0_ALPHA */
+      1055, /* GL_OPERAND1_ALPHA */
+      1061, /* GL_OPERAND2_ALPHA */
+      1067, /* GL_OPERAND3_ALPHA_NV */
+      1772, /* GL_VERTEX_ARRAY_BINDING */
+      1700, /* GL_TEXTURE_RANGE_LENGTH_APPLE */
+      1701, /* GL_TEXTURE_RANGE_POINTER_APPLE */
+      1837, /* GL_YCBCR_422_APPLE */
+      1761, /* GL_UNSIGNED_SHORT_8_8_APPLE */
+      1763, /* GL_UNSIGNED_SHORT_8_8_REV_APPLE */
+      1709, /* GL_TEXTURE_STORAGE_HINT_APPLE */
+      1509, /* GL_STORAGE_PRIVATE_APPLE */
+      1508, /* GL_STORAGE_CACHED_APPLE */
+      1510, /* GL_STORAGE_SHARED_APPLE */
+      1419, /* GL_SLICE_ACCUM_SUN */
+      1269, /* GL_QUAD_MESH_SUN */
+      1732, /* GL_TRIANGLE_MESH_SUN */
+      1811, /* GL_VERTEX_PROGRAM_ARB */
+      1822, /* GL_VERTEX_STATE_PROGRAM_NV */
+      1798, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED */
+      1804, /* GL_VERTEX_ATTRIB_ARRAY_SIZE */
+      1806, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE */
+      1808, /* GL_VERTEX_ATTRIB_ARRAY_TYPE */
+       332, /* GL_CURRENT_VERTEX_ATTRIB */
+      1223, /* GL_PROGRAM_LENGTH_ARB */
+      1237, /* GL_PROGRAM_STRING_ARB */
+       982, /* GL_MODELVIEW_PROJECTION_NV */
+       612, /* GL_IDENTITY_NV */
+       659, /* GL_INVERSE_NV */
+      1725, /* GL_TRANSPOSE_NV */
+       660, /* GL_INVERSE_TRANSPOSE_NV */
+       890, /* GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB */
+       889, /* GL_MAX_PROGRAM_MATRICES_ARB */
+       797, /* GL_MATRIX0_NV */
+       809, /* GL_MATRIX1_NV */
+       821, /* GL_MATRIX2_NV */
+       825, /* GL_MATRIX3_NV */
+       827, /* GL_MATRIX4_NV */
+       829, /* GL_MATRIX5_NV */
+       831, /* GL_MATRIX6_NV */
+       833, /* GL_MATRIX7_NV */
+       316, /* GL_CURRENT_MATRIX_STACK_DEPTH_ARB */
+       313, /* GL_CURRENT_MATRIX_ARB */
+      1814, /* GL_VERTEX_PROGRAM_POINT_SIZE */
+      1817, /* GL_VERTEX_PROGRAM_TWO_SIDE */
+      1235, /* GL_PROGRAM_PARAMETER_NV */
+      1802, /* GL_VERTEX_ATTRIB_ARRAY_POINTER */
+      1239, /* GL_PROGRAM_TARGET_NV */
+      1236, /* GL_PROGRAM_RESIDENT_NV */
+      1717, /* GL_TRACK_MATRIX_NV */
+      1718, /* GL_TRACK_MATRIX_TRANSFORM_NV */
+      1812, /* GL_VERTEX_PROGRAM_BINDING_NV */
+      1217, /* GL_PROGRAM_ERROR_POSITION_ARB */
+       353, /* GL_DEPTH_CLAMP_NV */
+      1780, /* GL_VERTEX_ATTRIB_ARRAY0_NV */
+      1787, /* GL_VERTEX_ATTRIB_ARRAY1_NV */
+      1788, /* GL_VERTEX_ATTRIB_ARRAY2_NV */
+      1789, /* GL_VERTEX_ATTRIB_ARRAY3_NV */
+      1790, /* GL_VERTEX_ATTRIB_ARRAY4_NV */
+      1791, /* GL_VERTEX_ATTRIB_ARRAY5_NV */
+      1792, /* GL_VERTEX_ATTRIB_ARRAY6_NV */
+      1793, /* GL_VERTEX_ATTRIB_ARRAY7_NV */
+      1794, /* GL_VERTEX_ATTRIB_ARRAY8_NV */
+      1795, /* GL_VERTEX_ATTRIB_ARRAY9_NV */
+      1781, /* GL_VERTEX_ATTRIB_ARRAY10_NV */
+      1782, /* GL_VERTEX_ATTRIB_ARRAY11_NV */
+      1783, /* GL_VERTEX_ATTRIB_ARRAY12_NV */
+      1784, /* GL_VERTEX_ATTRIB_ARRAY13_NV */
+      1785, /* GL_VERTEX_ATTRIB_ARRAY14_NV */
+      1786, /* GL_VERTEX_ATTRIB_ARRAY15_NV */
+       745, /* GL_MAP1_VERTEX_ATTRIB0_4_NV */
+       752, /* GL_MAP1_VERTEX_ATTRIB1_4_NV */
+       753, /* GL_MAP1_VERTEX_ATTRIB2_4_NV */
+       754, /* GL_MAP1_VERTEX_ATTRIB3_4_NV */
+       755, /* GL_MAP1_VERTEX_ATTRIB4_4_NV */
+       756, /* GL_MAP1_VERTEX_ATTRIB5_4_NV */
+       757, /* GL_MAP1_VERTEX_ATTRIB6_4_NV */
+       758, /* GL_MAP1_VERTEX_ATTRIB7_4_NV */
+       759, /* GL_MAP1_VERTEX_ATTRIB8_4_NV */
+       760, /* GL_MAP1_VERTEX_ATTRIB9_4_NV */
+       746, /* GL_MAP1_VERTEX_ATTRIB10_4_NV */
+       747, /* GL_MAP1_VERTEX_ATTRIB11_4_NV */
+       748, /* GL_MAP1_VERTEX_ATTRIB12_4_NV */
+       749, /* GL_MAP1_VERTEX_ATTRIB13_4_NV */
+       750, /* GL_MAP1_VERTEX_ATTRIB14_4_NV */
+       751, /* GL_MAP1_VERTEX_ATTRIB15_4_NV */
+       772, /* GL_MAP2_VERTEX_ATTRIB0_4_NV */
+       779, /* GL_MAP2_VERTEX_ATTRIB1_4_NV */
+       780, /* GL_MAP2_VERTEX_ATTRIB2_4_NV */
+       781, /* GL_MAP2_VERTEX_ATTRIB3_4_NV */
+       782, /* GL_MAP2_VERTEX_ATTRIB4_4_NV */
+       783, /* GL_MAP2_VERTEX_ATTRIB5_4_NV */
+       784, /* GL_MAP2_VERTEX_ATTRIB6_4_NV */
+      1216, /* GL_PROGRAM_BINDING_ARB */
+       786, /* GL_MAP2_VERTEX_ATTRIB8_4_NV */
+       787, /* GL_MAP2_VERTEX_ATTRIB9_4_NV */
+       773, /* GL_MAP2_VERTEX_ATTRIB10_4_NV */
+       774, /* GL_MAP2_VERTEX_ATTRIB11_4_NV */
+       775, /* GL_MAP2_VERTEX_ATTRIB12_4_NV */
+       776, /* GL_MAP2_VERTEX_ATTRIB13_4_NV */
+       777, /* GL_MAP2_VERTEX_ATTRIB14_4_NV */
+       778, /* GL_MAP2_VERTEX_ATTRIB15_4_NV */
+      1635, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE */
+      1632, /* GL_TEXTURE_COMPRESSED */
+      1021, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS */
+       268, /* GL_COMPRESSED_TEXTURE_FORMATS */
+       930, /* GL_MAX_VERTEX_UNITS_ARB */
         22, /* GL_ACTIVE_VERTEX_UNITS_ARB */
-      1823, /* GL_WEIGHT_SUM_UNITY_ARB */
-      1801, /* GL_VERTEX_BLEND_ARB */
-       332, /* GL_CURRENT_WEIGHT_ARB */
-      1822, /* GL_WEIGHT_ARRAY_TYPE_ARB */
-      1821, /* GL_WEIGHT_ARRAY_STRIDE_ARB */
-      1820, /* GL_WEIGHT_ARRAY_SIZE_ARB */
-      1819, /* GL_WEIGHT_ARRAY_POINTER_ARB */
-      1816, /* GL_WEIGHT_ARRAY_ARB */
-       379, /* GL_DOT3_RGB */
-       380, /* GL_DOT3_RGBA */
-       260, /* GL_COMPRESSED_RGB_FXT1_3DFX */
-       255, /* GL_COMPRESSED_RGBA_FXT1_3DFX */
-       988, /* GL_MULTISAMPLE_3DFX */
-      1380, /* GL_SAMPLE_BUFFERS_3DFX */
-      1371, /* GL_SAMPLES_3DFX */
-       969, /* GL_MODELVIEW2_ARB */
-       972, /* GL_MODELVIEW3_ARB */
-       973, /* GL_MODELVIEW4_ARB */
-       974, /* GL_MODELVIEW5_ARB */
-       975, /* GL_MODELVIEW6_ARB */
-       976, /* GL_MODELVIEW7_ARB */
-       977, /* GL_MODELVIEW8_ARB */
-       978, /* GL_MODELVIEW9_ARB */
-       948, /* GL_MODELVIEW10_ARB */
-       949, /* GL_MODELVIEW11_ARB */
-       950, /* GL_MODELVIEW12_ARB */
-       951, /* GL_MODELVIEW13_ARB */
-       952, /* GL_MODELVIEW14_ARB */
-       953, /* GL_MODELVIEW15_ARB */
-       954, /* GL_MODELVIEW16_ARB */
-       955, /* GL_MODELVIEW17_ARB */
-       956, /* GL_MODELVIEW18_ARB */
-       957, /* GL_MODELVIEW19_ARB */
-       959, /* GL_MODELVIEW20_ARB */
-       960, /* GL_MODELVIEW21_ARB */
-       961, /* GL_MODELVIEW22_ARB */
-       962, /* GL_MODELVIEW23_ARB */
-       963, /* GL_MODELVIEW24_ARB */
-       964, /* GL_MODELVIEW25_ARB */
-       965, /* GL_MODELVIEW26_ARB */
-       966, /* GL_MODELVIEW27_ARB */
-       967, /* GL_MODELVIEW28_ARB */
-       968, /* GL_MODELVIEW29_ARB */
-       970, /* GL_MODELVIEW30_ARB */
-       971, /* GL_MODELVIEW31_ARB */
-       384, /* GL_DOT3_RGB_EXT */
-       382, /* GL_DOT3_RGBA_EXT */
-       942, /* GL_MIRROR_CLAMP_EXT */
-       945, /* GL_MIRROR_CLAMP_TO_EDGE_EXT */
-       983, /* GL_MODULATE_ADD_ATI */
-       984, /* GL_MODULATE_SIGNED_ADD_ATI */
-       985, /* GL_MODULATE_SUBTRACT_ATI */
-      1829, /* GL_YCBCR_MESA */
-      1074, /* GL_PACK_INVERT_MESA */
-       335, /* GL_DEBUG_OBJECT_MESA */
-       336, /* GL_DEBUG_PRINT_MESA */
-       334, /* GL_DEBUG_ASSERT_MESA */
-       107, /* GL_BUFFER_SIZE */
-       109, /* GL_BUFFER_USAGE */
-       113, /* GL_BUMP_ROT_MATRIX_ATI */
-       114, /* GL_BUMP_ROT_MATRIX_SIZE_ATI */
-       112, /* GL_BUMP_NUM_TEX_UNITS_ATI */
-       116, /* GL_BUMP_TEX_UNITS_ATI */
-       443, /* GL_DUDV_ATI */
-       442, /* GL_DU8DV8_ATI */
-       111, /* GL_BUMP_ENVMAP_ATI */
-       115, /* GL_BUMP_TARGET_ATI */
-      1478, /* GL_STENCIL_BACK_FUNC */
-      1476, /* GL_STENCIL_BACK_FAIL */
-      1480, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL */
-      1482, /* GL_STENCIL_BACK_PASS_DEPTH_PASS */
-       527, /* GL_FRAGMENT_PROGRAM_ARB */
-      1212, /* GL_PROGRAM_ALU_INSTRUCTIONS_ARB */
-      1240, /* GL_PROGRAM_TEX_INSTRUCTIONS_ARB */
-      1239, /* GL_PROGRAM_TEX_INDIRECTIONS_ARB */
-      1224, /* GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
-      1230, /* GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
-      1229, /* GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
-       877, /* GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB */
-       900, /* GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB */
-       899, /* GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB */
-       890, /* GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
-       896, /* GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
-       895, /* GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
-       860, /* GL_MAX_DRAW_BUFFERS */
-       388, /* GL_DRAW_BUFFER0 */
-       391, /* GL_DRAW_BUFFER1 */
-       412, /* GL_DRAW_BUFFER2 */
-       415, /* GL_DRAW_BUFFER3 */
-       418, /* GL_DRAW_BUFFER4 */
-       421, /* GL_DRAW_BUFFER5 */
-       424, /* GL_DRAW_BUFFER6 */
-       427, /* GL_DRAW_BUFFER7 */
-       430, /* GL_DRAW_BUFFER8 */
-       433, /* GL_DRAW_BUFFER9 */
-       392, /* GL_DRAW_BUFFER10 */
-       395, /* GL_DRAW_BUFFER11 */
-       398, /* GL_DRAW_BUFFER12 */
-       401, /* GL_DRAW_BUFFER13 */
-       404, /* GL_DRAW_BUFFER14 */
-       407, /* GL_DRAW_BUFFER15 */
+      1832, /* GL_WEIGHT_SUM_UNITY_ARB */
+      1810, /* GL_VERTEX_BLEND_ARB */
+       334, /* GL_CURRENT_WEIGHT_ARB */
+      1831, /* GL_WEIGHT_ARRAY_TYPE_ARB */
+      1830, /* GL_WEIGHT_ARRAY_STRIDE_ARB */
+      1829, /* GL_WEIGHT_ARRAY_SIZE_ARB */
+      1828, /* GL_WEIGHT_ARRAY_POINTER_ARB */
+      1825, /* GL_WEIGHT_ARRAY_ARB */
+       381, /* GL_DOT3_RGB */
+       382, /* GL_DOT3_RGBA */
+       262, /* GL_COMPRESSED_RGB_FXT1_3DFX */
+       257, /* GL_COMPRESSED_RGBA_FXT1_3DFX */
+       990, /* GL_MULTISAMPLE_3DFX */
+      1382, /* GL_SAMPLE_BUFFERS_3DFX */
+      1373, /* GL_SAMPLES_3DFX */
+       971, /* GL_MODELVIEW2_ARB */
+       974, /* GL_MODELVIEW3_ARB */
+       975, /* GL_MODELVIEW4_ARB */
+       976, /* GL_MODELVIEW5_ARB */
+       977, /* GL_MODELVIEW6_ARB */
+       978, /* GL_MODELVIEW7_ARB */
+       979, /* GL_MODELVIEW8_ARB */
+       980, /* GL_MODELVIEW9_ARB */
+       950, /* GL_MODELVIEW10_ARB */
+       951, /* GL_MODELVIEW11_ARB */
+       952, /* GL_MODELVIEW12_ARB */
+       953, /* GL_MODELVIEW13_ARB */
+       954, /* GL_MODELVIEW14_ARB */
+       955, /* GL_MODELVIEW15_ARB */
+       956, /* GL_MODELVIEW16_ARB */
+       957, /* GL_MODELVIEW17_ARB */
+       958, /* GL_MODELVIEW18_ARB */
+       959, /* GL_MODELVIEW19_ARB */
+       961, /* GL_MODELVIEW20_ARB */
+       962, /* GL_MODELVIEW21_ARB */
+       963, /* GL_MODELVIEW22_ARB */
+       964, /* GL_MODELVIEW23_ARB */
+       965, /* GL_MODELVIEW24_ARB */
+       966, /* GL_MODELVIEW25_ARB */
+       967, /* GL_MODELVIEW26_ARB */
+       968, /* GL_MODELVIEW27_ARB */
+       969, /* GL_MODELVIEW28_ARB */
+       970, /* GL_MODELVIEW29_ARB */
+       972, /* GL_MODELVIEW30_ARB */
+       973, /* GL_MODELVIEW31_ARB */
+       386, /* GL_DOT3_RGB_EXT */
+       384, /* GL_DOT3_RGBA_EXT */
+       944, /* GL_MIRROR_CLAMP_EXT */
+       947, /* GL_MIRROR_CLAMP_TO_EDGE_EXT */
+       985, /* GL_MODULATE_ADD_ATI */
+       986, /* GL_MODULATE_SIGNED_ADD_ATI */
+       987, /* GL_MODULATE_SUBTRACT_ATI */
+      1838, /* GL_YCBCR_MESA */
+      1076, /* GL_PACK_INVERT_MESA */
+       337, /* GL_DEBUG_OBJECT_MESA */
+       338, /* GL_DEBUG_PRINT_MESA */
+       336, /* GL_DEBUG_ASSERT_MESA */
+       109, /* GL_BUFFER_SIZE */
+       111, /* GL_BUFFER_USAGE */
+       115, /* GL_BUMP_ROT_MATRIX_ATI */
+       116, /* GL_BUMP_ROT_MATRIX_SIZE_ATI */
+       114, /* GL_BUMP_NUM_TEX_UNITS_ATI */
+       118, /* GL_BUMP_TEX_UNITS_ATI */
+       445, /* GL_DUDV_ATI */
+       444, /* GL_DU8DV8_ATI */
+       113, /* GL_BUMP_ENVMAP_ATI */
+       117, /* GL_BUMP_TARGET_ATI */
+      1480, /* GL_STENCIL_BACK_FUNC */
+      1478, /* GL_STENCIL_BACK_FAIL */
+      1482, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL */
+      1484, /* GL_STENCIL_BACK_PASS_DEPTH_PASS */
+       529, /* GL_FRAGMENT_PROGRAM_ARB */
+      1214, /* GL_PROGRAM_ALU_INSTRUCTIONS_ARB */
+      1242, /* GL_PROGRAM_TEX_INSTRUCTIONS_ARB */
+      1241, /* GL_PROGRAM_TEX_INDIRECTIONS_ARB */
+      1226, /* GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
+      1232, /* GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
+      1231, /* GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
+       879, /* GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB */
+       902, /* GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB */
+       901, /* GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB */
+       892, /* GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
+       898, /* GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
+       897, /* GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
+       862, /* GL_MAX_DRAW_BUFFERS */
+       390, /* GL_DRAW_BUFFER0 */
+       393, /* GL_DRAW_BUFFER1 */
+       414, /* GL_DRAW_BUFFER2 */
+       417, /* GL_DRAW_BUFFER3 */
+       420, /* GL_DRAW_BUFFER4 */
+       423, /* GL_DRAW_BUFFER5 */
+       426, /* GL_DRAW_BUFFER6 */
+       429, /* GL_DRAW_BUFFER7 */
+       432, /* GL_DRAW_BUFFER8 */
+       435, /* GL_DRAW_BUFFER9 */
+       394, /* GL_DRAW_BUFFER10 */
+       397, /* GL_DRAW_BUFFER11 */
+       400, /* GL_DRAW_BUFFER12 */
+       403, /* GL_DRAW_BUFFER13 */
+       406, /* GL_DRAW_BUFFER14 */
+       409, /* GL_DRAW_BUFFER15 */
         81, /* GL_BLEND_EQUATION_ALPHA */
-       840, /* GL_MATRIX_PALETTE_ARB */
-       871, /* GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB */
-       874, /* GL_MAX_PALETTE_MATRICES_ARB */
-       317, /* GL_CURRENT_PALETTE_MATRIX_ARB */
-       834, /* GL_MATRIX_INDEX_ARRAY_ARB */
-       312, /* GL_CURRENT_MATRIX_INDEX_ARB */
-       836, /* GL_MATRIX_INDEX_ARRAY_SIZE_ARB */
-       838, /* GL_MATRIX_INDEX_ARRAY_TYPE_ARB */
-       837, /* GL_MATRIX_INDEX_ARRAY_STRIDE_ARB */
-       835, /* GL_MATRIX_INDEX_ARRAY_POINTER_ARB */
-      1656, /* GL_TEXTURE_DEPTH_SIZE */
-       372, /* GL_DEPTH_TEXTURE_MODE */
-      1622, /* GL_TEXTURE_COMPARE_MODE */
-      1620, /* GL_TEXTURE_COMPARE_FUNC */
-       239, /* GL_COMPARE_R_TO_TEXTURE */
-      1146, /* GL_POINT_SPRITE */
-       292, /* GL_COORD_REPLACE */
-      1150, /* GL_POINT_SPRITE_R_MODE_NV */
-      1269, /* GL_QUERY_COUNTER_BITS */
-       319, /* GL_CURRENT_QUERY */
-      1271, /* GL_QUERY_RESULT */
-      1273, /* GL_QUERY_RESULT_AVAILABLE */
-       922, /* GL_MAX_VERTEX_ATTRIBS */
-      1791, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED */
-       370, /* GL_DEPTH_STENCIL_TO_RGBA_NV */
-       369, /* GL_DEPTH_STENCIL_TO_BGRA_NV */
-       908, /* GL_MAX_TEXTURE_COORDS */
-       910, /* GL_MAX_TEXTURE_IMAGE_UNITS */
-      1217, /* GL_PROGRAM_ERROR_STRING_ARB */
-      1219, /* GL_PROGRAM_FORMAT_ASCII_ARB */
-      1218, /* GL_PROGRAM_FORMAT_ARB */
-      1702, /* GL_TEXTURE_UNSIGNED_REMAP_MODE_NV */
-       349, /* GL_DEPTH_BOUNDS_TEST_EXT */
-       348, /* GL_DEPTH_BOUNDS_EXT */
+       842, /* GL_MATRIX_PALETTE_ARB */
+       873, /* GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB */
+       876, /* GL_MAX_PALETTE_MATRICES_ARB */
+       319, /* GL_CURRENT_PALETTE_MATRIX_ARB */
+       836, /* GL_MATRIX_INDEX_ARRAY_ARB */
+       314, /* GL_CURRENT_MATRIX_INDEX_ARB */
+       838, /* GL_MATRIX_INDEX_ARRAY_SIZE_ARB */
+       840, /* GL_MATRIX_INDEX_ARRAY_TYPE_ARB */
+       839, /* GL_MATRIX_INDEX_ARRAY_STRIDE_ARB */
+       837, /* GL_MATRIX_INDEX_ARRAY_POINTER_ARB */
+      1662, /* GL_TEXTURE_DEPTH_SIZE */
+       374, /* GL_DEPTH_TEXTURE_MODE */
+      1627, /* GL_TEXTURE_COMPARE_MODE */
+      1625, /* GL_TEXTURE_COMPARE_FUNC */
+       241, /* GL_COMPARE_R_TO_TEXTURE */
+      1148, /* GL_POINT_SPRITE */
+       294, /* GL_COORD_REPLACE */
+      1152, /* GL_POINT_SPRITE_R_MODE_NV */
+      1271, /* GL_QUERY_COUNTER_BITS */
+       321, /* GL_CURRENT_QUERY */
+      1273, /* GL_QUERY_RESULT */
+      1275, /* GL_QUERY_RESULT_AVAILABLE */
+       924, /* GL_MAX_VERTEX_ATTRIBS */
+      1800, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED */
+       372, /* GL_DEPTH_STENCIL_TO_RGBA_NV */
+       371, /* GL_DEPTH_STENCIL_TO_BGRA_NV */
+       910, /* GL_MAX_TEXTURE_COORDS */
+       912, /* GL_MAX_TEXTURE_IMAGE_UNITS */
+      1219, /* GL_PROGRAM_ERROR_STRING_ARB */
+      1221, /* GL_PROGRAM_FORMAT_ASCII_ARB */
+      1220, /* GL_PROGRAM_FORMAT_ARB */
+      1711, /* GL_TEXTURE_UNSIGNED_REMAP_MODE_NV */
+       351, /* GL_DEPTH_BOUNDS_TEST_EXT */
+       350, /* GL_DEPTH_BOUNDS_EXT */
         52, /* GL_ARRAY_BUFFER */
-       456, /* GL_ELEMENT_ARRAY_BUFFER */
+       458, /* GL_ELEMENT_ARRAY_BUFFER */
         53, /* GL_ARRAY_BUFFER_BINDING */
-       457, /* GL_ELEMENT_ARRAY_BUFFER_BINDING */
-      1765, /* GL_VERTEX_ARRAY_BUFFER_BINDING */
-      1009, /* GL_NORMAL_ARRAY_BUFFER_BINDING */
-       146, /* GL_COLOR_ARRAY_BUFFER_BINDING */
-       619, /* GL_INDEX_ARRAY_BUFFER_BINDING */
-      1635, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING */
-       452, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING */
-      1392, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING */
-       505, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING */
-      1817, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */
-      1787, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */
-      1220, /* GL_PROGRAM_INSTRUCTIONS_ARB */
-       883, /* GL_MAX_PROGRAM_INSTRUCTIONS_ARB */
-      1226, /* GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
-       892, /* GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
-      1238, /* GL_PROGRAM_TEMPORARIES_ARB */
-       898, /* GL_MAX_PROGRAM_TEMPORARIES_ARB */
-      1228, /* GL_PROGRAM_NATIVE_TEMPORARIES_ARB */
-       894, /* GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB */
-      1232, /* GL_PROGRAM_PARAMETERS_ARB */
-       897, /* GL_MAX_PROGRAM_PARAMETERS_ARB */
-      1227, /* GL_PROGRAM_NATIVE_PARAMETERS_ARB */
-       893, /* GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB */
-      1213, /* GL_PROGRAM_ATTRIBS_ARB */
-       878, /* GL_MAX_PROGRAM_ATTRIBS_ARB */
-      1225, /* GL_PROGRAM_NATIVE_ATTRIBS_ARB */
-       891, /* GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB */
-      1211, /* GL_PROGRAM_ADDRESS_REGISTERS_ARB */
-       876, /* GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB */
-      1223, /* GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
-       889, /* GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
-       884, /* GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB */
-       880, /* GL_MAX_PROGRAM_ENV_PARAMETERS_ARB */
-      1241, /* GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB */
-      1713, /* GL_TRANSPOSE_CURRENT_MATRIX_ARB */
-      1282, /* GL_READ_ONLY */
-      1825, /* GL_WRITE_ONLY */
-      1284, /* GL_READ_WRITE */
+       459, /* GL_ELEMENT_ARRAY_BUFFER_BINDING */
+      1774, /* GL_VERTEX_ARRAY_BUFFER_BINDING */
+      1011, /* GL_NORMAL_ARRAY_BUFFER_BINDING */
+       148, /* GL_COLOR_ARRAY_BUFFER_BINDING */
+       621, /* GL_INDEX_ARRAY_BUFFER_BINDING */
+      1640, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING */
+       454, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING */
+      1394, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING */
+       507, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING */
+      1826, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */
+      1796, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */
+      1222, /* GL_PROGRAM_INSTRUCTIONS_ARB */
+       885, /* GL_MAX_PROGRAM_INSTRUCTIONS_ARB */
+      1228, /* GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
+       894, /* GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
+      1240, /* GL_PROGRAM_TEMPORARIES_ARB */
+       900, /* GL_MAX_PROGRAM_TEMPORARIES_ARB */
+      1230, /* GL_PROGRAM_NATIVE_TEMPORARIES_ARB */
+       896, /* GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB */
+      1234, /* GL_PROGRAM_PARAMETERS_ARB */
+       899, /* GL_MAX_PROGRAM_PARAMETERS_ARB */
+      1229, /* GL_PROGRAM_NATIVE_PARAMETERS_ARB */
+       895, /* GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB */
+      1215, /* GL_PROGRAM_ATTRIBS_ARB */
+       880, /* GL_MAX_PROGRAM_ATTRIBS_ARB */
+      1227, /* GL_PROGRAM_NATIVE_ATTRIBS_ARB */
+       893, /* GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB */
+      1213, /* GL_PROGRAM_ADDRESS_REGISTERS_ARB */
+       878, /* GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB */
+      1225, /* GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
+       891, /* GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
+       886, /* GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB */
+       882, /* GL_MAX_PROGRAM_ENV_PARAMETERS_ARB */
+      1243, /* GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB */
+      1722, /* GL_TRANSPOSE_CURRENT_MATRIX_ARB */
+      1284, /* GL_READ_ONLY */
+      1834, /* GL_WRITE_ONLY */
+      1286, /* GL_READ_WRITE */
        101, /* GL_BUFFER_ACCESS */
-       103, /* GL_BUFFER_MAPPED */
-       105, /* GL_BUFFER_MAP_POINTER */
-      1707, /* GL_TIME_ELAPSED_EXT */
-       794, /* GL_MATRIX0_ARB */
-       806, /* GL_MATRIX1_ARB */
-       818, /* GL_MATRIX2_ARB */
-       822, /* GL_MATRIX3_ARB */
-       824, /* GL_MATRIX4_ARB */
-       826, /* GL_MATRIX5_ARB */
-       828, /* GL_MATRIX6_ARB */
-       830, /* GL_MATRIX7_ARB */
-       832, /* GL_MATRIX8_ARB */
-       833, /* GL_MATRIX9_ARB */
-       796, /* GL_MATRIX10_ARB */
-       797, /* GL_MATRIX11_ARB */
-       798, /* GL_MATRIX12_ARB */
-       799, /* GL_MATRIX13_ARB */
-       800, /* GL_MATRIX14_ARB */
-       801, /* GL_MATRIX15_ARB */
-       802, /* GL_MATRIX16_ARB */
-       803, /* GL_MATRIX17_ARB */
-       804, /* GL_MATRIX18_ARB */
-       805, /* GL_MATRIX19_ARB */
-       808, /* GL_MATRIX20_ARB */
-       809, /* GL_MATRIX21_ARB */
-       810, /* GL_MATRIX22_ARB */
-       811, /* GL_MATRIX23_ARB */
-       812, /* GL_MATRIX24_ARB */
-       813, /* GL_MATRIX25_ARB */
-       814, /* GL_MATRIX26_ARB */
-       815, /* GL_MATRIX27_ARB */
-       816, /* GL_MATRIX28_ARB */
-       817, /* GL_MATRIX29_ARB */
-       820, /* GL_MATRIX30_ARB */
-       821, /* GL_MATRIX31_ARB */
-      1508, /* GL_STREAM_DRAW */
-      1510, /* GL_STREAM_READ */
-      1506, /* GL_STREAM_COPY */
-      1469, /* GL_STATIC_DRAW */
-      1471, /* GL_STATIC_READ */
-      1467, /* GL_STATIC_COPY */
-       446, /* GL_DYNAMIC_DRAW */
-       448, /* GL_DYNAMIC_READ */
-       444, /* GL_DYNAMIC_COPY */
-      1114, /* GL_PIXEL_PACK_BUFFER */
-      1118, /* GL_PIXEL_UNPACK_BUFFER */
-      1115, /* GL_PIXEL_PACK_BUFFER_BINDING */
-      1119, /* GL_PIXEL_UNPACK_BUFFER_BINDING */
-       343, /* GL_DEPTH24_STENCIL8 */
-      1700, /* GL_TEXTURE_STENCIL_SIZE */
-       881, /* GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */
-       879, /* GL_MAX_PROGRAM_CALL_DEPTH_NV */
-       882, /* GL_MAX_PROGRAM_IF_DEPTH_NV */
-       886, /* GL_MAX_PROGRAM_LOOP_DEPTH_NV */
-       885, /* GL_MAX_PROGRAM_LOOP_COUNT_NV */
-       843, /* GL_MAX_ARRAY_TEXTURE_LAYERS_EXT */
-      1502, /* GL_STENCIL_TEST_TWO_SIDE_EXT */
+       104, /* GL_BUFFER_MAPPED */
+       106, /* GL_BUFFER_MAP_POINTER */
+      1716, /* GL_TIME_ELAPSED_EXT */
+       796, /* GL_MATRIX0_ARB */
+       808, /* GL_MATRIX1_ARB */
+       820, /* GL_MATRIX2_ARB */
+       824, /* GL_MATRIX3_ARB */
+       826, /* GL_MATRIX4_ARB */
+       828, /* GL_MATRIX5_ARB */
+       830, /* GL_MATRIX6_ARB */
+       832, /* GL_MATRIX7_ARB */
+       834, /* GL_MATRIX8_ARB */
+       835, /* GL_MATRIX9_ARB */
+       798, /* GL_MATRIX10_ARB */
+       799, /* GL_MATRIX11_ARB */
+       800, /* GL_MATRIX12_ARB */
+       801, /* GL_MATRIX13_ARB */
+       802, /* GL_MATRIX14_ARB */
+       803, /* GL_MATRIX15_ARB */
+       804, /* GL_MATRIX16_ARB */
+       805, /* GL_MATRIX17_ARB */
+       806, /* GL_MATRIX18_ARB */
+       807, /* GL_MATRIX19_ARB */
+       810, /* GL_MATRIX20_ARB */
+       811, /* GL_MATRIX21_ARB */
+       812, /* GL_MATRIX22_ARB */
+       813, /* GL_MATRIX23_ARB */
+       814, /* GL_MATRIX24_ARB */
+       815, /* GL_MATRIX25_ARB */
+       816, /* GL_MATRIX26_ARB */
+       817, /* GL_MATRIX27_ARB */
+       818, /* GL_MATRIX28_ARB */
+       819, /* GL_MATRIX29_ARB */
+       822, /* GL_MATRIX30_ARB */
+       823, /* GL_MATRIX31_ARB */
+      1513, /* GL_STREAM_DRAW */
+      1515, /* GL_STREAM_READ */
+      1511, /* GL_STREAM_COPY */
+      1471, /* GL_STATIC_DRAW */
+      1473, /* GL_STATIC_READ */
+      1469, /* GL_STATIC_COPY */
+       448, /* GL_DYNAMIC_DRAW */
+       450, /* GL_DYNAMIC_READ */
+       446, /* GL_DYNAMIC_COPY */
+      1116, /* GL_PIXEL_PACK_BUFFER */
+      1120, /* GL_PIXEL_UNPACK_BUFFER */
+      1117, /* GL_PIXEL_PACK_BUFFER_BINDING */
+      1121, /* GL_PIXEL_UNPACK_BUFFER_BINDING */
+       345, /* GL_DEPTH24_STENCIL8 */
+      1708, /* GL_TEXTURE_STENCIL_SIZE */
+      1660, /* GL_TEXTURE_CUBE_MAP_SEAMLESS */
+       881, /* GL_MAX_PROGRAM_CALL_DEPTH_NV */
+       884, /* GL_MAX_PROGRAM_IF_DEPTH_NV */
+       888, /* GL_MAX_PROGRAM_LOOP_DEPTH_NV */
+       887, /* GL_MAX_PROGRAM_LOOP_COUNT_NV */
+       845, /* GL_MAX_ARRAY_TEXTURE_LAYERS_EXT */
+      1504, /* GL_STENCIL_TEST_TWO_SIDE_EXT */
         17, /* GL_ACTIVE_STENCIL_FACE_EXT */
-       943, /* GL_MIRROR_CLAMP_TO_BORDER_EXT */
-      1373, /* GL_SAMPLES_PASSED */
-       528, /* GL_FRAGMENT_SHADER */
-      1811, /* GL_VERTEX_SHADER */
-      1231, /* GL_PROGRAM_OBJECT_ARB */
-      1405, /* GL_SHADER_OBJECT_ARB */
-       867, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS */
-       926, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS */
-       920, /* GL_MAX_VARYING_FLOATS */
-       924, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS */
-       852, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS */
-      1034, /* GL_OBJECT_TYPE_ARB */
-      1407, /* GL_SHADER_TYPE */
-       493, /* GL_FLOAT_VEC2 */
-       495, /* GL_FLOAT_VEC3 */
-       497, /* GL_FLOAT_VEC4 */
-       646, /* GL_INT_VEC2 */
-       648, /* GL_INT_VEC3 */
-       650, /* GL_INT_VEC4 */
+       945, /* GL_MIRROR_CLAMP_TO_BORDER_EXT */
+      1375, /* GL_SAMPLES_PASSED */
+       108, /* GL_BUFFER_SERIALIZED_MODIFY_APPLE */
+       103, /* GL_BUFFER_FLUSHING_UNMAP_APPLE */
+       530, /* GL_FRAGMENT_SHADER */
+      1820, /* GL_VERTEX_SHADER */
+      1233, /* GL_PROGRAM_OBJECT_ARB */
+      1407, /* GL_SHADER_OBJECT_ARB */
+       869, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS */
+       928, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS */
+       922, /* GL_MAX_VARYING_FLOATS */
+       926, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS */
+       854, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS */
+      1036, /* GL_OBJECT_TYPE_ARB */
+      1409, /* GL_SHADER_TYPE */
+       495, /* GL_FLOAT_VEC2 */
+       497, /* GL_FLOAT_VEC3 */
+       499, /* GL_FLOAT_VEC4 */
+       648, /* GL_INT_VEC2 */
+       650, /* GL_INT_VEC3 */
+       652, /* GL_INT_VEC4 */
         93, /* GL_BOOL */
         95, /* GL_BOOL_VEC2 */
         97, /* GL_BOOL_VEC3 */
         99, /* GL_BOOL_VEC4 */
-       481, /* GL_FLOAT_MAT2 */
-       485, /* GL_FLOAT_MAT3 */
-       489, /* GL_FLOAT_MAT4 */
-      1364, /* GL_SAMPLER_1D */
-      1366, /* GL_SAMPLER_2D */
-      1368, /* GL_SAMPLER_3D */
-      1369, /* GL_SAMPLER_CUBE */
-      1365, /* GL_SAMPLER_1D_SHADOW */
-      1367, /* GL_SAMPLER_2D_SHADOW */
-       483, /* GL_FLOAT_MAT2x3 */
-       484, /* GL_FLOAT_MAT2x4 */
-       487, /* GL_FLOAT_MAT3x2 */
-       488, /* GL_FLOAT_MAT3x4 */
-       491, /* GL_FLOAT_MAT4x2 */
-       492, /* GL_FLOAT_MAT4x3 */
-       341, /* GL_DELETE_STATUS */
-       243, /* GL_COMPILE_STATUS */
-       701, /* GL_LINK_STATUS */
-      1759, /* GL_VALIDATE_STATUS */
-       631, /* GL_INFO_LOG_LENGTH */
+       483, /* GL_FLOAT_MAT2 */
+       487, /* GL_FLOAT_MAT3 */
+       491, /* GL_FLOAT_MAT4 */
+      1366, /* GL_SAMPLER_1D */
+      1368, /* GL_SAMPLER_2D */
+      1370, /* GL_SAMPLER_3D */
+      1371, /* GL_SAMPLER_CUBE */
+      1367, /* GL_SAMPLER_1D_SHADOW */
+      1369, /* GL_SAMPLER_2D_SHADOW */
+       485, /* GL_FLOAT_MAT2x3 */
+       486, /* GL_FLOAT_MAT2x4 */
+       489, /* GL_FLOAT_MAT3x2 */
+       490, /* GL_FLOAT_MAT3x4 */
+       493, /* GL_FLOAT_MAT4x2 */
+       494, /* GL_FLOAT_MAT4x3 */
+       343, /* GL_DELETE_STATUS */
+       245, /* GL_COMPILE_STATUS */
+       703, /* GL_LINK_STATUS */
+      1768, /* GL_VALIDATE_STATUS */
+       633, /* GL_INFO_LOG_LENGTH */
         55, /* GL_ATTACHED_SHADERS */
         20, /* GL_ACTIVE_UNIFORMS */
         21, /* GL_ACTIVE_UNIFORM_MAX_LENGTH */
-      1406, /* GL_SHADER_SOURCE_LENGTH */
+      1408, /* GL_SHADER_SOURCE_LENGTH */
         15, /* GL_ACTIVE_ATTRIBUTES */
         16, /* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH */
-       530, /* GL_FRAGMENT_SHADER_DERIVATIVE_HINT */
-      1409, /* GL_SHADING_LANGUAGE_VERSION */
-       318, /* GL_CURRENT_PROGRAM */
-      1083, /* GL_PALETTE4_RGB8_OES */
-      1085, /* GL_PALETTE4_RGBA8_OES */
-      1081, /* GL_PALETTE4_R5_G6_B5_OES */
-      1084, /* GL_PALETTE4_RGBA4_OES */
-      1082, /* GL_PALETTE4_RGB5_A1_OES */
-      1088, /* GL_PALETTE8_RGB8_OES */
-      1090, /* GL_PALETTE8_RGBA8_OES */
-      1086, /* GL_PALETTE8_R5_G6_B5_OES */
-      1089, /* GL_PALETTE8_RGBA4_OES */
-      1087, /* GL_PALETTE8_RGB5_A1_OES */
-       613, /* GL_IMPLEMENTATION_COLOR_READ_TYPE_OES */
-       612, /* GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES */
-      1744, /* GL_UNSIGNED_NORMALIZED */
-      1590, /* GL_TEXTURE_1D_ARRAY_EXT */
-      1252, /* GL_PROXY_TEXTURE_1D_ARRAY_EXT */
-      1592, /* GL_TEXTURE_2D_ARRAY_EXT */
-      1255, /* GL_PROXY_TEXTURE_2D_ARRAY_EXT */
-      1598, /* GL_TEXTURE_BINDING_1D_ARRAY_EXT */
-      1600, /* GL_TEXTURE_BINDING_2D_ARRAY_EXT */
-      1461, /* GL_SRGB */
-      1462, /* GL_SRGB8 */
-      1464, /* GL_SRGB_ALPHA */
-      1463, /* GL_SRGB8_ALPHA8 */
-      1421, /* GL_SLUMINANCE_ALPHA */
-      1420, /* GL_SLUMINANCE8_ALPHA8 */
-      1418, /* GL_SLUMINANCE */
-      1419, /* GL_SLUMINANCE8 */
-       264, /* GL_COMPRESSED_SRGB */
-       265, /* GL_COMPRESSED_SRGB_ALPHA */
-       262, /* GL_COMPRESSED_SLUMINANCE */
-       263, /* GL_COMPRESSED_SLUMINANCE_ALPHA */
-      1148, /* GL_POINT_SPRITE_COORD_ORIGIN */
-       709, /* GL_LOWER_LEFT */
-      1756, /* GL_UPPER_LEFT */
-      1484, /* GL_STENCIL_BACK_REF */
-      1485, /* GL_STENCIL_BACK_VALUE_MASK */
-      1486, /* GL_STENCIL_BACK_WRITEMASK */
-       437, /* GL_DRAW_FRAMEBUFFER_BINDING_EXT */
-      1298, /* GL_RENDERBUFFER_BINDING_EXT */
-      1279, /* GL_READ_FRAMEBUFFER */
-       436, /* GL_DRAW_FRAMEBUFFER */
-      1280, /* GL_READ_FRAMEBUFFER_BINDING_EXT */
-      1308, /* GL_RENDERBUFFER_SAMPLES */
-       540, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE */
-       538, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME */
-       549, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL */
-       545, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE */
-       547, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */
-       552, /* GL_FRAMEBUFFER_COMPLETE */
-       556, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT */
-       562, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT */
-       560, /* GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT */
-       558, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT */
-       561, /* GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT */
-       559, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT */
-       565, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT */
-       568, /* GL_FRAMEBUFFER_UNSUPPORTED */
-       566, /* GL_FRAMEBUFFER_STATUS_ERROR_EXT */
-       849, /* GL_MAX_COLOR_ATTACHMENTS_EXT */
-       152, /* GL_COLOR_ATTACHMENT0 */
-       154, /* GL_COLOR_ATTACHMENT1 */
-       168, /* GL_COLOR_ATTACHMENT2 */
-       170, /* GL_COLOR_ATTACHMENT3 */
-       172, /* GL_COLOR_ATTACHMENT4 */
-       174, /* GL_COLOR_ATTACHMENT5 */
-       176, /* GL_COLOR_ATTACHMENT6 */
-       178, /* GL_COLOR_ATTACHMENT7 */
-       180, /* GL_COLOR_ATTACHMENT8 */
-       182, /* GL_COLOR_ATTACHMENT9 */
-       155, /* GL_COLOR_ATTACHMENT10 */
-       157, /* GL_COLOR_ATTACHMENT11 */
-       159, /* GL_COLOR_ATTACHMENT12 */
-       161, /* GL_COLOR_ATTACHMENT13 */
-       163, /* GL_COLOR_ATTACHMENT14 */
-       165, /* GL_COLOR_ATTACHMENT15 */
-       344, /* GL_DEPTH_ATTACHMENT */
-      1474, /* GL_STENCIL_ATTACHMENT */
-       531, /* GL_FRAMEBUFFER */
-      1296, /* GL_RENDERBUFFER */
-      1310, /* GL_RENDERBUFFER_WIDTH */
-      1303, /* GL_RENDERBUFFER_HEIGHT */
-      1305, /* GL_RENDERBUFFER_INTERNAL_FORMAT */
-      1497, /* GL_STENCIL_INDEX_EXT */
-      1494, /* GL_STENCIL_INDEX1_EXT */
-      1495, /* GL_STENCIL_INDEX4_EXT */
-      1496, /* GL_STENCIL_INDEX8_EXT */
-      1493, /* GL_STENCIL_INDEX16_EXT */
-      1307, /* GL_RENDERBUFFER_RED_SIZE */
-      1302, /* GL_RENDERBUFFER_GREEN_SIZE */
-      1299, /* GL_RENDERBUFFER_BLUE_SIZE */
-      1297, /* GL_RENDERBUFFER_ALPHA_SIZE */
-      1300, /* GL_RENDERBUFFER_DEPTH_SIZE */
-      1309, /* GL_RENDERBUFFER_STENCIL_SIZE */
-       564, /* GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE */
-       905, /* GL_MAX_SAMPLES */
-      1266, /* GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT */
-       478, /* GL_FIRST_VERTEX_CONVENTION_EXT */
-       661, /* GL_LAST_VERTEX_CONVENTION_EXT */
-      1245, /* GL_PROVOKING_VERTEX_EXT */
-       298, /* GL_COPY_READ_BUFFER */
-       299, /* GL_COPY_WRITE_BUFFER */
-      1357, /* GL_RGBA_SNORM */
-      1353, /* GL_RGBA8_SNORM */
-      1414, /* GL_SIGNED_NORMALIZED */
-       463, /* GL_EVAL_BIT */
-      1277, /* GL_RASTER_POSITION_UNCLIPPED_IBM */
-       703, /* GL_LIST_BIT */
-      1606, /* GL_TEXTURE_BIT */
-      1388, /* GL_SCISSOR_BIT */
+       532, /* GL_FRAGMENT_SHADER_DERIVATIVE_HINT */
+      1411, /* GL_SHADING_LANGUAGE_VERSION */
+       320, /* GL_CURRENT_PROGRAM */
+      1085, /* GL_PALETTE4_RGB8_OES */
+      1087, /* GL_PALETTE4_RGBA8_OES */
+      1083, /* GL_PALETTE4_R5_G6_B5_OES */
+      1086, /* GL_PALETTE4_RGBA4_OES */
+      1084, /* GL_PALETTE4_RGB5_A1_OES */
+      1090, /* GL_PALETTE8_RGB8_OES */
+      1092, /* GL_PALETTE8_RGBA8_OES */
+      1088, /* GL_PALETTE8_R5_G6_B5_OES */
+      1091, /* GL_PALETTE8_RGBA4_OES */
+      1089, /* GL_PALETTE8_RGB5_A1_OES */
+       615, /* GL_IMPLEMENTATION_COLOR_READ_TYPE_OES */
+       614, /* GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES */
+      1753, /* GL_UNSIGNED_NORMALIZED */
+      1595, /* GL_TEXTURE_1D_ARRAY_EXT */
+      1254, /* GL_PROXY_TEXTURE_1D_ARRAY_EXT */
+      1597, /* GL_TEXTURE_2D_ARRAY_EXT */
+      1257, /* GL_PROXY_TEXTURE_2D_ARRAY_EXT */
+      1603, /* GL_TEXTURE_BINDING_1D_ARRAY_EXT */
+      1605, /* GL_TEXTURE_BINDING_2D_ARRAY_EXT */
+      1463, /* GL_SRGB */
+      1464, /* GL_SRGB8 */
+      1466, /* GL_SRGB_ALPHA */
+      1465, /* GL_SRGB8_ALPHA8 */
+      1423, /* GL_SLUMINANCE_ALPHA */
+      1422, /* GL_SLUMINANCE8_ALPHA8 */
+      1420, /* GL_SLUMINANCE */
+      1421, /* GL_SLUMINANCE8 */
+       266, /* GL_COMPRESSED_SRGB */
+       267, /* GL_COMPRESSED_SRGB_ALPHA */
+       264, /* GL_COMPRESSED_SLUMINANCE */
+       265, /* GL_COMPRESSED_SLUMINANCE_ALPHA */
+      1150, /* GL_POINT_SPRITE_COORD_ORIGIN */
+       711, /* GL_LOWER_LEFT */
+      1765, /* GL_UPPER_LEFT */
+      1486, /* GL_STENCIL_BACK_REF */
+      1487, /* GL_STENCIL_BACK_VALUE_MASK */
+      1488, /* GL_STENCIL_BACK_WRITEMASK */
+       439, /* GL_DRAW_FRAMEBUFFER_BINDING_EXT */
+      1300, /* GL_RENDERBUFFER_BINDING_EXT */
+      1281, /* GL_READ_FRAMEBUFFER */
+       438, /* GL_DRAW_FRAMEBUFFER */
+      1282, /* GL_READ_FRAMEBUFFER_BINDING_EXT */
+      1310, /* GL_RENDERBUFFER_SAMPLES */
+       542, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE */
+       540, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME */
+       551, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL */
+       547, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE */
+       549, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */
+       554, /* GL_FRAMEBUFFER_COMPLETE */
+       558, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT */
+       564, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT */
+       562, /* GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT */
+       560, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT */
+       563, /* GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT */
+       561, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT */
+       567, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT */
+       570, /* GL_FRAMEBUFFER_UNSUPPORTED */
+       568, /* GL_FRAMEBUFFER_STATUS_ERROR_EXT */
+       851, /* GL_MAX_COLOR_ATTACHMENTS_EXT */
+       154, /* GL_COLOR_ATTACHMENT0 */
+       156, /* GL_COLOR_ATTACHMENT1 */
+       170, /* GL_COLOR_ATTACHMENT2 */
+       172, /* GL_COLOR_ATTACHMENT3 */
+       174, /* GL_COLOR_ATTACHMENT4 */
+       176, /* GL_COLOR_ATTACHMENT5 */
+       178, /* GL_COLOR_ATTACHMENT6 */
+       180, /* GL_COLOR_ATTACHMENT7 */
+       182, /* GL_COLOR_ATTACHMENT8 */
+       184, /* GL_COLOR_ATTACHMENT9 */
+       157, /* GL_COLOR_ATTACHMENT10 */
+       159, /* GL_COLOR_ATTACHMENT11 */
+       161, /* GL_COLOR_ATTACHMENT12 */
+       163, /* GL_COLOR_ATTACHMENT13 */
+       165, /* GL_COLOR_ATTACHMENT14 */
+       167, /* GL_COLOR_ATTACHMENT15 */
+       346, /* GL_DEPTH_ATTACHMENT */
+      1476, /* GL_STENCIL_ATTACHMENT */
+       533, /* GL_FRAMEBUFFER */
+      1298, /* GL_RENDERBUFFER */
+      1312, /* GL_RENDERBUFFER_WIDTH */
+      1305, /* GL_RENDERBUFFER_HEIGHT */
+      1307, /* GL_RENDERBUFFER_INTERNAL_FORMAT */
+      1499, /* GL_STENCIL_INDEX_EXT */
+      1496, /* GL_STENCIL_INDEX1_EXT */
+      1497, /* GL_STENCIL_INDEX4_EXT */
+      1498, /* GL_STENCIL_INDEX8_EXT */
+      1495, /* GL_STENCIL_INDEX16_EXT */
+      1309, /* GL_RENDERBUFFER_RED_SIZE */
+      1304, /* GL_RENDERBUFFER_GREEN_SIZE */
+      1301, /* GL_RENDERBUFFER_BLUE_SIZE */
+      1299, /* GL_RENDERBUFFER_ALPHA_SIZE */
+      1302, /* GL_RENDERBUFFER_DEPTH_SIZE */
+      1311, /* GL_RENDERBUFFER_STENCIL_SIZE */
+       566, /* GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE */
+       907, /* GL_MAX_SAMPLES */
+      1268, /* GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT */
+       480, /* GL_FIRST_VERTEX_CONVENTION_EXT */
+       663, /* GL_LAST_VERTEX_CONVENTION_EXT */
+      1247, /* GL_PROVOKING_VERTEX_EXT */
+       300, /* GL_COPY_READ_BUFFER */
+       301, /* GL_COPY_WRITE_BUFFER */
+      1359, /* GL_RGBA_SNORM */
+      1355, /* GL_RGBA8_SNORM */
+      1416, /* GL_SIGNED_NORMALIZED */
+       465, /* GL_EVAL_BIT */
+      1279, /* GL_RASTER_POSITION_UNCLIPPED_IBM */
+       705, /* GL_LIST_BIT */
+      1611, /* GL_TEXTURE_BIT */
+      1390, /* GL_SCISSOR_BIT */
         29, /* GL_ALL_ATTRIB_BITS */
-       990, /* GL_MULTISAMPLE_BIT */
+       992, /* GL_MULTISAMPLE_BIT */
         30, /* GL_ALL_CLIENT_ATTRIB_BITS */
 };
 
index c60b58a..195fdde 100644 (file)
@@ -61,6 +61,7 @@ static const struct {
    { OFF, "GL_ARB_pixel_buffer_object",        F(EXT_pixel_buffer_object) },
    { OFF, "GL_ARB_point_parameters",           F(EXT_point_parameters) },
    { OFF, "GL_ARB_point_sprite",               F(ARB_point_sprite) },
+   { OFF, "GL_ARB_seamless_cube_map",          F(ARB_seamless_cube_map) },
    { OFF, "GL_ARB_shader_objects",             F(ARB_shader_objects) },
    { OFF, "GL_ARB_shading_language_100",       F(ARB_shading_language_100) },
    { OFF, "GL_ARB_shading_language_120",       F(ARB_shading_language_120) },
@@ -78,6 +79,7 @@ static const struct {
    { OFF, "GL_ARB_texture_non_power_of_two",   F(ARB_texture_non_power_of_two)},
    { OFF, "GL_ARB_texture_rectangle",          F(NV_texture_rectangle) },
    { ON,  "GL_ARB_transpose_matrix",           F(ARB_transpose_matrix) },
+   { OFF, "GL_ARB_vertex_array_bgra",          F(EXT_vertex_array_bgra) },
    { OFF, "GL_ARB_vertex_array_object",        F(ARB_vertex_array_object) },
    { ON,  "GL_ARB_vertex_buffer_object",       F(ARB_vertex_buffer_object) },
    { OFF, "GL_ARB_vertex_program",             F(ARB_vertex_program) },
@@ -413,6 +415,7 @@ _mesa_enable_2_0_extensions(GLcontext *ctx)
    ctx->Extensions.ARB_fragment_shader = GL_TRUE;
 #endif
    ctx->Extensions.ARB_point_sprite = GL_TRUE;
+   ctx->Extensions.EXT_blend_equation_separate = GL_TRUE;
    ctx->Extensions.ARB_texture_non_power_of_two = GL_TRUE;
 #if FEATURE_ARB_shader_objects
    ctx->Extensions.ARB_shader_objects = GL_TRUE;
index 83301f1..825a230 100644 (file)
@@ -417,21 +417,22 @@ test_attachment_completeness(const GLcontext *ctx, GLenum format,
       if (format == GL_COLOR) {
          if (att->Renderbuffer->_BaseFormat != GL_RGB &&
              att->Renderbuffer->_BaseFormat != GL_RGBA) {
-            ASSERT(att->Renderbuffer->RedBits);
-            ASSERT(att->Renderbuffer->GreenBits);
-            ASSERT(att->Renderbuffer->BlueBits);
             att_incomplete("bad renderbuffer color format");
             att->Complete = GL_FALSE;
             return;
          }
+         ASSERT(att->Renderbuffer->RedBits);
+         ASSERT(att->Renderbuffer->GreenBits);
+         ASSERT(att->Renderbuffer->BlueBits);
       }
       else if (format == GL_DEPTH) {
-         ASSERT(att->Renderbuffer->DepthBits);
          if (att->Renderbuffer->_BaseFormat == GL_DEPTH_COMPONENT) {
+            ASSERT(att->Renderbuffer->DepthBits);
             /* OK */
          }
          else if (ctx->Extensions.EXT_packed_depth_stencil &&
                   att->Renderbuffer->_BaseFormat == GL_DEPTH_STENCIL_EXT) {
+            ASSERT(att->Renderbuffer->DepthBits);
             /* OK */
          }
          else {
@@ -442,12 +443,13 @@ test_attachment_completeness(const GLcontext *ctx, GLenum format,
       }
       else {
          assert(format == GL_STENCIL);
-         ASSERT(att->Renderbuffer->StencilBits);
          if (att->Renderbuffer->_BaseFormat == GL_STENCIL_INDEX) {
+            ASSERT(att->Renderbuffer->StencilBits);
             /* OK */
          }
          else if (ctx->Extensions.EXT_packed_depth_stencil &&
                   att->Renderbuffer->_BaseFormat == GL_DEPTH_STENCIL_EXT) {
+            ASSERT(att->Renderbuffer->StencilBits);
             /* OK */
          }
          else {
@@ -2038,7 +2040,9 @@ _mesa_BlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
    if (mask & GL_STENCIL_BUFFER_BIT) {
       struct gl_renderbuffer *readRb = readFb->_StencilBuffer;
       struct gl_renderbuffer *drawRb = drawFb->_StencilBuffer;
-      if (readRb->StencilBits != drawRb->StencilBits) {
+      if (!readRb ||
+          !drawRb ||
+          readRb->StencilBits != drawRb->StencilBits) {
          _mesa_error(ctx, GL_INVALID_OPERATION,
                      "glBlitFramebufferEXT(stencil buffer size mismatch");
          return;
@@ -2048,7 +2052,9 @@ _mesa_BlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
    if (mask & GL_DEPTH_BUFFER_BIT) {
       struct gl_renderbuffer *readRb = readFb->_DepthBuffer;
       struct gl_renderbuffer *drawRb = drawFb->_DepthBuffer;
-      if (readRb->DepthBits != drawRb->DepthBits) {
+      if (!readRb ||
+          !drawRb ||
+          readRb->DepthBits != drawRb->DepthBits) {
          _mesa_error(ctx, GL_INVALID_OPERATION,
                      "glBlitFramebufferEXT(depth buffer size mismatch");
          return;
index 50a61bd..4323d3d 100644 (file)
@@ -67,7 +67,7 @@ _mesa_Fogiv(GLenum pname, const GLint *params )
         break;
       default:
          /* Error will be caught later in _mesa_Fogfv */
-         ;
+         ASSIGN_4V(p, 0.0F, 0.0F, 0.0F, 0.0F);
    }
    _mesa_Fogfv(pname, p);
 }
index 5a13c88..dc79b8c 100644 (file)
@@ -817,7 +817,7 @@ _mesa_update_framebuffer(GLcontext *ctx)
 
 /**
  * Check if the renderbuffer for a read operation (glReadPixels, glCopyPixels,
- * glCopyTex[Sub]Image, etc. exists.
+ * glCopyTex[Sub]Image, etc) exists.
  * \param format  a basic image format such as GL_RGB, GL_RGBA, GL_ALPHA,
  *                GL_DEPTH_COMPONENT, etc. or GL_COLOR, GL_DEPTH, GL_STENCIL.
  * \return GL_TRUE if buffer exists, GL_FALSE otherwise
@@ -825,8 +825,12 @@ _mesa_update_framebuffer(GLcontext *ctx)
 GLboolean
 _mesa_source_buffer_exists(GLcontext *ctx, GLenum format)
 {
-   const struct gl_renderbuffer_attachment *att
-      = ctx->ReadBuffer->Attachment;
+   const struct gl_renderbuffer_attachment *att = ctx->ReadBuffer->Attachment;
+
+   /* If we don't know the framebuffer status, update it now */
+   if (ctx->ReadBuffer->_Status == 0) {
+      _mesa_test_framebuffer_completeness(ctx, ctx->ReadBuffer);
+   }
 
    if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
       return GL_FALSE;
@@ -850,10 +854,8 @@ _mesa_source_buffer_exists(GLcontext *ctx, GLenum format)
       if (ctx->ReadBuffer->_ColorReadBuffer == NULL) {
          return GL_FALSE;
       }
-      /* XXX enable this post 6.5 release:
       ASSERT(ctx->ReadBuffer->_ColorReadBuffer->RedBits > 0 ||
              ctx->ReadBuffer->_ColorReadBuffer->IndexBits > 0);
-      */
       break;
    case GL_DEPTH:
    case GL_DEPTH_COMPONENT:
@@ -891,13 +893,17 @@ _mesa_source_buffer_exists(GLcontext *ctx, GLenum format)
 
 /**
  * As above, but for drawing operations.
- * XXX code do some code merging w/ above function.
+ * XXX could do some code merging w/ above function.
  */
 GLboolean
 _mesa_dest_buffer_exists(GLcontext *ctx, GLenum format)
 {
-   const struct gl_renderbuffer_attachment *att
-      = ctx->ReadBuffer->Attachment;
+   const struct gl_renderbuffer_attachment *att = ctx->DrawBuffer->Attachment;
+
+   /* If we don't know the framebuffer status, update it now */
+   if (ctx->DrawBuffer->_Status == 0) {
+      _mesa_test_framebuffer_completeness(ctx, ctx->DrawBuffer);
+   }
 
    if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
       return GL_FALSE;
@@ -918,7 +924,7 @@ _mesa_dest_buffer_exists(GLcontext *ctx, GLenum format)
    case GL_BGRA:
    case GL_ABGR_EXT:
    case GL_COLOR_INDEX:
-      /* nothing special */
+      /* Nothing special since GL_DRAW_BUFFER could be GL_NONE. */
       /* Could assert that colorbuffer has RedBits > 0 */
       break;
    case GL_DEPTH:
@@ -945,7 +951,7 @@ _mesa_dest_buffer_exists(GLcontext *ctx, GLenum format)
       break;
    default:
       _mesa_problem(ctx,
-                    "Unexpected format 0x%x in _mesa_source_buffer_exists",
+                    "Unexpected format 0x%x in _mesa_dest_buffer_exists",
                     format);
       return GL_FALSE;
    }
index 516159b..79f06a3 100644 (file)
@@ -1879,6 +1879,10 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          CHECK_EXT1(APPLE_vertex_array_object, "GetBooleanv");
          params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->Name);
          break;
+      case GL_TEXTURE_CUBE_MAP_SEAMLESS:
+         CHECK_EXT1(ARB_seamless_cube_map, "GetBooleanv");
+         params[0] = ctx->Texture.CubeMapSeamless;
+         break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetBooleanv(pname=0x%x)", pname);
    }
@@ -3701,6 +3705,10 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          CHECK_EXT1(APPLE_vertex_array_object, "GetFloatv");
          params[0] = (GLfloat)(ctx->Array.ArrayObj->Name);
          break;
+      case GL_TEXTURE_CUBE_MAP_SEAMLESS:
+         CHECK_EXT1(ARB_seamless_cube_map, "GetFloatv");
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Texture.CubeMapSeamless);
+         break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetFloatv(pname=0x%x)", pname);
    }
@@ -5523,6 +5531,10 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          CHECK_EXT1(APPLE_vertex_array_object, "GetIntegerv");
          params[0] = ctx->Array.ArrayObj->Name;
          break;
+      case GL_TEXTURE_CUBE_MAP_SEAMLESS:
+         CHECK_EXT1(ARB_seamless_cube_map, "GetIntegerv");
+         params[0] = BOOLEAN_TO_INT(ctx->Texture.CubeMapSeamless);
+         break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetIntegerv(pname=0x%x)", pname);
    }
index 5666ad0..e9c8226 100644 (file)
@@ -1015,6 +1015,10 @@ StateVars = [
        # GL_APPLE_vertex_array_object
        ( "GL_VERTEX_ARRAY_BINDING_APPLE", GLint, ["ctx->Array.ArrayObj->Name"], "",
          ["APPLE_vertex_array_object"] ),
+
+       # GL_ARB_seamless_cube_map
+       ( "GL_TEXTURE_CUBE_MAP_SEAMLESS", GLboolean, ["ctx->Texture.CubeMapSeamless"], "",
+         ["ARB_seamless_cube_map"] ),
 ]
 
 
index 41fd786..6599ed9 100644 (file)
@@ -266,5 +266,6 @@ _mesa_GetError( void )
       _mesa_debug(ctx, "glGetError <-- %s\n", _mesa_lookup_enum_by_nr(e));
 
    ctx->ErrorValue = (GLenum) GL_NO_ERROR;
+   ctx->ErrorDebugCount = 0;
    return e;
 }
index 5fee4fd..726a50d 100644 (file)
@@ -649,7 +649,7 @@ _mesa_GetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvo
       return;
    }
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       /* pack min/max values into a PBO */
       GLubyte *buf;
       if (!_mesa_validate_pbo_access(1, &ctx->Pack, 2, 1, 1,
@@ -687,7 +687,7 @@ _mesa_GetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvo
                                  format, type, values, &ctx->Pack, 0x0);
    }
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
                               ctx->Pack.BufferObj);
    }
@@ -733,7 +733,7 @@ _mesa_GetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, G
       return;
    }
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       /* pack min/max values into a PBO */
       GLubyte *buf;
       if (!_mesa_validate_pbo_access(1, &ctx->Pack, ctx->Histogram.Width, 1, 1,
@@ -761,7 +761,7 @@ _mesa_GetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, G
                   (CONST GLuint (*)[4]) ctx->Histogram.Count,
                   format, type, values, &ctx->Pack);
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
                               ctx->Pack.BufferObj);
    }
index 090e5eb..d77c593 100644 (file)
@@ -531,6 +531,210 @@ _mesa_is_legal_format_and_type( GLcontext *ctx, GLenum format, GLenum type )
 
 
 /**
+ * Test if the given image format is a color/RGBA format (i.e., not color
+ * index, depth, stencil, etc).
+ * \param format  the image format value (may by an internal texture format)
+ * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise.
+ */
+GLboolean
+_mesa_is_color_format(GLenum format)
+{
+   switch (format) {
+      case GL_RED:
+      case GL_GREEN:
+      case GL_BLUE:
+      case GL_ALPHA:
+      case GL_ALPHA4:
+      case GL_ALPHA8:
+      case GL_ALPHA12:
+      case GL_ALPHA16:
+      case 1:
+      case GL_LUMINANCE:
+      case GL_LUMINANCE4:
+      case GL_LUMINANCE8:
+      case GL_LUMINANCE12:
+      case GL_LUMINANCE16:
+      case 2:
+      case GL_LUMINANCE_ALPHA:
+      case GL_LUMINANCE4_ALPHA4:
+      case GL_LUMINANCE6_ALPHA2:
+      case GL_LUMINANCE8_ALPHA8:
+      case GL_LUMINANCE12_ALPHA4:
+      case GL_LUMINANCE12_ALPHA12:
+      case GL_LUMINANCE16_ALPHA16:
+      case GL_INTENSITY:
+      case GL_INTENSITY4:
+      case GL_INTENSITY8:
+      case GL_INTENSITY12:
+      case GL_INTENSITY16:
+      case 3:
+      case GL_RGB:
+      case GL_BGR:
+      case GL_R3_G3_B2:
+      case GL_RGB4:
+      case GL_RGB5:
+      case GL_RGB8:
+      case GL_RGB10:
+      case GL_RGB12:
+      case GL_RGB16:
+      case 4:
+      case GL_ABGR_EXT:
+      case GL_RGBA:
+      case GL_BGRA:
+      case GL_RGBA2:
+      case GL_RGBA4:
+      case GL_RGB5_A1:
+      case GL_RGBA8:
+      case GL_RGB10_A2:
+      case GL_RGBA12:
+      case GL_RGBA16:
+      /* float texture formats */
+      case GL_ALPHA16F_ARB:
+      case GL_ALPHA32F_ARB:
+      case GL_LUMINANCE16F_ARB:
+      case GL_LUMINANCE32F_ARB:
+      case GL_LUMINANCE_ALPHA16F_ARB:
+      case GL_LUMINANCE_ALPHA32F_ARB:
+      case GL_INTENSITY16F_ARB:
+      case GL_INTENSITY32F_ARB:
+      case GL_RGB16F_ARB:
+      case GL_RGB32F_ARB:
+      case GL_RGBA16F_ARB:
+      case GL_RGBA32F_ARB:
+      /* compressed formats */
+      case GL_COMPRESSED_ALPHA:
+      case GL_COMPRESSED_LUMINANCE:
+      case GL_COMPRESSED_LUMINANCE_ALPHA:
+      case GL_COMPRESSED_INTENSITY:
+      case GL_COMPRESSED_RGB:
+      case GL_COMPRESSED_RGBA:
+      case GL_RGB_S3TC:
+      case GL_RGB4_S3TC:
+      case GL_RGBA_S3TC:
+      case GL_RGBA4_S3TC:
+      case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+      case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+      case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
+      case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+      case GL_COMPRESSED_RGB_FXT1_3DFX:
+      case GL_COMPRESSED_RGBA_FXT1_3DFX:
+#if FEATURE_EXT_texture_sRGB
+      case GL_SRGB_EXT:
+      case GL_SRGB8_EXT:
+      case GL_SRGB_ALPHA_EXT:
+      case GL_SRGB8_ALPHA8_EXT:
+      case GL_SLUMINANCE_ALPHA_EXT:
+      case GL_SLUMINANCE8_ALPHA8_EXT:
+      case GL_SLUMINANCE_EXT:
+      case GL_SLUMINANCE8_EXT:
+      case GL_COMPRESSED_SRGB_EXT:
+      case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
+      case GL_COMPRESSED_SRGB_ALPHA_EXT:
+      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
+      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
+      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
+      case GL_COMPRESSED_SLUMINANCE_EXT:
+      case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
+#endif /* FEATURE_EXT_texture_sRGB */
+         return GL_TRUE;
+      /* signed texture formats */
+      case GL_RGBA_SNORM:
+      case GL_RGBA8_SNORM:
+         return GL_TRUE;
+      case GL_YCBCR_MESA:  /* not considered to be RGB */
+         /* fall-through */
+      default:
+         return GL_FALSE;
+   }
+}
+
+
+/**
+ * Test if the given image format is a color index format.
+ */
+GLboolean
+_mesa_is_index_format(GLenum format)
+{
+   switch (format) {
+      case GL_COLOR_INDEX:
+      case GL_COLOR_INDEX1_EXT:
+      case GL_COLOR_INDEX2_EXT:
+      case GL_COLOR_INDEX4_EXT:
+      case GL_COLOR_INDEX8_EXT:
+      case GL_COLOR_INDEX12_EXT:
+      case GL_COLOR_INDEX16_EXT:
+         return GL_TRUE;
+      default:
+         return GL_FALSE;
+   }
+}
+
+
+/**
+ * Test if the given image format is a depth component format.
+ */
+GLboolean
+_mesa_is_depth_format(GLenum format)
+{
+   switch (format) {
+      case GL_DEPTH_COMPONENT:
+      case GL_DEPTH_COMPONENT16:
+      case GL_DEPTH_COMPONENT24:
+      case GL_DEPTH_COMPONENT32:
+         return GL_TRUE;
+      default:
+         return GL_FALSE;
+   }
+}
+
+
+/**
+ * Test if the given image format is a YCbCr format.
+ */
+GLboolean
+_mesa_is_ycbcr_format(GLenum format)
+{
+   switch (format) {
+      case GL_YCBCR_MESA:
+         return GL_TRUE;
+      default:
+         return GL_FALSE;
+   }
+}
+
+
+/**
+ * Test if the given image format is a depth+stencil format.
+ */
+GLboolean
+_mesa_is_depthstencil_format(GLenum format)
+{
+   switch (format) {
+      case GL_DEPTH24_STENCIL8_EXT:
+      case GL_DEPTH_STENCIL_EXT:
+         return GL_TRUE;
+      default:
+         return GL_FALSE;
+   }
+}
+
+/**
+ * Test if the given image format is a dudv format.
+ */
+GLboolean
+_mesa_is_dudv_format(GLenum format)
+{
+   switch (format) {
+      case GL_DUDV_ATI:
+      case GL_DU8DV8_ATI:
+         return GL_TRUE;
+      default:
+         return GL_FALSE;
+   }
+}
+
+
+/**
  * Return the address of a specific pixel in an image (1D, 2D or 3D).
  *
  * Pixel unpacking/packing parameters are observed according to \p packing.
@@ -5335,3 +5539,181 @@ _mesa_clip_to_region(GLint xmin, GLint ymin,
 
    return GL_TRUE;
 }
+
+
+/**
+ * Clip dst coords against Xmax (or Ymax).
+ */
+static INLINE void
+clip_right_or_top(GLint *srcX0, GLint *srcX1,
+                  GLint *dstX0, GLint *dstX1,
+                  GLint maxValue)
+{
+   GLfloat t, bias;
+
+   if (*dstX1 > maxValue) {
+      /* X1 outside right edge */
+      ASSERT(*dstX0 < maxValue); /* X0 should be inside right edge */
+      t = (GLfloat) (maxValue - *dstX0) / (GLfloat) (*dstX1 - *dstX0);
+      /* chop off [t, 1] part */
+      ASSERT(t >= 0.0 && t <= 1.0);
+      *dstX1 = maxValue;
+      bias = (*srcX0 < *srcX1) ? 0.5 : -0.5;
+      *srcX1 = *srcX0 + (GLint) (t * (*srcX1 - *srcX0) + bias);
+   }
+   else if (*dstX0 > maxValue) {
+      /* X0 outside right edge */
+      ASSERT(*dstX1 < maxValue); /* X1 should be inside right edge */
+      t = (GLfloat) (maxValue - *dstX1) / (GLfloat) (*dstX0 - *dstX1);
+      /* chop off [t, 1] part */
+      ASSERT(t >= 0.0 && t <= 1.0);
+      *dstX0 = maxValue;
+      bias = (*srcX0 < *srcX1) ? -0.5 : 0.5;
+      *srcX0 = *srcX1 + (GLint) (t * (*srcX0 - *srcX1) + bias);
+   }
+}
+
+
+/**
+ * Clip dst coords against Xmin (or Ymin).
+ */
+static INLINE void
+clip_left_or_bottom(GLint *srcX0, GLint *srcX1,
+                    GLint *dstX0, GLint *dstX1,
+                    GLint minValue)
+{
+   GLfloat t, bias;
+
+   if (*dstX0 < minValue) {
+      /* X0 outside left edge */
+      ASSERT(*dstX1 > minValue); /* X1 should be inside left edge */
+      t = (GLfloat) (minValue - *dstX0) / (GLfloat) (*dstX1 - *dstX0);
+      /* chop off [0, t] part */
+      ASSERT(t >= 0.0 && t <= 1.0);
+      *dstX0 = minValue;
+      bias = (*srcX0 < *srcX1) ? 0.5 : -0.5; /* flipped??? */
+      *srcX0 = *srcX0 + (GLint) (t * (*srcX1 - *srcX0) + bias);
+   }
+   else if (*dstX1 < minValue) {
+      /* X1 outside left edge */
+      ASSERT(*dstX0 > minValue); /* X0 should be inside left edge */
+      t = (GLfloat) (minValue - *dstX1) / (GLfloat) (*dstX0 - *dstX1);
+      /* chop off [0, t] part */
+      ASSERT(t >= 0.0 && t <= 1.0);
+      *dstX1 = minValue;
+      bias = (*srcX0 < *srcX1) ? 0.5 : -0.5;
+      *srcX1 = *srcX1 + (GLint) (t * (*srcX0 - *srcX1) + bias);
+   }
+}
+
+
+/**
+ * Do clipping of blit src/dest rectangles.
+ * The dest rect is clipped against both the buffer bounds and scissor bounds.
+ * The src rect is just clipped against the buffer bounds.
+ *
+ * When either the src or dest rect is clipped, the other is also clipped
+ * proportionately!
+ *
+ * Note that X0 need not be less than X1 (same for Y) for either the source
+ * and dest rects.  That makes the clipping a little trickier.
+ *
+ * \return GL_TRUE if anything is left to draw, GL_FALSE if totally clipped
+ */
+GLboolean
+_mesa_clip_blit(GLcontext *ctx,
+                GLint *srcX0, GLint *srcY0, GLint *srcX1, GLint *srcY1,
+                GLint *dstX0, GLint *dstY0, GLint *dstX1, GLint *dstY1)
+{
+   const GLint srcXmin = 0;
+   const GLint srcXmax = ctx->ReadBuffer->Width;
+   const GLint srcYmin = 0;
+   const GLint srcYmax = ctx->ReadBuffer->Height;
+
+   /* these include scissor bounds */
+   const GLint dstXmin = ctx->DrawBuffer->_Xmin;
+   const GLint dstXmax = ctx->DrawBuffer->_Xmax;
+   const GLint dstYmin = ctx->DrawBuffer->_Ymin;
+   const GLint dstYmax = ctx->DrawBuffer->_Ymax;
+
+   /*
+   printf("PreClipX:  src: %d .. %d  dst: %d .. %d\n",
+          *srcX0, *srcX1, *dstX0, *dstX1);
+   printf("PreClipY:  src: %d .. %d  dst: %d .. %d\n",
+          *srcY0, *srcY1, *dstY0, *dstY1);
+   */
+
+   /* trivial rejection tests */
+   if (*dstX0 == *dstX1)
+      return GL_FALSE; /* no width */
+   if (*dstX0 <= dstXmin && *dstX1 <= dstXmin)
+      return GL_FALSE; /* totally out (left) of bounds */
+   if (*dstX0 >= dstXmax && *dstX1 >= dstXmax)
+      return GL_FALSE; /* totally out (right) of bounds */
+
+   if (*dstY0 == *dstY1)
+      return GL_FALSE;
+   if (*dstY0 <= dstYmin && *dstY1 <= dstYmin)
+      return GL_FALSE;
+   if (*dstY0 >= dstYmax && *dstY1 >= dstYmax)
+      return GL_FALSE;
+
+   if (*srcX0 == *srcX1)
+      return GL_FALSE;
+   if (*srcX0 <= srcXmin && *srcX1 <= srcXmin)
+      return GL_FALSE;
+   if (*srcX0 >= srcXmax && *srcX1 >= srcXmax)
+      return GL_FALSE;
+
+   if (*srcY0 == *srcY1)
+      return GL_FALSE;
+   if (*srcY0 <= srcYmin && *srcY1 <= srcYmin)
+      return GL_FALSE;
+   if (*srcY0 >= srcYmax && *srcY1 >= srcYmax)
+      return GL_FALSE;
+
+   /*
+    * dest clip
+    */
+   clip_right_or_top(srcX0, srcX1, dstX0, dstX1, dstXmax);
+   clip_right_or_top(srcY0, srcY1, dstY0, dstY1, dstYmax);
+   clip_left_or_bottom(srcX0, srcX1, dstX0, dstX1, dstXmin);
+   clip_left_or_bottom(srcY0, srcY1, dstY0, dstY1, dstYmin);
+
+   /*
+    * src clip (just swap src/dst values from above)
+    */
+   clip_right_or_top(dstX0, dstX1, srcX0, srcX1, srcXmax);
+   clip_right_or_top(dstY0, dstY1, srcY0, srcY1, srcYmax);
+   clip_left_or_bottom(dstX0, dstX1, srcX0, srcX1, srcXmin);
+   clip_left_or_bottom(dstY0, dstY1, srcY0, srcY1, srcYmin);
+
+   /*
+   printf("PostClipX: src: %d .. %d  dst: %d .. %d\n",
+          *srcX0, *srcX1, *dstX0, *dstX1);
+   printf("PostClipY: src: %d .. %d  dst: %d .. %d\n",
+          *srcY0, *srcY1, *dstY0, *dstY1);
+   */
+
+   ASSERT(*dstX0 >= dstXmin);
+   ASSERT(*dstX0 <= dstXmax);
+   ASSERT(*dstX1 >= dstXmin);
+   ASSERT(*dstX1 <= dstXmax);
+
+   ASSERT(*dstY0 >= dstYmin);
+   ASSERT(*dstY0 <= dstYmax);
+   ASSERT(*dstY1 >= dstYmin);
+   ASSERT(*dstY1 <= dstYmax);
+
+   ASSERT(*srcX0 >= srcXmin);
+   ASSERT(*srcX0 <= srcXmax);
+   ASSERT(*srcX1 >= srcXmin);
+   ASSERT(*srcX1 <= srcXmax);
+
+   ASSERT(*srcY0 >= srcYmin);
+   ASSERT(*srcY0 <= srcYmax);
+   ASSERT(*srcY1 >= srcYmin);
+   ASSERT(*srcY1 <= srcYmax);
+
+   return GL_TRUE;
+}
index b26c27e..20459a5 100644 (file)
@@ -54,6 +54,24 @@ _mesa_bytes_per_pixel( GLenum format, GLenum type );
 extern GLboolean
 _mesa_is_legal_format_and_type( GLcontext *ctx, GLenum format, GLenum type );
 
+extern GLboolean
+_mesa_is_color_format(GLenum format);
+
+extern GLboolean
+_mesa_is_index_format(GLenum format);
+
+extern GLboolean
+_mesa_is_depth_format(GLenum format);
+
+extern GLboolean
+_mesa_is_ycbcr_format(GLenum format);
+
+extern GLboolean
+_mesa_is_depthstencil_format(GLenum format);
+
+extern GLboolean
+_mesa_is_dudv_format(GLenum format);
+
 
 extern GLvoid *
 _mesa_image_address( GLuint dimensions,
@@ -291,4 +309,10 @@ _mesa_clip_to_region(GLint xmin, GLint ymin,
                      GLint *x, GLint *y,
                      GLsizei *width, GLsizei *height );
 
+extern GLboolean
+_mesa_clip_blit(GLcontext *ctx,
+                GLint *srcX0, GLint *srcY0, GLint *srcX1, GLint *srcY1,
+                GLint *dstX0, GLint *dstY0, GLint *dstX1, GLint *dstY1);
+
+
 #endif
index 1722579..6ffaddc 100644 (file)
@@ -911,6 +911,20 @@ _mesa_strtod( const char *s, char **end )
    return strtod(s, end);
 }
 
+/** Compute simple checksum/hash for a string */
+unsigned int
+_mesa_str_checksum(const char *str)
+{
+   /* This could probably be much better */
+   unsigned int sum, i;
+   const char *c;
+   sum = i = 1;
+   for (c = str; *c; c++)
+      sum += *c * (i % 100);
+   return sum;
+}
+
+
 /*@}*/
 
 
@@ -1021,23 +1035,59 @@ output_if_debug(const char *prefixString, const char *outputString,
    }
 }
 
-static const char *error_string( GLenum error );
 
-static void flush_delayed_errors( GLcontext *ctx )
+/**
+ * Return string version of GL error code.
+ */
+static const char *
+error_string( GLenum error )
+{
+   switch (error) {
+   case GL_NO_ERROR:
+      return "GL_NO_ERROR";
+   case GL_INVALID_VALUE:
+      return "GL_INVALID_VALUE";
+   case GL_INVALID_ENUM:
+      return "GL_INVALID_ENUM";
+   case GL_INVALID_OPERATION:
+      return "GL_INVALID_OPERATION";
+   case GL_STACK_OVERFLOW:
+      return "GL_STACK_OVERFLOW";
+   case GL_STACK_UNDERFLOW:
+      return "GL_STACK_UNDERFLOW";
+   case GL_OUT_OF_MEMORY:
+      return "GL_OUT_OF_MEMORY";
+   case GL_TABLE_TOO_LARGE:
+      return "GL_TABLE_TOO_LARGE";
+   case GL_INVALID_FRAMEBUFFER_OPERATION_EXT:
+      return "GL_INVALID_FRAMEBUFFER_OPERATION";
+   default:
+      return "unknown";
+   }
+}
+
+
+/**
+ * When a new type of error is recorded, print a message describing
+ * previous errors which were accumulated.
+ */
+static void
+flush_delayed_errors( GLcontext *ctx )
 {
-   char s2[MAXSTRING];
+   char s[MAXSTRING];
 
    if (ctx->ErrorDebugCount) {
-      _mesa_snprintf(s2, MAXSTRING, "%d similar %s errors", 
+      _mesa_snprintf(s, MAXSTRING, "%d similar %s errors", 
                      ctx->ErrorDebugCount,
                      error_string(ctx->ErrorValue));
 
-      output_if_debug("Mesa: ", s2, GL_TRUE);
+      output_if_debug("Mesa", s, GL_TRUE);
 
       ctx->ErrorDebugCount = 0;
    }
 }
 
+
 /**
  * Report a warning (a recoverable error condition) to stderr if
  * either DEBUG is defined or the MESA_DEBUG env var is set.
@@ -1083,31 +1133,6 @@ _mesa_problem( const GLcontext *ctx, const char *fmtString, ... )
    fprintf(stderr, "Please report at bugzilla.freedesktop.org\n");
 }
 
-static const char *error_string( GLenum error )
-{
-   switch (error) {
-   case GL_NO_ERROR:
-      return "GL_NO_ERROR";
-   case GL_INVALID_VALUE:
-      return "GL_INVALID_VALUE";
-   case GL_INVALID_ENUM:
-      return "GL_INVALID_ENUM";
-   case GL_INVALID_OPERATION:
-      return "GL_INVALID_OPERATION";
-   case GL_STACK_OVERFLOW:
-      return "GL_STACK_OVERFLOW";
-   case GL_STACK_UNDERFLOW:
-      return "GL_STACK_UNDERFLOW";
-   case GL_OUT_OF_MEMORY:
-      return "GL_OUT_OF_MEMORY";
-   case GL_TABLE_TOO_LARGE:
-      return "GL_TABLE_TOO_LARGE";
-   case GL_INVALID_FRAMEBUFFER_OPERATION_EXT:
-      return "GL_INVALID_FRAMEBUFFER_OPERATION";
-   default:
-      return "unknown";
-   }
-}
 
 /**
  * Record an OpenGL state error.  These usually occur when the user
index 7b61e22..fb85f08 100644 (file)
@@ -586,6 +586,9 @@ _mesa_atoi( const char *s );
 extern double
 _mesa_strtod( const char *s, char **end );
 
+extern unsigned int
+_mesa_str_checksum(const char *str);
+
 extern int
 _mesa_sprintf( char *str, const char *fmt, ... );
 
index 0f0d831..10c89f4 100644 (file)
@@ -528,7 +528,7 @@ _mesa_LightModeliv( GLenum pname, const GLint *params )
          break;
       default:
          /* Error will be caught later in gl_LightModelfv */
-         ;
+         ASSIGN_4V(fparam, 0.0F, 0.0F, 0.0F, 0.0F);
    }
    _mesa_LightModelfv( pname, fparam );
 }
@@ -1256,15 +1256,15 @@ _mesa_update_tnl_spaces( GLcontext *ctx, GLuint new_state )
         ctx->Driver.LightingSpaceChange( ctx );
    }
    else {
-      GLuint new_state = ctx->NewState;
+      GLuint new_state2 = ctx->NewState;
 
       /* Recalculate that same state only if it has been invalidated
        * by other statechanges.
        */
-      if (new_state & _NEW_MODELVIEW)
+      if (new_state2 & _NEW_MODELVIEW)
         update_modelview_scale(ctx);
 
-      if (new_state & (_NEW_LIGHT|_NEW_MODELVIEW))
+      if (new_state2 & (_NEW_LIGHT|_NEW_MODELVIEW))
         compute_light_positions( ctx );
    }
 }
index d0309f5..2d497ff 100644 (file)
@@ -83,6 +83,7 @@
 /*@{*/
 struct _mesa_HashTable;
 struct gl_attrib_node;
+struct gl_meta_state;
 struct gl_pixelstore_attrib;
 struct gl_program_cache;
 struct gl_texture_format;
@@ -227,7 +228,9 @@ typedef enum
    FRAG_ATTRIB_TEX5 = 9,
    FRAG_ATTRIB_TEX6 = 10,
    FRAG_ATTRIB_TEX7 = 11,
-   FRAG_ATTRIB_VAR0 = 12,  /**< shader varying */
+   FRAG_ATTRIB_FACE = 12,  /**< front/back face */
+   FRAG_ATTRIB_PNTC = 13,  /**< sprite/point coord */
+   FRAG_ATTRIB_VAR0 = 14,  /**< shader varying */
    FRAG_ATTRIB_MAX = (FRAG_ATTRIB_VAR0 + MAX_VARYING)
 } gl_frag_attrib;
 
@@ -239,6 +242,8 @@ typedef enum
 #define FRAG_BIT_COL0  (1 << FRAG_ATTRIB_COL0)
 #define FRAG_BIT_COL1  (1 << FRAG_ATTRIB_COL1)
 #define FRAG_BIT_FOGC  (1 << FRAG_ATTRIB_FOGC)
+#define FRAG_BIT_FACE  (1 << FRAG_ATTRIB_FACE)
+#define FRAG_BIT_PNTC  (1 << FRAG_ATTRIB_PNTC)
 #define FRAG_BIT_TEX0  (1 << FRAG_ATTRIB_TEX0)
 #define FRAG_BIT_TEX1  (1 << FRAG_ATTRIB_TEX1)
 #define FRAG_BIT_TEX2  (1 << FRAG_ATTRIB_TEX2)
@@ -1440,6 +1445,9 @@ struct gl_texture_attrib
 
    struct gl_texture_object *ProxyTex[NUM_TEXTURE_TARGETS];
 
+   /** GL_ARB_seamless_cubemap */
+   GLboolean CubeMapSeamless;
+
    /** GL_EXT_shared_texture_palette */
    GLboolean SharedPalette;
    struct gl_color_table Palette;
@@ -1834,9 +1842,6 @@ struct gl_fragment_program
    struct gl_program Base;   /**< base class */
    GLenum FogOption;
    GLboolean UsesKill;          /**< shader uses KIL instruction */
-   GLboolean UsesPointCoord;    /**< shader uses gl_PointCoord */
-   GLboolean UsesFrontFacing;   /**< shader used gl_FrontFacing */
-   GLboolean UsesFogFragCoord;  /**< shader used gl_FogFragCoord */
 };
 
 
@@ -2004,6 +2009,7 @@ struct gl_shader
    GLboolean Main;  /**< shader defines main() */
    GLboolean UnresolvedRefs;
    const GLchar *Source;  /**< Source code string */
+   GLuint SourceChecksum;       /**< for debug/logging purposes */
    struct gl_program *Program;  /**< Post-compile assembly code */
    GLchar *InfoLog;
    struct gl_sl_pragmas Pragmas;
@@ -2034,6 +2040,7 @@ struct gl_shader_program
    struct gl_program_parameter_list *Varying;
    GLboolean LinkStatus;   /**< GL_LINK_STATUS */
    GLboolean Validated;
+   GLboolean _Used;        /**< Ever used for drawing? */
    GLchar *InfoLog;
 };   
 
@@ -2454,6 +2461,7 @@ struct gl_extensions
    GLboolean ARB_multitexture;
    GLboolean ARB_occlusion_query;
    GLboolean ARB_point_sprite;
+   GLboolean ARB_seamless_cube_map;
    GLboolean ARB_shader_objects;
    GLboolean ARB_shading_language_100;
    GLboolean ARB_shading_language_120;
@@ -2981,6 +2989,8 @@ struct __GLcontextRec
    struct gl_buffer_object *CopyWriteBuffer; /**< GL_ARB_copy_buffer */
    /*@}*/
 
+   struct gl_meta_state *Meta;  /**< for "meta" operations */
+
 #if FEATURE_EXT_framebuffer_object
    struct gl_renderbuffer *CurrentRenderbuffer;
 #endif
index d9f3e47..25f55a4 100644 (file)
@@ -158,7 +158,7 @@ _mesa_PixelMapfv( GLenum map, GLsizei mapsize, const GLfloat *values )
 
    FLUSH_VERTICES(ctx, _NEW_PIXEL);
 
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       /* unpack pixelmap from PBO */
       GLubyte *buf;
       /* Note, need to use DefaultPacking and Unpack's buffer object */
@@ -188,7 +188,7 @@ _mesa_PixelMapfv( GLenum map, GLsizei mapsize, const GLfloat *values )
 
    store_pixelmap(ctx, map, mapsize, values);
 
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
                               ctx->Unpack.BufferObj);
    }
@@ -217,7 +217,7 @@ _mesa_PixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values )
 
    FLUSH_VERTICES(ctx, _NEW_PIXEL);
 
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       /* unpack pixelmap from PBO */
       GLubyte *buf;
       /* Note, need to use DefaultPacking and Unpack's buffer object */
@@ -259,7 +259,7 @@ _mesa_PixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values )
       }
    }
 
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
                               ctx->Unpack.BufferObj);
    }
@@ -290,7 +290,7 @@ _mesa_PixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values )
 
    FLUSH_VERTICES(ctx, _NEW_PIXEL);
 
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       /* unpack pixelmap from PBO */
       GLubyte *buf;
       /* Note, need to use DefaultPacking and Unpack's buffer object */
@@ -333,7 +333,7 @@ _mesa_PixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values )
       }
    }
 
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
                               ctx->Unpack.BufferObj);
    }
@@ -359,7 +359,7 @@ _mesa_GetPixelMapfv( GLenum map, GLfloat *values )
 
    mapsize = pm->Size;
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       /* pack pixelmap into PBO */
       GLubyte *buf;
       /* Note, need to use DefaultPacking and Pack's buffer object */
@@ -397,7 +397,7 @@ _mesa_GetPixelMapfv( GLenum map, GLfloat *values )
       MEMCPY(values, pm->Map, mapsize * sizeof(GLfloat));
    }
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
                               ctx->Pack.BufferObj);
    }
@@ -420,7 +420,7 @@ _mesa_GetPixelMapuiv( GLenum map, GLuint *values )
    }
    mapsize = pm->Size;
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       /* pack pixelmap into PBO */
       GLubyte *buf;
       /* Note, need to use DefaultPacking and Pack's buffer object */
@@ -458,7 +458,7 @@ _mesa_GetPixelMapuiv( GLenum map, GLuint *values )
       }
    }
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
                               ctx->Pack.BufferObj);
    }
@@ -481,7 +481,7 @@ _mesa_GetPixelMapusv( GLenum map, GLushort *values )
    }
    mapsize = pm ? pm->Size : 0;
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       /* pack pixelmap into PBO */
       GLubyte *buf;
       /* Note, need to use DefaultPacking and Pack's buffer object */
@@ -528,7 +528,7 @@ _mesa_GetPixelMapusv( GLenum map, GLushort *values )
       }
    }
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
                               ctx->Pack.BufferObj);
    }
index 564250b..d11c942 100644 (file)
@@ -193,7 +193,7 @@ _mesa_PolygonMode( GLenum face, GLenum mode )
 void
 _mesa_polygon_stipple(GLcontext *ctx, const GLubyte *pattern)
 {
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       /* Get/unpack the stipple pattern from a PBO */
       GLubyte *buf;
       if (!_mesa_validate_pbo_access(2, &ctx->Unpack, 32, 32, 1,
@@ -258,7 +258,7 @@ _mesa_GetPolygonStipple( GLubyte *dest )
    /* XXX someday we may put this code into a separate function and call
     * it with ctx->Driver.GetPolygonStipple().
     */
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       /* Put/pack the stipple pattern into a PBO */
       GLubyte *buf;
       if (!_mesa_validate_pbo_access(2, &ctx->Pack, 32, 32, 1,
index 2326776..feea1d3 100644 (file)
@@ -44,6 +44,10 @@ _mesa_error_check_format_type(GLcontext *ctx, GLenum format, GLenum type,
                               GLboolean drawing)
 {
    const char *readDraw = drawing ? "Draw" : "Read";
+   const GLboolean reading = !drawing;
+
+   /* state validation should have already been done */
+   ASSERT(ctx->NewState == 0x0);
 
    if (ctx->Extensions.EXT_packed_depth_stencil
        && type == GL_UNSIGNED_INT_24_8_EXT
@@ -73,32 +77,45 @@ _mesa_error_check_format_type(GLcontext *ctx, GLenum format, GLenum type,
    case GL_RGBA:
    case GL_BGRA:
    case GL_ABGR_EXT:
-      if (drawing && !ctx->Visual.rgbMode) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
+      if (drawing) {
+         if (!ctx->DrawBuffer->Visual.rgbMode) {
+            _mesa_error(ctx, GL_INVALID_OPERATION,
                    "glDrawPixels(drawing RGB pixels into color index buffer)");
-         return GL_TRUE;
+            return GL_TRUE;
+         }
       }
-      if (!drawing && !_mesa_dest_buffer_exists(ctx, GL_COLOR)) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glReadPixels(no color buffer)");
-         return GL_TRUE;
+      else {
+         /* reading */
+         if (!_mesa_source_buffer_exists(ctx, GL_COLOR)) {
+            _mesa_error(ctx, GL_INVALID_OPERATION,
+                        "glReadPixels(no color buffer)");
+            return GL_TRUE;
+         }
       }
       break;
    case GL_COLOR_INDEX:
-      if (!drawing && ctx->Visual.rgbMode) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                    "glReadPixels(reading color index format from RGB buffer)");
-         return GL_TRUE;
+      if (drawing) {
+         if (ctx->DrawBuffer->Visual.rgbMode &&
+             (ctx->PixelMaps.ItoR.Size == 0 ||
+              ctx->PixelMaps.ItoG.Size == 0 ||
+              ctx->PixelMaps.ItoB.Size == 0)) {
+            _mesa_error(ctx, GL_INVALID_OPERATION,
+                   "glDrawPixels(drawing color index pixels into RGB buffer)");
+            return GL_TRUE;
+         }
       }
-      if (!drawing && !_mesa_dest_buffer_exists(ctx, GL_COLOR)) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glReadPixels(no color buffer)");
-         return GL_TRUE;
+      else {
+         /* reading */
+         if (!_mesa_source_buffer_exists(ctx, GL_COLOR)) {
+            _mesa_error(ctx, GL_INVALID_OPERATION,
+                        "glReadPixels(no color buffer)");
+            return GL_TRUE;
+         }
       }
       break;
    case GL_STENCIL_INDEX:
       if ((drawing && !_mesa_dest_buffer_exists(ctx, format)) ||
-          (!drawing && !_mesa_source_buffer_exists(ctx, format))) {
+          (reading && !_mesa_source_buffer_exists(ctx, format))) {
          _mesa_error(ctx, GL_INVALID_OPERATION,
                      "gl%sPixels(no stencil buffer)", readDraw);
          return GL_TRUE;
@@ -118,7 +135,7 @@ _mesa_error_check_format_type(GLcontext *ctx, GLenum format, GLenum type,
          return GL_TRUE;
       }
       if ((drawing && !_mesa_dest_buffer_exists(ctx, format)) ||
-          (!drawing && !_mesa_source_buffer_exists(ctx, format))) {
+          (reading && !_mesa_source_buffer_exists(ctx, format))) {
          _mesa_error(ctx, GL_INVALID_OPERATION,
                      "gl%sPixels(no depth or stencil buffer)", readDraw);
          return GL_TRUE;
@@ -173,7 +190,7 @@ _mesa_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height,
    if (width == 0 || height == 0)
       return; /* nothing to do */
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       if (!_mesa_validate_pbo_access(2, &ctx->Pack, width, height, 1,
                                      format, type, pixels)) {
          _mesa_error(ctx, GL_INVALID_OPERATION,
@@ -181,7 +198,7 @@ _mesa_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height,
          return;
       }
 
-      if (ctx->Pack.BufferObj->Pointer) {
+      if (_mesa_bufferobj_mapped(ctx->Pack.BufferObj)) {
          /* buffer is mapped - that's an error */
          _mesa_error(ctx, GL_INVALID_OPERATION, "glReadPixels(PBO is mapped)");
          return;
index ad6e6ce..93bbccd 100644 (file)
@@ -196,7 +196,7 @@ delete_bufferobj_cb(GLuint id, void *data, void *userData)
 {
    struct gl_buffer_object *bufObj = (struct gl_buffer_object *) data;
    GLcontext *ctx = (GLcontext *) userData;
-   if (bufObj->Pointer) {
+   if (_mesa_bufferobj_mapped(bufObj)) {
       ctx->Driver.UnmapBuffer(ctx, 0, bufObj);
       bufObj->Pointer = NULL;
    }
index d8191ab..140a998 100644 (file)
@@ -547,7 +547,8 @@ _mesa_update_state_locked( GLcontext *ctx )
    /* Determine which state flags effect vertex/fragment program state */
    if (ctx->FragmentProgram._MaintainTexEnvProgram) {
       prog_flags |= (_NEW_TEXTURE | _NEW_FOG |
-                    _NEW_ARRAY | _NEW_LIGHT | _NEW_POINT | _NEW_RENDERMODE);
+                    _NEW_ARRAY | _NEW_LIGHT | _NEW_POINT | _NEW_RENDERMODE |
+                    _NEW_PROGRAM);
    }
    if (ctx->VertexProgram._MaintainTnlProgram) {
       prog_flags |= (_NEW_ARRAY | _NEW_TEXTURE | _NEW_TEXTURE_MATRIX |
@@ -712,6 +713,6 @@ _mesa_set_vp_override(GLcontext *ctx, GLboolean flag)
       /* Set one of the bits which will trigger fragment program
        * regeneration:
        */
-      ctx->NewState |= _NEW_ARRAY; 
+      ctx->NewState |= _NEW_PROGRAM;
    }
 }
index 4c04a7e..6d86a42 100644 (file)
@@ -35,6 +35,7 @@
 #include "main/enums.h"
 #include "main/macros.h"
 #include "main/texenv.h"
+#include "main/texstate.h"
 
 
 #define TE_ERROR(errCode, msg, value)                          \
@@ -466,7 +467,7 @@ _mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param )
       return;
    }
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
 
    if (target == GL_TEXTURE_ENV) {
       switch (pname) {
@@ -793,7 +794,7 @@ _mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params )
       return;
    }
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
 
    if (target == GL_TEXTURE_ENV) {
       if (pname == GL_TEXTURE_ENV_COLOR) {
@@ -857,7 +858,7 @@ _mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params )
       return;
    }
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
 
    if (target == GL_TEXTURE_ENV) {
       if (pname == GL_TEXTURE_ENV_COLOR) {
@@ -908,12 +909,26 @@ _mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params )
    }
 }
 
-/* why does ATI_envmap_bumpmap require new entrypoints? Should just
-   reuse TexEnv ones... */
+
+/**
+ * Why does ATI_envmap_bumpmap require new entrypoints? Should just
+ * reuse TexEnv ones...
+ */
 void GLAPIENTRY
 _mesa_TexBumpParameterivATI( GLenum pname, const GLint *param )
 {
    GLfloat p[4];
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   if (!ctx->Extensions.ATI_envmap_bumpmap) {
+      /* This isn't an "official" error case, but let's tell the user
+       * that something's wrong.
+       */
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBumpParameterivATI");
+      return;
+   }
+
    if (pname == GL_BUMP_ROT_MATRIX_ATI) {
       /* hope that conversion is correct here */
       p[0] = INT_TO_FLOAT( param[0] );
@@ -923,11 +938,12 @@ _mesa_TexBumpParameterivATI( GLenum pname, const GLint *param )
    }
    else {
       p[0] = (GLfloat) param[0];
-      p[1] = p[2] = p[3] = 0;  /* init to zero, just to be safe */
+      p[1] = p[2] = p[3] = 0.0F;  /* init to zero, just to be safe */
    }
    _mesa_TexBumpParameterfvATI( pname, p );
 }
 
+
 void GLAPIENTRY
 _mesa_TexBumpParameterfvATI( GLenum pname, const GLfloat *param )
 {
@@ -935,8 +951,12 @@ _mesa_TexBumpParameterfvATI( GLenum pname, const GLfloat *param )
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
-   /* should return error if extension not supported? */
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   if (!ctx->Extensions.ATI_envmap_bumpmap) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBumpParameterfvATI");
+      return;
+   }
+
+   texUnit = _mesa_get_current_tex_unit(ctx);
 
    if (pname == GL_BUMP_ROT_MATRIX_ATI) {
       if (TEST_EQ_4V(param, texUnit->RotMatrix))
@@ -955,17 +975,21 @@ _mesa_TexBumpParameterfvATI( GLenum pname, const GLfloat *param )
    }
 }
 
+
 void GLAPIENTRY
 _mesa_GetTexBumpParameterivATI( GLenum pname, GLint *param )
 {
    const struct gl_texture_unit *texUnit;
    GLuint i;
-   GLint temp = 0;
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
-   /* should return error if extension not supported? */
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   if (!ctx->Extensions.ATI_envmap_bumpmap) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexBumpParameterivATI");
+      return;
+   }
+
+   texUnit = _mesa_get_current_tex_unit(ctx);
 
    if (pname == GL_BUMP_ROT_MATRIX_SIZE_ATI) {
       /* spec leaves open to support larger matrices.
@@ -982,12 +1006,13 @@ _mesa_GetTexBumpParameterivATI( GLenum pname, GLint *param )
       param[3] = FLOAT_TO_INT(texUnit->RotMatrix[3]);
    }
    else if (pname == GL_BUMP_NUM_TEX_UNITS_ATI) {
+      GLint count = 0;
       for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
          if (ctx->Const.SupportedBumpUnits & (1 << i)) {
-            temp++;
+            count++;
          }
       }
-      *param = temp;
+      *param = count;
    }
    else if (pname == GL_BUMP_TEX_UNITS_ATI) {
       for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
@@ -1002,23 +1027,27 @@ _mesa_GetTexBumpParameterivATI( GLenum pname, GLint *param )
    }
 }
 
+
 void GLAPIENTRY
 _mesa_GetTexBumpParameterfvATI( GLenum pname, GLfloat *param )
 {
    const struct gl_texture_unit *texUnit;
    GLuint i;
-   GLint temp = 0;
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
-   /* should return error if extension not supported? */
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   if (!ctx->Extensions.ATI_envmap_bumpmap) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexBumpParameterfvATI");
+      return;
+   }
+
+   texUnit = _mesa_get_current_tex_unit(ctx);
 
    if (pname == GL_BUMP_ROT_MATRIX_SIZE_ATI) {
       /* spec leaves open to support larger matrices.
          Don't think anyone would ever want to use it
          (and apps might not understand it) so hardcode this. */
-      *param = (GLfloat) 4;
+      *param = 4.0F;
    }
    else if (pname == GL_BUMP_ROT_MATRIX_ATI) {
       param[0] = texUnit->RotMatrix[0];
@@ -1027,12 +1056,13 @@ _mesa_GetTexBumpParameterfvATI( GLenum pname, GLfloat *param )
       param[3] = texUnit->RotMatrix[3];
    }
    else if (pname == GL_BUMP_NUM_TEX_UNITS_ATI) {
+      GLint count = 0;
       for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
          if (ctx->Const.SupportedBumpUnits & (1 << i)) {
-            temp++;
+            count++;
          }
       }
-      *param = (GLfloat) temp;
+      *param = (GLfloat) count;
    }
    else if (pname == GL_BUMP_TEX_UNITS_ATI) {
       for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
@@ -1046,4 +1076,3 @@ _mesa_GetTexBumpParameterfvATI( GLenum pname, GLfloat *param )
       return;
    }
 }
-
index 6b090ff..3736138 100644 (file)
@@ -275,6 +275,7 @@ static GLbitfield get_fp_input_mask( GLcontext *ctx )
 {
    /* _NEW_PROGRAM */
    const GLboolean vertexShader = (ctx->Shader.CurrentProgram &&
+                                  ctx->Shader.CurrentProgram->LinkStatus &&
                                    ctx->Shader.CurrentProgram->VertexProgram);
    const GLboolean vertexProgram = ctx->VertexProgram._Enabled;
    GLbitfield fp_inputs = 0x0;
@@ -321,8 +322,10 @@ static GLbitfield get_fp_input_mask( GLcontext *ctx )
       /* Then look at what might be varying as a result of enabled
        * arrays, etc:
        */
-      if (varying_inputs & VERT_BIT_COLOR0) fp_inputs |= FRAG_BIT_COL0;
-      if (varying_inputs & VERT_BIT_COLOR1) fp_inputs |= FRAG_BIT_COL1;
+      if (varying_inputs & VERT_BIT_COLOR0)
+         fp_inputs |= FRAG_BIT_COL0;
+      if (varying_inputs & VERT_BIT_COLOR1)
+         fp_inputs |= FRAG_BIT_COL1;
 
       fp_inputs |= (((varying_inputs & VERT_BIT_TEX_ANY) >> VERT_ATTRIB_TEX0) 
                     << FRAG_ATTRIB_TEX0);
@@ -340,7 +343,7 @@ static GLbitfield get_fp_input_mask( GLcontext *ctx )
       if (vertexShader)
          vprog = ctx->Shader.CurrentProgram->VertexProgram;
       else
-         vprog = ctx->VertexProgram._Current;
+         vprog = ctx->VertexProgram.Current;
 
       vp_outputs = vprog->Base.OutputsWritten;
 
@@ -351,8 +354,10 @@ static GLbitfield get_fp_input_mask( GLcontext *ctx )
       if (ctx->Point.PointSprite)
          vp_outputs |= FRAG_BITS_TEX_ANY;
 
-      if (vp_outputs & (1 << VERT_RESULT_COL0)) fp_inputs |= FRAG_BIT_COL0;
-      if (vp_outputs & (1 << VERT_RESULT_COL1)) fp_inputs |= FRAG_BIT_COL1;
+      if (vp_outputs & (1 << VERT_RESULT_COL0))
+         fp_inputs |= FRAG_BIT_COL0;
+      if (vp_outputs & (1 << VERT_RESULT_COL1))
+         fp_inputs |= FRAG_BIT_COL1;
 
       fp_inputs |= (((vp_outputs & VERT_RESULT_TEX_ANY) >> VERT_RESULT_TEX0) 
                     << FRAG_ATTRIB_TEX0);
index 02409d8..14d6fc7 100644 (file)
 
 
 #include "glheader.h"
+#include "bufferobj.h"
 #include "context.h"
 #include "image.h"
 #include "texcompress.h"
 #include "texformat.h"
 #include "texgetimage.h"
+#include "teximage.h"
+#include "texstate.h"
 
 
 
@@ -116,7 +119,7 @@ _mesa_get_teximage(GLcontext *ctx, GLenum target, GLint level,
 {
    const GLuint dimensions = (target == GL_TEXTURE_3D) ? 3 : 2;
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       /* Packing texture image into a PBO.
        * Map the (potentially) VRAM-based buffer into our process space so
        * we can write into it with the code below.
@@ -296,7 +299,7 @@ _mesa_get_teximage(GLcontext *ctx, GLenum target, GLint level,
       } /* img */
    }
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
                               ctx->Pack.BufferObj);
    }
@@ -316,7 +319,7 @@ _mesa_get_compressed_teximage(GLcontext *ctx, GLenum target, GLint level,
 {
    GLuint size;
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       /* pack texture image into a PBO */
       GLubyte *buf;
       if ((const GLubyte *) img + texImage->CompressedSize >
@@ -349,8 +352,230 @@ _mesa_get_compressed_teximage(GLcontext *ctx, GLenum target, GLint level,
    /* just memcpy, no pixelstore or pixel transfer */
    _mesa_memcpy(img, texImage->Data, size);
 
-   if (ctx->Pack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
                               ctx->Pack.BufferObj);
    }
 }
+
+
+
+/**
+ * Do error checking for a glGetTexImage() call.
+ * \return GL_TRUE if any error, GL_FALSE if no errors.
+ */
+static GLboolean
+getteximage_error_check(GLcontext *ctx, GLenum target, GLint level,
+                        GLenum format, GLenum type, GLvoid *pixels )
+{
+   const struct gl_texture_unit *texUnit;
+   struct gl_texture_object *texObj;
+   struct gl_texture_image *texImage;
+   const GLuint maxLevels = _mesa_max_texture_levels(ctx, target);
+
+   if (maxLevels == 0) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(target=0x%x)", target);
+      return GL_TRUE;
+   }
+
+   if (level < 0 || level >= maxLevels) {
+      _mesa_error( ctx, GL_INVALID_VALUE, "glGetTexImage(level)" );
+      return GL_TRUE;
+   }
+
+   if (_mesa_sizeof_packed_type(type) <= 0) {
+      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexImage(type)" );
+      return GL_TRUE;
+   }
+
+   if (_mesa_components_in_format(format) <= 0 ||
+       format == GL_STENCIL_INDEX) {
+      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexImage(format)" );
+      return GL_TRUE;
+   }
+
+   if (!ctx->Extensions.EXT_paletted_texture && _mesa_is_index_format(format)) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)");
+      return GL_TRUE;
+   }
+
+   if (!ctx->Extensions.ARB_depth_texture && _mesa_is_depth_format(format)) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)");
+      return GL_TRUE;
+   }
+
+   if (!ctx->Extensions.MESA_ycbcr_texture && _mesa_is_ycbcr_format(format)) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)");
+      return GL_TRUE;
+   }
+
+   if (!ctx->Extensions.EXT_packed_depth_stencil
+       && _mesa_is_depthstencil_format(format)) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)");
+      return GL_TRUE;
+   }
+
+   if (!ctx->Extensions.ATI_envmap_bumpmap
+       && _mesa_is_dudv_format(format)) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)");
+      return GL_TRUE;
+   }
+
+   texUnit = _mesa_get_current_tex_unit(ctx);
+   texObj = _mesa_select_tex_object(ctx, texUnit, target);
+
+   if (!texObj || _mesa_is_proxy_texture(target)) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(target)");
+      return GL_TRUE;
+   }
+
+   texImage = _mesa_select_tex_image(ctx, texObj, target, level);
+   if (!texImage) {
+      /* out of memory */
+      return GL_TRUE;
+   }
+      
+   /* Make sure the requested image format is compatible with the
+    * texture's format.  Note that a color index texture can be converted
+    * to RGBA so that combo is allowed.
+    */
+   if (_mesa_is_color_format(format)
+       && !_mesa_is_color_format(texImage->TexFormat->BaseFormat)
+       && !_mesa_is_index_format(texImage->TexFormat->BaseFormat)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)");
+      return GL_TRUE;
+   }
+   else if (_mesa_is_index_format(format)
+            && !_mesa_is_index_format(texImage->TexFormat->BaseFormat)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)");
+      return GL_TRUE;
+   }
+   else if (_mesa_is_depth_format(format)
+            && !_mesa_is_depth_format(texImage->TexFormat->BaseFormat)
+            && !_mesa_is_depthstencil_format(texImage->TexFormat->BaseFormat)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)");
+      return GL_TRUE;
+   }
+   else if (_mesa_is_ycbcr_format(format)
+            && !_mesa_is_ycbcr_format(texImage->TexFormat->BaseFormat)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)");
+      return GL_TRUE;
+   }
+   else if (_mesa_is_depthstencil_format(format)
+            && !_mesa_is_depthstencil_format(texImage->TexFormat->BaseFormat)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)");
+      return GL_TRUE;
+   }
+   else if (_mesa_is_dudv_format(format)
+            && !_mesa_is_dudv_format(texImage->TexFormat->BaseFormat)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)");
+      return GL_TRUE;
+   }
+
+   if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
+      /* packing texture image into a PBO */
+      const GLuint dimensions = (target == GL_TEXTURE_3D) ? 3 : 2;
+      if (!_mesa_validate_pbo_access(dimensions, &ctx->Pack, texImage->Width,
+                                     texImage->Height, texImage->Depth,
+                                     format, type, pixels)) {
+         _mesa_error(ctx, GL_INVALID_OPERATION,
+                     "glGetTexImage(invalid PBO access)");
+         return GL_TRUE;
+      }
+   }
+
+   return GL_FALSE;
+}
+
+
+
+/**
+ * Get texture image.  Called by glGetTexImage.
+ *
+ * \param target texture target.
+ * \param level image level.
+ * \param format pixel data format for returned image.
+ * \param type pixel data type for returned image.
+ * \param pixels returned pixel data.
+ */
+void GLAPIENTRY
+_mesa_GetTexImage( GLenum target, GLint level, GLenum format,
+                   GLenum type, GLvoid *pixels )
+{
+   const struct gl_texture_unit *texUnit;
+   struct gl_texture_object *texObj;
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
+
+   if (getteximage_error_check(ctx, target, level, format, type, pixels)) {
+      return;
+   }
+
+   texUnit = _mesa_get_current_tex_unit(ctx);
+   texObj = _mesa_select_tex_object(ctx, texUnit, target);
+
+   _mesa_lock_texture(ctx, texObj);
+   {
+      struct gl_texture_image *texImage =
+         _mesa_select_tex_image(ctx, texObj, target, level);
+
+      /* typically, this will call _mesa_get_teximage() */
+      ctx->Driver.GetTexImage(ctx, target, level, format, type, pixels,
+                              texObj, texImage);
+   }
+   _mesa_unlock_texture(ctx, texObj);
+}
+
+
+void GLAPIENTRY
+_mesa_GetCompressedTexImageARB(GLenum target, GLint level, GLvoid *img)
+{
+   const struct gl_texture_unit *texUnit;
+   struct gl_texture_object *texObj;
+   struct gl_texture_image *texImage;
+   GLint maxLevels;
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
+
+   texUnit = _mesa_get_current_tex_unit(ctx);
+   texObj = _mesa_select_tex_object(ctx, texUnit, target);
+   if (!texObj) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glGetCompressedTexImageARB");
+      return;
+   }
+
+   maxLevels = _mesa_max_texture_levels(ctx, target);
+   ASSERT(maxLevels > 0); /* 0 indicates bad target, caught above */
+
+   if (level < 0 || level >= maxLevels) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glGetCompressedTexImageARB(level)");
+      return;
+   }
+
+   if (_mesa_is_proxy_texture(target)) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glGetCompressedTexImageARB(target)");
+      return;
+   }
+
+   _mesa_lock_texture(ctx, texObj);
+   {
+      texImage = _mesa_select_tex_image(ctx, texObj, target, level);
+      if (texImage) {
+         if (texImage->IsCompressed) {
+            /* this typically calls _mesa_get_compressed_teximage() */
+            ctx->Driver.GetCompressedTexImage(ctx, target, level, img,
+                                              texObj, texImage);
+         }
+         else {
+            _mesa_error(ctx, GL_INVALID_OPERATION,
+                        "glGetCompressedTexImageARB");
+         }
+      }
+      else {
+         /* probably invalid mipmap level */
+         _mesa_error(ctx, GL_INVALID_VALUE,
+                     "glGetCompressedTexImageARB(level)");
+      }
+   }
+   _mesa_unlock_texture(ctx, texObj);
+}
index 01f486e..088d27c 100644 (file)
@@ -43,4 +43,13 @@ _mesa_get_compressed_teximage(GLcontext *ctx, GLenum target, GLint level,
 
 
 
+extern void GLAPIENTRY
+_mesa_GetTexImage( GLenum target, GLint level,
+                   GLenum format, GLenum type, GLvoid *pixels );
+
+
+extern void GLAPIENTRY
+_mesa_GetCompressedTexImageARB(GLenum target, GLint lod, GLvoid *img);
+
+
 #endif /* TEXGETIMAGE_H */
index 6e21066..8228303 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * mesa 3-D graphics library
- * Version:  7.5
+ * Version:  7.6
  *
  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
  * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
@@ -182,6 +182,8 @@ logbase2( int n )
  *
  * This is the format which is used during texture application (i.e. the
  * texture format and env mode determine the arithmetic used.
+ *
+ * XXX this could be static
  */
 GLint
 _mesa_base_tex_format( GLcontext *ctx, GLint internalFormat )
@@ -415,211 +417,6 @@ _mesa_base_tex_format( GLcontext *ctx, GLint internalFormat )
 
 
 /**
- * Test if the given image format is a color/RGBA format (i.e., not color
- * index, depth, stencil, etc).
- * \param format  the image format value (may by an internal texture format)
- * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise.
- * XXX maybe move this func to image.c
- */
-GLboolean
-_mesa_is_color_format(GLenum format)
-{
-   switch (format) {
-      case GL_RED:
-      case GL_GREEN:
-      case GL_BLUE:
-      case GL_ALPHA:
-      case GL_ALPHA4:
-      case GL_ALPHA8:
-      case GL_ALPHA12:
-      case GL_ALPHA16:
-      case 1:
-      case GL_LUMINANCE:
-      case GL_LUMINANCE4:
-      case GL_LUMINANCE8:
-      case GL_LUMINANCE12:
-      case GL_LUMINANCE16:
-      case 2:
-      case GL_LUMINANCE_ALPHA:
-      case GL_LUMINANCE4_ALPHA4:
-      case GL_LUMINANCE6_ALPHA2:
-      case GL_LUMINANCE8_ALPHA8:
-      case GL_LUMINANCE12_ALPHA4:
-      case GL_LUMINANCE12_ALPHA12:
-      case GL_LUMINANCE16_ALPHA16:
-      case GL_INTENSITY:
-      case GL_INTENSITY4:
-      case GL_INTENSITY8:
-      case GL_INTENSITY12:
-      case GL_INTENSITY16:
-      case 3:
-      case GL_RGB:
-      case GL_BGR:
-      case GL_R3_G3_B2:
-      case GL_RGB4:
-      case GL_RGB5:
-      case GL_RGB8:
-      case GL_RGB10:
-      case GL_RGB12:
-      case GL_RGB16:
-      case 4:
-      case GL_ABGR_EXT:
-      case GL_RGBA:
-      case GL_BGRA:
-      case GL_RGBA2:
-      case GL_RGBA4:
-      case GL_RGB5_A1:
-      case GL_RGBA8:
-      case GL_RGB10_A2:
-      case GL_RGBA12:
-      case GL_RGBA16:
-      /* float texture formats */
-      case GL_ALPHA16F_ARB:
-      case GL_ALPHA32F_ARB:
-      case GL_LUMINANCE16F_ARB:
-      case GL_LUMINANCE32F_ARB:
-      case GL_LUMINANCE_ALPHA16F_ARB:
-      case GL_LUMINANCE_ALPHA32F_ARB:
-      case GL_INTENSITY16F_ARB:
-      case GL_INTENSITY32F_ARB:
-      case GL_RGB16F_ARB:
-      case GL_RGB32F_ARB:
-      case GL_RGBA16F_ARB:
-      case GL_RGBA32F_ARB:
-      /* compressed formats */
-      case GL_COMPRESSED_ALPHA:
-      case GL_COMPRESSED_LUMINANCE:
-      case GL_COMPRESSED_LUMINANCE_ALPHA:
-      case GL_COMPRESSED_INTENSITY:
-      case GL_COMPRESSED_RGB:
-      case GL_COMPRESSED_RGBA:
-      case GL_RGB_S3TC:
-      case GL_RGB4_S3TC:
-      case GL_RGBA_S3TC:
-      case GL_RGBA4_S3TC:
-      case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
-      case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
-      case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
-      case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
-      case GL_COMPRESSED_RGB_FXT1_3DFX:
-      case GL_COMPRESSED_RGBA_FXT1_3DFX:
-#if FEATURE_EXT_texture_sRGB
-      case GL_SRGB_EXT:
-      case GL_SRGB8_EXT:
-      case GL_SRGB_ALPHA_EXT:
-      case GL_SRGB8_ALPHA8_EXT:
-      case GL_SLUMINANCE_ALPHA_EXT:
-      case GL_SLUMINANCE8_ALPHA8_EXT:
-      case GL_SLUMINANCE_EXT:
-      case GL_SLUMINANCE8_EXT:
-      case GL_COMPRESSED_SRGB_EXT:
-      case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
-      case GL_COMPRESSED_SRGB_ALPHA_EXT:
-      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
-      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
-      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
-      case GL_COMPRESSED_SLUMINANCE_EXT:
-      case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
-#endif /* FEATURE_EXT_texture_sRGB */
-         return GL_TRUE;
-      /* signed texture formats */
-      case GL_RGBA_SNORM:
-      case GL_RGBA8_SNORM:
-         return GL_TRUE;
-      case GL_YCBCR_MESA:  /* not considered to be RGB */
-         /* fall-through */
-      default:
-         return GL_FALSE;
-   }
-}
-
-
-/**
- * Test if the given image format is a color index format.
- */
-static GLboolean
-is_index_format(GLenum format)
-{
-   switch (format) {
-      case GL_COLOR_INDEX:
-      case GL_COLOR_INDEX1_EXT:
-      case GL_COLOR_INDEX2_EXT:
-      case GL_COLOR_INDEX4_EXT:
-      case GL_COLOR_INDEX8_EXT:
-      case GL_COLOR_INDEX12_EXT:
-      case GL_COLOR_INDEX16_EXT:
-         return GL_TRUE;
-      default:
-         return GL_FALSE;
-   }
-}
-
-
-/**
- * Test if the given image format is a depth component format.
- */
-static GLboolean
-is_depth_format(GLenum format)
-{
-   switch (format) {
-      case GL_DEPTH_COMPONENT16:
-      case GL_DEPTH_COMPONENT24:
-      case GL_DEPTH_COMPONENT32:
-      case GL_DEPTH_COMPONENT:
-         return GL_TRUE;
-      default:
-         return GL_FALSE;
-   }
-}
-
-
-/**
- * Test if the given image format is a YCbCr format.
- */
-static GLboolean
-is_ycbcr_format(GLenum format)
-{
-   switch (format) {
-      case GL_YCBCR_MESA:
-         return GL_TRUE;
-      default:
-         return GL_FALSE;
-   }
-}
-
-
-/**
- * Test if the given image format is a Depth/Stencil format.
- */
-static GLboolean
-is_depthstencil_format(GLenum format)
-{
-   switch (format) {
-      case GL_DEPTH24_STENCIL8_EXT:
-      case GL_DEPTH_STENCIL_EXT:
-         return GL_TRUE;
-      default:
-         return GL_FALSE;
-   }
-}
-
-/**
- * Test if the given image format is a dudv format.
- */
-static GLboolean
-is_dudv_format(GLenum format)
-{
-   switch (format) {
-      case GL_DUDV_ATI:
-      case GL_DU8DV8_ATI:
-         return GL_TRUE;
-      default:
-         return GL_FALSE;
-   }
-}
-
-
-/**
  * Test if it is a supported compressed format.
  * 
  * \param internalFormat the internal format token provided by the user.
@@ -679,37 +476,14 @@ _mesa_set_tex_image(struct gl_texture_object *tObj,
                     GLenum target, GLint level,
                     struct gl_texture_image *texImage)
 {
+   const GLuint face = _mesa_tex_target_to_face(target);
+
    ASSERT(tObj);
    ASSERT(texImage);
-   /* XXX simplify this with _mesa_tex_target_to_face() */
-   switch (target) {
-      case GL_TEXTURE_1D:
-      case GL_TEXTURE_2D:
-      case GL_TEXTURE_3D:
-      case GL_TEXTURE_1D_ARRAY_EXT:
-      case GL_TEXTURE_2D_ARRAY_EXT:
-         tObj->Image[0][level] = texImage;
-         break;
-      case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
-      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
-      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
-      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
-      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
-      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
-         {
-            GLuint face = ((GLuint) target - 
-                           (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X);
-            tObj->Image[face][level] = texImage;
-         }
-         break;
-      case GL_TEXTURE_RECTANGLE_NV:
-         ASSERT(level == 0);
-         tObj->Image[0][level] = texImage;
-         break;
-      default:
-         _mesa_problem(NULL, "bad target in _mesa_set_tex_image()");
-         return;
-   }
+   ASSERT(target != GL_TEXTURE_RECTANGLE_NV || level == 0);
+
+   tObj->Image[face][level] = texImage;
+
    /* Set the 'back' pointer */
    texImage->TexObject = tObj;
 }
@@ -788,6 +562,9 @@ _mesa_delete_texture_image( GLcontext *ctx, struct gl_texture_image *texImage )
 GLboolean
 _mesa_is_proxy_texture(GLenum target)
 {
+   /* NUM_TEXTURE_TARGETS should match number of terms below */
+   assert(NUM_TEXTURE_TARGETS == 7);
+
    return (target == GL_PROXY_TEXTURE_1D ||
            target == GL_PROXY_TEXTURE_2D ||
            target == GL_PROXY_TEXTURE_3D ||
@@ -864,74 +641,28 @@ _mesa_select_tex_object(GLcontext *ctx, const struct gl_texture_unit *texUnit,
 
 
 /**
- * Get the texture image struct which corresponds to target and level
- * of the given texture unit.
+ * Get a texture image pointer from a texture object, given a texture
+ * target and mipmap level.  The target and level parameters should
+ * have already been error-checked.
  *
  * \param ctx GL context.
  * \param texObj texture unit.
  * \param target texture target.
  * \param level image level.
  *
- * \return pointer to the texture image structure on success, or NULL on failure.
- *
- * \sa gl_texture_unit.
+ * \return pointer to the texture image structure, or NULL on failure.
  */
 struct gl_texture_image *
 _mesa_select_tex_image(GLcontext *ctx, const struct gl_texture_object *texObj,
                       GLenum target, GLint level)
 {
-   ASSERT(texObj);
-
-   if (level < 0 || level >= MAX_TEXTURE_LEVELS) 
-      return NULL;
-
-   /* XXX simplify this with _mesa_tex_target_to_face() */
-   switch (target) {
-      case GL_TEXTURE_1D:
-      case GL_PROXY_TEXTURE_1D:
-      case GL_TEXTURE_2D:
-      case GL_PROXY_TEXTURE_2D:
-      case GL_TEXTURE_3D:
-      case GL_PROXY_TEXTURE_3D:
-         return texObj->Image[0][level];
-
-      case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
-      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
-      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
-      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
-      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
-      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 
-         if (ctx->Extensions.ARB_texture_cube_map) {
-           GLuint face = ((GLuint) target - 
-                          (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X);
-            return texObj->Image[face][level];
-        }
-         else
-            return NULL;
-
-      case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
-         if (ctx->Extensions.ARB_texture_cube_map)
-            return texObj->Image[0][level];
-         else
-            return NULL;
-
-      case GL_TEXTURE_RECTANGLE_NV:
-      case GL_PROXY_TEXTURE_RECTANGLE_NV:
-         if (ctx->Extensions.NV_texture_rectangle && level == 0) 
-            return texObj->Image[0][level];
-         else 
-            return NULL;
+   const GLuint face = _mesa_tex_target_to_face(target);
 
-      case GL_TEXTURE_1D_ARRAY_EXT:
-      case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
-      case GL_TEXTURE_2D_ARRAY_EXT:
-      case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
-         return (ctx->Extensions.MESA_texture_array)
-            ? texObj->Image[0][level] : NULL;
+   ASSERT(texObj);
+   ASSERT(level >= 0);
+   ASSERT(level < MAX_TEXTURE_LEVELS);
 
-      default:
-         return NULL;
-   }
+   return texObj->Image[face][level];
 }
 
 
@@ -1053,10 +784,6 @@ _mesa_max_texture_levels(GLcontext *ctx, GLenum target)
    case GL_PROXY_TEXTURE_1D:
    case GL_TEXTURE_2D:
    case GL_PROXY_TEXTURE_2D:
-   case GL_TEXTURE_1D_ARRAY_EXT:
-   case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
-   case GL_TEXTURE_2D_ARRAY_EXT:
-   case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
       return ctx->Const.MaxTextureLevels;
    case GL_TEXTURE_3D:
    case GL_PROXY_TEXTURE_3D:
@@ -1069,10 +796,17 @@ _mesa_max_texture_levels(GLcontext *ctx, GLenum target)
    case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
    case GL_TEXTURE_CUBE_MAP_ARB:
    case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
-      return ctx->Const.MaxCubeTextureLevels;
+      return ctx->Extensions.ARB_texture_cube_map
+         ? ctx->Const.MaxCubeTextureLevels : 0;
    case GL_TEXTURE_RECTANGLE_NV:
    case GL_PROXY_TEXTURE_RECTANGLE_NV:
-      return 1;
+      return ctx->Extensions.NV_texture_rectangle ? 1 : 0;
+   case GL_TEXTURE_1D_ARRAY_EXT:
+   case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
+   case GL_TEXTURE_2D_ARRAY_EXT:
+   case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
+      return ctx->Extensions.MESA_texture_array
+         ? ctx->Const.MaxTextureLevels : 0;
    default:
       return 0; /* bad target */
    }
@@ -1273,6 +1007,23 @@ _mesa_init_teximage_fields(GLcontext *ctx, GLenum target,
 
 
 /**
+ * Free and clear fields of the gl_texture_image struct.
+ *
+ * \param ctx GL context.
+ * \param texImage texture image structure to be cleared.
+ *
+ * After the call, \p texImage will have no data associated with it.  Its
+ * fields are cleared so that its parent object will test incomplete.
+ */
+void
+_mesa_clear_texture_image(GLcontext *ctx, struct gl_texture_image *texImage)
+{
+   ctx->Driver.FreeTexImageData(ctx, texImage);
+   clear_teximage_fields(texImage);
+}
+
+
+/**
  * This is the fallback for Driver.TestProxyTexImage().  Test the texture
  * level, width, height and depth against the ctx->Const limits for textures.
  *
@@ -1586,13 +1337,13 @@ texture_error_check( GLcontext *ctx, GLenum target,
 
    /* make sure internal format and format basically agree */
    colorFormat = _mesa_is_color_format(format);
-   indexFormat = is_index_format(format);
+   indexFormat = _mesa_is_index_format(format);
    if ((_mesa_is_color_format(internalFormat) && !colorFormat && !indexFormat) ||
-       (is_index_format(internalFormat) && !indexFormat) ||
-       (is_depth_format(internalFormat) != is_depth_format(format)) ||
-       (is_ycbcr_format(internalFormat) != is_ycbcr_format(format)) ||
-       (is_depthstencil_format(internalFormat) != is_depthstencil_format(format)) ||
-       (is_dudv_format(internalFormat) != is_dudv_format(format))) {
+       (_mesa_is_index_format(internalFormat) && !indexFormat) ||
+       (_mesa_is_depth_format(internalFormat) != _mesa_is_depth_format(format)) ||
+       (_mesa_is_ycbcr_format(internalFormat) != _mesa_is_ycbcr_format(format)) ||
+       (_mesa_is_depthstencil_format(internalFormat) != _mesa_is_depthstencil_format(format)) ||
+       (_mesa_is_dudv_format(internalFormat) != _mesa_is_dudv_format(format))) {
       if (!isProxy)
          _mesa_error(ctx, GL_INVALID_OPERATION,
                      "glTexImage%dD(incompatible internalFormat 0x%x, format 0x%x)",
@@ -1926,14 +1677,14 @@ copytexture_error_check( GLcontext *ctx, GLuint dimensions,
       return GL_TRUE;
    }
 
-   /* NOTE: the format and type aren't really significant for
-    * TestProxyTexImage().  Only the internalformat really matters.
    if (!_mesa_source_buffer_exists(ctx, format)) {
       _mesa_error(ctx, GL_INVALID_OPERATION,
                   "glCopyTexImage%dD(missing readbuffer)", dimensions);
       return GL_TRUE;
    }
 
+   /* NOTE: the format and type aren't really significant for
+    * TestProxyTexImage().  Only the internalformat really matters.
     */
    type = GL_FLOAT;
 
@@ -2027,7 +1778,7 @@ copytexture_error_check( GLcontext *ctx, GLuint dimensions,
          return GL_TRUE;
       }
    }
-   else if (is_depth_format(internalFormat)) {
+   else if (_mesa_is_depth_format(internalFormat)) {
       /* make sure we have depth/stencil buffers */
       if (!ctx->ReadBuffer->_DepthBuffer) {
          _mesa_error(ctx, GL_INVALID_OPERATION,
@@ -2035,7 +1786,7 @@ copytexture_error_check( GLcontext *ctx, GLuint dimensions,
          return GL_TRUE;
       }
    }
-   else if (is_depthstencil_format(internalFormat)) {
+   else if (_mesa_is_depthstencil_format(internalFormat)) {
       /* make sure we have depth/stencil buffers */
       if (!ctx->ReadBuffer->_DepthBuffer || !ctx->ReadBuffer->_StencilBuffer) {
          _mesa_error(ctx, GL_INVALID_OPERATION,
@@ -2260,147 +2011,6 @@ copytexsubimage_error_check2( GLcontext *ctx, GLuint dimensions,
 }
 
 
-/**
- * Get texture image.  Called by glGetTexImage.
- *
- * \param target texture target.
- * \param level image level.
- * \param format pixel data format for returned image.
- * \param type pixel data type for returned image.
- * \param pixels returned pixel data.
- */
-void GLAPIENTRY
-_mesa_GetTexImage( GLenum target, GLint level, GLenum format,
-                   GLenum type, GLvoid *pixels )
-{
-   const struct gl_texture_unit *texUnit;
-   struct gl_texture_object *texObj;
-   struct gl_texture_image *texImage;
-   GLint maxLevels = 0;
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
-
-   texUnit = &(ctx->Texture.Unit[ctx->Texture.CurrentUnit]);
-   texObj = _mesa_select_tex_object(ctx, texUnit, target);
-   if (!texObj || _mesa_is_proxy_texture(target)) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(target)");
-      return;
-   }
-
-   maxLevels = _mesa_max_texture_levels(ctx, target);
-   ASSERT(maxLevels > 0);  /* 0 indicates bad target, caught above */
-
-   if (level < 0 || level >= maxLevels) {
-      _mesa_error( ctx, GL_INVALID_VALUE, "glGetTexImage(level)" );
-      return;
-   }
-
-   if (_mesa_sizeof_packed_type(type) <= 0) {
-      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexImage(type)" );
-      return;
-   }
-
-   if (_mesa_components_in_format(format) <= 0 ||
-       format == GL_STENCIL_INDEX) {
-      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexImage(format)" );
-      return;
-   }
-
-   if (!ctx->Extensions.EXT_paletted_texture && is_index_format(format)) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)");
-      return;
-   }
-
-   if (!ctx->Extensions.ARB_depth_texture && is_depth_format(format)) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)");
-      return;
-   }
-
-   if (!ctx->Extensions.MESA_ycbcr_texture && is_ycbcr_format(format)) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)");
-      return;
-   }
-
-   if (!ctx->Extensions.EXT_packed_depth_stencil
-       && is_depthstencil_format(format)) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)");
-      return;
-   }
-
-   if (!ctx->Extensions.ATI_envmap_bumpmap
-       && is_dudv_format(format)) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)");
-      return;
-   }
-
-   _mesa_lock_texture(ctx, texObj);
-   {
-      texImage = _mesa_select_tex_image(ctx, texObj, target, level);
-      if (!texImage) {
-        /* invalid mipmap level, not an error */
-        goto out;
-      }
-
-
-      /* Make sure the requested image format is compatible with the
-       * texture's format.  Note that a color index texture can be converted
-       * to RGBA so that combo is allowed.
-       */
-      if (_mesa_is_color_format(format)
-         && !_mesa_is_color_format(texImage->TexFormat->BaseFormat)
-         && !is_index_format(texImage->TexFormat->BaseFormat)) {
-        _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)");
-        goto out;
-      }
-      else if (is_index_format(format)
-              && !is_index_format(texImage->TexFormat->BaseFormat)) {
-        _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)");
-        goto out;
-      }
-      else if (is_depth_format(format)
-              && !is_depth_format(texImage->TexFormat->BaseFormat)
-              && !is_depthstencil_format(texImage->TexFormat->BaseFormat)) {
-        _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)");
-        goto out;
-      }
-      else if (is_ycbcr_format(format)
-              && !is_ycbcr_format(texImage->TexFormat->BaseFormat)) {
-        _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)");
-        goto out;
-      }
-      else if (is_depthstencil_format(format)
-              && !is_depthstencil_format(texImage->TexFormat->BaseFormat)) {
-        _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)");
-        goto out;
-      }
-      else if (is_dudv_format(format)
-              && !is_dudv_format(texImage->TexFormat->BaseFormat)) {
-        _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)");
-        goto out;
-      }
-
-      if (ctx->Pack.BufferObj->Name) {
-        /* packing texture image into a PBO */
-        const GLuint dimensions = (target == GL_TEXTURE_3D) ? 3 : 2;
-        if (!_mesa_validate_pbo_access(dimensions, &ctx->Pack, texImage->Width,
-                                       texImage->Height, texImage->Depth,
-                                       format, type, pixels)) {
-           _mesa_error(ctx, GL_INVALID_OPERATION,
-                       "glGetTexImage(invalid PBO access)");
-           goto out;
-        }
-      }
-
-      /* typically, this will call _mesa_get_teximage() */
-      ctx->Driver.GetTexImage(ctx, target, level, format, type, pixels,
-                             texObj, texImage);
-
-   }
- out:
-   _mesa_unlock_texture(ctx, texObj);
-}
-
-
 /** Callback info for walking over FBO hash table */
 struct cb_info
 {
@@ -2544,7 +2154,7 @@ _mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat,
       if (ctx->NewState & _MESA_NEW_TRANSFER_STATE)
         _mesa_update_state(ctx);
 
-      texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+      texUnit = _mesa_get_current_tex_unit(ctx);
       texObj = _mesa_select_tex_object(ctx, texUnit, target);
       _mesa_lock_texture(ctx, texObj);
       {
@@ -2652,7 +2262,7 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,
       if (ctx->NewState & _MESA_NEW_TRANSFER_STATE)
         _mesa_update_state(ctx);
 
-      texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+      texUnit = _mesa_get_current_tex_unit(ctx);
       texObj = _mesa_select_tex_object(ctx, texUnit, target);
       _mesa_lock_texture(ctx, texObj);
       {
@@ -2755,7 +2365,7 @@ _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat,
       if (ctx->NewState & _MESA_NEW_TRANSFER_STATE)
         _mesa_update_state(ctx);
 
-      texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+      texUnit = _mesa_get_current_tex_unit(ctx);
       texObj = _mesa_select_tex_object(ctx, texUnit, target);
       _mesa_lock_texture(ctx, texObj);
       {
@@ -2861,7 +2471,7 @@ _mesa_TexSubImage1D( GLenum target, GLint level,
    }
 
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
    texObj = _mesa_select_tex_object(ctx, texUnit, target);
    assert(texObj);
 
@@ -2921,7 +2531,7 @@ _mesa_TexSubImage2D( GLenum target, GLint level,
       return;   /* error was detected */
    }
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
    texObj = _mesa_select_tex_object(ctx, texUnit, target);
    _mesa_lock_texture(ctx, texObj);
    {
@@ -2973,7 +2583,7 @@ _mesa_TexSubImage3D( GLenum target, GLint level,
       return;   /* error was detected */
    }
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
    texObj = _mesa_select_tex_object(ctx, texUnit, target);
 
    _mesa_lock_texture(ctx, texObj);
@@ -3034,7 +2644,7 @@ _mesa_CopyTexImage1D( GLenum target, GLint level,
                                postConvWidth, 1, border))
       return;
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
    texObj = _mesa_select_tex_object(ctx, texUnit, target);
    _mesa_lock_texture(ctx, texObj);
    {
@@ -3100,7 +2710,7 @@ _mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat,
                                postConvWidth, postConvHeight, border))
       return;
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
    texObj = _mesa_select_tex_object(ctx, texUnit, target);
 
    _mesa_lock_texture(ctx, texObj);
@@ -3160,7 +2770,7 @@ _mesa_CopyTexSubImage1D( GLenum target, GLint level,
    if (copytexsubimage_error_check1(ctx, 1, target, level))
       return;
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
    texObj = _mesa_select_tex_object(ctx, texUnit, target);
 
    _mesa_lock_texture(ctx, texObj);
@@ -3215,7 +2825,7 @@ _mesa_CopyTexSubImage2D( GLenum target, GLint level,
    if (copytexsubimage_error_check1(ctx, 2, target, level))
       return;
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
    texObj = _mesa_select_tex_object(ctx, texUnit, target);
 
    _mesa_lock_texture(ctx, texObj);
@@ -3270,7 +2880,7 @@ _mesa_CopyTexSubImage3D( GLenum target, GLint level,
    if (copytexsubimage_error_check1(ctx, 3, target, level))
       return;
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
    texObj = _mesa_select_tex_object(ctx, texUnit, target);
 
    _mesa_lock_texture(ctx, texObj);
@@ -3524,7 +3134,7 @@ _mesa_CompressedTexImage1DARB(GLenum target, GLint level,
          return;
       }
 
-      texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+      texUnit = _mesa_get_current_tex_unit(ctx);
       texObj = _mesa_select_tex_object(ctx, texUnit, target);
 
       _mesa_lock_texture(ctx, texObj);
@@ -3578,7 +3188,7 @@ _mesa_CompressedTexImage1DARB(GLenum target, GLint level,
          struct gl_texture_unit *texUnit;
          struct gl_texture_object *texObj;
          struct gl_texture_image *texImage;
-         texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+         texUnit = _mesa_get_current_tex_unit(ctx);
         texObj = _mesa_select_tex_object(ctx, texUnit, target);
 
         _mesa_lock_texture(ctx, texObj);
@@ -3621,7 +3231,7 @@ _mesa_CompressedTexImage2DARB(GLenum target, GLint level,
          return;
       }
 
-      texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+      texUnit = _mesa_get_current_tex_unit(ctx);
       texObj = _mesa_select_tex_object(ctx, texUnit, target);
 
       _mesa_lock_texture(ctx, texObj);
@@ -3677,7 +3287,7 @@ _mesa_CompressedTexImage2DARB(GLenum target, GLint level,
          struct gl_texture_unit *texUnit;
          struct gl_texture_object *texObj;
          struct gl_texture_image *texImage;
-         texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+         texUnit = _mesa_get_current_tex_unit(ctx);
         texObj = _mesa_select_tex_object(ctx, texUnit, target);
 
         _mesa_lock_texture(ctx, texObj);
@@ -3717,7 +3327,7 @@ _mesa_CompressedTexImage3DARB(GLenum target, GLint level,
          return;
       }
 
-      texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+      texUnit = _mesa_get_current_tex_unit(ctx);
       texObj = _mesa_select_tex_object(ctx, texUnit, target);
       _mesa_lock_texture(ctx, texObj);
       {
@@ -3771,7 +3381,7 @@ _mesa_CompressedTexImage3DARB(GLenum target, GLint level,
          struct gl_texture_unit *texUnit;
          struct gl_texture_object *texObj;
          struct gl_texture_image *texImage;
-         texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+         texUnit = _mesa_get_current_tex_unit(ctx);
         texObj = _mesa_select_tex_object(ctx, texUnit, target);
         _mesa_lock_texture(ctx, texObj);
         {
@@ -3810,7 +3420,7 @@ _mesa_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset,
       return;
    }
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
    texObj = _mesa_select_tex_object(ctx, texUnit, target);
    _mesa_lock_texture(ctx, texObj);
    {
@@ -3867,7 +3477,7 @@ _mesa_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset,
       return;
    }
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
    texObj = _mesa_select_tex_object(ctx, texUnit, target);
    _mesa_lock_texture(ctx, texObj);
    {
@@ -3924,7 +3534,7 @@ _mesa_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset,
       return;
    }
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
    texObj = _mesa_select_tex_object(ctx, texUnit, target);
    _mesa_lock_texture(ctx, texObj);
    {
@@ -3961,55 +3571,3 @@ _mesa_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset,
 }
 
 
-void GLAPIENTRY
-_mesa_GetCompressedTexImageARB(GLenum target, GLint level, GLvoid *img)
-{
-   const struct gl_texture_unit *texUnit;
-   struct gl_texture_object *texObj;
-   struct gl_texture_image *texImage;
-   GLint maxLevels;
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
-
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
-   texObj = _mesa_select_tex_object(ctx, texUnit, target);
-   if (!texObj) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glGetCompressedTexImageARB");
-      return;
-   }
-
-   maxLevels = _mesa_max_texture_levels(ctx, target);
-   ASSERT(maxLevels > 0); /* 0 indicates bad target, caught above */
-
-   if (level < 0 || level >= maxLevels) {
-      _mesa_error(ctx, GL_INVALID_VALUE, "glGetCompressedTexImageARB(level)");
-      return;
-   }
-
-   if (_mesa_is_proxy_texture(target)) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glGetCompressedTexImageARB(target)");
-      return;
-   }
-
-   _mesa_lock_texture(ctx, texObj);
-   {
-      texImage = _mesa_select_tex_image(ctx, texObj, target, level);
-      if (texImage) {
-         if (texImage->IsCompressed) {
-            /* this typically calls _mesa_get_compressed_teximage() */
-            ctx->Driver.GetCompressedTexImage(ctx, target, level, img,
-                                              texObj, texImage);
-         }
-         else {
-            _mesa_error(ctx, GL_INVALID_OPERATION,
-                        "glGetCompressedTexImageARB");
-         }
-      }
-      else {
-         /* probably invalid mipmap level */
-         _mesa_error(ctx, GL_INVALID_VALUE,
-                     "glGetCompressedTexImageARB(level)");
-      }
-   }
-   _mesa_unlock_texture(ctx, texObj);
-}
index eb60a1f..094177d 100644 (file)
@@ -73,6 +73,10 @@ _mesa_init_teximage_fields(GLcontext *ctx, GLenum target,
 
 
 extern void
+_mesa_clear_texture_image(GLcontext *ctx, struct gl_texture_image *texImage);
+
+
+extern void
 _mesa_set_tex_image(struct gl_texture_object *tObj,
                     GLenum target, GLint level,
                     struct gl_texture_image *texImage);
@@ -111,10 +115,6 @@ extern GLuint
 _mesa_tex_target_to_face(GLenum target);
 
 
-extern GLboolean
-_mesa_is_color_format(GLenum format);
-
-
 /**
  * Lock a texture for updating.  See also _mesa_lock_context_textures().
  */
@@ -164,11 +164,6 @@ _mesa_TexImage3DEXT( GLenum target, GLint level, GLenum internalformat,
 
 
 extern void GLAPIENTRY
-_mesa_GetTexImage( GLenum target, GLint level,
-                   GLenum format, GLenum type, GLvoid *pixels );
-
-
-extern void GLAPIENTRY
 _mesa_TexSubImage1D( GLenum target, GLint level, GLint xoffset,
                      GLsizei width,
                      GLenum format, GLenum type,
@@ -260,9 +255,6 @@ _mesa_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset,
                                  GLsizei height, GLsizei depth, GLenum format,
                                  GLsizei imageSize, const GLvoid *data);
 
-extern void GLAPIENTRY
-_mesa_GetCompressedTexImageARB(GLenum target, GLint lod, GLvoid *img);
-
 /*@}*/
 
 #endif
index 2082f94..d09c439 100644 (file)
@@ -261,6 +261,32 @@ _mesa_copy_texture_object( struct gl_texture_object *dest,
 
 
 /**
+ * Clear all texture images of the given texture object.
+ *
+ * \param ctx GL context.
+ * \param t texture object.
+ *
+ * \sa _mesa_clear_texture_image().
+ */
+void
+_mesa_clear_texture_object(GLcontext *ctx, struct gl_texture_object *texObj)
+{
+   GLuint i, j;
+
+   if (texObj->Target == 0)
+      return;
+
+   for (i = 0; i < MAX_FACES; i++) {
+      for (j = 0; j < MAX_TEXTURE_LEVELS; j++) {
+         struct gl_texture_image *texImage = texObj->Image[i][j];
+         if (texImage)
+            _mesa_clear_texture_image(ctx, texImage);
+      }
+   }
+}
+
+
+/**
  * Check if the given texture object is valid by examining its Target field.
  * For debugging only.
  */
@@ -308,7 +334,7 @@ _mesa_reference_texobj(struct gl_texture_object **ptr,
       GLboolean deleteFlag = GL_FALSE;
       struct gl_texture_object *oldTex = *ptr;
 
-      assert(valid_texture_object(oldTex));
+      ASSERT(valid_texture_object(oldTex));
 
       _glthread_LOCK_MUTEX(oldTex->Mutex);
       ASSERT(oldTex->RefCount > 0);
@@ -331,7 +357,7 @@ _mesa_reference_texobj(struct gl_texture_object **ptr,
 
    if (tex) {
       /* reference new texture */
-      assert(valid_texture_object(tex));
+      ASSERT(valid_texture_object(tex));
       _glthread_LOCK_MUTEX(tex->Mutex);
       if (tex->RefCount == 0) {
          /* this texture's being deleted (look just above) */
@@ -665,6 +691,24 @@ _mesa_test_texobj_completeness( const GLcontext *ctx,
 
 
 /**
+ * Mark a texture object dirty.  It forces the object to be incomplete
+ * and optionally forces the context to re-validate its state.
+ *
+ * \param ctx GL context.
+ * \param texObj texture object.
+ * \param invalidate_state also invalidate context state.
+ */
+void
+_mesa_dirty_texobj(GLcontext *ctx, struct gl_texture_object *texObj,
+                   GLboolean invalidate_state)
+{
+   texObj->_Complete = GL_FALSE;
+   if (invalidate_state)
+      ctx->NewState |= _NEW_TEXTURE;
+}
+
+
+/**
  * Return pointer to a default/fallback texture.
  * The texture is a 2D 8x8 RGBA texture with all texels = (0,0,0,1).
  * That's the value a sampler should get when sampling from an
@@ -715,7 +759,6 @@ _mesa_get_fallback_texture(GLcontext *ctx)
 }
 
 
-
 /*@}*/
 
 
@@ -1160,10 +1203,9 @@ _mesa_IsTexture( GLuint texture )
 
 
 /**
- * Simplest implementation of texture locking: Grab the a new mutex in
- * the shared context.  Examine the shared context state timestamp and
- * if there has been a change, set the appropriate bits in
- * ctx->NewState.
+ * Simplest implementation of texture locking: grab the shared tex
+ * mutex.  Examine the shared context state timestamp and if there has
+ * been a change, set the appropriate bits in ctx->NewState.
  *
  * This is used to deal with synchronizing things when a texture object
  * is used/modified by different contexts (or threads) which are sharing
index 2599c08..9bfebd4 100644 (file)
@@ -58,6 +58,9 @@ _mesa_copy_texture_object( struct gl_texture_object *dest,
                            const struct gl_texture_object *src );
 
 extern void
+_mesa_clear_texture_object(GLcontext *ctx, struct gl_texture_object *obj);
+
+extern void
 _mesa_reference_texobj(struct gl_texture_object **ptr,
                        struct gl_texture_object *tex);
 
@@ -65,6 +68,10 @@ extern void
 _mesa_test_texobj_completeness( const GLcontext *ctx,
                                 struct gl_texture_object *obj );
 
+extern void
+_mesa_dirty_texobj(GLcontext *ctx, struct gl_texture_object *texObj,
+                   GLboolean invalidate_state);
+
 extern struct gl_texture_object *
 _mesa_get_fallback_texture(GLcontext *ctx);
 
@@ -76,7 +83,6 @@ _mesa_lock_context_textures( GLcontext *ctx );
 
 /*@}*/
 
-
 /**
  * \name API functions
  */
index d27c593..05d1442 100644 (file)
@@ -38,6 +38,7 @@
 #include "main/texcompress.h"
 #include "main/texparam.h"
 #include "main/teximage.h"
+#include "main/texstate.h"
 #include "shader/prog_instruction.h"
 
 
@@ -88,7 +89,7 @@ get_texobj(GLcontext *ctx, GLenum target)
       return NULL;
    }
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
 
    switch (target) {
    case GL_TEXTURE_1D:
@@ -716,44 +717,6 @@ _mesa_GetTexLevelParameterfv( GLenum target, GLint level,
 }
 
 
-static GLuint
-tex_image_dimensions(GLcontext *ctx, GLenum target)
-{
-   switch (target) {
-      case GL_TEXTURE_1D:
-      case GL_PROXY_TEXTURE_1D:
-         return 1;
-      case GL_TEXTURE_2D:
-      case GL_PROXY_TEXTURE_2D:
-         return 2;
-      case GL_TEXTURE_3D:
-      case GL_PROXY_TEXTURE_3D:
-         return 3;
-      case GL_TEXTURE_CUBE_MAP:
-      case GL_PROXY_TEXTURE_CUBE_MAP:
-      case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
-      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
-      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
-      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
-      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
-      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
-         return ctx->Extensions.ARB_texture_cube_map ? 2 : 0;
-      case GL_TEXTURE_RECTANGLE_NV:
-      case GL_PROXY_TEXTURE_RECTANGLE_NV:
-         return ctx->Extensions.NV_texture_rectangle ? 2 : 0;
-      case GL_TEXTURE_1D_ARRAY_EXT:
-      case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
-         return ctx->Extensions.MESA_texture_array ? 2 : 0;
-      case GL_TEXTURE_2D_ARRAY_EXT:
-      case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
-         return ctx->Extensions.MESA_texture_array ? 3 : 0;
-      default:
-         _mesa_problem(ctx, "bad target in _mesa_tex_target_dimensions()");
-         return 0;
-   }
-}
-
-
 void GLAPIENTRY
 _mesa_GetTexLevelParameteriv( GLenum target, GLint level,
                               GLenum pname, GLint *params )
@@ -761,7 +724,6 @@ _mesa_GetTexLevelParameteriv( GLenum target, GLint level,
    const struct gl_texture_unit *texUnit;
    struct gl_texture_object *texObj;
    const struct gl_texture_image *img = NULL;
-   GLuint dimensions;
    GLboolean isProxy;
    GLint maxLevels;
    GET_CURRENT_CONTEXT(ctx);
@@ -773,19 +735,13 @@ _mesa_GetTexLevelParameteriv( GLenum target, GLint level,
       return;
    }
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
 
    /* this will catch bad target values */
-   dimensions = tex_image_dimensions(ctx, target);  /* 1, 2 or 3 */
-   if (dimensions == 0) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexLevelParameter[if]v(target)");
-      return;
-   }
-
    maxLevels = _mesa_max_texture_levels(ctx, target);
    if (maxLevels == 0) {
-      /* should not happen since <target> was just checked above */
-      _mesa_problem(ctx, "maxLevels=0 in _mesa_GetTexLevelParameter");
+      _mesa_error(ctx, GL_INVALID_ENUM,
+                  "glGetTexLevelParameter[if]v(target=0x%x)", target);
       return;
    }
 
@@ -1002,7 +958,7 @@ _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params )
       return;
    }
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
 
    obj = _mesa_select_tex_object(ctx, texUnit, target);
    if (!obj) {
@@ -1169,7 +1125,7 @@ _mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params )
       return;
    }
 
-   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
+   texUnit = _mesa_get_current_tex_unit(ctx);
 
    obj = _mesa_select_tex_object(ctx, texUnit, target);
    if (!obj) {
index a7d7088..17ac680 100644 (file)
 #include "mtypes.h"
 
 
+/**
+ * Return pointer to current texture unit.
+ * This the texture unit set by glActiveTexture(), not glClientActiveTexture().
+ */
+static INLINE struct gl_texture_unit *
+_mesa_get_current_tex_unit(GLcontext *ctx)
+{
+   ASSERT(ctx->Texture.CurrentUnit < Elements(ctx->Texture.Unit));
+   return &(ctx->Texture.Unit[ctx->Texture.CurrentUnit]);
+}
+
+
 extern void
 _mesa_copy_texture_state( const GLcontext *src, GLcontext *dst );
 
@@ -48,16 +60,14 @@ _mesa_print_texunit_state( GLcontext *ctx, GLuint unit );
  */
 /*@{*/
 
-
-/*
- * GL_ARB_multitexture
- */
 extern void GLAPIENTRY
 _mesa_ActiveTextureARB( GLenum target );
 
 extern void GLAPIENTRY
 _mesa_ClientActiveTextureARB( GLenum target );
 
+/*@}*/
+
 
 /**
  * \name Initialization, state maintenance
index bfced1b..a22db62 100644 (file)
@@ -3138,7 +3138,7 @@ _mesa_validate_pbo_teximage(GLcontext *ctx, GLuint dimensions,
 {
    GLubyte *buf;
 
-   if (unpack->BufferObj->Name == 0) {
+   if (!_mesa_is_bufferobj(unpack->BufferObj)) {
       /* no PBO */
       return pixels;
    }
@@ -3174,7 +3174,7 @@ _mesa_validate_pbo_compressed_teximage(GLcontext *ctx,
 {
    GLubyte *buf;
 
-   if (packing->BufferObj->Name == 0) {
+   if (!_mesa_is_bufferobj(packing->BufferObj)) {
       /* not using a PBO - return pointer unchanged */
       return pixels;
    }
@@ -3204,7 +3204,7 @@ void
 _mesa_unmap_teximage_pbo(GLcontext *ctx,
                          const struct gl_pixelstore_attrib *unpack)
 {
-   if (unpack->BufferObj->Name) {
+   if (_mesa_is_bufferobj(unpack->BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
                               unpack->BufferObj);
    }
index 3d5b8fa..be1c03c 100644 (file)
@@ -135,7 +135,8 @@ _mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
          break;
 #endif
       default:
-         _mesa_error( ctx, GL_INVALID_ENUM, "glVertexPointer(type)" );
+         _mesa_error( ctx, GL_INVALID_ENUM, "glVertexPointer(type=%s)",
+                      _mesa_lookup_enum_by_nr(type));
          return;
    }
 
@@ -186,7 +187,8 @@ _mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr )
          break;
 #endif
       default:
-         _mesa_error( ctx, GL_INVALID_ENUM, "glNormalPointer(type)" );
+         _mesa_error( ctx, GL_INVALID_ENUM, "glNormalPointer(type=%s)",
+                      _mesa_lookup_enum_by_nr(type));
          return;
    }
 
@@ -265,7 +267,8 @@ _mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
          break;
 #endif
       default:
-         _mesa_error( ctx, GL_INVALID_ENUM, "glColorPointer(type)" );
+         _mesa_error( ctx, GL_INVALID_ENUM, "glColorPointer(type=%s)",
+                      _mesa_lookup_enum_by_nr(type));
          return;
    }
 
@@ -415,7 +418,8 @@ _mesa_SecondaryColorPointerEXT(GLint size, GLenum type,
          elementSize = size * sizeof(GLdouble);
          break;
       default:
-         _mesa_error( ctx, GL_INVALID_ENUM, "glSecondaryColorPointer(type)" );
+         _mesa_error( ctx, GL_INVALID_ENUM, "glSecondaryColorPointer(type=%s)",
+                      _mesa_lookup_enum_by_nr(type));
          return;
    }
 
@@ -476,7 +480,8 @@ _mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride,
          break;
 #endif
       default:
-         _mesa_error( ctx, GL_INVALID_ENUM, "glTexCoordPointer(type)" );
+         _mesa_error( ctx, GL_INVALID_ENUM, "glTexCoordPointer(type=%s)",
+                      _mesa_lookup_enum_by_nr(type));
          return;
    }
 
@@ -610,7 +615,8 @@ _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
          elementSize = size * sizeof(GLdouble);
          break;
       default:
-         _mesa_error( ctx, GL_INVALID_ENUM, "glVertexAttribPointerNV(type)" );
+         _mesa_error( ctx, GL_INVALID_ENUM, "glVertexAttribPointerNV(type=%s)",
+                      _mesa_lookup_enum_by_nr(type));
          return;
    }
 
@@ -1093,6 +1099,29 @@ _mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count,
 
 
 /**
+ * Copy one client vertex array to another.
+ */
+void
+_mesa_copy_client_array(GLcontext *ctx,
+                        struct gl_client_array *dst,
+                        struct gl_client_array *src)
+{
+   dst->Size = src->Size;
+   dst->Type = src->Type;
+   dst->Format = src->Format;
+   dst->Stride = src->Stride;
+   dst->StrideB = src->StrideB;
+   dst->Ptr = src->Ptr;
+   dst->Enabled = src->Enabled;
+   dst->Normalized = src->Normalized;
+   dst->_ElementSize = src->_ElementSize;
+   _mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj);
+   dst->_MaxElement = src->_MaxElement;
+}
+
+
+
+/**
  * Print vertex array's fields.
  */
 static void
index d4d505a..becc67c 100644 (file)
@@ -161,6 +161,12 @@ _mesa_DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
 
 
 extern void
+_mesa_copy_client_array(GLcontext *ctx,
+                        struct gl_client_array *dst,
+                        struct gl_client_array *src);
+
+
+extern void
 _mesa_print_arrays(GLcontext *ctx);
 
 extern void
index 50e0402..309308c 100644 (file)
@@ -120,6 +120,10 @@ _mesa_DepthRange(GLclampd nearval, GLclampd farval)
    if (MESA_VERBOSE&VERBOSE_API)
       _mesa_debug(ctx, "glDepthRange %f %f\n", nearval, farval);
 
+   if (ctx->Viewport.Near == nearval &&
+       ctx->Viewport.Far == farval)
+      return;
+
    ctx->Viewport.Near = (GLfloat) CLAMP(nearval, 0.0, 1.0);
    ctx->Viewport.Far = (GLfloat) CLAMP(farval, 0.0, 1.0);
    ctx->NewState |= _NEW_VIEWPORT;
index 8596aa2..05ee4f5 100644 (file)
@@ -127,13 +127,6 @@ _mesa_parse_arb_fragment_program(GLcontext* ctx, GLenum target,
    if (program->FogOption)
       program->Base.InputsRead |= FRAG_BIT_FOGC;
 
-   /* XXX: assume that ARB fragment programs don't have access to the
-    * FrontFacing and PointCoord values stuffed into the fog
-    * coordinate in GLSL shaders.
-    */
-   if (program->Base.InputsRead & FRAG_BIT_FOGC)
-      program->UsesFogFragCoord = GL_TRUE;
-      
    if (program->Base.Instructions)
       _mesa_free(program->Base.Instructions);
    program->Base.Instructions = prog.Instructions;
index 40ad998..39a221e 100644 (file)
 #define NEGATE_Y    0x2
 #define NEGATE_Z    0x4
 #define NEGATE_W    0x8
+#define NEGATE_XYZ  0x7
 #define NEGATE_XYZW 0xf
 #define NEGATE_NONE 0x0
 /*@}*/
@@ -303,11 +304,11 @@ struct prog_dst_register
     * Condition code swizzle value.
     */
    GLuint CondSwizzle:12;
-   
+
    /**
     * Selects the condition code register to use for conditional destination
     * update masking.  In NV_fragmnet_program or NV_vertex_program2 mode, only
-    * condition code register 0 is available.  In NV_vertex_program3 mode, 
+    * condition code register 0 is available.  In NV_vertex_program3 mode,
     * condition code registers 0 and 1 are available.
     */
    GLuint CondSrc:1;
@@ -359,7 +360,7 @@ struct prog_instruction
     * NV_fragment_program, NV_fragment_program_option, NV_vertex_program3.
     */
    GLuint SaturateMode:2;
-   
+
    /**
     * Per-instruction selectable precision: FLOAT32, FLOAT16, FIXED12.
     *
@@ -374,7 +375,7 @@ struct prog_instruction
    /*@{*/
    /** Source texture unit. */
    GLuint TexSrcUnit:5;
-   
+
    /** Source texture target, one of TEXTURE_{1D,2D,3D,CUBE,RECT}_INDEX */
    GLuint TexSrcTarget:3;
 
index 441496b..1763a35 100644 (file)
@@ -541,7 +541,7 @@ _mesa_print_alu_instruction(const struct prog_instruction *inst,
 /**
  * Print a single vertex/fragment program instruction.
  */
-static GLint
+GLint
 _mesa_fprint_instruction_opt(FILE *f,
                             const struct prog_instruction *inst,
                             GLint indent,
@@ -933,7 +933,7 @@ _mesa_write_shader_to_file(const struct gl_shader *shader)
       return;
    }
 
-   fprintf(f, "/* Shader %u source */\n", shader->Name);
+   fprintf(f, "/* Shader %u source, checksum %u */\n", shader->Name, shader->SourceChecksum);
    fputs(shader->Source, f);
    fprintf(f, "\n");
 
@@ -958,3 +958,35 @@ _mesa_write_shader_to_file(const struct gl_shader *shader)
 }
 
 
+/**
+ * Append the shader's uniform info/values to the shader log file.
+ * The log file will typically have been created by the
+ * _mesa_write_shader_to_file function.
+ */
+void
+_mesa_append_uniforms_to_file(const struct gl_shader *shader,
+                              const struct gl_program *prog)
+{
+   const char *type;
+   char filename[100];
+   FILE *f;
+
+   if (shader->Type == GL_FRAGMENT_SHADER)
+      type = "frag";
+   else
+      type = "vert";
+
+   _mesa_snprintf(filename, sizeof(filename), "shader_%u.%s", shader->Name, type);
+   f = fopen(filename, "a"); /* append */
+   if (!f) {
+      fprintf(stderr, "Unable to open %s for appending\n", filename);
+      return;
+   }
+
+   fprintf(f, "/* First-draw parameters / constants */\n");
+   fprintf(f, "/*\n");
+   _mesa_fprint_parameter_list(f, prog->Parameters);
+   fprintf(f, "*/\n");
+
+   fclose(f);
+}
index d55661c..fc286de 100644 (file)
@@ -57,6 +57,13 @@ extern void
 _mesa_print_instruction(const struct prog_instruction *inst);
 
 extern GLint
+_mesa_fprint_instruction_opt(FILE *f,
+                            const struct prog_instruction *inst,
+                            GLint indent,
+                            gl_prog_print_mode mode,
+                            const struct gl_program *prog);
+
+extern GLint
 _mesa_print_instruction_opt(const struct prog_instruction *inst, GLint indent,
                             gl_prog_print_mode mode,
                             const struct gl_program *prog);
@@ -79,5 +86,9 @@ _mesa_print_parameter_list(const struct gl_program_parameter_list *list);
 extern void
 _mesa_write_shader_to_file(const struct gl_shader *shader);
 
+extern void
+_mesa_append_uniforms_to_file(const struct gl_shader *shader,
+                              const struct gl_program *prog);
+
 
 #endif /* PROG_PRINT_H */
index ac5fe0f..f70c75c 100644 (file)
@@ -396,7 +396,6 @@ _mesa_append_fog_code(GLcontext *ctx, struct gl_fragment_program *fprog)
    fprog->Base.Instructions = newInst;
    fprog->Base.NumInstructions = inst - newInst;
    fprog->Base.InputsRead |= FRAG_BIT_FOGC;
-   fprog->UsesFogFragCoord = GL_TRUE;
    /* XXX do this?  fprog->FogOption = GL_NONE; */
 }
 
index 648fbc1..cf0a902 100644 (file)
@@ -885,7 +885,7 @@ _mesa_get_active_attrib(GLcontext *ctx, GLuint program, GLuint index,
 static struct gl_program_parameter *
 get_uniform_parameter(const struct gl_shader_program *shProg, GLuint index)
 {
-   const struct gl_program *prog;
+   const struct gl_program *prog = NULL;
    GLint progPos;
 
    progPos = shProg->Uniforms->Uniforms[index].VertPos;
@@ -915,7 +915,7 @@ _mesa_get_active_uniform(GLcontext *ctx, GLuint program, GLuint index,
                          GLenum *type, GLchar *nameOut)
 {
    const struct gl_shader_program *shProg;
-   const struct gl_program *prog;
+   const struct gl_program *prog = NULL;
    const struct gl_program_parameter *param;
    GLint progPos;
 
@@ -1431,6 +1431,9 @@ _mesa_shader_source(GLcontext *ctx, GLuint shader, const GLchar *source)
    }
    sh->Source = source;
    sh->CompileStatus = GL_FALSE;
+#ifdef DEBUG
+   sh->SourceChecksum = _mesa_str_checksum(sh->Source);
+#endif
 }
 
 
@@ -1506,9 +1509,10 @@ _mesa_use_program(GLcontext *ctx, GLuint program)
          GLuint i;
          _mesa_printf("Use Shader %u\n", shProg->Name);
          for (i = 0; i < shProg->NumShaders; i++) {
-            _mesa_printf(" shader %u, type 0x%x\n",
+            _mesa_printf(" shader %u, type 0x%x, checksum %u\n",
                          shProg->Shaders[i]->Name,
-                         shProg->Shaders[i]->Type);
+                         shProg->Shaders[i]->Type,
+                         shProg->Shaders[i]->SourceChecksum);
          }
          if (shProg->VertexProgram)
             printf(" vert prog %u\n", shProg->VertexProgram->Base.Id);
index 289d946..ad2e306 100644 (file)
@@ -710,3 +710,186 @@ _slang_alloc_statevar(slang_ir_node *n,
    *direct = GL_FALSE;
    return alloc_state_var_array(n->Var, paramList);
 }
+
+
+
+
+#define SWIZZLE_ZWWW MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W)
+
+
+/** Predefined shader inputs */
+struct input_info
+{
+   const char *Name;
+   GLuint Attrib;
+   GLenum Type;
+   GLuint Swizzle;
+};
+
+/** Predefined vertex shader inputs/attributes */
+static const struct input_info vertInputs[] = {
+   { "gl_Vertex", VERT_ATTRIB_POS, GL_FLOAT_VEC4, SWIZZLE_NOOP },
+   { "gl_Normal", VERT_ATTRIB_NORMAL, GL_FLOAT_VEC3, SWIZZLE_NOOP },
+   { "gl_Color", VERT_ATTRIB_COLOR0, GL_FLOAT_VEC4, SWIZZLE_NOOP },
+   { "gl_SecondaryColor", VERT_ATTRIB_COLOR1, GL_FLOAT_VEC4, SWIZZLE_NOOP },
+   { "gl_FogCoord", VERT_ATTRIB_FOG, GL_FLOAT, SWIZZLE_XXXX },
+   { "gl_MultiTexCoord0", VERT_ATTRIB_TEX0, GL_FLOAT_VEC4, SWIZZLE_NOOP },
+   { "gl_MultiTexCoord1", VERT_ATTRIB_TEX1, GL_FLOAT_VEC4, SWIZZLE_NOOP },
+   { "gl_MultiTexCoord2", VERT_ATTRIB_TEX2, GL_FLOAT_VEC4, SWIZZLE_NOOP },
+   { "gl_MultiTexCoord3", VERT_ATTRIB_TEX3, GL_FLOAT_VEC4, SWIZZLE_NOOP },
+   { "gl_MultiTexCoord4", VERT_ATTRIB_TEX4, GL_FLOAT_VEC4, SWIZZLE_NOOP },
+   { "gl_MultiTexCoord5", VERT_ATTRIB_TEX5, GL_FLOAT_VEC4, SWIZZLE_NOOP },
+   { "gl_MultiTexCoord6", VERT_ATTRIB_TEX6, GL_FLOAT_VEC4, SWIZZLE_NOOP },
+   { "gl_MultiTexCoord7", VERT_ATTRIB_TEX7, GL_FLOAT_VEC4, SWIZZLE_NOOP },
+   { NULL, 0, SWIZZLE_NOOP }
+};
+
+/** Predefined fragment shader inputs */
+static const struct input_info fragInputs[] = {
+   { "gl_FragCoord", FRAG_ATTRIB_WPOS, GL_FLOAT_VEC4, SWIZZLE_NOOP },
+   { "gl_Color", FRAG_ATTRIB_COL0, GL_FLOAT_VEC4, SWIZZLE_NOOP },
+   { "gl_SecondaryColor", FRAG_ATTRIB_COL1, GL_FLOAT_VEC4, SWIZZLE_NOOP },
+   { "gl_TexCoord", FRAG_ATTRIB_TEX0, GL_FLOAT_VEC4, SWIZZLE_NOOP },
+   /* note: we're packing several quantities into the fogcoord vector */
+   { "gl_FogFragCoord", FRAG_ATTRIB_FOGC, GL_FLOAT, SWIZZLE_XXXX },
+   { "gl_FrontFacing", FRAG_ATTRIB_FACE, GL_FLOAT, SWIZZLE_XXXX },
+   { "gl_PointCoord", FRAG_ATTRIB_PNTC, GL_FLOAT_VEC2, SWIZZLE_XYZW },
+   { NULL, 0, SWIZZLE_NOOP }
+};
+
+
+/**
+ * Return the VERT_ATTRIB_* or FRAG_ATTRIB_* value that corresponds to
+ * a vertex or fragment program input variable.  Return -1 if the input
+ * name is invalid.
+ * XXX return size too
+ */
+GLint
+_slang_input_index(const char *name, GLenum target, GLuint *swizzleOut)
+{
+   const struct input_info *inputs;
+   GLuint i;
+
+   switch (target) {
+   case GL_VERTEX_PROGRAM_ARB:
+      inputs = vertInputs;
+      break;
+   case GL_FRAGMENT_PROGRAM_ARB:
+      inputs = fragInputs;
+      break;
+   /* XXX geom program */
+   default:
+      _mesa_problem(NULL, "bad target in _slang_input_index");
+      return -1;
+   }
+
+   ASSERT(MAX_TEXTURE_COORD_UNITS == 8); /* if this fails, fix vertInputs above */
+
+   for (i = 0; inputs[i].Name; i++) {
+      if (strcmp(inputs[i].Name, name) == 0) {
+         /* found */
+         *swizzleOut = inputs[i].Swizzle;
+         return inputs[i].Attrib;
+      }
+   }
+   return -1;
+}
+
+
+/**
+ * Return name of the given vertex attribute (VERT_ATTRIB_x).
+ */
+const char *
+_slang_vert_attrib_name(GLuint attrib)
+{
+   GLuint i;
+   assert(attrib < VERT_ATTRIB_GENERIC0);
+   for (i = 0; vertInputs[i].Name; i++) {
+      if (vertInputs[i].Attrib == attrib)
+         return vertInputs[i].Name;
+   }
+   return NULL;
+}
+
+
+/**
+ * Return type (GL_FLOAT, GL_FLOAT_VEC2, etc) of the given vertex
+ * attribute (VERT_ATTRIB_x).
+ */
+GLenum
+_slang_vert_attrib_type(GLuint attrib)
+{
+   GLuint i;
+   assert(attrib < VERT_ATTRIB_GENERIC0);
+   for (i = 0; vertInputs[i].Name; i++) {
+      if (vertInputs[i].Attrib == attrib)
+         return vertInputs[i].Type;
+   }
+   return GL_NONE;
+}
+
+
+
+
+
+/** Predefined shader output info */
+struct output_info
+{
+   const char *Name;
+   GLuint Attrib;
+};
+
+/** Predefined vertex shader outputs */
+static const struct output_info vertOutputs[] = {
+   { "gl_Position", VERT_RESULT_HPOS },
+   { "gl_FrontColor", VERT_RESULT_COL0 },
+   { "gl_BackColor", VERT_RESULT_BFC0 },
+   { "gl_FrontSecondaryColor", VERT_RESULT_COL1 },
+   { "gl_BackSecondaryColor", VERT_RESULT_BFC1 },
+   { "gl_TexCoord", VERT_RESULT_TEX0 },
+   { "gl_FogFragCoord", VERT_RESULT_FOGC },
+   { "gl_PointSize", VERT_RESULT_PSIZ },
+   { NULL, 0 }
+};
+
+/** Predefined fragment shader outputs */
+static const struct output_info fragOutputs[] = {
+   { "gl_FragColor", FRAG_RESULT_COLOR },
+   { "gl_FragDepth", FRAG_RESULT_DEPTH },
+   { "gl_FragData", FRAG_RESULT_DATA0 },
+   { NULL, 0 }
+};
+
+
+/**
+ * Return the VERT_RESULT_* or FRAG_RESULT_* value that corresponds to
+ * a vertex or fragment program output variable.  Return -1 for an invalid
+ * output name.
+ */
+GLint
+_slang_output_index(const char *name, GLenum target)
+{
+   const struct output_info *outputs;
+   GLuint i;
+
+   switch (target) {
+   case GL_VERTEX_PROGRAM_ARB:
+      outputs = vertOutputs;
+      break;
+   case GL_FRAGMENT_PROGRAM_ARB:
+      outputs = fragOutputs;
+      break;
+   /* XXX geom program */
+   default:
+      _mesa_problem(NULL, "bad target in _slang_output_index");
+      return -1;
+   }
+
+   for (i = 0; outputs[i].Name; i++) {
+      if (strcmp(outputs[i].Name, name) == 0) {
+         /* found */
+         return outputs[i].Attrib;
+      }
+   }
+   return -1;
+}
index 7f6fe80..f814d11 100644 (file)
@@ -37,4 +37,18 @@ _slang_alloc_statevar(slang_ir_node *n,
                       GLboolean *direct);
 
 
+extern GLint
+_slang_input_index(const char *name, GLenum target, GLuint *swizzleOut);
+
+extern GLint
+_slang_output_index(const char *name, GLenum target);
+
+
+extern const char *
+_slang_vert_attrib_name(GLuint attrib);
+
+extern GLenum
+_slang_vert_attrib_type(GLuint attrib);
+
+
 #endif /* SLANG_BUILTIN_H */
index 2b7e781..349f432 100644 (file)
@@ -46,6 +46,7 @@
 #include "shader/prog_print.h"
 #include "shader/prog_statevars.h"
 #include "slang_typeinfo.h"
+#include "slang_builtin.h"
 #include "slang_codegen.h"
 #include "slang_compile.h"
 #include "slang_label.h"
@@ -342,109 +343,6 @@ slang_operation_identifier(slang_operation *oper,
 }
 
 
-#define SWIZZLE_ZWWW MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W)
-
-/**
- * Return the VERT_ATTRIB_* or FRAG_ATTRIB_* value that corresponds to
- * a vertex or fragment program input variable.  Return -1 if the input
- * name is invalid.
- * XXX return size too
- */
-static GLint
-_slang_input_index(const char *name, GLenum target, GLuint *swizzleOut)
-{
-   struct input_info {
-      const char *Name;
-      GLuint Attrib;
-      GLuint Swizzle;
-   };
-   static const struct input_info vertInputs[] = {
-      { "gl_Vertex", VERT_ATTRIB_POS, SWIZZLE_NOOP },
-      { "gl_Normal", VERT_ATTRIB_NORMAL, SWIZZLE_NOOP },
-      { "gl_Color", VERT_ATTRIB_COLOR0, SWIZZLE_NOOP },
-      { "gl_SecondaryColor", VERT_ATTRIB_COLOR1, SWIZZLE_NOOP },
-      { "gl_FogCoord", VERT_ATTRIB_FOG, SWIZZLE_XXXX },
-      { "gl_MultiTexCoord0", VERT_ATTRIB_TEX0, SWIZZLE_NOOP },
-      { "gl_MultiTexCoord1", VERT_ATTRIB_TEX1, SWIZZLE_NOOP },
-      { "gl_MultiTexCoord2", VERT_ATTRIB_TEX2, SWIZZLE_NOOP },
-      { "gl_MultiTexCoord3", VERT_ATTRIB_TEX3, SWIZZLE_NOOP },
-      { "gl_MultiTexCoord4", VERT_ATTRIB_TEX4, SWIZZLE_NOOP },
-      { "gl_MultiTexCoord5", VERT_ATTRIB_TEX5, SWIZZLE_NOOP },
-      { "gl_MultiTexCoord6", VERT_ATTRIB_TEX6, SWIZZLE_NOOP },
-      { "gl_MultiTexCoord7", VERT_ATTRIB_TEX7, SWIZZLE_NOOP },
-      { NULL, 0, SWIZZLE_NOOP }
-   };
-   static const struct input_info fragInputs[] = {
-      { "gl_FragCoord", FRAG_ATTRIB_WPOS, SWIZZLE_NOOP },
-      { "gl_Color", FRAG_ATTRIB_COL0, SWIZZLE_NOOP },
-      { "gl_SecondaryColor", FRAG_ATTRIB_COL1, SWIZZLE_NOOP },
-      { "gl_TexCoord", FRAG_ATTRIB_TEX0, SWIZZLE_NOOP },
-      /* note: we're packing several quantities into the fogcoord vector */
-      { "gl_FogFragCoord", FRAG_ATTRIB_FOGC, SWIZZLE_XXXX },
-      { "gl_FrontFacing", FRAG_ATTRIB_FOGC, SWIZZLE_YYYY }, /*XXX*/
-      { "gl_PointCoord", FRAG_ATTRIB_FOGC, SWIZZLE_ZWWW },
-      { NULL, 0, SWIZZLE_NOOP }
-   };
-   GLuint i;
-   const struct input_info *inputs
-      = (target == GL_VERTEX_PROGRAM_ARB) ? vertInputs : fragInputs;
-
-   ASSERT(MAX_TEXTURE_COORD_UNITS == 8); /* if this fails, fix vertInputs above */
-
-   for (i = 0; inputs[i].Name; i++) {
-      if (strcmp(inputs[i].Name, name) == 0) {
-         /* found */
-         *swizzleOut = inputs[i].Swizzle;
-         return inputs[i].Attrib;
-      }
-   }
-   return -1;
-}
-
-
-/**
- * Return the VERT_RESULT_* or FRAG_RESULT_* value that corresponds to
- * a vertex or fragment program output variable.  Return -1 for an invalid
- * output name.
- */
-static GLint
-_slang_output_index(const char *name, GLenum target)
-{
-   struct output_info {
-      const char *Name;
-      GLuint Attrib;
-   };
-   static const struct output_info vertOutputs[] = {
-      { "gl_Position", VERT_RESULT_HPOS },
-      { "gl_FrontColor", VERT_RESULT_COL0 },
-      { "gl_BackColor", VERT_RESULT_BFC0 },
-      { "gl_FrontSecondaryColor", VERT_RESULT_COL1 },
-      { "gl_BackSecondaryColor", VERT_RESULT_BFC1 },
-      { "gl_TexCoord", VERT_RESULT_TEX0 },
-      { "gl_FogFragCoord", VERT_RESULT_FOGC },
-      { "gl_PointSize", VERT_RESULT_PSIZ },
-      { NULL, 0 }
-   };
-   static const struct output_info fragOutputs[] = {
-      { "gl_FragColor", FRAG_RESULT_COLOR },
-      { "gl_FragDepth", FRAG_RESULT_DEPTH },
-      { "gl_FragData", FRAG_RESULT_DATA0 },
-      { NULL, 0 }
-   };
-   GLuint i;
-   const struct output_info *outputs
-      = (target == GL_VERTEX_PROGRAM_ARB) ? vertOutputs : fragOutputs;
-
-   for (i = 0; outputs[i].Name; i++) {
-      if (strcmp(outputs[i].Name, name) == 0) {
-         /* found */
-         return outputs[i].Attrib;
-      }
-   }
-   return -1;
-}
-
-
 /**
  * Called when we begin code/IR generation for a new while/do/for loop.
  */
index f6032d1..1caf594 100644 (file)
@@ -40,6 +40,7 @@
 #include "shader/prog_statevars.h"
 #include "shader/prog_uniform.h"
 #include "shader/shader_api.h"
+#include "slang_builtin.h"
 #include "slang_link.h"
 
 
@@ -327,6 +328,7 @@ _slang_resolve_attributes(struct gl_shader_program *shProg,
    GLint attribMap[MAX_VERTEX_GENERIC_ATTRIBS];
    GLuint i, j;
    GLbitfield usedAttributes; /* generics only, not legacy attributes */
+   GLbitfield inputsRead = 0x0;
 
    assert(origProg != linkedProg);
    assert(origProg->Target == GL_VERTEX_PROGRAM_ARB);
@@ -370,6 +372,10 @@ _slang_resolve_attributes(struct gl_shader_program *shProg,
    for (i = 0; i < linkedProg->NumInstructions; i++) {
       struct prog_instruction *inst = linkedProg->Instructions + i;
       for (j = 0; j < 3; j++) {
+         if (inst->SrcReg[j].File == PROGRAM_INPUT) {
+            inputsRead |= (1 << inst->SrcReg[j].Index);
+         }
+
          if (inst->SrcReg[j].File == PROGRAM_INPUT &&
              inst->SrcReg[j].Index >= VERT_ATTRIB_GENERIC0) {
             /*
@@ -431,6 +437,20 @@ _slang_resolve_attributes(struct gl_shader_program *shProg,
       }
    }
 
+   /* Handle pre-defined attributes here (gl_Vertex, gl_Normal, etc).
+    * When the user queries the active attributes we need to include both
+    * the user-defined attributes and the built-in ones.
+    */
+   for (i = VERT_ATTRIB_POS; i < VERT_ATTRIB_GENERIC0; i++) {
+      if (inputsRead & (1 << i)) {
+         _mesa_add_attribute(linkedProg->Attributes,
+                             _slang_vert_attrib_name(i),
+                             4, /* size in floats */
+                             _slang_vert_attrib_type(i),
+                             -1 /* attrib/input */);
+      }
+   }
+
    return GL_TRUE;
 }
 
@@ -484,20 +504,6 @@ _slang_update_inputs_outputs(struct gl_program *prog)
       for (j = 0; j < numSrc; j++) {
          if (inst->SrcReg[j].File == PROGRAM_INPUT) {
             prog->InputsRead |= 1 << inst->SrcReg[j].Index;
-            if (prog->Target == GL_FRAGMENT_PROGRAM_ARB &&
-                inst->SrcReg[j].Index == FRAG_ATTRIB_FOGC) {
-               /* The fragment shader FOGC input is used for fog,
-                * front-facing and sprite/point coord.
-                */
-               struct gl_fragment_program *fp = fragment_program(prog);
-               const GLint swz = GET_SWZ(inst->SrcReg[j].Swizzle, 0);
-               if (swz == SWIZZLE_X)
-                  fp->UsesFogFragCoord = GL_TRUE;
-               else if (swz == SWIZZLE_Y)
-                  fp->UsesFrontFacing = GL_TRUE;
-               else if (swz == SWIZZLE_Z || swz == SWIZZLE_W)
-                  fp->UsesPointCoord = GL_TRUE;
-            }
          }
          else if (inst->SrcReg[j].File == PROGRAM_ADDRESS) {
             maxAddrReg = MAX2(maxAddrReg, (GLuint) (inst->SrcReg[j].Index + 1));
index f07f96d..dfa7e06 100644 (file)
@@ -309,7 +309,8 @@ SPARC_API =                 \
        sparc/glapi_sparc.S
 
 COMMON_DRIVER_SOURCES =                        \
-       drivers/common/driverfuncs.c
+       drivers/common/driverfuncs.c    \
+       drivers/common/meta.c
 
 
 # Sources for building non-Gallium drivers
index 12d74fa..34c1e09 100644 (file)
@@ -999,18 +999,26 @@ gl_dispatch_functions_start:
        GL_STUB(glRenderbufferStorageEXT, _gloffset_RenderbufferStorageEXT)
        GL_STUB(gl_dispatch_stub_773, _gloffset_BlitFramebufferEXT)
        HIDDEN(gl_dispatch_stub_773)
+       GL_STUB(gl_dispatch_stub_774, _gloffset_BufferParameteriAPPLE)
+       HIDDEN(gl_dispatch_stub_774)
+       GL_STUB(gl_dispatch_stub_775, _gloffset_FlushMappedBufferRangeAPPLE)
+       HIDDEN(gl_dispatch_stub_775)
        GL_STUB(glFramebufferTextureLayerEXT, _gloffset_FramebufferTextureLayerEXT)
        GL_STUB(glProvokingVertexEXT, _gloffset_ProvokingVertexEXT)
-       GL_STUB(gl_dispatch_stub_776, _gloffset_StencilFuncSeparateATI)
-       HIDDEN(gl_dispatch_stub_776)
-       GL_STUB(gl_dispatch_stub_777, _gloffset_ProgramEnvParameters4fvEXT)
-       HIDDEN(gl_dispatch_stub_777)
-       GL_STUB(gl_dispatch_stub_778, _gloffset_ProgramLocalParameters4fvEXT)
+       GL_STUB(gl_dispatch_stub_778, _gloffset_GetTexParameterPointervAPPLE)
        HIDDEN(gl_dispatch_stub_778)
-       GL_STUB(gl_dispatch_stub_779, _gloffset_GetQueryObjecti64vEXT)
+       GL_STUB(gl_dispatch_stub_779, _gloffset_TextureRangeAPPLE)
        HIDDEN(gl_dispatch_stub_779)
-       GL_STUB(gl_dispatch_stub_780, _gloffset_GetQueryObjectui64vEXT)
+       GL_STUB(gl_dispatch_stub_780, _gloffset_StencilFuncSeparateATI)
        HIDDEN(gl_dispatch_stub_780)
+       GL_STUB(gl_dispatch_stub_781, _gloffset_ProgramEnvParameters4fvEXT)
+       HIDDEN(gl_dispatch_stub_781)
+       GL_STUB(gl_dispatch_stub_782, _gloffset_ProgramLocalParameters4fvEXT)
+       HIDDEN(gl_dispatch_stub_782)
+       GL_STUB(gl_dispatch_stub_783, _gloffset_GetQueryObjecti64vEXT)
+       HIDDEN(gl_dispatch_stub_783)
+       GL_STUB(gl_dispatch_stub_784, _gloffset_GetQueryObjectui64vEXT)
+       HIDDEN(gl_dispatch_stub_784)
        GL_STUB_ALIAS(glArrayElementEXT, glArrayElement)
        GL_STUB_ALIAS(glBindTextureEXT, glBindTexture)
        GL_STUB_ALIAS(glDrawArraysEXT, glDrawArrays)
index 8b3bb5c..ee649be 100644 (file)
@@ -139,23 +139,6 @@ find_translated_vp(struct st_context *st,
          if (fragInputsRead & (1 << inAttr)) {
             stfp->input_to_slot[inAttr] = numIn;
             numIn++;
-            if (((1 << inAttr) & FRAG_BIT_FOGC)) {
-               /* leave placeholders for the
-                * extra registers we extract from fog */
-               if (stfp->Base.UsesFrontFacing) {
-                  if (!stfp->Base.UsesFogFragCoord)
-                     --stfp->input_to_slot[inAttr];
-                  else
-                     ++numIn;
-               }
-               if (stfp->Base.UsesPointCoord) {
-                  if (!stfp->Base.UsesFrontFacing &&
-                      !stfp->Base.UsesFogFragCoord)
-                     stfp->input_to_slot[inAttr] -= 2;
-                  else
-                     ++numIn;
-               }
-            }
          }
          else {
             stfp->input_to_slot[inAttr] = UNUSED;
index 2852623..c741940 100644 (file)
@@ -69,34 +69,107 @@ st_BlitFramebuffer(GLcontext *ctx,
                    GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
                    GLbitfield mask, GLenum filter)
 {
+   const GLbitfield depthStencil = (GL_DEPTH_BUFFER_BIT |
+                                    GL_STENCIL_BUFFER_BIT);
    struct st_context *st = ctx->st;
-
    const uint pFilter = ((filter == GL_NEAREST)
                          ? PIPE_TEX_MIPFILTER_NEAREST
                          : PIPE_TEX_MIPFILTER_LINEAR);
+   struct gl_framebuffer *readFB = ctx->ReadBuffer;
+   struct gl_framebuffer *drawFB = ctx->DrawBuffer;
+
+   if (!_mesa_clip_blit(ctx, &srcX0, &srcY0, &srcX1, &srcY1,
+                        &dstX0, &dstY0, &dstX1, &dstY1)) {
+      return; /* nothing to draw/blit */
+   }
+
+   if (st_fb_orientation(drawFB) == Y_0_TOP) {
+      /* invert Y for dest */
+      dstY0 = drawFB->Height - dstY0;
+      dstY1 = drawFB->Height - dstY1;
+   }
+
+   if (st_fb_orientation(readFB) == Y_0_TOP) {
+      /* invert Y for src */
+      srcY0 = readFB->Height - srcY0;
+      srcY1 = readFB->Height - srcY1;
+   }
+
+   if (srcY0 > srcY1 && dstY0 > dstY1) {
+      /* Both src and dst are upside down.  Swap Y to make it
+       * right-side up to increase odds of using a fast path.
+       * Recall that all Gallium raster coords have Y=0=top.
+       */
+      GLint tmp;
+      tmp = srcY0;
+      srcY0 = srcY1;
+      srcY1 = tmp;
+      tmp = dstY0;
+      dstY0 = dstY1;
+      dstY1 = tmp;
+   }
 
    if (mask & GL_COLOR_BUFFER_BIT) {
       struct st_renderbuffer *srcRb = 
-         st_renderbuffer(ctx->ReadBuffer->_ColorReadBuffer);
+         st_renderbuffer(readFB->_ColorReadBuffer);
       struct st_renderbuffer *dstRb = 
-         st_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0]);
+         st_renderbuffer(drawFB->_ColorDrawBuffers[0]);
       struct pipe_surface *srcSurf = srcRb->surface;
       struct pipe_surface *dstSurf = dstRb->surface;
 
-      if (st_fb_orientation(ctx->DrawBuffer) == Y_0_TOP) {
-         /* invert Y */
-         srcY0 = srcRb->Base.Height - srcY0;
-         srcY1 = srcRb->Base.Height - srcY1;
-
-         dstY0 = dstRb->Base.Height - dstY0;
-         dstY1 = dstRb->Base.Height - dstY1;
-      }
-
       util_blit_pixels(st->blit,
                        srcSurf, srcX0, srcY0, srcX1, srcY1,
                        dstSurf, dstX0, dstY0, dstX1, dstY1,
                        0.0, pFilter);
+   }
 
+   if (mask & depthStencil) {
+      /* depth and/or stencil blit */
+
+      /* get src/dst depth surfaces */
+      struct st_renderbuffer *srcDepthRb = 
+         st_renderbuffer(readFB->Attachment[BUFFER_DEPTH].Renderbuffer);
+      struct st_renderbuffer *dstDepthRb = 
+         st_renderbuffer(drawFB->Attachment[BUFFER_DEPTH].Renderbuffer);
+      struct pipe_surface *srcDepthSurf =
+         srcDepthRb ? srcDepthRb->surface : NULL;
+      struct pipe_surface *dstDepthSurf =
+         dstDepthRb ? dstDepthRb->surface : NULL;
+
+      /* get src/dst stencil surfaces */
+      struct st_renderbuffer *srcStencilRb = 
+         st_renderbuffer(readFB->Attachment[BUFFER_STENCIL].Renderbuffer);
+      struct st_renderbuffer *dstStencilRb = 
+         st_renderbuffer(drawFB->Attachment[BUFFER_STENCIL].Renderbuffer);
+      struct pipe_surface *srcStencilSurf =
+         srcStencilRb ? srcStencilRb->surface : NULL;
+      struct pipe_surface *dstStencilSurf =
+         dstStencilRb ? dstStencilRb->surface : NULL;
+
+      if ((mask & depthStencil) == depthStencil &&
+          srcDepthSurf == srcStencilSurf &&
+          dstDepthSurf == dstStencilSurf) {
+         /* Blitting depth and stencil values between combined
+          * depth/stencil buffers.  This is the ideal case for such buffers.
+          */
+         util_blit_pixels(st->blit,
+                          srcDepthSurf, srcX0, srcY0, srcX1, srcY1,
+                          dstDepthSurf, dstX0, dstY0, dstX1, dstY1,
+                          0.0, pFilter);
+      }
+      else {
+         /* blitting depth and stencil separately */
+
+         if (mask & GL_DEPTH_BUFFER_BIT) {
+            /* blit Z only */
+            _mesa_problem(ctx, "st_BlitFramebuffer(DEPTH) not completed");
+         }
+
+         if (mask & GL_STENCIL_BUFFER_BIT) {
+            /* blit stencil only */
+            _mesa_problem(ctx, "st_BlitFramebuffer(STENCIL) not completed");
+         }
+      }
    }
 }
 
index 668acbc..8a8c99f 100644 (file)
@@ -280,7 +280,11 @@ clear_with_quad(GLcontext *ctx,
 static INLINE GLboolean
 check_clear_color_with_quad(GLcontext *ctx, struct gl_renderbuffer *rb)
 {
-   if (ctx->Scissor.Enabled)
+   if (ctx->Scissor.Enabled &&
+       (ctx->Scissor.X != 0 ||
+        ctx->Scissor.Y != 0 ||
+        ctx->Scissor.Width < rb->Width ||
+        ctx->Scissor.Height < rb->Height))
       return TRUE;
 
    if (!ctx->Color.ColorMask[0] ||
@@ -300,7 +304,11 @@ check_clear_depth_stencil_with_quad(GLcontext *ctx, struct gl_renderbuffer *rb)
    GLboolean maskStencil
       = (ctx->Stencil.WriteMask[0] & stencilMax) != stencilMax;
 
-   if (ctx->Scissor.Enabled)
+   if (ctx->Scissor.Enabled &&
+       (ctx->Scissor.X != 0 ||
+        ctx->Scissor.Y != 0 ||
+        ctx->Scissor.Width < rb->Width ||
+        ctx->Scissor.Height < rb->Height))
       return TRUE;
 
    if (maskStencil)
@@ -319,7 +327,11 @@ check_clear_depth_with_quad(GLcontext *ctx, struct gl_renderbuffer *rb)
    const struct st_renderbuffer *strb = st_renderbuffer(rb);
    const GLboolean isDS = pf_is_depth_and_stencil(strb->surface->format);
 
-   if (ctx->Scissor.Enabled)
+   if (ctx->Scissor.Enabled &&
+       (ctx->Scissor.X != 0 ||
+        ctx->Scissor.Y != 0 ||
+        ctx->Scissor.Width < rb->Width ||
+        ctx->Scissor.Height < rb->Height))
       return TRUE;
 
    if (isDS && 
@@ -345,7 +357,11 @@ check_clear_stencil_with_quad(GLcontext *ctx, struct gl_renderbuffer *rb)
    if (maskStencil) 
       return TRUE;
 
-   if (ctx->Scissor.Enabled)
+   if (ctx->Scissor.Enabled &&
+       (ctx->Scissor.X != 0 ||
+        ctx->Scissor.Y != 0 ||
+        ctx->Scissor.Width < rb->Width ||
+        ctx->Scissor.Height < rb->Height))
       return TRUE;
 
    /* This is correct, but it is necessary to look at the depth clear
index 8b5094a..d19a88f 100644 (file)
@@ -60,6 +60,7 @@
 #include "pipe/p_inlines.h"
 #include "util/u_tile.h"
 #include "util/u_draw_quad.h"
+#include "util/u_math.h"
 #include "shader/prog_instruction.h"
 #include "cso_cache/cso_context.h"
 
@@ -341,6 +342,7 @@ make_texture(struct st_context *st,
    enum pipe_format pipeFormat;
    GLuint cpp;
    GLenum baseFormat;
+   int ptw, pth;
 
    baseFormat = _mesa_base_format(format);
 
@@ -355,7 +357,28 @@ make_texture(struct st_context *st,
    if (!pixels)
       return NULL;
 
-   pt = st_texture_create(st, PIPE_TEXTURE_2D, pipeFormat, 0, width, height, 1,
+   /* Need to use POT texture? */
+   ptw = width;
+   pth = height;
+   if (!screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES)) {
+      int l2pt, maxSize;
+
+      l2pt = util_logbase2(width);
+      if (1<<l2pt != width) {
+         ptw = 1<<(l2pt+1);
+      }
+      l2pt = util_logbase2(height);
+      if (1<<l2pt != height) {
+         pth = 1<<(l2pt+1);
+      }
+
+      /* Check against maximum texture size */
+      maxSize = 1 << (pipe->screen->get_param(pipe->screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS) - 1);
+      assert(ptw <= maxSize);
+      assert(pth <= maxSize);
+   }
+
+   pt = st_texture_create(st, PIPE_TEXTURE_2D, pipeFormat, 0, ptw, pth, 1,
                           PIPE_TEXTURE_USAGE_SAMPLER);
    if (!pt) {
       _mesa_unmap_drawpix_pbo(ctx, unpack);
@@ -420,7 +443,7 @@ make_texture(struct st_context *st,
 static void
 draw_quad(GLcontext *ctx, GLfloat x0, GLfloat y0, GLfloat z,
           GLfloat x1, GLfloat y1, const GLfloat *color,
-          GLboolean invertTex)
+          GLboolean invertTex, GLfloat maxXcoord, GLfloat maxYcoord)
 {
    struct st_context *st = ctx->st;
    struct pipe_context *pipe = ctx->st->pipe;
@@ -435,8 +458,9 @@ draw_quad(GLcontext *ctx, GLfloat x0, GLfloat y0, GLfloat z,
       const GLfloat clip_y0 = y0 / fb_height * 2.0f - 1.0f;
       const GLfloat clip_x1 = x1 / fb_width * 2.0f - 1.0f;
       const GLfloat clip_y1 = y1 / fb_height * 2.0f - 1.0f;
-      const GLfloat sLeft = 0.0f, sRight = 1.0f;
-      const GLfloat tTop = invertTex, tBot = 1.0f - tTop;
+      const GLfloat sLeft = 0.0f, sRight = maxXcoord;
+      const GLfloat tTop = invertTex ? maxYcoord : 0.0f;
+      const GLfloat tBot = invertTex ? 0.0f : maxYcoord;
       GLuint tex, i;
 
       /* upper-left */
@@ -608,7 +632,9 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
    y0 = (GLfloat) y;
    y1 = y + height * ctx->Pixel.ZoomY;
 
-   draw_quad(ctx, x0, y0, z, x1, y1, color, invertTex);
+   draw_quad(ctx, x0, y0, z, x1, y1, color, invertTex,
+            (GLfloat) width / pt->width[0],
+            (GLfloat) height / pt->height[0]);
 
    /* restore state */
    cso_restore_rasterizer(cso);
@@ -648,7 +674,7 @@ draw_stencil_pixels(GLcontext *ctx, GLint x, GLint y,
       usage = PIPE_TRANSFER_READ_WRITE;
    else
       usage = PIPE_TRANSFER_WRITE;
-   
+
    pt = st_cond_flush_get_tex_transfer(st_context(ctx), strb->texture, 0, 0, 0,
                                       usage, x, y,
                                       width, height);
@@ -778,8 +804,8 @@ st_DrawPixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,
       return;
    }
 
-   _mesa_set_vp_override( ctx, TRUE );
-   _mesa_update_state( ctx );
+   /* Mesa state should be up to date by now */
+   assert(ctx->NewState == 0x0);
 
    st_validate_state(st);
 
@@ -807,8 +833,6 @@ st_DrawPixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,
          pipe_texture_reference(&pt, NULL);
       }
    }
-
-   _mesa_set_vp_override( ctx, FALSE );
 }
 
 
@@ -841,7 +865,7 @@ copy_stencil_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
       usage = PIPE_TRANSFER_READ_WRITE;
    else
       usage = PIPE_TRANSFER_WRITE;
-   
+
    ptDraw = st_cond_flush_get_tex_transfer(st_context(ctx),
                                           rbDraw->texture, 0, 0, 0,
                                           usage, dstx, dsty,
@@ -849,7 +873,7 @@ copy_stencil_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
 
    assert(ptDraw->block.width == 1);
    assert(ptDraw->block.height == 1);
-   
+
    /* map the stencil buffer */
    drawMap = screen->transfer_map(screen, ptDraw);
 
@@ -923,6 +947,7 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,
    struct pipe_texture *pt;
    GLfloat *color;
    enum pipe_format srcFormat, texFormat;
+   int ptw, pth;
 
    pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE, NULL);
 
@@ -1004,13 +1029,34 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,
          height -= -srcy;
          srcy = 0;
       }
-      
+
       if (height < 0)
          return;
    }
 
+   /* Need to use POT texture? */
+   ptw = width;
+   pth = height;
+   if (!screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES)) {
+      int l2pt, maxSize;
+
+      l2pt = util_logbase2(width);
+      if (1<<l2pt != width) {
+         ptw = 1<<(l2pt+1);
+      }
+      l2pt = util_logbase2(height);
+      if (1<<l2pt != height) {
+         pth = 1<<(l2pt+1);
+      }
+
+      /* Check against maximum texture size */
+      maxSize = 1 << (pipe->screen->get_param(pipe->screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS) - 1);
+      assert(ptw <= maxSize);
+      assert(pth <= maxSize);
+   }
+
    pt = st_texture_create(ctx->st, PIPE_TEXTURE_2D, texFormat, 0,
-                          width, height, 1,
+                          ptw, pth, 1,
                           PIPE_TEXTURE_USAGE_SAMPLER);
    if (!pt)
       return;
index ecdb988..a966028 100644 (file)
@@ -446,6 +446,35 @@ st_finish_render_texture(GLcontext *ctx,
 
 
 /**
+ * Validate a renderbuffer attachment for a particular usage.
+ */
+
+static GLboolean
+st_validate_attachment(struct pipe_screen *screen,
+                      const struct gl_renderbuffer_attachment *att,
+                      GLuint usage)
+{
+   const struct st_texture_object *stObj =
+      st_texture_object(att->Texture);
+
+   /**
+    * Only validate texture attachments for now, since
+    * st_renderbuffer_alloc_storage makes sure that
+    * the format is supported.
+    */
+
+   if (att->Type != GL_TEXTURE)
+      return GL_TRUE;
+
+   if (!stObj)
+      return GL_FALSE;
+
+   return screen->is_format_supported(screen, stObj->pt->format,
+                                     PIPE_TEXTURE_2D,
+                                     usage, 0);
+}
+
+/**
  * Check that the framebuffer configuration is valid in terms of what
  * the driver can support.
  *
@@ -454,13 +483,37 @@ st_finish_render_texture(GLcontext *ctx,
 static void
 st_validate_framebuffer(GLcontext *ctx, struct gl_framebuffer *fb)
 {
+   struct pipe_screen *screen = ctx->st->pipe->screen;
    const struct gl_renderbuffer *depthRb =
       fb->Attachment[BUFFER_DEPTH].Renderbuffer;
    const struct gl_renderbuffer *stencilRb =
       fb->Attachment[BUFFER_STENCIL].Renderbuffer;
+   GLuint i;
 
    if (stencilRb && depthRb && stencilRb != depthRb) {
       fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
+      return;
+   }
+
+   if (!st_validate_attachment(screen,
+                              &fb->Attachment[BUFFER_DEPTH],
+                              PIPE_TEXTURE_USAGE_DEPTH_STENCIL)) {
+      fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
+      return;
+   }
+   if (!st_validate_attachment(screen,
+                              &fb->Attachment[BUFFER_STENCIL],
+                              PIPE_TEXTURE_USAGE_DEPTH_STENCIL)) {
+      fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
+      return;
+   }
+   for (i = 0; i < ctx->Const.MaxColorAttachments; i++) {
+      if (!st_validate_attachment(screen,
+                                 &fb->Attachment[BUFFER_COLOR0 + i],
+                                 PIPE_TEXTURE_USAGE_RENDER_TARGET)) {
+        fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
+        return;
+      }
    }
 }
 
index 8ceeeab..1329f80 100644 (file)
@@ -161,4 +161,16 @@ void st_init_flush_functions(struct dd_function_table *functions)
 {
    functions->Flush = st_glFlush;
    functions->Finish = st_glFinish;
+
+   /* Windows opengl32.dll calls glFinish prior to every swapbuffers.
+    * This is unnecessary and degrades performance.  Luckily we have some
+    * scope to work around this, as the externally-visible behaviour of
+    * Finish() is identical to Flush() in all cases - no differences in
+    * rendering or ReadPixels are visible if we opt not to wait here.
+    *
+    * Only set this up on windows to avoid suprise elsewhere.
+    */
+#ifdef PIPE_OS_WINDOWS
+   functions->Finish = st_glFlush;
+#endif
 }
index 3bcccd0..d82b2a2 100644 (file)
@@ -251,7 +251,7 @@ st_RasterPos(GLcontext *ctx, const GLfloat v[4])
    rs->array[0].Ptr = (GLubyte *) v;
 
    /* draw the point */
-   st_feedback_draw_vbo(ctx, rs->arrays, &rs->prim, 1, NULL, 0, 1);
+   st_feedback_draw_vbo(ctx, rs->arrays, &rs->prim, 1, NULL, GL_TRUE, 0, 1);
 }
 
 
index 15f84b6..90a059c 100644 (file)
@@ -59,6 +59,7 @@
 #include "util/u_tile.h"
 #include "util/u_blit.h"
 #include "util/u_surface.h"
+#include "util/u_math.h"
 
 
 #define DBG if (0) printf
@@ -237,16 +238,6 @@ do_memcpy(void *dest, const void *src, size_t n)
 }
 
 
-static INLINE unsigned
-logbase2(unsigned n)
-{
-   unsigned log2 = 0;
-   while (n >>= 1)
-      ++log2;
-   return log2;
-}
-
-
 /**
  * Return default texture usage bitmask for the given texture format.
  */
@@ -340,9 +331,9 @@ guess_and_alloc_texture(struct st_context *st,
       lastLevel = firstLevel;
    }
    else {
-      GLuint l2width = logbase2(width);
-      GLuint l2height = logbase2(height);
-      GLuint l2depth = logbase2(depth);
+      GLuint l2width = util_logbase2(width);
+      GLuint l2height = util_logbase2(height);
+      GLuint l2depth = util_logbase2(depth);
       lastLevel = firstLevel + MAX2(MAX2(l2width, l2height), l2depth);
    }
 
@@ -532,6 +523,12 @@ st_TexImage(GLcontext * ctx,
    DBG("%s target %s level %d %dx%dx%d border %d\n", __FUNCTION__,
        _mesa_lookup_enum_by_nr(target), level, width, height, depth, border);
 
+   /* switch to "normal" */
+   if (stObj->surface_based) {
+      _mesa_clear_texture_object(ctx, texObj);
+      stObj->surface_based = GL_FALSE;
+   }
+
    /* gallium does not support texture borders, strip it off */
    if (border) {
       strip_texture_border(border, &width, &height, &depth, unpack, &unpackNB);
@@ -1047,7 +1044,8 @@ st_TexSubimage(GLcontext *ctx, GLint dims, GLenum target, GLint level,
       _mesa_image_image_stride(packing, width, height, format, type);
    GLint i;
    const GLubyte *src;
-   enum pipe_transfer_usage transfer_usage;
+   /* init to silence warning only: */
+   enum pipe_transfer_usage transfer_usage = PIPE_TRANSFER_WRITE;
 
    DBG("%s target %s level %d offset %d,%d %dx%d\n", __FUNCTION__,
        _mesa_lookup_enum_by_nr(target),
index 914a507..503a5f3 100644 (file)
@@ -533,6 +533,7 @@ st_draw_vbo(GLcontext *ctx,
             const struct _mesa_prim *prims,
             GLuint nr_prims,
             const struct _mesa_index_buffer *ib,
+           GLboolean index_bounds_valid,
             GLuint min_index,
             GLuint max_index)
 {
@@ -545,6 +546,10 @@ st_draw_vbo(GLcontext *ctx,
    unsigned num_vbuffers, num_velements;
    GLboolean userSpace;
 
+   /* Gallium probably doesn't want this in some cases. */
+   if (!index_bounds_valid)
+      vbo_get_minmax_index(ctx, prims, ib, &min_index, &max_index);
+
    /* sanity check for pointer arithmetic below */
    assert(sizeof(arrays[0]->Ptr[0]) == 1);
 
index dcfe7e1..3e0face 100644 (file)
@@ -47,6 +47,7 @@ st_draw_vbo(GLcontext *ctx,
             const struct _mesa_prim *prims,
             GLuint nr_prims,
             const struct _mesa_index_buffer *ib,
+           GLboolean index_bounds_valid,
             GLuint min_index,
             GLuint max_index);
 
@@ -56,6 +57,7 @@ st_feedback_draw_vbo(GLcontext *ctx,
                      const struct _mesa_prim *prims,
                      GLuint nr_prims,
                      const struct _mesa_index_buffer *ib,
+                    GLboolean index_bounds_valid,
                      GLuint min_index,
                      GLuint max_index);
 
index 2712c13..b2d682e 100644 (file)
@@ -96,6 +96,7 @@ st_feedback_draw_vbo(GLcontext *ctx,
                      const struct _mesa_prim *prims,
                      GLuint nr_prims,
                      const struct _mesa_index_buffer *ib,
+                    GLboolean index_bounds_valid,
                      GLuint min_index,
                      GLuint max_index)
 {
@@ -114,6 +115,9 @@ st_feedback_draw_vbo(GLcontext *ctx,
 
    st_validate_state(ctx->st);
 
+   if (!index_bounds_valid)
+      vbo_get_minmax_index(ctx, prims, ib, &min_index, &max_index);
+
    /* must get these after state validation! */
    vp = ctx->st->vp;
    vs = &st->vp->state;
index 8a958e8..3f835d3 100644 (file)
@@ -233,7 +233,9 @@ void st_init_extensions(struct st_context *st)
 
    if (screen->get_param(screen, PIPE_CAP_POINT_SPRITE)) {
       ctx->Extensions.ARB_point_sprite = GL_TRUE;
-      ctx->Extensions.NV_point_sprite = GL_TRUE;
+      /* GL_NV_point_sprite is not supported by gallium because we don't
+       * support the GL_POINT_SPRITE_R_MODE_NV option.
+       */
    }
 
    if (screen->get_param(screen, PIPE_CAP_OCCLUSION_QUERY)) {
index b243c24..dcb90a3 100644 (file)
@@ -435,10 +435,10 @@ st_choose_format(struct pipe_context *pipe, GLenum internalFormat,
    case GL_RGB5:
    case GL_RGB4:
    case GL_R3_G3_B2:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_A1R5G5B5_UNORM, target, tex_usage, geom_flags ))
-         return PIPE_FORMAT_A1R5G5B5_UNORM;
       if (screen->is_format_supported( screen, PIPE_FORMAT_R5G6B5_UNORM, target, tex_usage, geom_flags ))
          return PIPE_FORMAT_R5G6B5_UNORM;
+      if (screen->is_format_supported( screen, PIPE_FORMAT_A1R5G5B5_UNORM, target, tex_usage, geom_flags ))
+         return PIPE_FORMAT_A1R5G5B5_UNORM;
       return default_rgba_format( screen, target, tex_usage, geom_flags );
 
    case GL_ALPHA:
index e150dff..2ab12d3 100644 (file)
@@ -112,27 +112,6 @@ map_register_file_index(
 {
    switch( file ) {
    case TGSI_FILE_INPUT:
-      if (procType == TGSI_PROCESSOR_FRAGMENT &&
-          index == FRAG_ATTRIB_FOGC) {
-         if (GET_SWZ(*swizzle, 0) == SWIZZLE_X) {
-            /* do nothing we're, ok */
-         } else if (GET_SWZ(*swizzle, 0) == SWIZZLE_Y) {
-            /* replace the swizzle with xxxx */
-            *swizzle = MAKE_SWIZZLE4(SWIZZLE_X,
-                                     SWIZZLE_X,
-                                     SWIZZLE_X,
-                                     SWIZZLE_X);
-            /* register after fog */
-            return inputMapping[index] + 1;
-         } else {
-            *swizzle = MAKE_SWIZZLE4(SWIZZLE_Z,
-                                     SWIZZLE_W,
-                                     SWIZZLE_Z,
-                                     SWIZZLE_W);
-            /* register after frontface */
-            return inputMapping[index] + 2;
-         }
-      }
       /* inputs are mapped according to the user-defined map */
       return inputMapping[index];
 
@@ -158,12 +137,6 @@ map_texture_target(
     GLuint textarget,
     GLboolean shadow )
 {
-#if 1
-   /* XXX remove this line after we've checked that the rest of gallium
-    * can handle the TGSI_TEXTURE_SHADOWx tokens.
-    */
-   shadow = GL_FALSE;
-#endif
    switch( textarget ) {
    case TEXTURE_1D_INDEX:
       if (shadow)
@@ -225,11 +198,15 @@ static struct tgsi_full_immediate
 make_immediate(const float *value, uint size)
 {
    struct tgsi_full_immediate imm;
+   unsigned i;
 
    imm = tgsi_default_full_immediate();
    imm.Immediate.NrTokens += size;
    imm.Immediate.DataType = TGSI_IMM_FLOAT32;
-   imm.u.Pointer = value;
+
+   for (i = 0; i < size; i++)
+      imm.u[i].Float = value[i];
+
    return imm;
 }
 
@@ -370,7 +347,7 @@ compile_instruction(
       fullinst->Instruction.Opcode = TGSI_OPCODE_ADD;
       break;
    case OPCODE_BGNLOOP:
-      fullinst->Instruction.Opcode = TGSI_OPCODE_BGNLOOP2;
+      fullinst->Instruction.Opcode = TGSI_OPCODE_BGNLOOP;
       fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size;
       break;
    case OPCODE_BGNSUB:
@@ -428,7 +405,7 @@ compile_instruction(
       fullinst->Instruction.Opcode = TGSI_OPCODE_ENDIF;
       break;
    case OPCODE_ENDLOOP:
-      fullinst->Instruction.Opcode = TGSI_OPCODE_ENDLOOP2;
+      fullinst->Instruction.Opcode = TGSI_OPCODE_ENDLOOP;
       fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size;
       break;
    case OPCODE_ENDSUB:
index 806e0ca..d2da20a 100644 (file)
@@ -458,34 +458,20 @@ st_translate_fragment_program(struct st_context *st,
             stfp->input_semantic_index[slot] = 1;
             interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
             break;
-         case FRAG_ATTRIB_FOGC: {
-            int extra_decls = 0;
-            if (stfp->Base.UsesFogFragCoord) {
-               stfp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
-               stfp->input_semantic_index[slot] = 0;
-               interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
-               input_flags[slot] = stfp->Base.Base.InputFlags[attr];
-               ++extra_decls;
-           }
-            if (stfp->Base.UsesFrontFacing) {
-               GLint idx = slot + extra_decls;
-               stfp->input_semantic_name[idx] = TGSI_SEMANTIC_FACE;
-               stfp->input_semantic_index[idx] = 0;
-               interpMode[idx] = TGSI_INTERPOLATE_CONSTANT;
-               input_flags[idx] = stfp->Base.Base.InputFlags[attr];
-               ++extra_decls;
-            }
-            if (stfp->Base.UsesPointCoord) {
-               GLint idx = slot + extra_decls;
-               stfp->input_semantic_name[idx] = TGSI_SEMANTIC_GENERIC;
-               stfp->input_semantic_index[idx] = num_generic++;
-               interpMode[idx] = TGSI_INTERPOLATE_PERSPECTIVE;
-               input_flags[idx] = stfp->Base.Base.InputFlags[attr];
-               ++extra_decls;
-            }
-            fs_num_inputs += extra_decls - 1;
-            continue;
-         }
+         case FRAG_ATTRIB_FOGC:
+            stfp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
+            stfp->input_semantic_index[slot] = 0;
+            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
+            break;
+         case FRAG_ATTRIB_FACE:
+            stfp->input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
+            stfp->input_semantic_index[slot] = num_generic++;
+            interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
+            break;
+         case FRAG_ATTRIB_PNTC:
+            stfp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
+            stfp->input_semantic_index[slot] = num_generic++;
+            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
             break;
          case FRAG_ATTRIB_TEX0:
          case FRAG_ATTRIB_TEX1:
index 04d3a3d..a5fdac3 100644 (file)
@@ -107,7 +107,9 @@ void st_swapbuffers(struct st_framebuffer *stfb,
                     struct pipe_surface **front_left,
                     struct pipe_surface **front_right);
 
-int st_set_teximage(struct pipe_texture *pt, int target);
+int st_bind_texture_surface(struct pipe_surface *ps, int target, int level,
+                            enum pipe_format format);
+int st_unbind_texture_surface(struct pipe_surface *ps, int target, int level);
 
 /** Redirect rendering into stfb's surface to a texture image */
 int st_bind_teximage(struct st_framebuffer *stfb, uint surfIndex,
index 10faa63..d588039 100644 (file)
@@ -32,6 +32,7 @@
 #include "st_cb_fbo.h"
 #include "st_inlines.h"
 #include "main/enums.h"
+#include "main/texobj.h"
 #include "main/teximage.h"
 #include "main/texstore.h"
 
@@ -353,25 +354,95 @@ st_texture_image_copy(struct pipe_context *pipe,
    }
 }
 
-/** Bind a pipe surface for use as a texture image */
+
+/**
+ * Bind a pipe surface to a texture object.  After the call,
+ * the texture object is marked dirty and will be (re-)validated.
+ *
+ * If this is the first surface bound, the texture object is said to
+ * switch from normal to surface based.  It will be cleared first in
+ * this case.
+ *
+ * \param ps      pipe surface to be unbound
+ * \param target  texture target
+ * \param level   image level
+ * \param format  internal format of the texture
+ */
 int
-st_set_teximage(struct pipe_texture *pt, int target)
+st_bind_texture_surface(struct pipe_surface *ps, int target, int level,
+                        enum pipe_format format)
 {
    GET_CURRENT_CONTEXT(ctx);
    const GLuint unit = ctx->Texture.CurrentUnit;
    struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
    struct gl_texture_object *texObj;
    struct gl_texture_image *texImage;
+   struct st_texture_object *stObj;
    struct st_texture_image *stImage;
-   int internalFormat;
+   GLenum internalFormat;
 
-   switch (pt->format) {
-   case PIPE_FORMAT_A8R8G8B8_UNORM:
-      internalFormat = GL_RGBA8;
+   switch (target) {
+   case ST_TEXTURE_2D:
+      target = GL_TEXTURE_2D;
+      break;
+   case ST_TEXTURE_RECT:
+      target = GL_TEXTURE_RECTANGLE_ARB;
       break;
    default:
       return 0;
-   };
+   }
+
+   /* map pipe format to base format for now */
+   if (pf_get_component_bits(format, PIPE_FORMAT_COMP_A) > 0)
+      internalFormat = GL_RGBA;
+   else
+      internalFormat = GL_RGB;
+
+   texObj = _mesa_select_tex_object(ctx, texUnit, target);
+   _mesa_lock_texture(ctx, texObj);
+
+   stObj = st_texture_object(texObj);
+   /* switch to surface based */
+   if (!stObj->surface_based) {
+      _mesa_clear_texture_object(ctx, texObj);
+      stObj->surface_based = GL_TRUE;
+   }
+
+   texImage = _mesa_get_tex_image(ctx, texObj, target, level);
+   stImage = st_texture_image(texImage);
+
+   _mesa_init_teximage_fields(ctx, target, texImage,
+                              ps->width, ps->height, 1, 0, internalFormat);
+   texImage->TexFormat = st_ChooseTextureFormat(ctx, internalFormat,
+                                                GL_RGBA, GL_UNSIGNED_BYTE);
+   _mesa_set_fetch_functions(texImage, 2);
+   pipe_texture_reference(&stImage->pt, ps->texture);
+
+   _mesa_dirty_texobj(ctx, texObj, GL_TRUE);
+   _mesa_unlock_texture(ctx, texObj);
+   
+   return 1;
+}
+
+
+/**
+ * Unbind a pipe surface from a texture object.  After the call,
+ * the texture object is marked dirty and will be (re-)validated.
+ *
+ * \param ps      pipe surface to be unbound
+ * \param target  texture target
+ * \param level   image level
+ */
+int
+st_unbind_texture_surface(struct pipe_surface *ps, int target, int level)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   const GLuint unit = ctx->Texture.CurrentUnit;
+   struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
+   struct gl_texture_object *texObj;
+   struct gl_texture_image *texImage;
+   struct st_texture_object *stObj;
+   struct st_texture_image *stImage;
 
    switch (target) {
    case ST_TEXTURE_2D:
@@ -385,21 +456,28 @@ st_set_teximage(struct pipe_texture *pt, int target)
    }
 
    texObj = _mesa_select_tex_object(ctx, texUnit, target);
-   texImage = _mesa_get_tex_image(ctx, texObj, target, 0);
+
+   _mesa_lock_texture(ctx, texObj);
+
+   texImage = _mesa_get_tex_image(ctx, texObj, target, level);
+   stObj = st_texture_object(texObj);
    stImage = st_texture_image(texImage);
-   
-   _mesa_init_teximage_fields(ctx, GL_TEXTURE_2D, texImage, pt->width[0],
-                              pt->height[0], 1, 0, internalFormat);
 
-   texImage->TexFormat = st_ChooseTextureFormat(ctx, internalFormat, GL_RGBA,
-                                                GL_UNSIGNED_BYTE);
-   _mesa_set_fetch_functions(texImage, 2);
+   /* Make sure the pipe surface is still bound.  The texture object is still
+    * considered surface based even if this is the last bound surface. */
+   if (stImage->pt == ps->texture) {
+      pipe_texture_reference(&stImage->pt, NULL);
+      _mesa_clear_texture_image(ctx, texImage);
 
-   pipe_texture_reference(&stImage->pt, pt);
+      _mesa_dirty_texobj(ctx, texObj, GL_TRUE);
+   }
 
+   _mesa_unlock_texture(ctx, texObj);
+   
    return 1;
 }
 
+
 /** Redirect rendering into stfb's surface to a texture image */
 int
 st_bind_teximage(struct st_framebuffer *stfb, uint surfIndex,
index b9d447c..60868ce 100644 (file)
@@ -69,6 +69,11 @@ struct st_texture_object
    struct pipe_texture *pt;
 
    GLboolean teximage_realloc;
+
+   /* True if there is/was a surface bound to this texture object.  It helps
+    * track whether the texture object is surface based or not.
+    */
+   GLboolean surface_based;
 };
 
 
index 0e32cb8..8303e4d 100644 (file)
@@ -24,6 +24,7 @@
 
 
 #include "main/glheader.h"
+#include "main/image.h"
 #include "main/macros.h"
 #include "s_context.h"
 
@@ -104,7 +105,7 @@ static void
 blit_nearest(GLcontext *ctx,
              GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
              GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
-             GLenum buffer)
+             GLbitfield buffer)
 {
    struct gl_renderbuffer *readRb, *drawRb;
 
@@ -456,7 +457,7 @@ static void
 simple_blit(GLcontext *ctx,
             GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
             GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
-            GLenum buffer)
+            GLbitfield buffer)
 {
    struct gl_renderbuffer *readRb, *drawRb;
    const GLint width = srcX1 - srcX0;
@@ -551,184 +552,6 @@ simple_blit(GLcontext *ctx,
 
 
 /**
- * Clip dst coords against Xmax (or Ymax).
- */
-static INLINE void
-clip_right_or_top(GLint *srcX0, GLint *srcX1,
-                  GLint *dstX0, GLint *dstX1,
-                  GLint maxValue)
-{
-   GLfloat t, bias;
-
-   if (*dstX1 > maxValue) {
-      /* X1 outside right edge */
-      ASSERT(*dstX0 < maxValue); /* X0 should be inside right edge */
-      t = (GLfloat) (maxValue - *dstX0) / (GLfloat) (*dstX1 - *dstX0);
-      /* chop off [t, 1] part */
-      ASSERT(t >= 0.0 && t <= 1.0);
-      *dstX1 = maxValue;
-      bias = (*srcX0 < *srcX1) ? 0.5 : -0.5;
-      *srcX1 = *srcX0 + (GLint) (t * (*srcX1 - *srcX0) + bias);
-   }
-   else if (*dstX0 > maxValue) {
-      /* X0 outside right edge */
-      ASSERT(*dstX1 < maxValue); /* X1 should be inside right edge */
-      t = (GLfloat) (maxValue - *dstX1) / (GLfloat) (*dstX0 - *dstX1);
-      /* chop off [t, 1] part */
-      ASSERT(t >= 0.0 && t <= 1.0);
-      *dstX0 = maxValue;
-      bias = (*srcX0 < *srcX1) ? -0.5 : 0.5;
-      *srcX0 = *srcX1 + (GLint) (t * (*srcX0 - *srcX1) + bias);
-   }
-}
-
-
-/**
- * Clip dst coords against Xmin (or Ymin).
- */
-static INLINE void
-clip_left_or_bottom(GLint *srcX0, GLint *srcX1,
-                    GLint *dstX0, GLint *dstX1,
-                    GLint minValue)
-{
-   GLfloat t, bias;
-
-   if (*dstX0 < minValue) {
-      /* X0 outside left edge */
-      ASSERT(*dstX1 > minValue); /* X1 should be inside left edge */
-      t = (GLfloat) (minValue - *dstX0) / (GLfloat) (*dstX1 - *dstX0);
-      /* chop off [0, t] part */
-      ASSERT(t >= 0.0 && t <= 1.0);
-      *dstX0 = minValue;
-      bias = (*srcX0 < *srcX1) ? 0.5 : -0.5; /* flipped??? */
-      *srcX0 = *srcX0 + (GLint) (t * (*srcX1 - *srcX0) + bias);
-   }
-   else if (*dstX1 < minValue) {
-      /* X1 outside left edge */
-      ASSERT(*dstX0 > minValue); /* X0 should be inside left edge */
-      t = (GLfloat) (minValue - *dstX1) / (GLfloat) (*dstX0 - *dstX1);
-      /* chop off [0, t] part */
-      ASSERT(t >= 0.0 && t <= 1.0);
-      *dstX1 = minValue;
-      bias = (*srcX0 < *srcX1) ? 0.5 : -0.5;
-      *srcX1 = *srcX1 + (GLint) (t * (*srcX0 - *srcX1) + bias);
-   }
-}
-
-
-/**
- * Do clipping of blit src/dest rectangles.
- * The dest rect is clipped against both the buffer bounds and scissor bounds.
- * The src rect is just clipped against the buffer bounds.
- *
- * When either the src or dest rect is clipped, the other is also clipped
- * proportionately!
- *
- * Note that X0 need not be less than X1 (same for Y) for either the source
- * and dest rects.  That makes the clipping a little trickier.
- *
- * \return GL_TRUE if anything is left to draw, GL_FALSE if totally clipped
- */
-static GLboolean
-clip_blit(GLcontext *ctx,
-          GLint *srcX0, GLint *srcY0, GLint *srcX1, GLint *srcY1,
-          GLint *dstX0, GLint *dstY0, GLint *dstX1, GLint *dstY1)
-{
-   const GLint srcXmin = 0;
-   const GLint srcXmax = ctx->ReadBuffer->Width;
-   const GLint srcYmin = 0;
-   const GLint srcYmax = ctx->ReadBuffer->Height;
-
-   /* these include scissor bounds */
-   const GLint dstXmin = ctx->DrawBuffer->_Xmin;
-   const GLint dstXmax = ctx->DrawBuffer->_Xmax;
-   const GLint dstYmin = ctx->DrawBuffer->_Ymin;
-   const GLint dstYmax = ctx->DrawBuffer->_Ymax;
-
-   /*
-   printf("PreClipX:  src: %d .. %d  dst: %d .. %d\n",
-          *srcX0, *srcX1, *dstX0, *dstX1);
-   printf("PreClipY:  src: %d .. %d  dst: %d .. %d\n",
-          *srcY0, *srcY1, *dstY0, *dstY1);
-   */
-
-   /* trivial rejection tests */
-   if (*dstX0 == *dstX1)
-      return GL_FALSE; /* no width */
-   if (*dstX0 <= dstXmin && *dstX1 <= dstXmin)
-      return GL_FALSE; /* totally out (left) of bounds */
-   if (*dstX0 >= dstXmax && *dstX1 >= dstXmax)
-      return GL_FALSE; /* totally out (right) of bounds */
-
-   if (*dstY0 == *dstY1)
-      return GL_FALSE;
-   if (*dstY0 <= dstYmin && *dstY1 <= dstYmin)
-      return GL_FALSE;
-   if (*dstY0 >= dstYmax && *dstY1 >= dstYmax)
-      return GL_FALSE;
-
-   if (*srcX0 == *srcX1)
-      return GL_FALSE;
-   if (*srcX0 <= srcXmin && *srcX1 <= srcXmin)
-      return GL_FALSE;
-   if (*srcX0 >= srcXmax && *srcX1 >= srcXmax)
-      return GL_FALSE;
-
-   if (*srcY0 == *srcY1)
-      return GL_FALSE;
-   if (*srcY0 <= srcYmin && *srcY1 <= srcYmin)
-      return GL_FALSE;
-   if (*srcY0 >= srcYmax && *srcY1 >= srcYmax)
-      return GL_FALSE;
-
-   /*
-    * dest clip
-    */
-   clip_right_or_top(srcX0, srcX1, dstX0, dstX1, dstXmax);
-   clip_right_or_top(srcY0, srcY1, dstY0, dstY1, dstYmax);
-   clip_left_or_bottom(srcX0, srcX1, dstX0, dstX1, dstXmin);
-   clip_left_or_bottom(srcY0, srcY1, dstY0, dstY1, dstYmin);
-
-   /*
-    * src clip (just swap src/dst values from above)
-    */
-   clip_right_or_top(dstX0, dstX1, srcX0, srcX1, srcXmax);
-   clip_right_or_top(dstY0, dstY1, srcY0, srcY1, srcYmax);
-   clip_left_or_bottom(dstX0, dstX1, srcX0, srcX1, srcXmin);
-   clip_left_or_bottom(dstY0, dstY1, srcY0, srcY1, srcYmin);
-
-   /*
-   printf("PostClipX: src: %d .. %d  dst: %d .. %d\n",
-          *srcX0, *srcX1, *dstX0, *dstX1);
-   printf("PostClipY: src: %d .. %d  dst: %d .. %d\n",
-          *srcY0, *srcY1, *dstY0, *dstY1);
-   */
-
-   ASSERT(*dstX0 >= dstXmin);
-   ASSERT(*dstX0 <= dstXmax);
-   ASSERT(*dstX1 >= dstXmin);
-   ASSERT(*dstX1 <= dstXmax);
-
-   ASSERT(*dstY0 >= dstYmin);
-   ASSERT(*dstY0 <= dstYmax);
-   ASSERT(*dstY1 >= dstYmin);
-   ASSERT(*dstY1 <= dstYmax);
-
-   ASSERT(*srcX0 >= srcXmin);
-   ASSERT(*srcX0 <= srcXmax);
-   ASSERT(*srcX1 >= srcXmin);
-   ASSERT(*srcX1 <= srcXmax);
-
-   ASSERT(*srcY0 >= srcYmin);
-   ASSERT(*srcY0 <= srcYmax);
-   ASSERT(*srcY1 >= srcYmin);
-   ASSERT(*srcY1 <= srcYmax);
-
-   return GL_TRUE;
-}
-
-
-/**
  * Software fallback for glBlitFramebufferEXT().
  */
 void
@@ -737,7 +560,7 @@ _swrast_BlitFramebuffer(GLcontext *ctx,
                         GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
                         GLbitfield mask, GLenum filter)
 {
-   static const GLint buffers[3] = {
+   static const GLbitfield buffers[3] = {
       GL_COLOR_BUFFER_BIT,
       GL_DEPTH_BUFFER_BIT,
       GL_STENCIL_BUFFER_BIT
@@ -747,8 +570,8 @@ _swrast_BlitFramebuffer(GLcontext *ctx,
    if (!ctx->DrawBuffer->_NumColorDrawBuffers)
       return;
 
-   if (!clip_blit(ctx, &srcX0, &srcY0, &srcX1, &srcY1,
-                  &dstX0, &dstY0, &dstX1, &dstY1)) {
+   if (!_mesa_clip_blit(ctx, &srcX0, &srcY0, &srcX1, &srcY1,
+                        &dstX0, &dstY0, &dstX1, &dstY1)) {
       return;
    }
 
index b71fb9e..613a91b 100644 (file)
@@ -157,9 +157,8 @@ init_machine(GLcontext *ctx, struct gl_program_machine *machine,
 
    /* if running a GLSL program (not ARB_fragment_program) */
    if (ctx->Shader.CurrentProgram) {
-      /* Store front/back facing value in register FOGC.Y */
-      machine->Attribs[FRAG_ATTRIB_FOGC][col][1] = 1.0 - span->facing;
-      /* Note FOGC.ZW is gl_PointCoord if drawing a sprite */
+      /* Store front/back facing value */
+      machine->Attribs[FRAG_ATTRIB_FACE][col][0] = 1.0 - span->facing;
    }
 
    machine->CurElement = col;
index 0a3ad97..50ec206 100644 (file)
@@ -139,9 +139,10 @@ sprite_point(GLcontext *ctx, const SWvertex *vert)
       }
 
       ATTRIB_LOOP_BEGIN
-         if (attr >= FRAG_ATTRIB_TEX0 && attr < FRAG_ATTRIB_VAR0) {
+         if (attr >= FRAG_ATTRIB_TEX0 && attr <= FRAG_ATTRIB_TEX7) {
+            /* a texcoord attribute */
             const GLuint u = attr - FRAG_ATTRIB_TEX0;
-            /* a texcoord */
+            ASSERT(u < Elements(ctx->Point.CoordReplace));
             if (ctx->Point.CoordReplace[u]) {
                tCoords[numTcoords++] = attr;
 
@@ -170,15 +171,15 @@ sprite_point(GLcontext *ctx, const SWvertex *vert)
                continue;
             }
          }
-         else if (attr == FRAG_ATTRIB_FOGC) {
-            /* GLSL gl_PointCoord is stored in fog.zw */
-            span.attrStart[FRAG_ATTRIB_FOGC][2] = 0.0;
-            span.attrStart[FRAG_ATTRIB_FOGC][3] = 0.0; /* t0 set below */
-            span.attrStepX[FRAG_ATTRIB_FOGC][2] = dsdx;
-            span.attrStepX[FRAG_ATTRIB_FOGC][3] = 0.0;
-            span.attrStepY[FRAG_ATTRIB_FOGC][2] = 0.0;
-            span.attrStepY[FRAG_ATTRIB_FOGC][3] = dtdy;
-            tCoords[numTcoords++] = FRAG_ATTRIB_FOGC;
+         else if (attr == FRAG_ATTRIB_PNTC) {
+            /* GLSL gl_PointCoord.xy (.zw undefined) */
+            span.attrStart[FRAG_ATTRIB_PNTC][0] = 0.0;
+            span.attrStart[FRAG_ATTRIB_PNTC][1] = 0.0; /* t0 set below */
+            span.attrStepX[FRAG_ATTRIB_PNTC][0] = dsdx;
+            span.attrStepX[FRAG_ATTRIB_PNTC][1] = 0.0;
+            span.attrStepY[FRAG_ATTRIB_PNTC][0] = 0.0;
+            span.attrStepY[FRAG_ATTRIB_PNTC][1] = dtdy;
+            tCoords[numTcoords++] = FRAG_ATTRIB_PNTC;
             continue;
          }
          /* use vertex's texcoord/attrib */
@@ -221,10 +222,7 @@ sprite_point(GLcontext *ctx, const SWvertex *vert)
          GLuint i;
          /* setup texcoord T for this row */
          for (i = 0; i < numTcoords; i++) {
-            if (tCoords[i] == FRAG_ATTRIB_FOGC)
-               span.attrStart[FRAG_ATTRIB_FOGC][3] = tcoord;
-            else
-               span.attrStart[tCoords[i]][1] = tcoord;
+            span.attrStart[tCoords[i]][1] = tcoord;
          }
 
          /* these might get changed by span clipping */
index f69b122..f2771cd 100644 (file)
@@ -81,7 +81,7 @@ _tnl_CreateContext( GLcontext *ctx )
    tnl->nr_blocks = 0;
 
    /* plug in the VBO drawing function */
-   vbo_set_draw_func(ctx, _tnl_draw_prims);
+   vbo_set_draw_func(ctx, _tnl_vbo_draw_prims);
 
    _math_init_transformation();
    _math_init_translate();
index 2ec65d5..c64c2c2 100644 (file)
@@ -360,6 +360,20 @@ static void unmap_vbos( GLcontext *ctx,
 }
 
 
+void _tnl_vbo_draw_prims(GLcontext *ctx,
+                        const struct gl_client_array *arrays[],
+                        const struct _mesa_prim *prim,
+                        GLuint nr_prims,
+                        const struct _mesa_index_buffer *ib,
+                        GLboolean index_bounds_valid,
+                        GLuint min_index,
+                        GLuint max_index)
+{
+   if (!index_bounds_valid)
+      vbo_get_minmax_index(ctx, prim, ib, &min_index, &max_index);
+
+   _tnl_draw_prims(ctx, arrays, prim, nr_prims, ib, min_index, max_index);
+}
 
 /* This is the main entrypoint into the slimmed-down software tnl
  * module.  In a regular swtnl driver, this can be plugged straight
@@ -393,7 +407,7 @@ void _tnl_draw_prims( GLcontext *ctx,
        */
       vbo_rebase_prims( ctx, arrays, prim, nr_prims, ib, 
                        min_index, max_index,
-                       _tnl_draw_prims );
+                       _tnl_vbo_draw_prims );
       return;
    }
    else if (max_index > max) {
@@ -411,7 +425,7 @@ void _tnl_draw_prims( GLcontext *ctx,
        */
       vbo_split_prims( ctx, arrays, prim, nr_prims, ib, 
                       0, max_index,
-                      _tnl_draw_prims,
+                      _tnl_vbo_draw_prims,
                       &limits );
    }
    else {
index 66c5e13..dc954bc 100644 (file)
@@ -386,6 +386,9 @@ run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage )
 #endif
          COPY_4V(store->results[attr].data[i], machine.Outputs[attr]);
       }
+#ifdef NAN_CHECK
+      ASSERT(machine.Outputs[0][3] != 0.0F);
+#endif
 #if 0
       printf("HPOS: %f %f %f %f\n",
              machine.Outputs[0][0], 
index 4d628aa..9c66d3b 100644 (file)
@@ -81,6 +81,16 @@ _tnl_draw_prims( GLcontext *ctx,
                 GLuint min_index,
                 GLuint max_index);
 
+void
+_tnl_vbo_draw_prims( GLcontext *ctx,
+                    const struct gl_client_array *arrays[],
+                    const struct _mesa_prim *prim,
+                    GLuint nr_prims,
+                    const struct _mesa_index_buffer *ib,
+                    GLboolean index_bounds_valid,
+                    GLuint min_index,
+                    GLuint max_index);
+
 extern void
 _mesa_load_tracked_matrices(GLcontext *ctx);
 
index 5362226..5986e93 100644 (file)
@@ -69,6 +69,7 @@ typedef void (*vbo_draw_func)( GLcontext *ctx,
                               const struct _mesa_prim *prims,
                               GLuint nr_prims,
                               const struct _mesa_index_buffer *ib,
+                              GLboolean index_bounds_valid,
                               GLuint min_index,
                               GLuint max_index );
 
@@ -112,7 +113,10 @@ void vbo_rebase_prims( GLcontext *ctx,
                       GLuint min_index,
                       GLuint max_index,
                       vbo_draw_func draw );
-
+void
+vbo_get_minmax_index(GLcontext *ctx, const struct _mesa_prim *prim,
+                    const struct _mesa_index_buffer *ib,
+                    GLuint *min_index, GLuint *max_index);
 
 void vbo_use_buffer_objects(GLcontext *ctx);
 
index b746a77..387d4ee 100644 (file)
@@ -486,23 +486,6 @@ static void GLAPIENTRY vbo_exec_EvalPoint2( GLint i, GLint j )
 }
 
 
-/**
- * Check if programs/shaders are enabled and valid at glBegin time.
- */
-GLboolean 
-vbo_validate_shaders(GLcontext *ctx)
-{
-   if ((ctx->VertexProgram.Enabled && !ctx->VertexProgram._Enabled) ||
-       (ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled)) {
-      return GL_FALSE;
-   }
-   if (ctx->Shader.CurrentProgram && !ctx->Shader.CurrentProgram->LinkStatus) {
-      return GL_FALSE;
-   }
-   return GL_TRUE;
-}
-
-
 /* Build a list of primitives on the fly.  Keep
  * ctx->Driver.CurrentExecPrimitive uptodate as well.
  */
@@ -521,9 +504,7 @@ static void GLAPIENTRY vbo_exec_Begin( GLenum mode )
         return;
       }
 
-      if (!vbo_validate_shaders(ctx)) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glBegin (invalid vertex/fragment program)");
+      if (!_mesa_valid_to_render(ctx, "glBegin")) {
          return;
       }
 
index f4b9b2f..4148469 100644 (file)
 /**
  * Compute min and max elements for glDraw[Range]Elements() calls.
  */
-static void
-get_minmax_index(GLuint count, GLuint type, const GLvoid *indices,
-                 GLuint *min_index, GLuint *max_index)
+void
+vbo_get_minmax_index(GLcontext *ctx,
+                    const struct _mesa_prim *prim,
+                    const struct _mesa_index_buffer *ib,
+                    GLuint *min_index, GLuint *max_index)
 {
    GLuint i;
+   GLsizei count = prim->count;
+   const void *indices;
+
+   if (_mesa_is_bufferobj(ib->obj)) {
+      const GLvoid *map = ctx->Driver.MapBuffer(ctx,
+                                                GL_ELEMENT_ARRAY_BUFFER_ARB,
+                                                GL_READ_ONLY,
+                                                ib->obj);
+      indices = ADD_POINTERS(map, ib->ptr);
+   } else {
+      indices = ib->ptr;
+   }
 
-   switch(type) {
+   switch (ib->type) {
    case GL_UNSIGNED_INT: {
       const GLuint *ui_indices = (const GLuint *)indices;
       GLuint max_ui = ui_indices[count-1];
@@ -88,6 +102,12 @@ get_minmax_index(GLuint count, GLuint type, const GLvoid *indices,
       assert(0);
       break;
    }
+
+   if (_mesa_is_bufferobj(ib->obj)) {
+      ctx->Driver.UnmapBuffer(ctx,
+                             GL_ELEMENT_ARRAY_BUFFER_ARB,
+                             ib->obj);
+   }
 }
 
 
@@ -101,7 +121,7 @@ check_array_data(GLcontext *ctx, struct gl_client_array *array,
 {
    if (array->Enabled) {
       const void *data = array->Ptr;
-      if (array->BufferObj->Name) {
+      if (_mesa_is_bufferobj(array->BufferObj)) {
          if (!array->BufferObj->Pointer) {
             /* need to map now */
             array->BufferObj->Pointer = ctx->Driver.MapBuffer(ctx,
@@ -146,8 +166,8 @@ static void
 unmap_array_buffer(GLcontext *ctx, struct gl_client_array *array)
 {
    if (array->Enabled &&
-       array->BufferObj->Name &&
-       array->BufferObj->Pointer) {
+       _mesa_is_bufferobj(array->BufferObj) &&
+       _mesa_bufferobj_mapped(array->BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx,
                               GL_ARRAY_BUFFER_ARB,
                               array->BufferObj);
@@ -166,7 +186,7 @@ check_draw_elements_data(GLcontext *ctx, GLsizei count, GLenum elemType,
    const void *elemMap;
    GLint i, k;
 
-   if (ctx->Array.ElementArrayBufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Array.ElementArrayBufferObj)) {
       elemMap = ctx->Driver.MapBuffer(ctx,
                                       GL_ELEMENT_ARRAY_BUFFER_ARB,
                                       GL_READ_ONLY,
@@ -205,7 +225,7 @@ check_draw_elements_data(GLcontext *ctx, GLsizei count, GLenum elemType,
       }
    }
 
-   if (ctx->Array.ElementArrayBufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Array.ElementArrayBufferObj)) {
       ctx->Driver.UnmapBuffer(ctx,
                              GL_ELEMENT_ARRAY_BUFFER_ARB,
                              ctx->Array.ElementArrayBufferObj);
@@ -469,8 +489,7 @@ vbo_exec_DrawArrays(GLenum mode, GLint start, GLsizei count)
    if (ctx->NewState)
       _mesa_update_state( ctx );
       
-   if (!vbo_validate_shaders(ctx)) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawArrays(bad shader)");
+   if (!_mesa_valid_to_render(ctx, "glDrawArrays")) {
       return;
    }
 
@@ -500,7 +519,7 @@ vbo_exec_DrawArrays(GLenum mode, GLint start, GLsizei count)
    prim[0].indexed = 0;
 
    vbo->draw_prims( ctx, exec->array.inputs, prim, 1, NULL,
-                    start, start + count - 1 );
+                    GL_TRUE, start, start + count - 1 );
 
 #if 0
    print_draw_arrays(ctx, exec, mode, start, count);
@@ -566,70 +585,35 @@ dump_element_buffer(GLcontext *ctx, GLenum type)
                            ctx->Array.ElementArrayBufferObj);
 }
 
-
-static void GLAPIENTRY
-vbo_exec_DrawRangeElements(GLenum mode,
-                          GLuint start, GLuint end,
-                          GLsizei count, GLenum type, const GLvoid *indices)
+/* Inner support for both _mesa_DrawElements and _mesa_DrawRangeElements */
+static void
+vbo_validated_drawrangeelements(GLcontext *ctx, GLenum mode,
+                               GLboolean index_bounds_valid,
+                               GLuint start, GLuint end,
+                               GLsizei count, GLenum type,
+                               const GLvoid *indices)
 {
-   GET_CURRENT_CONTEXT(ctx);
    struct vbo_context *vbo = vbo_context(ctx);
    struct vbo_exec_context *exec = &vbo->exec;
    struct _mesa_index_buffer ib;
    struct _mesa_prim prim[1];
 
-   if (!_mesa_validate_DrawRangeElements( ctx, mode, start, end, count,
-                                          type, indices ))
-      return;
-
-   if (end >= ctx->Array.ArrayObj->_MaxElement) {
-      /* the max element is out of bounds of one or more enabled arrays */
-      _mesa_warning(ctx, "glDraw[Range]Elements(start %u, end %u, count %d, "
-                    "type 0x%x, indices=%p)\n"
-                    "\tindex=%u is out of bounds (max=%u)  "
-                    "Element Buffer %u (size %d)",
-                    start, end, count, type, indices, end,
-                    ctx->Array.ArrayObj->_MaxElement - 1,
-                    ctx->Array.ElementArrayBufferObj->Name,
-                    ctx->Array.ElementArrayBufferObj->Size);
-
-      if (0)
-         dump_element_buffer(ctx, type);
-
-      if (0)
-         _mesa_print_arrays(ctx);
-      return;
-   }
-   else if (0) {
-      _mesa_printf("glDraw[Range]Elements"
-                   "(start %u, end %u, type 0x%x, count %d) ElemBuf %u\n",
-                   start, end, type, count,
-                   ctx->Array.ElementArrayBufferObj->Name);
-   }
-
-#if 0
-   check_draw_elements_data(ctx, count, type, indices);
-#else
-   (void) check_draw_elements_data;
-#endif
-
    FLUSH_CURRENT( ctx, 0 );
 
    if (ctx->NewState)
       _mesa_update_state( ctx );
 
-   if (!vbo_validate_shaders(ctx)) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawRangeElements(bad shader)");
+   if (!_mesa_valid_to_render(ctx, "glDraw[Range]Elements")) {
       return;
    }
 
-   bind_arrays( ctx );
-
    if (ctx->NewState)
       _mesa_update_state( ctx );
 
+   bind_arrays( ctx );
+
    ib.count = count;
-   ib.type = type; 
+   ib.type = type;
    ib.obj = ctx->Array.ElementArrayBufferObj;
    ib.ptr = indices;
 
@@ -673,44 +657,68 @@ vbo_exec_DrawRangeElements(GLenum mode,
     * for the latter case elsewhere.
     */
 
-   vbo->draw_prims( ctx, exec->array.inputs, prim, 1, &ib, start, end );
+   vbo->draw_prims( ctx, exec->array.inputs, prim, 1, &ib,
+                   index_bounds_valid, start, end );
 }
 
-
 static void GLAPIENTRY
-vbo_exec_DrawElements(GLenum mode, GLsizei count, GLenum type,
-                      const GLvoid *indices)
+vbo_exec_DrawRangeElements(GLenum mode,
+                          GLuint start, GLuint end,
+                          GLsizei count, GLenum type, const GLvoid *indices)
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLuint min_index = 0;
-   GLuint max_index = 0;
 
-   if (!_mesa_validate_DrawElements( ctx, mode, count, type, indices ))
+   if (!_mesa_validate_DrawRangeElements( ctx, mode, start, end, count,
+                                          type, indices ))
       return;
 
-   if (!vbo_validate_shaders(ctx)) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawElements(bad shader)");
+   if (end >= ctx->Array.ArrayObj->_MaxElement) {
+      /* the max element is out of bounds of one or more enabled arrays */
+      _mesa_warning(ctx, "glDraw[Range]Elements(start %u, end %u, count %d, "
+                    "type 0x%x, indices=%p)\n"
+                    "\tindex=%u is out of bounds (max=%u)  "
+                    "Element Buffer %u (size %d)",
+                    start, end, count, type, indices, end,
+                    ctx->Array.ArrayObj->_MaxElement - 1,
+                    ctx->Array.ElementArrayBufferObj->Name,
+                    ctx->Array.ElementArrayBufferObj->Size);
+
+      if (0)
+         dump_element_buffer(ctx, type);
+
+      if (0)
+         _mesa_print_arrays(ctx);
       return;
    }
+   else if (0) {
+      _mesa_printf("glDraw[Range]Elements"
+                   "(start %u, end %u, type 0x%x, count %d) ElemBuf %u\n",
+                   start, end, type, count,
+                   ctx->Array.ElementArrayBufferObj->Name);
+   }
 
-   if (ctx->Array.ElementArrayBufferObj->Name) {
-      const GLvoid *map = ctx->Driver.MapBuffer(ctx,
-                                                GL_ELEMENT_ARRAY_BUFFER_ARB,
-                                                GL_READ_ONLY,
-                                                ctx->Array.ElementArrayBufferObj);
+#if 0
+   check_draw_elements_data(ctx, count, type, indices);
+#else
+   (void) check_draw_elements_data;
+#endif
 
-      get_minmax_index(count, type, ADD_POINTERS(map, indices),
-                       &min_index, &max_index);
+   vbo_validated_drawrangeelements(ctx, mode, GL_TRUE, start, end,
+                                  count, type, indices);
+}
 
-      ctx->Driver.UnmapBuffer(ctx,
-                             GL_ELEMENT_ARRAY_BUFFER_ARB,
-                             ctx->Array.ElementArrayBufferObj);
-   }
-   else {
-      get_minmax_index(count, type, indices, &min_index, &max_index);
-   }
 
-   vbo_exec_DrawRangeElements(mode, min_index, max_index, count, type, indices);
+static void GLAPIENTRY
+vbo_exec_DrawElements(GLenum mode, GLsizei count, GLenum type,
+                      const GLvoid *indices)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   if (!_mesa_validate_DrawElements( ctx, mode, count, type, indices ))
+      return;
+
+   vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0,
+                                  count, type, indices);
 }
 
 
index 1841992..d76c45f 100644 (file)
@@ -214,7 +214,7 @@ vbo_exec_bind_arrays( GLcontext *ctx )
          /* override the default array set above */
          exec->vtx.inputs[attr] = &arrays[attr];
 
-         if (exec->vtx.bufferobj->Name) {
+         if (_mesa_is_bufferobj(exec->vtx.bufferobj)) {
             /* a real buffer obj: Ptr is an offset, not a pointer*/
             GLsizeiptr offset;
             assert(exec->vtx.bufferobj->Pointer);  /* buf should be mapped */
@@ -251,7 +251,7 @@ vbo_exec_vtx_unmap( struct vbo_exec_context *exec )
 {
    GLenum target = GL_ARRAY_BUFFER_ARB;
 
-   if (exec->vtx.bufferobj->Name) {
+   if (_mesa_is_bufferobj(exec->vtx.bufferobj)) {
       GLcontext *ctx = exec->ctx;
       
       if (ctx->Driver.FlushMappedBufferRange) {
@@ -291,7 +291,7 @@ vbo_exec_vtx_map( struct vbo_exec_context *exec )
                               MESA_MAP_NOWAIT_BIT;
    const GLenum usage = GL_STREAM_DRAW_ARB;
    
-   if (exec->vtx.bufferobj->Name == 0)
+   if (!_mesa_is_bufferobj(exec->vtx.bufferobj))
       return;
 
    if (exec->vtx.buffer_map != NULL) {
@@ -365,7 +365,7 @@ vbo_exec_vtx_flush( struct vbo_exec_context *exec, GLboolean unmap )
          if (ctx->NewState)
             _mesa_update_state( ctx );
 
-         if (exec->vtx.bufferobj->Name) {
+         if (_mesa_is_bufferobj(exec->vtx.bufferobj)) {
             vbo_exec_vtx_unmap( exec );
          }
 
@@ -378,12 +378,13 @@ vbo_exec_vtx_flush( struct vbo_exec_context *exec, GLboolean unmap )
                                       exec->vtx.prim, 
                                       exec->vtx.prim_count,
                                       NULL,
+                                      GL_TRUE,
                                       0,
                                       exec->vtx.vert_count - 1);
 
         /* If using a real VBO, get new storage -- unless asked not to.
           */
-         if (exec->vtx.bufferobj->Name && !unmap) {
+         if (_mesa_is_bufferobj(exec->vtx.bufferobj) && !unmap) {
             vbo_exec_vtx_map( exec );
          }
       }
@@ -392,7 +393,7 @@ vbo_exec_vtx_flush( struct vbo_exec_context *exec, GLboolean unmap )
    /* May have to unmap explicitly if we didn't draw:
     */
    if (unmap && 
-       exec->vtx.bufferobj->Name &&
+       _mesa_is_bufferobj(exec->vtx.bufferobj) &&
        exec->vtx.buffer_map) {
       vbo_exec_vtx_unmap( exec );
    }
index ea87ded..3bf7ef5 100644 (file)
@@ -208,6 +208,7 @@ void vbo_rebase_prims( GLcontext *ctx,
         prim, 
         nr_prims, 
         ib, 
+        GL_TRUE,
         0, 
         max_index - min_index );
    
index d00d304..cdbbc9c 100644 (file)
@@ -911,7 +911,7 @@ static void GLAPIENTRY _save_OBE_DrawElements(GLenum mode, GLsizei count, GLenum
 
    _ae_map_vbos( ctx );
 
-   if (ctx->Array.ElementArrayBufferObj->Name)
+   if (_mesa_is_bufferobj(ctx->Array.ElementArrayBufferObj))
       indices = ADD_POINTERS(ctx->Array.ElementArrayBufferObj->Pointer, indices);
 
    vbo_save_NotifyBegin( ctx, mode | VBO_SAVE_PRIM_WEAK );
index 5110648..d834fa1 100644 (file)
@@ -279,6 +279,7 @@ void vbo_save_playback_vertex_list( GLcontext *ctx, void *data )
                                    node->prim, 
                                    node->prim_count,
                                    NULL,
+                                   GL_TRUE,
                                    0,  /* Node is a VBO, so this is ok */
                                    node->count - 1);
    }
index d7ffebf..8ec180d 100644 (file)
@@ -30,6 +30,7 @@
  */
 
 #include "main/glheader.h"
+#include "main/bufferobj.h"
 #include "main/imports.h"
 #include "main/image.h"
 #include "main/macros.h"
@@ -194,6 +195,7 @@ flush( struct copy_context *copy )
               copy->dstprim,
               copy->dstprim_nr,
               &copy->dstib,
+              GL_TRUE,
               0,
               copy->dstbuf_nr );
 
@@ -443,7 +445,7 @@ replay_init( struct copy_context *copy )
         copy->varying[j].size = attr_size(copy->array[i]);
         copy->vertex_size += attr_size(copy->array[i]);
       
-        if (vbo->Name && !vbo->Pointer
+        if (_mesa_is_bufferobj(vbo) && !_mesa_bufferobj_mapped(vbo)
            ctx->Driver.MapBuffer(ctx, GL_ARRAY_BUFFER, GL_READ_ONLY, vbo);
 
         copy->varying[j].src_ptr = ADD_POINTERS(vbo->Pointer,
@@ -457,7 +459,8 @@ replay_init( struct copy_context *copy )
     * caller convert non-indexed prims to indexed.  Could alternately
     * do it internally.
     */
-   if (copy->ib->obj->Name && !copy->ib->obj->Pointer) 
+   if (_mesa_is_bufferobj(copy->ib->obj) &&
+       !_mesa_bufferobj_mapped(copy->ib->obj)) 
       ctx->Driver.MapBuffer(ctx, GL_ELEMENT_ARRAY_BUFFER, GL_READ_ONLY,
                            copy->ib->obj);
 
@@ -561,13 +564,14 @@ replay_finish( struct copy_context *copy )
     */
    for (i = 0; i < copy->nr_varying; i++) {
       struct gl_buffer_object *vbo = copy->varying[i].array->BufferObj;
-      if (vbo->Name && vbo->Pointer
+      if (_mesa_is_bufferobj(vbo) && _mesa_bufferobj_mapped(vbo)
         ctx->Driver.UnmapBuffer(ctx, GL_ARRAY_BUFFER, vbo);
    }
 
    /* Unmap index buffer:
     */
-   if (copy->ib->obj->Name && copy->ib->obj->Pointer) {
+   if (_mesa_is_bufferobj(copy->ib->obj) &&
+       _mesa_bufferobj_mapped(copy->ib->obj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_ELEMENT_ARRAY_BUFFER, copy->ib->obj);
    }
 }
index 266bc56..da84eaa 100644 (file)
@@ -59,11 +59,11 @@ struct split_context {
 static void flush_vertex( struct split_context *split )
 {
    GLuint min_index, max_index;
+   GLuint i;
 
    if (!split->dstprim_nr) 
       return;
 
-   GLuint i;
    min_index = split->dstprim[0].start;
    max_index = min_index + split->dstprim[0].count - 1;
 
@@ -85,6 +85,7 @@ static void flush_vertex( struct split_context *split )
                split->dstprim,
                split->dstprim_nr,
                NULL,
+               GL_TRUE,
                min_index,
                max_index);
 
index 90ad36a..10525d4 100644 (file)
@@ -45,7 +45,7 @@
 #  define GL_PREFIX(n) GLNAME(CONCAT(gl,n))
 # endif
 
-#if defined(PTHREADS) || defined(USE_XTHREADS) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || defined(BEOS_THREADS)
+#if defined(PTHREADS) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || defined(BEOS_THREADS)
 #  define THREADS
 #endif
 
@@ -29277,12 +29277,88 @@ GL_PREFIX(_dispatch_stub_773):
        .size   GL_PREFIX(_dispatch_stub_773), .-GL_PREFIX(_dispatch_stub_773)
 
        .p2align        4,,15
+       .globl  GL_PREFIX(_dispatch_stub_774)
+       .type   GL_PREFIX(_dispatch_stub_774), @function
+       HIDDEN(GL_PREFIX(_dispatch_stub_774))
+GL_PREFIX(_dispatch_stub_774):
+#if defined(GLX_USE_TLS)
+       call    _x86_64_get_dispatch@PLT
+       movq    6192(%rax), %r11
+       jmp     *%r11
+#elif defined(PTHREADS)
+       pushq   %rdi
+       pushq   %rsi
+       pushq   %rdx
+       call    _x86_64_get_dispatch@PLT
+       popq    %rdx
+       popq    %rsi
+       popq    %rdi
+       movq    6192(%rax), %r11
+       jmp     *%r11
+#else
+       movq    _glapi_Dispatch(%rip), %rax
+       testq   %rax, %rax
+       je      1f
+       movq    6192(%rax), %r11
+       jmp     *%r11
+1:
+       pushq   %rdi
+       pushq   %rsi
+       pushq   %rdx
+       call    _glapi_get_dispatch
+       popq    %rdx
+       popq    %rsi
+       popq    %rdi
+       movq    6192(%rax), %r11
+       jmp     *%r11
+#endif /* defined(GLX_USE_TLS) */
+       .size   GL_PREFIX(_dispatch_stub_774), .-GL_PREFIX(_dispatch_stub_774)
+
+       .p2align        4,,15
+       .globl  GL_PREFIX(_dispatch_stub_775)
+       .type   GL_PREFIX(_dispatch_stub_775), @function
+       HIDDEN(GL_PREFIX(_dispatch_stub_775))
+GL_PREFIX(_dispatch_stub_775):
+#if defined(GLX_USE_TLS)
+       call    _x86_64_get_dispatch@PLT
+       movq    6200(%rax), %r11
+       jmp     *%r11
+#elif defined(PTHREADS)
+       pushq   %rdi
+       pushq   %rsi
+       pushq   %rdx
+       call    _x86_64_get_dispatch@PLT
+       popq    %rdx
+       popq    %rsi
+       popq    %rdi
+       movq    6200(%rax), %r11
+       jmp     *%r11
+#else
+       movq    _glapi_Dispatch(%rip), %rax
+       testq   %rax, %rax
+       je      1f
+       movq    6200(%rax), %r11
+       jmp     *%r11
+1:
+       pushq   %rdi
+       pushq   %rsi
+       pushq   %rdx
+       call    _glapi_get_dispatch
+       popq    %rdx
+       popq    %rsi
+       popq    %rdi
+       movq    6200(%rax), %r11
+       jmp     *%r11
+#endif /* defined(GLX_USE_TLS) */
+       .size   GL_PREFIX(_dispatch_stub_775), .-GL_PREFIX(_dispatch_stub_775)
+
+       .p2align        4,,15
        .globl  GL_PREFIX(FramebufferTextureLayerEXT)
        .type   GL_PREFIX(FramebufferTextureLayerEXT), @function
 GL_PREFIX(FramebufferTextureLayerEXT):
 #if defined(GLX_USE_TLS)
        call    _x86_64_get_dispatch@PLT
-       movq    6192(%rax), %r11
+       movq    6208(%rax), %r11
        jmp     *%r11
 #elif defined(PTHREADS)
        pushq   %rdi
@@ -29296,13 +29372,13 @@ GL_PREFIX(FramebufferTextureLayerEXT):
        popq    %rdx
        popq    %rsi
        popq    %rdi
-       movq    6192(%rax), %r11
+       movq    6208(%rax), %r11
        jmp     *%r11
 #else
        movq    _glapi_Dispatch(%rip), %rax
        testq   %rax, %rax
        je      1f
-       movq    6192(%rax), %r11
+       movq    6208(%rax), %r11
        jmp     *%r11
 1:
        pushq   %rdi
@@ -29316,7 +29392,7 @@ GL_PREFIX(FramebufferTextureLayerEXT):
        popq    %rdx
        popq    %rsi
        popq    %rdi
-       movq    6192(%rax), %r11
+       movq    6208(%rax), %r11
        jmp     *%r11
 #endif /* defined(GLX_USE_TLS) */
        .size   GL_PREFIX(FramebufferTextureLayerEXT), .-GL_PREFIX(FramebufferTextureLayerEXT)
@@ -29327,37 +29403,113 @@ GL_PREFIX(FramebufferTextureLayerEXT):
 GL_PREFIX(ProvokingVertexEXT):
 #if defined(GLX_USE_TLS)
        call    _x86_64_get_dispatch@PLT
-       movq    6200(%rax), %r11
+       movq    6216(%rax), %r11
        jmp     *%r11
 #elif defined(PTHREADS)
        pushq   %rdi
        call    _x86_64_get_dispatch@PLT
        popq    %rdi
-       movq    6200(%rax), %r11
+       movq    6216(%rax), %r11
        jmp     *%r11
 #else
        movq    _glapi_Dispatch(%rip), %rax
        testq   %rax, %rax
        je      1f
-       movq    6200(%rax), %r11
+       movq    6216(%rax), %r11
        jmp     *%r11
 1:
        pushq   %rdi
        call    _glapi_get_dispatch
        popq    %rdi
-       movq    6200(%rax), %r11
+       movq    6216(%rax), %r11
        jmp     *%r11
 #endif /* defined(GLX_USE_TLS) */
        .size   GL_PREFIX(ProvokingVertexEXT), .-GL_PREFIX(ProvokingVertexEXT)
 
        .p2align        4,,15
-       .globl  GL_PREFIX(_dispatch_stub_776)
-       .type   GL_PREFIX(_dispatch_stub_776), @function
-       HIDDEN(GL_PREFIX(_dispatch_stub_776))
-GL_PREFIX(_dispatch_stub_776):
+       .globl  GL_PREFIX(_dispatch_stub_778)
+       .type   GL_PREFIX(_dispatch_stub_778), @function
+       HIDDEN(GL_PREFIX(_dispatch_stub_778))
+GL_PREFIX(_dispatch_stub_778):
 #if defined(GLX_USE_TLS)
        call    _x86_64_get_dispatch@PLT
-       movq    6208(%rax), %r11
+       movq    6224(%rax), %r11
+       jmp     *%r11
+#elif defined(PTHREADS)
+       pushq   %rdi
+       pushq   %rsi
+       pushq   %rdx
+       call    _x86_64_get_dispatch@PLT
+       popq    %rdx
+       popq    %rsi
+       popq    %rdi
+       movq    6224(%rax), %r11
+       jmp     *%r11
+#else
+       movq    _glapi_Dispatch(%rip), %rax
+       testq   %rax, %rax
+       je      1f
+       movq    6224(%rax), %r11
+       jmp     *%r11
+1:
+       pushq   %rdi
+       pushq   %rsi
+       pushq   %rdx
+       call    _glapi_get_dispatch
+       popq    %rdx
+       popq    %rsi
+       popq    %rdi
+       movq    6224(%rax), %r11
+       jmp     *%r11
+#endif /* defined(GLX_USE_TLS) */
+       .size   GL_PREFIX(_dispatch_stub_778), .-GL_PREFIX(_dispatch_stub_778)
+
+       .p2align        4,,15
+       .globl  GL_PREFIX(_dispatch_stub_779)
+       .type   GL_PREFIX(_dispatch_stub_779), @function
+       HIDDEN(GL_PREFIX(_dispatch_stub_779))
+GL_PREFIX(_dispatch_stub_779):
+#if defined(GLX_USE_TLS)
+       call    _x86_64_get_dispatch@PLT
+       movq    6232(%rax), %r11
+       jmp     *%r11
+#elif defined(PTHREADS)
+       pushq   %rdi
+       pushq   %rsi
+       pushq   %rdx
+       call    _x86_64_get_dispatch@PLT
+       popq    %rdx
+       popq    %rsi
+       popq    %rdi
+       movq    6232(%rax), %r11
+       jmp     *%r11
+#else
+       movq    _glapi_Dispatch(%rip), %rax
+       testq   %rax, %rax
+       je      1f
+       movq    6232(%rax), %r11
+       jmp     *%r11
+1:
+       pushq   %rdi
+       pushq   %rsi
+       pushq   %rdx
+       call    _glapi_get_dispatch
+       popq    %rdx
+       popq    %rsi
+       popq    %rdi
+       movq    6232(%rax), %r11
+       jmp     *%r11
+#endif /* defined(GLX_USE_TLS) */
+       .size   GL_PREFIX(_dispatch_stub_779), .-GL_PREFIX(_dispatch_stub_779)
+
+       .p2align        4,,15
+       .globl  GL_PREFIX(_dispatch_stub_780)
+       .type   GL_PREFIX(_dispatch_stub_780), @function
+       HIDDEN(GL_PREFIX(_dispatch_stub_780))
+GL_PREFIX(_dispatch_stub_780):
+#if defined(GLX_USE_TLS)
+       call    _x86_64_get_dispatch@PLT
+       movq    6240(%rax), %r11
        jmp     *%r11
 #elif defined(PTHREADS)
        pushq   %rdi
@@ -29371,13 +29523,13 @@ GL_PREFIX(_dispatch_stub_776):
        popq    %rdx
        popq    %rsi
        popq    %rdi
-       movq    6208(%rax), %r11
+       movq    6240(%rax), %r11
        jmp     *%r11
 #else
        movq    _glapi_Dispatch(%rip), %rax
        testq   %rax, %rax
        je      1f
-       movq    6208(%rax), %r11
+       movq    6240(%rax), %r11
        jmp     *%r11
 1:
        pushq   %rdi
@@ -29391,19 +29543,19 @@ GL_PREFIX(_dispatch_stub_776):
        popq    %rdx
        popq    %rsi
        popq    %rdi
-       movq    6208(%rax), %r11
+       movq    6240(%rax), %r11
        jmp     *%r11
 #endif /* defined(GLX_USE_TLS) */
-       .size   GL_PREFIX(_dispatch_stub_776), .-GL_PREFIX(_dispatch_stub_776)
+       .size   GL_PREFIX(_dispatch_stub_780), .-GL_PREFIX(_dispatch_stub_780)
 
        .p2align        4,,15
-       .globl  GL_PREFIX(_dispatch_stub_777)
-       .type   GL_PREFIX(_dispatch_stub_777), @function
-       HIDDEN(GL_PREFIX(_dispatch_stub_777))
-GL_PREFIX(_dispatch_stub_777):
+       .globl  GL_PREFIX(_dispatch_stub_781)
+       .type   GL_PREFIX(_dispatch_stub_781), @function
+       HIDDEN(GL_PREFIX(_dispatch_stub_781))
+GL_PREFIX(_dispatch_stub_781):
 #if defined(GLX_USE_TLS)
        call    _x86_64_get_dispatch@PLT
-       movq    6216(%rax), %r11
+       movq    6248(%rax), %r11
        jmp     *%r11
 #elif defined(PTHREADS)
        pushq   %rdi
@@ -29417,13 +29569,13 @@ GL_PREFIX(_dispatch_stub_777):
        popq    %rdx
        popq    %rsi
        popq    %rdi
-       movq    6216(%rax), %r11
+       movq    6248(%rax), %r11
        jmp     *%r11
 #else
        movq    _glapi_Dispatch(%rip), %rax
        testq   %rax, %rax
        je      1f
-       movq    6216(%rax), %r11
+       movq    6248(%rax), %r11
        jmp     *%r11
 1:
        pushq   %rdi
@@ -29437,19 +29589,19 @@ GL_PREFIX(_dispatch_stub_777):
        popq    %rdx
        popq    %rsi
        popq    %rdi
-       movq    6216(%rax), %r11
+       movq    6248(%rax), %r11
        jmp     *%r11
 #endif /* defined(GLX_USE_TLS) */
-       .size   GL_PREFIX(_dispatch_stub_777), .-GL_PREFIX(_dispatch_stub_777)
+       .size   GL_PREFIX(_dispatch_stub_781), .-GL_PREFIX(_dispatch_stub_781)
 
        .p2align        4,,15
-       .globl  GL_PREFIX(_dispatch_stub_778)
-       .type   GL_PREFIX(_dispatch_stub_778), @function
-       HIDDEN(GL_PREFIX(_dispatch_stub_778))
-GL_PREFIX(_dispatch_stub_778):
+       .globl  GL_PREFIX(_dispatch_stub_782)
+       .type   GL_PREFIX(_dispatch_stub_782), @function
+       HIDDEN(GL_PREFIX(_dispatch_stub_782))
+GL_PREFIX(_dispatch_stub_782):
 #if defined(GLX_USE_TLS)
        call    _x86_64_get_dispatch@PLT
-       movq    6224(%rax), %r11
+       movq    6256(%rax), %r11
        jmp     *%r11
 #elif defined(PTHREADS)
        pushq   %rdi
@@ -29463,13 +29615,13 @@ GL_PREFIX(_dispatch_stub_778):
        popq    %rdx
        popq    %rsi
        popq    %rdi
-       movq    6224(%rax), %r11
+       movq    6256(%rax), %r11
        jmp     *%r11
 #else
        movq    _glapi_Dispatch(%rip), %rax
        testq   %rax, %rax
        je      1f
-       movq    6224(%rax), %r11
+       movq    6256(%rax), %r11
        jmp     *%r11
 1:
        pushq   %rdi
@@ -29483,19 +29635,19 @@ GL_PREFIX(_dispatch_stub_778):
        popq    %rdx
        popq    %rsi
        popq    %rdi
-       movq    6224(%rax), %r11
+       movq    6256(%rax), %r11
        jmp     *%r11
 #endif /* defined(GLX_USE_TLS) */
-       .size   GL_PREFIX(_dispatch_stub_778), .-GL_PREFIX(_dispatch_stub_778)
+       .size   GL_PREFIX(_dispatch_stub_782), .-GL_PREFIX(_dispatch_stub_782)
 
        .p2align        4,,15
-       .globl  GL_PREFIX(_dispatch_stub_779)
-       .type   GL_PREFIX(_dispatch_stub_779), @function
-       HIDDEN(GL_PREFIX(_dispatch_stub_779))
-GL_PREFIX(_dispatch_stub_779):
+       .globl  GL_PREFIX(_dispatch_stub_783)
+       .type   GL_PREFIX(_dispatch_stub_783), @function
+       HIDDEN(GL_PREFIX(_dispatch_stub_783))
+GL_PREFIX(_dispatch_stub_783):
 #if defined(GLX_USE_TLS)
        call    _x86_64_get_dispatch@PLT
-       movq    6232(%rax), %r11
+       movq    6264(%rax), %r11
        jmp     *%r11
 #elif defined(PTHREADS)
        pushq   %rdi
@@ -29505,13 +29657,13 @@ GL_PREFIX(_dispatch_stub_779):
        popq    %rdx
        popq    %rsi
        popq    %rdi
-       movq    6232(%rax), %r11
+       movq    6264(%rax), %r11
        jmp     *%r11
 #else
        movq    _glapi_Dispatch(%rip), %rax
        testq   %rax, %rax
        je      1f
-       movq    6232(%rax), %r11
+       movq    6264(%rax), %r11
        jmp     *%r11
 1:
        pushq   %rdi
@@ -29521,19 +29673,19 @@ GL_PREFIX(_dispatch_stub_779):
        popq    %rdx
        popq    %rsi
        popq    %rdi
-       movq    6232(%rax), %r11
+       movq    6264(%rax), %r11
        jmp     *%r11
 #endif /* defined(GLX_USE_TLS) */
-       .size   GL_PREFIX(_dispatch_stub_779), .-GL_PREFIX(_dispatch_stub_779)
+       .size   GL_PREFIX(_dispatch_stub_783), .-GL_PREFIX(_dispatch_stub_783)
 
        .p2align        4,,15
-       .globl  GL_PREFIX(_dispatch_stub_780)
-       .type   GL_PREFIX(_dispatch_stub_780), @function
-       HIDDEN(GL_PREFIX(_dispatch_stub_780))
-GL_PREFIX(_dispatch_stub_780):
+       .globl  GL_PREFIX(_dispatch_stub_784)
+       .type   GL_PREFIX(_dispatch_stub_784), @function
+       HIDDEN(GL_PREFIX(_dispatch_stub_784))
+GL_PREFIX(_dispatch_stub_784):
 #if defined(GLX_USE_TLS)
        call    _x86_64_get_dispatch@PLT
-       movq    6240(%rax), %r11
+       movq    6272(%rax), %r11
        jmp     *%r11
 #elif defined(PTHREADS)
        pushq   %rdi
@@ -29543,13 +29695,13 @@ GL_PREFIX(_dispatch_stub_780):
        popq    %rdx
        popq    %rsi
        popq    %rdi
-       movq    6240(%rax), %r11
+       movq    6272(%rax), %r11
        jmp     *%r11
 #else
        movq    _glapi_Dispatch(%rip), %rax
        testq   %rax, %rax
        je      1f
-       movq    6240(%rax), %r11
+       movq    6272(%rax), %r11
        jmp     *%r11
 1:
        pushq   %rdi
@@ -29559,10 +29711,10 @@ GL_PREFIX(_dispatch_stub_780):
        popq    %rdx
        popq    %rsi
        popq    %rdi
-       movq    6240(%rax), %r11
+       movq    6272(%rax), %r11
        jmp     *%r11
 #endif /* defined(GLX_USE_TLS) */
-       .size   GL_PREFIX(_dispatch_stub_780), .-GL_PREFIX(_dispatch_stub_780)
+       .size   GL_PREFIX(_dispatch_stub_784), .-GL_PREFIX(_dispatch_stub_784)
 
        .globl GL_PREFIX(ArrayElementEXT) ; .set GL_PREFIX(ArrayElementEXT), GL_PREFIX(ArrayElement)
        .globl GL_PREFIX(BindTextureEXT) ; .set GL_PREFIX(BindTextureEXT), GL_PREFIX(BindTexture)
index 40fc6f2..204175b 100644 (file)
@@ -52,7 +52,7 @@
 #define GLOBL_FN(x) GLOBL x
 #endif
 
-#if defined(PTHREADS) || defined(USE_XTHREADS) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || defined(BEOS_THREADS)
+#if defined(PTHREADS) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || defined(BEOS_THREADS)
 #  define THREADS
 #endif
 
@@ -953,18 +953,26 @@ GLNAME(gl_dispatch_functions_start):
        GL_STUB(RenderbufferStorageEXT, _gloffset_RenderbufferStorageEXT, RenderbufferStorageEXT@16)
        GL_STUB(_dispatch_stub_773, _gloffset_BlitFramebufferEXT, _dispatch_stub_773@40)
        HIDDEN(GL_PREFIX(_dispatch_stub_773, _dispatch_stub_773@40))
+       GL_STUB(_dispatch_stub_774, _gloffset_BufferParameteriAPPLE, _dispatch_stub_774@12)
+       HIDDEN(GL_PREFIX(_dispatch_stub_774, _dispatch_stub_774@12))
+       GL_STUB(_dispatch_stub_775, _gloffset_FlushMappedBufferRangeAPPLE, _dispatch_stub_775@12)
+       HIDDEN(GL_PREFIX(_dispatch_stub_775, _dispatch_stub_775@12))
        GL_STUB(FramebufferTextureLayerEXT, _gloffset_FramebufferTextureLayerEXT, FramebufferTextureLayerEXT@20)
        GL_STUB(ProvokingVertexEXT, _gloffset_ProvokingVertexEXT, ProvokingVertexEXT@4)
-       GL_STUB(_dispatch_stub_776, _gloffset_StencilFuncSeparateATI, _dispatch_stub_776@16)
-       HIDDEN(GL_PREFIX(_dispatch_stub_776, _dispatch_stub_776@16))
-       GL_STUB(_dispatch_stub_777, _gloffset_ProgramEnvParameters4fvEXT, _dispatch_stub_777@16)
-       HIDDEN(GL_PREFIX(_dispatch_stub_777, _dispatch_stub_777@16))
-       GL_STUB(_dispatch_stub_778, _gloffset_ProgramLocalParameters4fvEXT, _dispatch_stub_778@16)
-       HIDDEN(GL_PREFIX(_dispatch_stub_778, _dispatch_stub_778@16))
-       GL_STUB(_dispatch_stub_779, _gloffset_GetQueryObjecti64vEXT, _dispatch_stub_779@12)
+       GL_STUB(_dispatch_stub_778, _gloffset_GetTexParameterPointervAPPLE, _dispatch_stub_778@12)
+       HIDDEN(GL_PREFIX(_dispatch_stub_778, _dispatch_stub_778@12))
+       GL_STUB(_dispatch_stub_779, _gloffset_TextureRangeAPPLE, _dispatch_stub_779@12)
        HIDDEN(GL_PREFIX(_dispatch_stub_779, _dispatch_stub_779@12))
-       GL_STUB(_dispatch_stub_780, _gloffset_GetQueryObjectui64vEXT, _dispatch_stub_780@12)
-       HIDDEN(GL_PREFIX(_dispatch_stub_780, _dispatch_stub_780@12))
+       GL_STUB(_dispatch_stub_780, _gloffset_StencilFuncSeparateATI, _dispatch_stub_780@16)
+       HIDDEN(GL_PREFIX(_dispatch_stub_780, _dispatch_stub_780@16))
+       GL_STUB(_dispatch_stub_781, _gloffset_ProgramEnvParameters4fvEXT, _dispatch_stub_781@16)
+       HIDDEN(GL_PREFIX(_dispatch_stub_781, _dispatch_stub_781@16))
+       GL_STUB(_dispatch_stub_782, _gloffset_ProgramLocalParameters4fvEXT, _dispatch_stub_782@16)
+       HIDDEN(GL_PREFIX(_dispatch_stub_782, _dispatch_stub_782@16))
+       GL_STUB(_dispatch_stub_783, _gloffset_GetQueryObjecti64vEXT, _dispatch_stub_783@12)
+       HIDDEN(GL_PREFIX(_dispatch_stub_783, _dispatch_stub_783@12))
+       GL_STUB(_dispatch_stub_784, _gloffset_GetQueryObjectui64vEXT, _dispatch_stub_784@12)
+       HIDDEN(GL_PREFIX(_dispatch_stub_784, _dispatch_stub_784@12))
        GL_STUB_ALIAS(ArrayElementEXT, _gloffset_ArrayElement, ArrayElementEXT@4, ArrayElement, ArrayElement@4)
        GL_STUB_ALIAS(BindTextureEXT, _gloffset_BindTexture, BindTextureEXT@8, BindTexture, BindTexture@8)
        GL_STUB_ALIAS(DrawArraysEXT, _gloffset_DrawArrays, DrawArraysEXT@12, DrawArrays, DrawArrays@12)
index 51a837f..068da16 100644 (file)
@@ -52,6 +52,7 @@
                                WarningLevel="3"\r
                                SuppressStartupBanner="true"\r
                                CompileAs="0"\r
+                               ForcedIncludeFiles="../../../../src/mesa/main/compiler.h"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
                                SuppressStartupBanner="true"\r
                                DebugInformationFormat="3"\r
                                CompileAs="0"\r
+                               ForcedIncludeFiles="../../../../src/mesa/main/compiler.h"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
                                SuppressStartupBanner="true"\r
                                DebugInformationFormat="3"\r
                                CompileAs="0"\r
+                               ForcedIncludeFiles="../../../../src/mesa/main/compiler.h"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
                                WarningLevel="3"\r
                                SuppressStartupBanner="true"\r
                                CompileAs="0"\r
+                               ForcedIncludeFiles="../../../../src/mesa/main/compiler.h"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\mesa\main\cpuinfo.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\mesa\main\debug.c"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\src\mesa\shader\prog_debug.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\src\mesa\shader\prog_execute.c"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\mesa\shader\prog_optimize.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\mesa\shader\prog_parameter.c"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\mesa\main\texgetimage.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\mesa\main\teximage.c"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\src\mesa\main\viewport.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\src\mesa\vbo\vbo_context.c"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\mesa\main\viewport.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\mesa\main\vsnprintf.c"\r
                                >\r
                                <FileConfiguration\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\mesa\main\cpuinfo.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\mesa\main\dd.h"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\src\mesa\shader\prog_debug.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\src\mesa\shader\prog_execute.h"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\mesa\shader\prog_optimize.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\mesa\shader\prog_parameter.h"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\mesa\main\texgetimage.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\mesa\main\teximage.h"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\..\..\..\src\mesa\main\viewport.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\..\..\..\src\mesa\vbo\vbo.h"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\..\..\..\src\mesa\main\viewport.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\..\..\..\src\mesa\main\vtxfmt.h"\r
                                >\r
                        </File>\r
index d7cd47a..10f2dc9 100644 (file)
@@ -55,6 +55,7 @@
                                WarningLevel="3"\r
                                SuppressStartupBanner="true"\r
                                CompileAs="0"\r
+                               ForcedIncludeFiles="../../../../src/mesa/main/compiler.h"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
                                SuppressStartupBanner="true"\r
                                DebugInformationFormat="3"\r
                                CompileAs="0"\r
+                               ForcedIncludeFiles="../../../../src/mesa/main/compiler.h"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
                                SuppressStartupBanner="true"\r
                                DebugInformationFormat="3"\r
                                CompileAs="0"\r
+                               ForcedIncludeFiles="../../../../src/mesa/main/compiler.h"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
                                WarningLevel="3"\r
                                SuppressStartupBanner="true"\r
                                CompileAs="0"\r
+                               ForcedIncludeFiles="../../../../src/mesa/main/compiler.h"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r