Merge branch 'lp-offset-twoside'
authorKeith Whitwell <keithw@vmware.com>
Mon, 22 Nov 2010 10:36:01 +0000 (10:36 +0000)
committerKeith Whitwell <keithw@vmware.com>
Mon, 22 Nov 2010 10:36:01 +0000 (10:36 +0000)
663 files changed:
Makefile
SConstruct
common.py
configs/autoconf.in
configure.ac
docs/GL3.txt
docs/egl.html
docs/openvg.html
docs/relnotes-7.10.html
include/GL/glext.h
scons/gallium.py
scons/llvm.py
scons/udis86.py
src/SConscript
src/egl/drivers/Makefile.template
src/egl/drivers/dri2/egl_dri2.c
src/egl/drivers/glx/egl_glx.c
src/egl/main/SConscript
src/egl/main/eglapi.c
src/egl/main/eglarray.h
src/egl/main/eglconfig.c
src/egl/main/eglconfig.h
src/egl/main/eglcontext.c
src/egl/main/eglcontext.h
src/egl/main/eglcurrent.c
src/egl/main/egldisplay.c
src/egl/main/egldisplay.h
src/egl/main/egldriver.c
src/egl/main/egldriver.h
src/egl/main/eglimage.c
src/egl/main/eglimage.h
src/egl/main/egllog.c
src/egl/main/eglmode.c
src/egl/main/eglmode.h
src/egl/main/eglscreen.c
src/egl/main/eglscreen.h
src/egl/main/eglsurface.c
src/egl/main/eglsurface.h
src/egl/main/eglsync.c
src/egl/main/eglsync.h
src/gallium/SConscript
src/gallium/auxiliary/Makefile
src/gallium/auxiliary/SConscript
src/gallium/auxiliary/draw/draw_llvm.c
src/gallium/auxiliary/gallivm/lp_bld_init.c
src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
src/gallium/auxiliary/gallivm/lp_bld_type.c
src/gallium/auxiliary/gallivm/lp_bld_type.h
src/gallium/auxiliary/os/os_stream_stdc.c
src/gallium/auxiliary/pipebuffer/SConscript [deleted file]
src/gallium/auxiliary/rtasm/rtasm_ppc.c
src/gallium/auxiliary/target-helpers/wrap_screen.c [deleted file]
src/gallium/auxiliary/target-helpers/wrap_screen.h [deleted file]
src/gallium/auxiliary/tgsi/tgsi_build.c
src/gallium/auxiliary/tgsi/tgsi_build.h
src/gallium/auxiliary/tgsi/tgsi_exec.c
src/gallium/auxiliary/tgsi/tgsi_exec.h
src/gallium/auxiliary/tgsi/tgsi_text.c
src/gallium/auxiliary/translate/translate.h
src/gallium/auxiliary/translate/translate_sse.c
src/gallium/auxiliary/util/u_dl.c
src/gallium/auxiliary/util/u_format_srgb.py
src/gallium/auxiliary/util/u_format_table.py
src/gallium/drivers/failover/SConscript
src/gallium/drivers/galahad/SConscript
src/gallium/drivers/i915/SConscript
src/gallium/drivers/i915/i915_reg.h
src/gallium/drivers/i915/i915_resource.h
src/gallium/drivers/i915/i915_resource_texture.c
src/gallium/drivers/i915/i915_screen.c
src/gallium/drivers/i915/i915_state_emit.c
src/gallium/drivers/i915/i915_state_sampler.c
src/gallium/drivers/i965/SConscript
src/gallium/drivers/i965/brw_screen.c
src/gallium/drivers/llvmpipe/Makefile
src/gallium/drivers/llvmpipe/README
src/gallium/drivers/llvmpipe/SConscript
src/gallium/drivers/llvmpipe/lp_rast.c
src/gallium/drivers/llvmpipe/lp_setup_line.c
src/gallium/drivers/llvmpipe/lp_setup_tri.c
src/gallium/drivers/llvmpipe/lp_state_fs.c
src/gallium/drivers/llvmpipe/lp_tile_soa.py
src/gallium/drivers/noop/Makefile [new file with mode: 0644]
src/gallium/drivers/noop/SConscript [new file with mode: 0644]
src/gallium/drivers/noop/noop_pipe.c [new file with mode: 0644]
src/gallium/drivers/noop/noop_public.h [new file with mode: 0644]
src/gallium/drivers/noop/noop_state.c [new file with mode: 0644]
src/gallium/drivers/nv50/nv50_screen.c
src/gallium/drivers/nv50/nv50_shader_state.c
src/gallium/drivers/nvfx/nvfx_screen.c
src/gallium/drivers/r300/SConscript
src/gallium/drivers/r300/r300_blit.c
src/gallium/drivers/r300/r300_context.c
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_emit.c
src/gallium/drivers/r300/r300_hyperz.c
src/gallium/drivers/r300/r300_render.c
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_tgsi_to_rc.c
src/gallium/drivers/r600/SConscript
src/gallium/drivers/r600/eg_asm.c
src/gallium/drivers/r600/eg_state_inlines.h
src/gallium/drivers/r600/evergreen_state.c
src/gallium/drivers/r600/evergreend.h
src/gallium/drivers/r600/r600.h
src/gallium/drivers/r600/r600_asm.c
src/gallium/drivers/r600/r600_asm.h
src/gallium/drivers/r600/r600_blit.c
src/gallium/drivers/r600/r600_buffer.c
src/gallium/drivers/r600/r600_opcodes.h
src/gallium/drivers/r600/r600_pipe.c
src/gallium/drivers/r600/r600_pipe.h
src/gallium/drivers/r600/r600_resource.h
src/gallium/drivers/r600/r600_shader.c
src/gallium/drivers/r600/r600_shader.h
src/gallium/drivers/r600/r600_state.c
src/gallium/drivers/r600/r600_state_common.c
src/gallium/drivers/r600/r600_state_inlines.h
src/gallium/drivers/r600/r600_texture.c
src/gallium/drivers/r600/r600d.h
src/gallium/drivers/rbug/README
src/gallium/drivers/rbug/SConscript
src/gallium/drivers/softpipe/SConscript
src/gallium/drivers/softpipe/sp_quad_depth_test.c
src/gallium/drivers/softpipe/sp_screen.c
src/gallium/drivers/softpipe/sp_tex_sample.c
src/gallium/drivers/softpipe/sp_tile_cache.h
src/gallium/drivers/svga/svga_screen.c
src/gallium/drivers/sw/Makefile [deleted file]
src/gallium/drivers/sw/SConscript [deleted file]
src/gallium/drivers/sw/sw.c [deleted file]
src/gallium/drivers/sw/sw_public.h [deleted file]
src/gallium/drivers/trace/README
src/gallium/drivers/trace/SConscript
src/gallium/include/pipe/p_defines.h
src/gallium/include/state_tracker/graw.h
src/gallium/include/state_tracker/st_api.h
src/gallium/include/state_tracker/swrast_screen_create.h [deleted file]
src/gallium/state_trackers/d3d1x/dxgi/src/dxgi_native.cpp
src/gallium/state_trackers/dri/SConscript
src/gallium/state_trackers/dri/common/dri_context.c
src/gallium/state_trackers/dri/common/dri_drawable.h
src/gallium/state_trackers/dri/common/dri_screen.c
src/gallium/state_trackers/dri/drm/SConscript
src/gallium/state_trackers/dri/sw/SConscript
src/gallium/state_trackers/egl/Makefile
src/gallium/state_trackers/egl/SConscript
src/gallium/state_trackers/egl/common/egl_g3d.c
src/gallium/state_trackers/egl/common/egl_g3d.h
src/gallium/state_trackers/egl/common/egl_g3d_api.c
src/gallium/state_trackers/egl/common/egl_g3d_image.c
src/gallium/state_trackers/egl/common/egl_g3d_st.c
src/gallium/state_trackers/egl/common/egl_g3d_sync.c
src/gallium/state_trackers/egl/common/native.h
src/gallium/state_trackers/egl/common/native_buffer.h [new file with mode: 0644]
src/gallium/state_trackers/egl/common/native_modeset.h
src/gallium/state_trackers/egl/drm/modeset.c
src/gallium/state_trackers/egl/drm/native_drm.c
src/gallium/state_trackers/egl/fbdev/native_fbdev.c
src/gallium/state_trackers/egl/gdi/native_gdi.c
src/gallium/state_trackers/egl/x11/native_dri2.c
src/gallium/state_trackers/egl/x11/native_x11.h
src/gallium/state_trackers/egl/x11/native_ximage.c
src/gallium/state_trackers/glx/xlib/SConscript
src/gallium/state_trackers/glx/xlib/glx_api.c
src/gallium/state_trackers/glx/xlib/xm_api.c
src/gallium/state_trackers/glx/xlib/xm_api.h
src/gallium/state_trackers/python/SConscript
src/gallium/state_trackers/vega/Makefile
src/gallium/state_trackers/vega/SConscript
src/gallium/state_trackers/vega/api_context.c
src/gallium/state_trackers/vega/api_filters.c
src/gallium/state_trackers/vega/api_images.c
src/gallium/state_trackers/vega/api_masks.c
src/gallium/state_trackers/vega/api_paint.c
src/gallium/state_trackers/vega/api_path.c
src/gallium/state_trackers/vega/api_text.c
src/gallium/state_trackers/vega/image.c
src/gallium/state_trackers/vega/paint.c
src/gallium/state_trackers/vega/polygon.c
src/gallium/state_trackers/vega/renderer.c
src/gallium/state_trackers/vega/shaders_cache.c
src/gallium/state_trackers/vega/vg_context.c
src/gallium/state_trackers/vega/vg_manager.c
src/gallium/state_trackers/wgl/SConscript
src/gallium/state_trackers/wgl/stw_context.c
src/gallium/state_trackers/xorg/SConscript
src/gallium/state_trackers/xorg/xorg_driver.c
src/gallium/targets/Makefile.dri
src/gallium/targets/Makefile.xorg
src/gallium/targets/SConscript [deleted file]
src/gallium/targets/SConscript.dri
src/gallium/targets/dri-i915/SConscript
src/gallium/targets/dri-i965/SConscript
src/gallium/targets/dri-noop/Makefile [new file with mode: 0644]
src/gallium/targets/dri-noop/SConscript [new file with mode: 0644]
src/gallium/targets/dri-noop/swrast_drm_api.c [new file with mode: 0644]
src/gallium/targets/dri-r300/SConscript
src/gallium/targets/dri-r600/SConscript
src/gallium/targets/dri-swrast/SConscript
src/gallium/targets/dri-vmwgfx/Makefile
src/gallium/targets/dri-vmwgfx/SConscript
src/gallium/targets/dri-vmwgfx/vmw_powf.c [new file with mode: 0644]
src/gallium/targets/egl-gdi/SConscript
src/gallium/targets/egl/Makefile
src/gallium/targets/graw-gdi/SConscript [new file with mode: 0644]
src/gallium/targets/graw-gdi/graw_gdi.c [new file with mode: 0644]
src/gallium/targets/graw-null/SConscript
src/gallium/targets/graw-null/graw_null.c
src/gallium/targets/graw-null/graw_util.c [new file with mode: 0644]
src/gallium/targets/graw-xlib/SConscript
src/gallium/targets/graw-xlib/graw_util.c [deleted file]
src/gallium/targets/graw-xlib/graw_xlib.c
src/gallium/targets/libgl-gdi/SConscript
src/gallium/targets/libgl-gdi/gdi_llvmpipe_winsys.c [deleted file]
src/gallium/targets/libgl-gdi/gdi_softpipe_winsys.c [deleted file]
src/gallium/targets/libgl-gdi/libgl_gdi.c [new file with mode: 0644]
src/gallium/targets/libgl-xlib/Makefile
src/gallium/targets/libgl-xlib/SConscript
src/gallium/targets/libgl-xlib/xlib.c
src/gallium/targets/xorg-vmwgfx/SConscript
src/gallium/tests/graw/SConscript
src/gallium/tests/graw/clear.c
src/gallium/tests/graw/fs-test.c
src/gallium/tests/graw/gs-test.c
src/gallium/tests/graw/quad-tex.c
src/gallium/tests/graw/shader-leak.c
src/gallium/tests/graw/tri-gs.c
src/gallium/tests/graw/tri-instanced.c
src/gallium/tests/graw/tri.c
src/gallium/tests/graw/vs-test.c
src/gallium/tests/unit/SConscript
src/gallium/winsys/SConscript
src/gallium/winsys/i915/drm/i915_drm_batchbuffer.c
src/gallium/winsys/i915/drm/i915_drm_buffer.c
src/gallium/winsys/i915/drm/i915_drm_winsys.c
src/gallium/winsys/i915/drm/i915_drm_winsys.h
src/gallium/winsys/r600/drm/evergreen_hw_context.c
src/gallium/winsys/r600/drm/r600_bo.c
src/gallium/winsys/r600/drm/r600_drm.c
src/gallium/winsys/r600/drm/r600_hw_context.c
src/gallium/winsys/r600/drm/r600_priv.h
src/gallium/winsys/r600/drm/r600d.h
src/gallium/winsys/r600/drm/radeon_bo.c
src/gallium/winsys/r600/drm/radeon_bo_pb.c
src/gallium/winsys/svga/drm/SConscript
src/gallium/winsys/sw/xlib/SConscript
src/glsl/Makefile
src/glsl/Makefile.am [deleted file]
src/glsl/SConscript
src/glsl/ast_function.cpp
src/glsl/ast_to_hir.cpp
src/glsl/builtin_function.cpp
src/glsl/builtin_types.h
src/glsl/builtins/ir/acosh [new file with mode: 0644]
src/glsl/builtins/ir/asinh [new file with mode: 0644]
src/glsl/builtins/ir/atan
src/glsl/builtins/ir/atanh [new file with mode: 0644]
src/glsl/builtins/ir/cross
src/glsl/builtins/profiles/130.frag
src/glsl/builtins/profiles/130.vert
src/glsl/builtins/tools/generate_builtins.py
src/glsl/glcpp/glcpp-lex.c
src/glsl/glcpp/glcpp-parse.c
src/glsl/glcpp/glcpp-parse.h
src/glsl/glcpp/glcpp-parse.y
src/glsl/glsl_lexer.cpp
src/glsl/glsl_lexer.lpp
src/glsl/glsl_parser.cpp
src/glsl/glsl_parser.h
src/glsl/glsl_parser.ypp
src/glsl/glsl_parser_extras.cpp
src/glsl/glsl_types.cpp
src/glsl/glsl_types.h
src/glsl/ir.cpp
src/glsl/ir.h
src/glsl/ir_algebraic.cpp [deleted file]
src/glsl/ir_clone.cpp
src/glsl/ir_constant_expression.cpp
src/glsl/ir_constant_folding.cpp [deleted file]
src/glsl/ir_constant_propagation.cpp [deleted file]
src/glsl/ir_constant_variable.cpp [deleted file]
src/glsl/ir_copy_propagation.cpp [deleted file]
src/glsl/ir_dead_code.cpp [deleted file]
src/glsl/ir_dead_code_local.cpp [deleted file]
src/glsl/ir_dead_functions.cpp [deleted file]
src/glsl/ir_div_to_mul_rcp.cpp [deleted file]
src/glsl/ir_explog_to_explog2.cpp [deleted file]
src/glsl/ir_function.cpp
src/glsl/ir_function_inlining.cpp [deleted file]
src/glsl/ir_if_simplification.cpp [deleted file]
src/glsl/ir_if_to_cond_assign.cpp [deleted file]
src/glsl/ir_lower_jumps.cpp [deleted file]
src/glsl/ir_mat_op_to_vec.cpp [deleted file]
src/glsl/ir_mod_to_fract.cpp [deleted file]
src/glsl/ir_noop_swizzle.cpp [deleted file]
src/glsl/ir_optimization.h
src/glsl/ir_print_visitor.cpp
src/glsl/ir_reader.cpp
src/glsl/ir_structure_splitting.cpp [deleted file]
src/glsl/ir_sub_to_add_neg.cpp [deleted file]
src/glsl/ir_swizzle_swizzle.cpp [deleted file]
src/glsl/ir_tree_grafting.cpp [deleted file]
src/glsl/ir_validate.cpp
src/glsl/ir_vec_index_to_cond_assign.cpp [deleted file]
src/glsl/ir_vec_index_to_swizzle.cpp [deleted file]
src/glsl/loop_analysis.cpp
src/glsl/loop_controls.cpp
src/glsl/lower_if_to_cond_assign.cpp [new file with mode: 0644]
src/glsl/lower_instructions.cpp [new file with mode: 0644]
src/glsl/lower_jumps.cpp [new file with mode: 0644]
src/glsl/lower_mat_op_to_vec.cpp [new file with mode: 0644]
src/glsl/lower_vec_index_to_cond_assign.cpp [new file with mode: 0644]
src/glsl/lower_vec_index_to_swizzle.cpp [new file with mode: 0644]
src/glsl/lower_vector.cpp [new file with mode: 0644]
src/glsl/main.cpp
src/glsl/opt_algebraic.cpp [new file with mode: 0644]
src/glsl/opt_constant_folding.cpp [new file with mode: 0644]
src/glsl/opt_constant_propagation.cpp [new file with mode: 0644]
src/glsl/opt_constant_variable.cpp [new file with mode: 0644]
src/glsl/opt_copy_propagation.cpp [new file with mode: 0644]
src/glsl/opt_dead_code.cpp [new file with mode: 0644]
src/glsl/opt_dead_code_local.cpp [new file with mode: 0644]
src/glsl/opt_dead_functions.cpp [new file with mode: 0644]
src/glsl/opt_function_inlining.cpp [new file with mode: 0644]
src/glsl/opt_if_simplification.cpp [new file with mode: 0644]
src/glsl/opt_noop_swizzle.cpp [new file with mode: 0644]
src/glsl/opt_structure_splitting.cpp [new file with mode: 0644]
src/glsl/opt_swizzle_swizzle.cpp [new file with mode: 0644]
src/glsl/opt_tree_grafting.cpp [new file with mode: 0644]
src/glsl/s_expression.cpp
src/glut/glx/SConscript
src/glx/indirect.c
src/glx/indirect.h
src/glx/single2.c
src/glx/singlepix.c
src/mapi/glapi/SConscript
src/mapi/glapi/gen-es/Makefile
src/mapi/glapi/gen/ARB_draw_instanced.xml
src/mapi/glapi/gen/EXT_gpu_shader4.xml [new file with mode: 0644]
src/mapi/glapi/gen/EXT_separate_shader_objects.xml [new file with mode: 0644]
src/mapi/glapi/gen/EXT_texture_integer.xml [new file with mode: 0644]
src/mapi/glapi/gen/EXT_transform_feedback.xml
src/mapi/glapi/gen/GL3.xml [deleted file]
src/mapi/glapi/gen/GL3x.xml [new file with mode: 0644]
src/mapi/glapi/gen/Makefile
src/mapi/glapi/gen/glX_proto_send.py
src/mapi/glapi/gen/gl_API.xml
src/mapi/glapi/gen/gl_SPARC_asm.py
src/mapi/glapi/gen/gl_procs.py
src/mapi/glapi/gen/gl_table.py
src/mapi/glapi/gen/gl_x86_asm.py
src/mapi/glapi/glapi_dispatch.c
src/mapi/glapi/glapi_getproc.c
src/mapi/glapi/glapi_sparc.S
src/mapi/glapi/glapi_x86-64.S
src/mapi/glapi/glapi_x86.S
src/mapi/glapi/glapidispatch.h [deleted file]
src/mapi/glapi/glapioffsets.h [deleted file]
src/mapi/glapi/glapitable.h
src/mapi/glapi/glapitemp.h
src/mapi/glapi/glprocs.h
src/mapi/vgapi/.gitignore [new file with mode: 0644]
src/mesa/Makefile
src/mesa/SConscript
src/mesa/drivers/common/meta.c
src/mesa/drivers/dri/Makefile.template
src/mesa/drivers/dri/common/utils.c
src/mesa/drivers/dri/common/xmlpool/Makefile
src/mesa/drivers/dri/i915/intel_structs.h [deleted file]
src/mesa/drivers/dri/i965/brw_cc.c
src/mesa/drivers/dri/i965/brw_clip.c
src/mesa/drivers/dri/i965/brw_clip_state.c
src/mesa/drivers/dri/i965/brw_context.c
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_curbe.c
src/mesa/drivers/dri/i965/brw_defines.h
src/mesa/drivers/dri/i965/brw_disasm.c
src/mesa/drivers/dri/i965/brw_draw.c
src/mesa/drivers/dri/i965/brw_draw_upload.c
src/mesa/drivers/dri/i965/brw_eu.h
src/mesa/drivers/dri/i965/brw_eu_emit.c
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_fs.h
src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp
src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp
src/mesa/drivers/dri/i965/brw_gs.c
src/mesa/drivers/dri/i965/brw_gs_state.c
src/mesa/drivers/dri/i965/brw_misc_state.c
src/mesa/drivers/dri/i965/brw_sf.c
src/mesa/drivers/dri/i965/brw_sf_state.c
src/mesa/drivers/dri/i965/brw_state_cache.c
src/mesa/drivers/dri/i965/brw_state_dump.c
src/mesa/drivers/dri/i965/brw_state_upload.c
src/mesa/drivers/dri/i965/brw_urb.c
src/mesa/drivers/dri/i965/brw_vs_emit.c
src/mesa/drivers/dri/i965/brw_vs_state.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_pass0.c
src/mesa/drivers/dri/i965/brw_wm_pass1.c
src/mesa/drivers/dri/i965/brw_wm_pass2.c
src/mesa/drivers/dri/i965/brw_wm_state.c
src/mesa/drivers/dri/i965/brw_wm_surface_state.c
src/mesa/drivers/dri/i965/gen6_cc.c
src/mesa/drivers/dri/i965/gen6_clip_state.c
src/mesa/drivers/dri/i965/gen6_sf_state.c
src/mesa/drivers/dri/i965/gen6_urb.c
src/mesa/drivers/dri/i965/gen6_vs_state.c
src/mesa/drivers/dri/i965/gen6_wm_state.c
src/mesa/drivers/dri/i965/intel_structs.h [deleted file]
src/mesa/drivers/dri/intel/intel_batchbuffer.c
src/mesa/drivers/dri/intel/intel_batchbuffer.h
src/mesa/drivers/dri/intel/intel_blit.c
src/mesa/drivers/dri/intel/intel_chipset.h
src/mesa/drivers/dri/intel/intel_clear.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_pixel.c
src/mesa/drivers/dri/intel/intel_pixel_bitmap.c
src/mesa/drivers/dri/intel/intel_pixel_copy.c
src/mesa/drivers/dri/intel/intel_pixel_read.c
src/mesa/drivers/dri/intel/intel_tex.c
src/mesa/drivers/dri/intel/intel_tex_copy.c
src/mesa/drivers/dri/intel/intel_tex_image.c
src/mesa/drivers/dri/nouveau/Makefile
src/mesa/drivers/dri/nouveau/nouveau_array.c [new file with mode: 0644]
src/mesa/drivers/dri/nouveau/nouveau_array.h [new file with mode: 0644]
src/mesa/drivers/dri/nouveau/nouveau_bo_state.c
src/mesa/drivers/dri/nouveau/nouveau_bo_state.h
src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c
src/mesa/drivers/dri/nouveau/nouveau_bufferobj.h
src/mesa/drivers/dri/nouveau/nouveau_class.h [deleted file]
src/mesa/drivers/dri/nouveau/nouveau_context.c
src/mesa/drivers/dri/nouveau/nouveau_context.h
src/mesa/drivers/dri/nouveau/nouveau_render.h
src/mesa/drivers/dri/nouveau/nouveau_render_t.c
src/mesa/drivers/dri/nouveau/nouveau_scratch.c [new file with mode: 0644]
src/mesa/drivers/dri/nouveau/nouveau_scratch.h [new file with mode: 0644]
src/mesa/drivers/dri/nouveau/nouveau_state.c
src/mesa/drivers/dri/nouveau/nouveau_swtnl_t.c
src/mesa/drivers/dri/nouveau/nouveau_texture.c
src/mesa/drivers/dri/nouveau/nouveau_texture.h
src/mesa/drivers/dri/nouveau/nouveau_util.h
src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c
src/mesa/drivers/dri/nouveau/nv01_2d.xml.h [new file with mode: 0644]
src/mesa/drivers/dri/nouveau/nv04_3d.xml.h [new file with mode: 0644]
src/mesa/drivers/dri/nouveau/nv04_context.c
src/mesa/drivers/dri/nouveau/nv04_context.h
src/mesa/drivers/dri/nouveau/nv04_render.c
src/mesa/drivers/dri/nouveau/nv04_state_fb.c
src/mesa/drivers/dri/nouveau/nv04_state_frag.c
src/mesa/drivers/dri/nouveau/nv04_state_raster.c
src/mesa/drivers/dri/nouveau/nv04_state_tex.c
src/mesa/drivers/dri/nouveau/nv04_surface.c
src/mesa/drivers/dri/nouveau/nv10_3d.xml.h [new file with mode: 0644]
src/mesa/drivers/dri/nouveau/nv10_context.c
src/mesa/drivers/dri/nouveau/nv10_driver.h
src/mesa/drivers/dri/nouveau/nv10_render.c
src/mesa/drivers/dri/nouveau/nv10_state_fb.c
src/mesa/drivers/dri/nouveau/nv10_state_frag.c
src/mesa/drivers/dri/nouveau/nv10_state_polygon.c
src/mesa/drivers/dri/nouveau/nv10_state_raster.c
src/mesa/drivers/dri/nouveau/nv10_state_tex.c
src/mesa/drivers/dri/nouveau/nv10_state_tnl.c
src/mesa/drivers/dri/nouveau/nv20_3d.xml.h [new file with mode: 0644]
src/mesa/drivers/dri/nouveau/nv20_context.c
src/mesa/drivers/dri/nouveau/nv20_driver.h
src/mesa/drivers/dri/nouveau/nv20_render.c
src/mesa/drivers/dri/nouveau/nv20_state_fb.c
src/mesa/drivers/dri/nouveau/nv20_state_frag.c
src/mesa/drivers/dri/nouveau/nv20_state_polygon.c
src/mesa/drivers/dri/nouveau/nv20_state_raster.c
src/mesa/drivers/dri/nouveau/nv20_state_tex.c
src/mesa/drivers/dri/nouveau/nv20_state_tnl.c
src/mesa/drivers/dri/nouveau/nv_m2mf.xml.h [new file with mode: 0644]
src/mesa/drivers/dri/nouveau/nv_object.xml.h [new file with mode: 0644]
src/mesa/drivers/dri/r200/r200_context.c
src/mesa/drivers/dri/r200/r200_swtcl.c
src/mesa/drivers/dri/r200/r200_tcl.c
src/mesa/drivers/dri/r200/r200_tex.c
src/mesa/drivers/dri/r200/r200_texstate.c
src/mesa/drivers/dri/r300/compiler/r300_fragprog_emit.c
src/mesa/drivers/dri/r300/compiler/r300_fragprog_swizzle.c
src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c
src/mesa/drivers/dri/r300/compiler/r500_fragprog_emit.c
src/mesa/drivers/dri/r300/compiler/radeon_code.h
src/mesa/drivers/dri/r300/compiler/radeon_compiler_util.c
src/mesa/drivers/dri/r300/compiler/radeon_compiler_util.h
src/mesa/drivers/dri/r300/compiler/radeon_dataflow.c
src/mesa/drivers/dri/r300/compiler/radeon_dataflow.h
src/mesa/drivers/dri/r300/compiler/radeon_optimize.c
src/mesa/drivers/dri/r300/compiler/radeon_pair_regalloc.c
src/mesa/drivers/dri/r300/compiler/radeon_pair_schedule.c
src/mesa/drivers/dri/r300/compiler/radeon_pair_translate.c
src/mesa/drivers/dri/r300/compiler/radeon_program.c
src/mesa/drivers/dri/r300/compiler/radeon_program.h
src/mesa/drivers/dri/r300/compiler/radeon_program_constants.h
src/mesa/drivers/dri/r300/compiler/radeon_program_pair.c
src/mesa/drivers/dri/r300/compiler/radeon_program_pair.h
src/mesa/drivers/dri/r300/compiler/radeon_program_print.c
src/mesa/drivers/dri/r300/compiler/radeon_rename_regs.c
src/mesa/drivers/dri/r300/r300_context.c
src/mesa/drivers/dri/r300/r300_draw.c
src/mesa/drivers/dri/r300/r300_render.c
src/mesa/drivers/dri/r300/r300_tex.c
src/mesa/drivers/dri/r300/r300_texstate.c
src/mesa/drivers/dri/r600/evergreen_render.c
src/mesa/drivers/dri/r600/evergreen_tex.c
src/mesa/drivers/dri/r600/r600_context.c
src/mesa/drivers/dri/r600/r600_tex.c
src/mesa/drivers/dri/r600/r600_texstate.c
src/mesa/drivers/dri/radeon/radeon_common.c
src/mesa/drivers/dri/radeon/radeon_common_context.c
src/mesa/drivers/dri/radeon/radeon_context.c
src/mesa/drivers/dri/radeon/radeon_fbo.c
src/mesa/drivers/dri/radeon/radeon_screen.c
src/mesa/drivers/dri/radeon/radeon_screen.h
src/mesa/drivers/dri/radeon/radeon_swtcl.c
src/mesa/drivers/dri/radeon/radeon_tcl.c
src/mesa/drivers/dri/radeon/radeon_tex.c
src/mesa/drivers/dri/radeon/radeon_texstate.c
src/mesa/drivers/dri/radeon/radeon_texture.c
src/mesa/drivers/dri/radeon/radeon_texture.h
src/mesa/drivers/dri/savage/savage_xmesa.c
src/mesa/drivers/dri/swrast/swrast.c
src/mesa/drivers/dri/tdfx/tdfx_tex.c
src/mesa/drivers/osmesa/osmesa.c
src/mesa/drivers/x11/fakeglx.c
src/mesa/drivers/x11/glxapi.c
src/mesa/main/accum.h
src/mesa/main/api_arrayelt.c
src/mesa/main/api_exec.c
src/mesa/main/api_loopback.c
src/mesa/main/api_loopback.h
src/mesa/main/api_validate.c
src/mesa/main/api_validate.h
src/mesa/main/arrayobj.h
src/mesa/main/atifragshader.h
src/mesa/main/attrib.h
src/mesa/main/blend.h
src/mesa/main/bufferobj.c
src/mesa/main/buffers.h
src/mesa/main/clear.c
src/mesa/main/clear.h
src/mesa/main/colortab.c
src/mesa/main/colortab.h
src/mesa/main/context.c
src/mesa/main/convolve.h
src/mesa/main/core.h
src/mesa/main/dd.h
src/mesa/main/debug.c
src/mesa/main/debug.h
src/mesa/main/depth.h
src/mesa/main/depthstencil.h
src/mesa/main/dispatch.h
src/mesa/main/dlist.c
src/mesa/main/drawpix.c
src/mesa/main/drawpix.h
src/mesa/main/drawtex.h
src/mesa/main/enable.c
src/mesa/main/enable.h
src/mesa/main/enums.c
src/mesa/main/enums.h
src/mesa/main/es_generator.py
src/mesa/main/extensions.c
src/mesa/main/extensions.h
src/mesa/main/fbobject.c
src/mesa/main/fbobject.h
src/mesa/main/ffvertex_prog.h
src/mesa/main/fog.h
src/mesa/main/formats.c
src/mesa/main/formats.h
src/mesa/main/framebuffer.c
src/mesa/main/framebuffer.h
src/mesa/main/get.c
src/mesa/main/glapidispatch.h [new file with mode: 0644]
src/mesa/main/hint.h
src/mesa/main/histogram.h
src/mesa/main/image.c
src/mesa/main/image.h
src/mesa/main/imports.h
src/mesa/main/light.h
src/mesa/main/lines.c
src/mesa/main/lines.h
src/mesa/main/matrix.h
src/mesa/main/mfeatures.h
src/mesa/main/mipmap.c
src/mesa/main/mtypes.h
src/mesa/main/multisample.h
src/mesa/main/nvprogram.c
src/mesa/main/nvprogram.h
src/mesa/main/pack.c [new file with mode: 0644]
src/mesa/main/pack.h [new file with mode: 0644]
src/mesa/main/pixel.h
src/mesa/main/pixelstore.h
src/mesa/main/pixeltransfer.c [new file with mode: 0644]
src/mesa/main/pixeltransfer.h [new file with mode: 0644]
src/mesa/main/points.h
src/mesa/main/polygon.c
src/mesa/main/polygon.h
src/mesa/main/rastpos.h
src/mesa/main/readpix.c
src/mesa/main/readpix.h
src/mesa/main/remap.c
src/mesa/main/remap.h
src/mesa/main/remap_helper.h
src/mesa/main/renderbuffer.c
src/mesa/main/renderbuffer.h
src/mesa/main/scissor.h
src/mesa/main/shaderapi.c
src/mesa/main/shaderapi.h
src/mesa/main/shaderobj.h
src/mesa/main/shared.h
src/mesa/main/state.c
src/mesa/main/stencil.h
src/mesa/main/texenvprogram.c
src/mesa/main/texfetch.c
src/mesa/main/texgetimage.c
src/mesa/main/teximage.c
src/mesa/main/teximage.h
src/mesa/main/texobj.c
src/mesa/main/texstate.c
src/mesa/main/texstore.c
src/mesa/main/uniforms.c
src/mesa/main/uniforms.h
src/mesa/main/varray.c
src/mesa/main/varray.h
src/mesa/main/version.h
src/mesa/main/vtxfmt.c
src/mesa/program/ir_to_mesa.cpp
src/mesa/program/program.c
src/mesa/program/sampler.cpp
src/mesa/sources.mak
src/mesa/state_tracker/st_atom_constbuf.c
src/mesa/state_tracker/st_atom_rasterizer.c
src/mesa/state_tracker/st_cb_drawpixels.c
src/mesa/state_tracker/st_cb_eglimage.c
src/mesa/state_tracker/st_cb_queryobj.c
src/mesa/state_tracker/st_cb_readpixels.c
src/mesa/state_tracker/st_cb_texture.c
src/mesa/state_tracker/st_context.c
src/mesa/state_tracker/st_draw.c
src/mesa/state_tracker/st_extensions.c
src/mesa/state_tracker/st_format.c
src/mesa/state_tracker/st_gen_mipmap.c
src/mesa/state_tracker/st_manager.c
src/mesa/state_tracker/st_program.c
src/mesa/swrast/s_copypix.c
src/mesa/swrast/s_drawpix.c
src/mesa/swrast/s_fragprog.c
src/mesa/swrast/s_readpix.c
src/mesa/swrast/s_texcombine.c
src/mesa/vbo/vbo_attrib_tmp.h
src/mesa/vbo/vbo_exec_api.c
src/mesa/vbo/vbo_exec_draw.c
src/mesa/vbo/vbo_save_api.c

index 65897861ef0734a1a4ea66d724e67bfd81aa9e40..30269194f4bde7e1d6a203d1e012bbc045c680c1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -347,23 +347,19 @@ GALLIUM_FILES = \
 
 DRI_FILES = \
        $(DIRECTORY)/include/GL/internal/dri_interface.h                \
-       $(DIRECTORY)/include/GL/internal/glcore.h                       \
        $(DIRECTORY)/include/GL/internal/sarea.h                        \
        $(DIRECTORY)/src/glx/Makefile                                   \
-       $(DIRECTORY)/src/glx/Makefile                                   \
        $(DIRECTORY)/src/glx/*.[ch]                                     \
        $(DIRECTORY)/src/mesa/drivers/dri/Makefile                      \
        $(DIRECTORY)/src/mesa/drivers/dri/Makefile.template             \
        $(DIRECTORY)/src/mesa/drivers/dri/dri.pc.in                     \
-       $(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/*/*.cpp                       \
        $(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]
+       $(DIRECTORY)/src/mesa/drivers/dri/*/Doxyfile
 
 SGI_GLU_FILES = \
        $(DIRECTORY)/src/glu/Makefile                                   \
index 558ebf90aaa03673f92825bd6384fc8e6655ed5b..c6198041fb0cff49b695423ac5eaece4fe2217ab 100644 (file)
@@ -3,14 +3,14 @@
 #
 # For example, invoke scons as 
 #
-#   scons debug=1 dri=0 machine=x86
+#   scons build=debug llvm=yes machine=x86
 #
 # to set configuration variables. Or you can write those options to a file
 # named config.py:
 #
 #   # config.py
-#   debug=1
-#   dri=0
+#   build='debug'
+#   llvm=True
 #   machine='x86'
 # 
 # Invoke
@@ -30,54 +30,8 @@ import common
 #######################################################################
 # Configuration options
 
-default_statetrackers = 'mesa'
-default_targets = 'graw-null'
-
-if common.default_platform in ('linux', 'freebsd', 'darwin'):
-       default_drivers = 'softpipe,galahad,failover,svga,i915,i965,trace,identity,llvmpipe'
-       default_winsys = 'xlib'
-elif common.default_platform in ('winddk',):
-       default_drivers = 'softpipe,svga,i915,i965,trace,identity'
-       default_winsys = 'all'
-elif common.default_platform in ('embedded',):
-       default_drivers = 'softpipe,llvmpipe'
-       default_winsys = 'xlib'
-else:
-       default_drivers = 'all'
-       default_winsys = 'all'
-
 opts = Variables('config.py')
 common.AddOptions(opts)
-opts.Add(ListVariable('statetrackers', 'state trackers to build', default_statetrackers,
-                     ['mesa', 'python', 'xorg', 'egl']))
-opts.Add(ListVariable('drivers', 'pipe drivers to build', default_drivers,
-                     ['softpipe', 'galahad', 'failover', 'svga', 'i915', 'i965', 'trace', 'r300', 'r600', 'identity', 'llvmpipe', 'nouveau', 'nv50', 'nvfx']))
-opts.Add(ListVariable('winsys', 'winsys drivers to build', default_winsys,
-                     ['xlib', 'vmware', 'i915', 'i965', 'gdi', 'radeon', 'r600', 'graw-xlib']))
-
-opts.Add(ListVariable('targets', 'driver targets to build', default_targets,
-                     ['dri-i915',
-                      'dri-i965',
-                      'dri-nouveau',
-                      'dri-radeong',
-                      'dri-swrast',
-                      'dri-vmwgfx',
-                      'egl-i915',
-                      'egl-i965',
-                      'egl-nouveau',
-                      'egl-radeon',
-                      'egl-swrast',
-                      'egl-vmwgfx',
-                      'graw-xlib',
-                      'graw-null',
-                      'libgl-gdi',
-                      'libgl-xlib',
-                      'xorg-i915',
-                      'xorg-i965',
-                      'xorg-nouveau',
-                      'xorg-radeon',
-                      'xorg-vmwgfx']))
-
 opts.Add(EnumVariable('MSVS_VERSION', 'MS Visual C++ version', None, allowed_values=('7.1', '8.0', '9.0')))
 
 env = Environment(
@@ -87,61 +41,26 @@ env = Environment(
        ENV = os.environ,
 )
 
-if os.environ.has_key('CC'):
-       env['CC'] = os.environ['CC']
-if os.environ.has_key('CFLAGS'):
-       env['CCFLAGS'] += SCons.Util.CLVar(os.environ['CFLAGS'])
-if os.environ.has_key('CXX'):
-       env['CXX'] = os.environ['CXX']
-if os.environ.has_key('CXXFLAGS'):
-       env['CXXFLAGS'] += SCons.Util.CLVar(os.environ['CXXFLAGS'])
-if os.environ.has_key('LDFLAGS'):
-       env['LINKFLAGS'] += SCons.Util.CLVar(os.environ['LDFLAGS'])
+# Backwards compatability with old target configuration variable
+try:
+    targets = ARGUMENTS['targets']
+except KeyError:
+    pass
+else:
+    targets = targets.split(',')
+    print 'scons: warning: targets option is deprecated; pass the targets on their own such as'
+    print
+    print '  scons %s' % ' '.join(targets)
+    print 
+    COMMAND_LINE_TARGETS.append(targets)
 
-Help(opts.GenerateHelpText(env))
 
-# replicate options values in local variables
-debug = env['debug']
-dri = env['dri']
-machine = env['machine']
-platform = env['platform']
-
-# derived options
-x86 = machine == 'x86'
-ppc = machine == 'ppc'
-gcc = platform in ('linux', 'freebsd', 'darwin', 'embedded')
-msvc = platform in ('windows', 'winddk')
-
-Export([
-       'debug', 
-       'x86', 
-       'ppc', 
-       'dri', 
-       'platform',
-       'gcc',
-       'msvc',
-])
+Help(opts.GenerateHelpText(env))
 
 
 #######################################################################
 # Environment setup
 
-# Always build trace, rbug, identity, softpipe, and llvmpipe (where possible)
-if 'trace' not in env['drivers']:
-    env['drivers'].append('trace')
-if 'rbug' not in env['drivers']:
-    env['drivers'].append('rbug')
-if 'galahad' not in env['drivers']:
-    env['drivers'].append('galahad')
-if 'identity' not in env['drivers']:
-    env['drivers'].append('identity')
-if 'softpipe' not in env['drivers']:
-    env['drivers'].append('softpipe')
-if env['llvm'] and 'llvmpipe' not in env['drivers']:
-    env['drivers'].append('llvmpipe')
-if 'sw' not in env['drivers']:
-    env['drivers'].append('sw')
-
 # Includes
 env.Prepend(CPPPATH = [
        '#/include',
@@ -157,7 +76,7 @@ if env['msvc']:
     env.Append(CPPPATH = ['#include/c99'])
 
 # Embedded
-if platform == 'embedded':
+if env['platform'] == 'embedded':
        env.Append(CPPDEFINES = [
                '_POSIX_SOURCE',
                ('_POSIX_C_SOURCE', '199309L'), 
@@ -174,7 +93,7 @@ if platform == 'embedded':
        ])
 
 # Posix
-if platform in ('posix', 'linux', 'freebsd', 'darwin'):
+if env['platform'] in ('posix', 'linux', 'freebsd', 'darwin'):
        env.Append(CPPDEFINES = [
                '_POSIX_SOURCE',
                ('_POSIX_C_SOURCE', '199309L'), 
@@ -184,9 +103,9 @@ if platform in ('posix', 'linux', 'freebsd', 'darwin'):
                'PTHREADS',
                'HAVE_POSIX_MEMALIGN',
        ])
-       if gcc:
+       if env['gcc']:
                env.Append(CFLAGS = ['-fvisibility=hidden'])
-       if platform == 'darwin':
+       if env['platform'] == 'darwin':
                env.Append(CPPDEFINES = ['_DARWIN_C_SOURCE'])
        env.Append(LIBS = [
                'm',
@@ -212,5 +131,3 @@ SConscript(
        duplicate = 0 # http://www.scons.org/doc/0.97/HTML/scons-user/x2261.html
 )
 
-env.Default('src')
-
index 13e8dc83e978bbcd2df2b3b92d38d977be7ecd51..b7749c925dfc3db0d7734cdd0462edc5016e15bd 100644 (file)
--- a/common.py
+++ b/common.py
@@ -8,6 +8,8 @@ import subprocess
 import sys
 import platform as _platform
 
+import SCons.Script.SConscript
+
 
 #######################################################################
 # Defaults
@@ -20,6 +22,15 @@ _platform_map = {
 default_platform = sys.platform
 default_platform = _platform_map.get(default_platform, default_platform)
 
+# Search sys.argv[] for a "platform=foo" argument since we don't have
+# an 'env' variable at this point.
+if 'platform' in SCons.Script.ARGUMENTS:
+    selected_platform = SCons.Script.ARGUMENTS['platform']
+else:
+    selected_platform = default_platform
+
+cross_compiling = selected_platform != default_platform
+
 _machine_map = {
        'x86': 'x86',
        'i386': 'x86',
@@ -37,38 +48,26 @@ if 'PROCESSOR_ARCHITECTURE' in os.environ:
 else:
        default_machine = _platform.machine()
 default_machine = _machine_map.get(default_machine, 'generic')
+default_toolchain = 'default'
+
+if selected_platform == 'windows' and cross_compiling:
+    default_machine = 'x86'
+    default_toolchain = 'crossmingw'
 
 
 # find default_llvm value
 if 'LLVM' in os.environ:
     default_llvm = 'yes'
 else:
-    # Search sys.argv[] for a "platform=foo" argument since we don't have
-    # an 'env' variable at this point.
-    platform = default_platform
-    pattern = re.compile("(platform=)(.*)")
-    for arg in sys.argv:
-        m = pattern.match(arg)
-        if m:
-            platform = m.group(2)
-
     default_llvm = 'no'
     try:
-        if platform != 'windows' and subprocess.call(['llvm-config', '--version'], stdout=subprocess.PIPE) == 0:
+        if selected_platform != 'windows' and \
+           subprocess.call(['llvm-config', '--version'], stdout=subprocess.PIPE) == 0:
             default_llvm = 'yes'
     except:
         pass
 
 
-# find default_dri value
-if default_platform in ('linux', 'freebsd'):
-       default_dri = 'yes'
-elif default_platform in ('winddk', 'windows', 'wince', 'darwin'):
-       default_dri = 'no'
-else:
-       default_dri = 'no'
-
-
 #######################################################################
 # Common options
 
@@ -88,8 +87,7 @@ def AddOptions(opts):
                                                                                         allowed_values=('generic', 'ppc', 'x86', 'x86_64')))
        opts.Add(EnumOption('platform', 'target platform', default_platform,
                                                                                         allowed_values=('linux', 'cell', 'windows', 'winddk', 'wince', 'darwin', 'embedded', 'cygwin', 'sunos5', 'freebsd8')))
-       opts.Add('toolchain', 'compiler toolchain', 'default')
+       opts.Add('toolchain', 'compiler toolchain', default_toolchain)
        opts.Add(BoolOption('llvm', 'use LLVM', default_llvm))
-       opts.Add(BoolOption('dri', 'build DRI drivers', default_dri))
        opts.Add(BoolOption('debug', 'DEPRECATED: debug build', 'yes'))
        opts.Add(BoolOption('profile', 'DEPRECATED: profile build', 'no'))
index 9bdbefebddd9edffaeb82196a99bb631e5330f08..e2d70c63a12084deafd3843e4caaa643b7eb18a8 100644 (file)
@@ -53,7 +53,7 @@ MKDEP_OPTIONS = @MKDEP_OPTIONS@
 INSTALL = @INSTALL@
 
 # Python and flags (generally only needed by the developers)
-PYTHON2 = python
+PYTHON2 = @PYTHON2@
 PYTHON_FLAGS = -t -O -O
 
 # Library names (base name)
index 364ee0394703c38d5ef951f1915449a250a0340f..77e7603520d3c4de739def1e631bdf4a126c475b 100644 (file)
@@ -30,6 +30,7 @@ AC_PROG_CPP
 AC_PROG_CC
 AC_PROG_CXX
 AC_CHECK_PROGS([MAKE], [gmake make])
+AC_CHECK_PROGS([PYTHON2], [python2 python])
 AC_PATH_PROG([MKDEP], [makedepend])
 AC_PATH_PROG([SED], [sed])
 
@@ -464,6 +465,71 @@ if test "x$enable_selinux" = "xyes"; then
     DEFINES="$DEFINES -DMESA_SELINUX"
 fi
 
+dnl Determine which APIs to support
+AC_ARG_ENABLE([opengl],
+    [AS_HELP_STRING([--disable-opengl],
+        [disable support for standard OpenGL API @<:@default=no@:>@])],
+    [enable_opengl="$enableval"],
+    [enable_opengl=yes])
+AC_ARG_ENABLE([gles1],
+    [AS_HELP_STRING([--enable-gles1],
+        [enable support for OpenGL ES 1.x API @<:@default=no@:>@])],
+    [enable_gles1="$enableval"],
+    [enable_gles1=no])
+AC_ARG_ENABLE([gles2],
+    [AS_HELP_STRING([--enable-gles2],
+        [enable support for OpenGL ES 2.x API @<:@default=no@:>@])],
+    [enable_gles2="$enableval"],
+    [enable_gles2=no])
+AC_ARG_ENABLE([gles-overlay],
+    [AS_HELP_STRING([--enable-gles-overlay],
+        [build separate OpenGL ES only libraries @<:@default=no@:>@])],
+    [enable_gles_overlay="$enableval"],
+    [enable_gles_overlay=no])
+
+AC_ARG_ENABLE([openvg],
+    [AS_HELP_STRING([--enable-openvg],
+        [enable support for OpenVG API @<:@default=no@:>@])],
+    [enable_openvg="$enableval"],
+    [enable_openvg=no])
+
+dnl smooth the transition; should be removed eventually
+if test "x$enable_openvg" = xno; then
+    case "x$with_state_trackers" in
+    x*vega*)
+        AC_MSG_WARN([vega state tracker is enabled without --enable-openvg])
+        enable_openvg=yes
+        ;;
+    esac
+fi
+
+if test "x$enable_opengl" = xno -a \
+        "x$enable_gles1" = xno -a \
+        "x$enable_gles2" = xno -a \
+        "x$enable_gles_overlay" = xno -a \
+        "x$enable_openvg" = xno; then
+    AC_MSG_ERROR([at least one API should be enabled])
+fi
+
+API_DEFINES=""
+GLES_OVERLAY=0
+if test "x$enable_opengl" = xno; then
+    API_DEFINES="$API_DEFINES -DFEATURE_GL=0"
+else
+    API_DEFINES="$API_DEFINES -DFEATURE_GL=1"
+fi
+if test "x$enable_gles1" = xyes; then
+    API_DEFINES="$API_DEFINES -DFEATURE_ES1=1"
+fi
+if test "x$enable_gles2" = xyes; then
+    API_DEFINES="$API_DEFINES -DFEATURE_ES2=1"
+fi
+if test "x$enable_gles_overlay" = xyes; then
+    GLES_OVERLAY=1
+fi
+AC_SUBST([API_DEFINES])
+AC_SUBST([GLES_OVERLAY])
+
 dnl
 dnl Driver configuration. Options are xlib, dri and osmesa right now.
 dnl More later: fbdev, ...
@@ -483,6 +549,10 @@ linux*)
     ;;
 esac
 
+if test "x$enable_opengl" = xno; then
+    default_driver="no"
+fi
+
 AC_ARG_WITH([driver],
     [AS_HELP_STRING([--with-driver=DRIVER],
         [driver for Mesa: xlib,dri,osmesa @<:@default=dri when available, or xlib@:>@])],
@@ -491,6 +561,11 @@ AC_ARG_WITH([driver],
 dnl Check for valid option
 case "x$mesa_driver" in
 xxlib|xdri|xosmesa)
+    if test "x$enable_opengl" = xno; then
+        AC_MSG_ERROR([Driver '$mesa_driver' requires OpenGL enabled])
+    fi
+    ;;
+xno)
     ;;
 *)
     AC_MSG_ERROR([Driver '$mesa_driver' is not a valid option])
@@ -506,7 +581,7 @@ dnl Driver specific build directories
 dnl
 
 dnl this variable will be prepended to SRC_DIRS and is not exported
-CORE_DIRS="mapi/glapi glsl mesa"
+CORE_DIRS=""
 
 SRC_DIRS=""
 GLU_DIRS="sgi"
@@ -516,6 +591,30 @@ GALLIUM_WINSYS_DIRS="sw"
 GALLIUM_DRIVERS_DIRS="softpipe failover galahad trace rbug identity"
 GALLIUM_STATE_TRACKERS_DIRS=""
 
+# build glapi if OpenGL is enabled
+if test "x$enable_opengl" = xyes; then
+    CORE_DIRS="$CORE_DIRS mapi/glapi"
+fi
+
+# build es1api and es2api if OpenGL ES is enabled
+case "x$enable_gles1$enable_gles2$enable_gles_overlay" in
+x*yes*)
+    CORE_DIRS="$CORE_DIRS mapi/es1api mapi/es2api"
+    ;;
+esac
+
+# build vgapi if OpenVG is enabled
+if test "x$enable_openvg" = xyes; then
+    CORE_DIRS="$CORE_DIRS mapi/vgapi"
+fi
+
+# build glsl and mesa if OpenGL or OpenGL ES is enabled
+case "x$enable_opengl$enable_gles1$enable_gles2$enable_gles_overlay" in
+x*yes*)
+    CORE_DIRS="$CORE_DIRS glsl mesa"
+    ;;
+esac
+
 case "$mesa_driver" in
 xlib)
     DRIVER_DIRS="x11"
@@ -530,6 +629,9 @@ dri)
 osmesa)
     DRIVER_DIRS="osmesa"
     ;;
+no)
+    DRIVER_DRIS=""
+    ;;
 esac
 AC_SUBST([SRC_DIRS])
 AC_SUBST([GLU_DIRS])
@@ -622,7 +724,7 @@ xlib)
         GL_LIB_DEPS=""
     fi
     ;;
-dri)
+dri|no) # these checks are still desired when there is no mesa_driver
     # DRI must be shared, I think
     if test "$enable_static" = yes; then
         AC_MSG_ERROR([Can't use static libraries for DRI drivers])
@@ -747,51 +849,6 @@ if test "x$with_dri_drivers" = x; then
     with_dri_drivers=no
 fi
 
-dnl Determine which APIs to support
-AC_ARG_ENABLE([opengl],
-    [AS_HELP_STRING([--disable-opengl],
-        [disable support for standard OpenGL API @<:@default=no@:>@])],
-    [enable_opengl="$enableval"],
-    [enable_opengl=yes])
-AC_ARG_ENABLE([gles1],
-    [AS_HELP_STRING([--enable-gles1],
-        [enable support for OpenGL ES 1.x API @<:@default=no@:>@])],
-    [enable_gles1="$enableval"],
-    [enable_gles1=no])
-AC_ARG_ENABLE([gles2],
-    [AS_HELP_STRING([--enable-gles2],
-        [enable support for OpenGL ES 2.x API @<:@default=no@:>@])],
-    [enable_gles2="$enableval"],
-    [enable_gles2=no])
-AC_ARG_ENABLE([gles-overlay],
-    [AS_HELP_STRING([--enable-gles-overlay],
-        [build separate OpenGL ES only libraries @<:@default=no@:>@])],
-    [enable_gles_overlay="$enableval"],
-    [enable_gles_overlay=no])
-
-API_DEFINES=""
-GLES_OVERLAY=0
-if test "x$enable_opengl" = xno; then
-    API_DEFINES="$API_DEFINES -DFEATURE_GL=0"
-else
-    API_DEFINES="$API_DEFINES -DFEATURE_GL=1"
-fi
-if test "x$enable_gles1" = xyes; then
-    API_DEFINES="$API_DEFINES -DFEATURE_ES1=1"
-fi
-if test "x$enable_gles2" = xyes; then
-    API_DEFINES="$API_DEFINES -DFEATURE_ES2=1"
-fi
-if test "x$enable_gles_overlay" = xyes -o \
-    "x$enable_gles1" = xyes -o "x$enable_gles2" = xyes; then
-    CORE_DIRS="mapi/es1api mapi/es2api $CORE_DIRS"
-    if test "x$enable_gles_overlay" = xyes; then
-        GLES_OVERLAY=1
-    fi
-fi
-AC_SUBST([API_DEFINES])
-AC_SUBST([GLES_OVERLAY])
-
 dnl If $with_dri_drivers is yes, directories will be added through
 dnl platform checks
 DRI_DIRS=""
@@ -812,7 +869,7 @@ yes)
 esac
 
 dnl Set DRI_DIRS, DEFINES and LIB_DEPS
-if test "$mesa_driver" = dri; then
+if test "$mesa_driver" = dri -o "$mesa_driver" = no; then
     # Use TLS in GLX?
     if test "x$GLX_USE_TLS" = xyes; then
         DEFINES="$DEFINES -DGLX_USE_TLS -DPTHREADS"
@@ -890,19 +947,21 @@ if test "$mesa_driver" = dri; then
     DRI_DIRS=`echo "$DRI_DIRS" | $SED 's/  */ /g'`
 
     # Check for expat
-    EXPAT_INCLUDES=""
-    EXPAT_LIB=-lexpat
-    AC_ARG_WITH([expat],
-        [AS_HELP_STRING([--with-expat=DIR],
-            [expat install directory])],[
-        EXPAT_INCLUDES="-I$withval/include"
-        CPPFLAGS="$CPPFLAGS $EXPAT_INCLUDES"
-        LDFLAGS="$LDFLAGS -L$withval/$LIB_DIR"
-        EXPAT_LIB="-L$withval/$LIB_DIR -lexpat"
-        ])
-    AC_CHECK_HEADER([expat.h],[],[AC_MSG_ERROR([Expat required for DRI.])])
-    AC_CHECK_LIB([expat],[XML_ParserCreate],[],
-        [AC_MSG_ERROR([Expat required for DRI.])])
+    if test "$mesa_driver" = dri; then
+        EXPAT_INCLUDES=""
+        EXPAT_LIB=-lexpat
+        AC_ARG_WITH([expat],
+            [AS_HELP_STRING([--with-expat=DIR],
+                [expat install directory])],[
+            EXPAT_INCLUDES="-I$withval/include"
+            CPPFLAGS="$CPPFLAGS $EXPAT_INCLUDES"
+            LDFLAGS="$LDFLAGS -L$withval/$LIB_DIR"
+            EXPAT_LIB="-L$withval/$LIB_DIR -lexpat"
+            ])
+        AC_CHECK_HEADER([expat.h],[],[AC_MSG_ERROR([Expat required for DRI.])])
+        AC_CHECK_LIB([expat],[XML_ParserCreate],[],
+            [AC_MSG_ERROR([Expat required for DRI.])])
+    fi
 
     # put all the necessary libs together
     DRI_LIB_DEPS="$SELINUX_LIBS $LIBDRM_LIBS $EXPAT_LIB -lm -lpthread $DLOPEN_LIBS $TALLOC_LIBS"
@@ -943,6 +1002,9 @@ AC_ARG_ENABLE([gl-osmesa],
     [gl_osmesa="$enableval"],
     [gl_osmesa="$default_gl_osmesa"])
 if test "x$gl_osmesa" = xyes; then
+    if test "x$enable_opengl" = xno; then
+        AC_MSG_ERROR([OpenGL is not available for OSMesa driver])
+    fi
     if test "$mesa_driver" = osmesa; then
         AC_MSG_ERROR([libGL is not available for OSMesa driver])
     else
@@ -999,13 +1061,21 @@ AC_ARG_ENABLE([egl],
         [disable EGL library @<:@default=enabled@:>@])],
     [enable_egl="$enableval"],
     [enable_egl=yes])
+if test "x$enable_egl" = xno; then
+    if test "x$mesa_driver" = xno; then
+        AC_MSG_ERROR([cannot disable EGL when there is no mesa driver])
+    fi
+    if test "x$enable_openvg" = xyes; then
+        AC_MSG_ERROR([cannot enable OpenVG without EGL])
+    fi
+fi
 if test "x$enable_egl" = xyes; then
     SRC_DIRS="$SRC_DIRS egl"
     EGL_LIB_DEPS="$DLOPEN_LIBS -lpthread"
     EGL_DRIVERS_DIRS=""
     if test "$enable_static" != yes; then
         # build egl_glx when libGL is built
-        if test "$mesa_driver" != osmesa; then
+        if test "$mesa_driver" = xlib -o "$mesa_driver" = dri; then
             EGL_DRIVERS_DIRS="glx"
         fi
 
@@ -1039,6 +1109,12 @@ AC_ARG_ENABLE([glu],
         [enable OpenGL Utility library @<:@default=enabled@:>@])],
     [enable_glu="$enableval"],
     [enable_glu=yes])
+
+if test "x$enable_glu" = xyes -a "x$mesa_driver" = xno; then
+    AC_MSG_NOTICE([Disabling GLU since there is no OpenGL driver])
+    enable_glu=no
+fi
+
 if test "x$enable_glu" = xyes; then
     SRC_DIRS="$SRC_DIRS glu"
 
@@ -1088,9 +1164,13 @@ AC_ARG_ENABLE([glw],
     [enable_glw="$enableval"],
     [enable_glw=yes])
 dnl Don't build GLw on osmesa
-if test "x$enable_glw" = xyes && test "$mesa_driver" = osmesa; then
-    AC_MSG_WARN([Disabling GLw since the driver is OSMesa])
-    enable_glw=no
+if test "x$enable_glw" = xyes; then
+    case "$mesa_driver" in
+    osmesa|no)
+        AC_MSG_NOTICE([Disabling GLw since there is no OpenGL driver])
+        enable_glw=no
+        ;;
+    esac
 fi
 AC_ARG_ENABLE([motif],
     [AS_HELP_STRING([--enable-motif],
@@ -1164,16 +1244,20 @@ AC_ARG_ENABLE([glut],
     [enable_glut="$enableval"],
     [enable_glut="$default_glut"])
 
+dnl Don't build glut on osmesa
+if test "x$enable_glut" = xyes; then
+    case "$mesa_driver" in
+    osmesa|no)
+        AC_MSG_NOTICE([Disabling glut since there is no OpenGL driver])
+        enable_glut=no
+        ;;
+    esac
+fi
 dnl Can't build glut if GLU not available
 if test "x$enable_glu$enable_glut" = xnoyes; then
     AC_MSG_WARN([Disabling glut since GLU is disabled])
     enable_glut=no
 fi
-dnl Don't build glut on osmesa
-if test "x$enable_glut" = xyes && test "$mesa_driver" = osmesa; then
-    AC_MSG_WARN([Disabling glut since the driver is OSMesa])
-    enable_glut=no
-fi
 
 if test "x$enable_glut" = xyes; then
     SRC_DIRS="$SRC_DIRS glut/glx"
@@ -1238,6 +1322,9 @@ AC_ARG_ENABLE([gallium],
         [build gallium @<:@default=enabled@:>@])],
     [enable_gallium="$enableval"],
     [enable_gallium=yes])
+if test "x$enable_gallium" = xno -a "x$enable_openvg" = xyes; then
+    AC_MSG_ERROR([cannot enable OpenVG without Gallium])
+fi
 if test "x$enable_gallium" = xyes; then
     SRC_DIRS="$SRC_DIRS gallium gallium/winsys gallium/targets"
     AC_CHECK_HEADER([udis86.h], [HAS_UDIS86="yes"],
@@ -1250,15 +1337,30 @@ AC_SUBST([LLVM_LIBS])
 AC_SUBST([LLVM_LDFLAGS])
 AC_SUBST([LLVM_VERSION])
 
-VG_LIB_DEPS=""
-EGL_CLIENT_APIS='$(GL_LIB)'
-if test "x$enable_gles_overlay" = xyes; then
-    EGL_CLIENT_APIS="$EGL_CLIENT_APIS "'$(GLESv1_CM_LIB) $(GLESv2_LIB)'
-fi
-
 dnl
 dnl Gallium state trackers configuration
 dnl
+
+AC_ARG_ENABLE([gallium-egl],
+    [AS_HELP_STRING([--enable-gallium-egl],
+        [enable gallium EGL state tracker @<:@default=auto@:>@])],
+    [enable_gallium_egl="$enableval"],
+    [enable_gallium_egl=auto])
+if test "x$enable_gallium_egl" = xauto; then
+    case "$mesa_driver" in
+    dri|no)
+        enable_gallium_egl=$enable_egl
+        ;;
+    *)
+        enable_gallium_egl=no
+        ;;
+    esac
+fi
+case "x$enable_egl$enable_gallium_egl" in
+xnoyes)
+    AC_MSG_ERROR([cannot build Gallium EGL state tracker without EGL])
+esac
+
 AC_ARG_WITH([state-trackers],
     [AS_HELP_STRING([--with-state-trackers@<:@=DIRS...@:>@],
         [comma delimited state_trackers list, e.g.
@@ -1279,16 +1381,24 @@ yes)
     dri)
         GALLIUM_STATE_TRACKERS_DIRS="dri"
         HAVE_ST_DRI="yes"
-        if test "x$enable_egl" = xyes; then
-            GALLIUM_STATE_TRACKERS_DIRS="$GALLIUM_STATE_TRACKERS_DIRS egl"
-            HAVE_ST_EGL="yes"
-        fi
         # Have only tested st/xorg on 1.6.0 servers
         PKG_CHECK_MODULES(XORG, [xorg-server >= 1.6.0 libdrm >= $LIBDRM_XORG_REQUIRED libkms >= $LIBKMS_XORG_REQUIRED],
             HAVE_ST_XORG="yes"; GALLIUM_STATE_TRACKERS_DIRS="$GALLIUM_STATE_TRACKERS_DIRS xorg",
             HAVE_ST_XORG="no")
         ;;
     esac
+
+    if test "x$enable_egl" = xyes; then
+        if test "$enable_openvg" = yes; then
+            GALLIUM_STATE_TRACKERS_DIRS="$GALLIUM_STATE_TRACKERS_DIRS vega"
+            st_egl="yes"
+        fi
+
+        if test "$enable_gallium_egl" = yes; then
+            GALLIUM_STATE_TRACKERS_DIRS="$GALLIUM_STATE_TRACKERS_DIRS egl"
+            HAVE_ST_EGL="yes"
+        fi
+    fi
     ;;
 *)
     # verify the requested state tracker exist
@@ -1314,22 +1424,10 @@ yes)
             PKG_CHECK_MODULES([LIBKMS_XORG], [libkms >= $LIBKMS_XORG_REQUIRED])
             HAVE_ST_XORG="yes"
             ;;
-        es)
-            AC_MSG_WARN([state tracker 'es' has been replaced by --enable-gles-overlay])
-
-            if test "x$enable_gles_overlay" != xyes; then
-                if test "x$enable_gles1" != xyes -a "x$enable_gles2" != xyes; then
-                    CORE_DIRS="mapi/es1api mapi/es2api $CORE_DIRS"
-                fi
-                GLES_OVERLAY=1
-                EGL_CLIENT_APIS="$EGL_CLIENT_APIS "'$(GLESv1_CM_LIB) $(GLESv2_LIB)'
-            fi
-           tracker=""
-            ;;
         vega)
-            CORE_DIRS="$CORE_DIRS mapi/vgapi"
-            VG_LIB_DEPS="$VG_LIB_DEPS -lpthread"
-            EGL_CLIENT_APIS="$EGL_CLIENT_APIS "'$(VG_LIB)'
+            if test "x$enable_openvg" != xyes; then
+                AC_MSG_ERROR([cannot build vega state tracker without --enable-openvg])
+            fi
             ;;
         esac
 
@@ -1347,6 +1445,23 @@ yes)
     ;;
 esac
 
+
+EGL_CLIENT_APIS=""
+VG_LIB_DEPS=""
+
+case "x$enable_opengl$enable_gles1$enable_gles2" in
+x*yes*)
+    EGL_CLIENT_APIS="$EGL_CLIENT_APIS "'$(GL_LIB)'
+    ;;
+esac
+if test "x$enable_gles_overlay" = xyes; then
+    EGL_CLIENT_APIS="$EGL_CLIENT_APIS "'$(GLESv1_CM_LIB) $(GLESv2_LIB)'
+fi
+if test "x$enable_openvg" = xyes; then
+    EGL_CLIENT_APIS="$EGL_CLIENT_APIS "'$(VG_LIB)'
+    VG_LIB_DEPS="$VG_LIB_DEPS -lpthread"
+fi
+
 AC_SUBST([VG_LIB_DEPS])
 AC_SUBST([EGL_CLIENT_APIS])
 
@@ -1593,6 +1708,19 @@ if test "x$enable_gallium_swrast" = xyes || test "x$enable_gallium_swrast" = xau
     fi
 fi
 
+dnl
+dnl Gallium noop configuration
+dnl
+AC_ARG_ENABLE([gallium-noop],
+    [AS_HELP_STRING([--enable-gallium-noop],
+        [build gallium radeon @<:@default=disabled@:>@])],
+    [enable_gallium_noop="$enableval"],
+    [enable_gallium_noop=auto])
+if test "x$enable_gallium_noop" = xyes; then
+    GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS noop"
+    GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS dri-noop"
+fi
+
 dnl prepend CORE_DIRS to SRC_DIRS
 SRC_DIRS="$CORE_DIRS $SRC_DIRS"
 
@@ -1622,25 +1750,56 @@ echo "        exec_prefix:     $exec_prefix"
 echo "        libdir:          $libdir"
 echo "        includedir:      $includedir"
 
+dnl API info
+echo ""
+echo "        OpenGL:          $enable_opengl (ES1: $enable_gles1 ES2: $enable_gles2)"
+echo "        GLES overlay:    $enable_gles_overlay"
+echo "        OpenVG:          $enable_openvg"
+
 dnl Driver info
 echo ""
 echo "        Driver:          $mesa_driver"
-if echo "$DRIVER_DIRS" | grep 'osmesa' >/dev/null 2>&1; then
-    echo "        OSMesa:          lib$OSMESA_LIB"
-else
-    echo "        OSMesa:          no"
-fi
-if test "$mesa_driver" = dri; then
-    # cleanup the drivers var
-    dri_dirs=`echo $DRI_DIRS | $SED 's/^ *//;s/  */ /;s/ *$//'`
-if test "x$DRI_DIRS" = x; then
-    echo "        DRI drivers:     no"
-else
-    echo "        DRI drivers:     $dri_dirs"
+if test "$mesa_driver" != no; then
+    if echo "$DRIVER_DIRS" | grep 'osmesa' >/dev/null 2>&1; then
+        echo "        OSMesa:          lib$OSMESA_LIB"
+    else
+        echo "        OSMesa:          no"
+    fi
+    if test "$mesa_driver" = dri; then
+        # cleanup the drivers var
+        dri_dirs=`echo $DRI_DIRS | $SED 's/^ *//;s/  */ /;s/ *$//'`
+        if test "x$DRI_DIRS" = x; then
+            echo "        DRI drivers:     no"
+        else
+            echo "        DRI drivers:     $dri_dirs"
+        fi
+        echo "        DRI driver dir:  $DRI_DRIVER_INSTALL_DIR"
+        echo "        Use XCB:         $enable_xcb"
+    fi
 fi
-    echo "        DRI driver dir:  $DRI_DRIVER_INSTALL_DIR"
+echo ""
+echo "        GLU:             $enable_glu"
+echo "        GLw:             $enable_glw (Motif: $enable_motif)"
+echo "        glut:            $enable_glut"
+
+dnl EGL
+echo ""
+echo "        EGL:             $enable_egl"
+if test "$enable_egl" = yes; then
+    echo "        EGL platforms:   $EGL_PLATFORMS"
+
+    egl_drivers=""
+    for d in $EGL_DRIVERS_DIRS; do
+        egl_drivers="$egl_drivers egl_$d"
+    done
+
+    if test "$enable_gallium" = yes -a "$HAVE_ST_EGL" = yes; then
+        echo "        EGL drivers:    ${egl_drivers} egl_gallium"
+        echo "        EGL Gallium STs:$EGL_CLIENT_APIS"
+    else
+        echo "        EGL drivers:    $egl_drivers"
+    fi
 fi
-echo "        Use XCB:         $enable_xcb"
 
 echo ""
 if test "x$MESA_LLVM" = x1; then
@@ -1659,9 +1818,6 @@ if echo "$SRC_DIRS" | grep 'gallium' >/dev/null 2>&1; then
     echo "        Winsys dirs:     $GALLIUM_WINSYS_DIRS"
     echo "        Driver dirs:     $GALLIUM_DRIVERS_DIRS"
     echo "        Trackers dirs:   $GALLIUM_STATE_TRACKERS_DIRS"
-    if test "x$HAVE_ST_EGL" = xyes; then
-        echo "        EGL client APIs: $EGL_CLIENT_APIS"
-    fi
 else
     echo "        Gallium:         no"
 fi
@@ -1670,15 +1826,6 @@ dnl Libraries
 echo ""
 echo "        Shared libs:     $enable_shared"
 echo "        Static libs:     $enable_static"
-if test "$enable_egl" = yes; then
-    echo "        EGL:             $EGL_DRIVERS_DIRS"
-    echo "        EGL platforms:   $EGL_PLATFORMS"
-else
-    echo "        EGL:             no"
-fi
-echo "        GLU:             $enable_glu"
-echo "        GLw:             $enable_glw (Motif: $enable_motif)"
-echo "        glut:            $enable_glut"
 
 dnl Compiler options
 # cleanup the CFLAGS/CXXFLAGS/DEFINES vars
@@ -1691,6 +1838,8 @@ echo ""
 echo "        CFLAGS:          $cflags"
 echo "        CXXFLAGS:        $cxxflags"
 echo "        Macros:          $defines"
+echo ""
+echo "        PYTHON2:         $PYTHON2"
 
 echo ""
 echo "        Run '${MAKE-make}' to build Mesa"
index 461c9abe360fa85e464282b6fbeab0dcc6dc99a0..fb22739b6c7c779fe18bc8d4fa2a29b776063a51 100644 (file)
@@ -20,7 +20,7 @@ Float textures, renderbuffers                         some infrastructure done
 Framebuffer objects (GL_EXT_framebuffer_object)       DONE
 Half-float                                            some infrastructure done
 Multisample blit                                      DONE
-Non-normalized Integer texture/framebuffer formats    not started
+Non-normalized Integer texture/framebuffer formats    ~50% done
 1D/2D Texture arrays                                  core Mesa, swrast done
 Packed depth/stencil formats                          DONE
 Per-buffer blend and masks (GL_EXT_draw_buffers2)     DONE
@@ -31,10 +31,11 @@ Transform feedback (GL_EXT_transform_feedback)        ~50% done
    glBindBufferRange, glBindBufferBase commands
 Vertex array objects (GL_APPLE_vertex_array_object)   DONE
 sRGB framebuffer format (GL_EXT_framebuffer_sRGB)     not started
-glClearBuffer commands                                DONE, except for dispatch
-glGetStringi command                                  DONE, except for dispatch
-glTexParameterI, glGetTexParameterI commands          DONE, except for dispatch
-glVertexAttribI commands                              not started
+glClearBuffer commands                                DONE
+glGetStringi command                                  DONE
+glTexParameterI, glGetTexParameterI commands          DONE
+glVertexAttribI commands                              DONE (but converts int
+                                                            values to floats)
 
 
 GL 3.1:
@@ -42,7 +43,7 @@ GL 3.1:
 GLSL 1.30 and 1.40                                    not started
 Instanced drawing (GL_ARB_draw_instanced)             ~50% done
 Buffer copying (GL_ARB_copy_buffer)                   DONE
-Primitive restart (GL_NV_primitive_restart)           not started
+Primitive restart (GL_NV_primitive_restart)           DONE (gallium)
 16 vertex texture image units                         not started
 Texture buffer objs (GL_ARB_texture_buffer_object)    not started
 Rectangular textures (GL_ARB_texture_rectangle)       DONE
@@ -93,6 +94,18 @@ GL_ARB_texture_buffer_object_rgb32                   not started
 GL_ARB_texture_cube_map_array                        not started
 GL_ARB_texture_gather                                not started
 GL_ARB_transform_feedback2                           not started
+GL_ARB_transform_feedback3                           not started
+
+
+GL 4.1:
+
+GLSL 4.1                                             not started
+GL_ARB_ES2_compatibility                             not started
+GL_ARB_get_program_binary                            not started
+GL_ARB_separate_shader_objects                       some infrastructure done
+GL_ARB_shader_precision                              not started
+GL_ARB_vertex_attrib_64bit                           not started
+GL_ARB_viewport_array                                not started
 
 
 
index d38f2dd7b7d018dc13ef757fef7ae272be916e3c..ee9bf355d7c5f50e229b63425e4942d8a23366bc 100644 (file)
@@ -28,18 +28,17 @@ cards.</p>
 
 <ol>
 <li>
-<p>Run <code>configure</code> with the desired state trackers and enable
-the Gallium driver for your hardware.  For example</p>
+<p>Run <code>configure</code> with the desired client APIs and enable
+the driver for your hardware.  For example</p>
 
 <pre>
-  $ ./configure --enable-gles-overlay --with-state-trackers=egl,vega --enable-gallium-intel
+  $ ./configure --enable-gles2 --enable-openvg --enable-gallium-nouveau
 </pre>
 
-<p>The main library and OpenGL is enabled by default.  The first option enables
-<a href="opengles.html">OpenGL ES 1.x and 2.x</a>.  The <code>egl</code> state
-tracker is needed by a number of EGL drivers.  EGL drivers will be covered
-later.  The <a href="openvg.html">vega state tracker</a> provides OpenVG
-1.x.</p>
+<p>The main library and OpenGL is enabled by default.  The first option above
+enables <a href="opengles.html">OpenGL ES 2.x</a>.  The second option enables
+<a href="openvg.html">OpenVG</a>.</p>
+
 </li>
 
 <li>Build and install Mesa as usual.</li>
@@ -80,31 +79,35 @@ types such as <code>EGLNativeDisplayType</code> or
 
 <p>The available platforms are <code>x11</code>, <code>drm</code>,
 <code>fbdev</code>, and <code>gdi</code>.  The <code>gdi</code> platform can
-only be built with SCons.</p>
+only be built with SCons.  Unless for special needs, the build system should
+select the right platforms automatically.</p>
 
 </li>
 
-<li><code>--with-state-trackers</code>
+<li><code>--enable-gles1</code> and <code>--enable-gles2</code>
 
-<p>The argument is a comma separated string.  It is usually used to specify the
-rendering APIs, such as OpenVG, to build.  But it is also used to specify
-<code>egl</code> state tracker that <code>egl_gallium</code> depends on.</p>
+<p>These options enable OpenGL ES support in OpenGL.  The result is
+one big library that supports multiple APIs.</p>
 
 </li>
 
 <li><code>--enable-gles-overlay</code>
 
-<p>OpenGL and OpenGL ES are not controlled by
-<code>--with-state-trackers</code>.  OpenGL is always built.  To build OpenGL
-ES, this option must be explicitly given.</p>
+<p>This option enables OpenGL ES as separate libraries.  This is an alternative
+approach to enable OpenGL ES.  It is only supported by
+<code>egl_gallium</code>.</p>
 
 </li>
 
-<li><code>--enable-gles1</code> and <code>--enable-gles2</code>
+<li><code>--enable-openvg</code>
 
-<p>Unlike <code>--enable-gles-overlay</code>, which builds one library for each
-rendering API, these options enable OpenGL ES support in OpenGL.  The result is
-one big library that supports multiple APIs.</p>
+<p>OpenVG must be explicitly enabled by this option.</p>
+
+</li>
+
+<li><code>--enable-gallium-egl</code>
+
+<p>Explicitly enable or disable <code>egl_gallium</code>.</p>
 
 </li>
 
@@ -139,10 +142,6 @@ binaries.</p>
 specified EGL driver to be loaded.  It comes in handy when one wants to test a
 specific driver.  This variable is ignored for setuid/setgid binaries.</p>
 
-<p><code>egl_gallium</code> dynamically loads hardware drivers and client API
-modules found in <code>EGL_DRIVERS_PATH</code>.  Thus, specifying this variable
-alone is not sufficient for <code>egl_gallium</code> for uninstalled build.</p>
-
 </li>
 
 <li><code>EGL_PLATFORM</code>
@@ -150,7 +149,12 @@ alone is not sufficient for <code>egl_gallium</code> for uninstalled build.</p>
 <p>This variable specifies the native platform.  The valid values are the same
 as those for <code>--with-egl-platforms</code>.  When the variable is not set,
 the main library uses the first platform listed in
-<code>--with-egl-platforms</code> as the native platform</p>
+<code>--with-egl-platforms</code> as the native platform.</p>
+
+<p>Extensions like <code>EGL_MESA_drm_display</code> define new functions to
+create displays for non-native platforms.  These extensions are usually used by
+applications that support non-native platforms.  Setting this variable is
+probably required only for some of the demos found in mesa/demo repository.</p>
 
 </li>
 
@@ -173,11 +177,19 @@ variable to true forces the use of software rendering.</p>
 <h2>EGL Drivers</h2>
 
 <ul>
+<li><code>egl_dri2</code>
+
+<p>This driver supports both <code>x11</code> and <code>drm</code> platforms.
+It functions as a DRI2 driver loader.  For <code>x11</code> support, it talks
+to the X server directly using (XCB-)DRI2 protocol.</p>
+
+</li>
+
 <li><code>egl_gallium</code>
 
 <p>This driver is based on Gallium3D.  It supports all rendering APIs and
 hardwares supported by Gallium3D.  It is the only driver that supports OpenVG.
-The supported platforms are X11, KMS, FBDEV, and GDI.</p>
+The supported platforms are X11, DRM, FBDEV, and GDI.</p>
 
 </li>
 
@@ -187,23 +199,6 @@ The supported platforms are X11, KMS, FBDEV, and GDI.</p>
 the EGL API.  It supports both direct and indirect rendering when the GLX does.
 It is accelerated when the GLX is.  As such, it cannot provide functions that
 is not available in GLX or GLX extensions.</p>
-</li>
-
-<li><code>egl_dri2</code>
-
-<p>This driver supports the X Window System as its window system.  It functions
-as a DRI2 driver loader.  Unlike <code>egl_glx</code>, it has no dependency on
-<code>libGL</code>.  It talks to the X server directly using DRI2 protocol.</p>
-
-</li>
-<li><code>egl_dri</code>
-
-<p>This driver lacks maintenance and does <em>not</em> build.  It is similiar
-to <code>egl_dri2</code> in that it functions as a DRI(1) driver loader.  But
-unlike <code>egl_dri2</code>, it supports Linux framebuffer devices as its
-window system and supports EGL_MESA_screen_surface extension.  As DRI1 drivers
-are phasing out, it might eventually be replaced by <code>egl_dri2</code>.</p>
-
 </li>
 </ul>
 
@@ -295,7 +290,6 @@ should as well lock the display before using it.
 
 <ul>
 <li>Pass the conformance tests</li>
-<li>Reference counting in main library?</li>
 <li>Mixed use of OpenGL, OpenGL ES 1.1, and OpenGL ES 2.0 is supported.  But
 which one of <code>libGL.so</code>, <code>libGLESv1_CM.so</code>, and
 <code>libGLESv2.so</code> should an application link to?  Bad things may happen
index cdf6b57e0f432b22136e2f00b5c0d31f13d1e678..eff8c5828e2307ba3735a9f457925dfbda9d5117 100644 (file)
@@ -26,36 +26,27 @@ Please refer to <a href="egl.html">Mesa EGL</a> for more information about EGL.
 
 <h2>Building the library</h2>
 <ol>
-<li>Build Mesa3D with Gallium3D. Any build that builds Gallium3D libraries, EGL, and Gallium EGL drivers will suffice</li>
-<li>cd src/gallium/state_trackers/vega; make</li>
-<li>The last step will build libOpenVG library. You can add the libdir to LD_LIBRARY_PATH or install libOpenVG</li>
+<li>Run <code>configure</code> with <code>--enable-openvg</code>.  If you do
+not need OpenGL, you can add <code>--disable-opengl</code> to save the
+compilation time.</li>
+
+<li>Build and install Mesa as usual.</li>
 </ol>
 
 <h3>Sample build</h3>
 A sample build looks as follows:
 <pre>
-  $ ./configure --with-state-trackers=egl,vega --enable-gallium-intel
+  $ ./configure --disable-opengl --enable-openvg
   $ make
   $ make install
 </pre>
 
-<h2>OpenVG Demos</h2>
+<p>It will install <code>libOpenVG.so</code>, <code>libEGL.so</code>, and one
+or more EGL drivers.</p>
 
-<p>
-To build the OpenVG demos:
-</p>
-<pre>
-  cd progs/openvg
-  make
-</pre>
-<p>
-To run a demo:
-</p>
-<pre>
-  cd openvg/demos
-  ./lion
-</pre>
+<h2>OpenVG Demos</h2>
 
+<p>OpenVG demos can be found in mesa/demos repository.</p>
 
 </body>
 </html>
index 2d0adcc8cd6bd67eaa3e2031bb928d76759e288d..1f5570d71d3ecf4a397efa5b6c90ee9cd279c24c 100644 (file)
@@ -36,6 +36,7 @@ tbd
 <ul>
 <li>GL_ARB_explicit_attrib_location extension (Intel and software drivers).
 <li>GL_ARB_texture_rg (Intel, software drivers, gallium drivers).
+<li>GL_EXT_separate_shader_objects extension (Intel and software drivers).
 <li>GL_NV_primitive_restart extension (Gallium softpipe, llvmpipe).
 </ul>
 
@@ -48,7 +49,7 @@ tbd
 
 <h2>Changes</h2>
 <ul>
-<li>tbd</li>
+<li>Upgraded glext.h to version 66</li>
 </ul>
 
 </body>
index 22348a1295f9b45a9b3ba1b49e313588126963f2..9818cbc99c972624e682d2da10e9cb72237270f2 100644 (file)
@@ -29,9 +29,9 @@ extern "C" {
 */
 
 /* Header file version number, required by OpenGL ABI for Linux */
-/* glext.h last updated $Date: 2010-08-03 01:30:25 -0700 (Tue, 03 Aug 2010) $ */
+/* glext.h last updated $Date: 2010-11-03 18:59:30 -0700 (Wed, 03 Nov 2010) $ */
 /* Current version at http://www.opengl.org/registry/ */
-#define GL_GLEXT_VERSION 64
+#define GL_GLEXT_VERSION 66
 /* Function declaration macros - to move into glplatform.h */
 
 #if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
@@ -4840,7 +4840,7 @@ extern "C" {
 #endif
 
 #ifndef GL_AMD_seamless_cubemap_per_texture
-/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS_ARB */
+/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS */
 #endif
 
 #ifndef GL_AMD_conservative_depth
@@ -4925,6 +4925,8 @@ extern "C" {
 #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B
 #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C
 #define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F
 #define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44
 #define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV  0x8F45
 #endif
@@ -5019,6 +5021,11 @@ extern "C" {
 #ifndef GL_AMD_transform_feedback3_lines_triangles
 #endif
 
+#ifndef GL_AMD_depth_clamp_separate
+#define GL_DEPTH_CLAMP_NEAR_AMD           0x901E
+#define GL_DEPTH_CLAMP_FAR_AMD            0x901F
+#endif
+
 
 /*************************************************************/
 
@@ -8765,8 +8772,8 @@ GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdoubl
 GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v);
 GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
 GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v);
-GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLuint count, const GLdouble *v);
-GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLuint count, const GLfloat *v);
+GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLsizei count, const GLdouble *v);
+GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLsizei count, const GLfloat *v);
 GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs);
 GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform);
 GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer);
@@ -8830,8 +8837,8 @@ typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint in
 typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v);
 typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
 typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v);
-typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v);
-typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v);
+typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLdouble *v);
+typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *v);
 typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs);
 typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform);
 typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer);
@@ -11020,6 +11027,10 @@ typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, cons
 #define GL_AMD_transform_feedback3_lines_triangles 1
 #endif
 
+#ifndef GL_AMD_depth_clamp_separate
+#define GL_AMD_depth_clamp_separate 1
+#endif
+
 
 #ifdef __cplusplus
 }
index b065b7bc49fca8b8600bd04a6e482fec0c10d238..75e9b9e7fc302fcbe9a1dc8635381fb9c9d8444a 100644 (file)
@@ -50,29 +50,34 @@ def symlink(target, source, env):
 
 def install(env, source, subdir):
     target_dir = os.path.join(env.Dir('#.').srcnode().abspath, env['build_dir'], subdir)
-    env.Install(target_dir, source)
+    return env.Install(target_dir, source)
 
 def install_program(env, source):
-    install(env, source, 'bin')
+    return install(env, source, 'bin')
 
 def install_shared_library(env, sources, version = ()):
+    targets = []
     install_dir = os.path.join(env.Dir('#.').srcnode().abspath, env['build_dir'])
     version = tuple(map(str, version))
     if env['SHLIBSUFFIX'] == '.dll':
         dlls = env.FindIxes(sources, 'SHLIBPREFIX', 'SHLIBSUFFIX')
-        install(env, dlls, 'bin')
+        targets += install(env, dlls, 'bin')
         libs = env.FindIxes(sources, 'LIBPREFIX', 'LIBSUFFIX')
-        install(env, libs, 'lib')
+        targets += install(env, libs, 'lib')
     else:
         for source in sources:
             target_dir =  os.path.join(install_dir, 'lib')
             target_name = '.'.join((str(source),) + version)
             last = env.InstallAs(os.path.join(target_dir, target_name), source)
+            targets += last
             while len(version):
                 version = version[:-1]
                 target_name = '.'.join((str(source),) + version)
                 action = SCons.Action.Action(symlink, "$TARGET -> $SOURCE")
                 last = env.Command(os.path.join(target_dir, target_name), last, action) 
+                targets += last
+    return targets
+
 
 def createInstallMethods(env):
     env.AddMethod(install_program, 'InstallProgram')
@@ -98,6 +103,41 @@ def num_jobs():
     return 1
 
 
+def pkg_config_modules(env, name, modules):
+    '''Simple wrapper for pkg-config.'''
+
+    env[name] = False
+
+    if env['platform'] == 'windows':
+        return
+
+    if not env.Detect('pkg-config'):
+        return
+
+    if subprocess.call(["pkg-config", "--exists", ' '.join(modules)]) != 0:
+        return
+
+    # Put -I and -L flags directly into the environment, as these don't affect
+    # the compilation of targets that do not use them
+    try:
+        env.ParseConfig('pkg-config --cflags-only-I --libs-only-L ' + ' '.join(modules))
+    except OSError:
+        return
+
+    # Other flags may affect the compilation of unrelated targets, so store
+    # them with a prefix, (e.g., XXX_CFLAGS, XXX_LIBS, etc)
+    try:
+        flags = env.ParseFlags('!pkg-config --cflags-only-other --libs-only-l --libs-only-other ' + ' '.join(modules))
+    except OSError:
+        return
+    prefix = name.upper() + '_'
+    for flag_name, flag_value in flags.iteritems():
+        env[prefix + flag_name] = flag_value
+
+    env[name] = True
+
+
+
 def generate(env):
     """Common environment generation code"""
 
@@ -110,21 +150,27 @@ def generate(env):
             env['toolchain'] = 'wcesdk'
     env.Tool(env['toolchain'])
 
-    if env['platform'] == 'embedded':
-        # Allow overriding compiler from environment
-        if os.environ.has_key('CC'):
-            env['CC'] = os.environ['CC']
-            # Update CCVERSION to match
-            pipe = SCons.Action._subproc(env, [env['CC'], '--version'],
-                                         stdin = 'devnull',
-                                         stderr = 'devnull',
-                                         stdout = subprocess.PIPE)
-            if pipe.wait() == 0:
-                line = pipe.stdout.readline()
-                match = re.search(r'[0-9]+(\.[0-9]+)+', line)
-                if match:
-                    env['CCVERSION'] = match.group(0)
-            
+    # Allow override compiler and specify additional flags from environment
+    if os.environ.has_key('CC'):
+        env['CC'] = os.environ['CC']
+        # Update CCVERSION to match
+        pipe = SCons.Action._subproc(env, [env['CC'], '--version'],
+                                     stdin = 'devnull',
+                                     stderr = 'devnull',
+                                     stdout = subprocess.PIPE)
+        if pipe.wait() == 0:
+            line = pipe.stdout.readline()
+            match = re.search(r'[0-9]+(\.[0-9]+)+', line)
+            if match:
+                env['CCVERSION'] = match.group(0)
+    if os.environ.has_key('CFLAGS'):
+        env['CCFLAGS'] += SCons.Util.CLVar(os.environ['CFLAGS'])
+    if os.environ.has_key('CXX'):
+        env['CXX'] = os.environ['CXX']
+    if os.environ.has_key('CXXFLAGS'):
+        env['CXXFLAGS'] += SCons.Util.CLVar(os.environ['CXXFLAGS'])
+    if os.environ.has_key('LDFLAGS'):
+        env['LINKFLAGS'] += SCons.Util.CLVar(os.environ['LDFLAGS'])
 
     env['gcc'] = 'gcc' in os.path.basename(env['CC']).split('-')
     env['msvc'] = env['CC'] == 'cl'
@@ -140,10 +186,16 @@ def generate(env):
     # Backwards compatability with the debug= profile= options
     if env['build'] == 'debug':
         if not env['debug']:
-            print 'scons: debug option is deprecated: use instead build=release'
+            print 'scons: warning: debug option is deprecated and will be removed eventually; use instead'
+            print
+            print ' scons build=release'
+            print
             env['build'] = 'release'
         if env['profile']:
-            print 'scons: profile option is deprecated: use instead build=profile'
+            print 'scons: warning: profile option is deprecated and will be removed eventually; use instead'
+            print
+            print ' scons build=profile'
+            print
             env['build'] = 'profile'
     if False:
         # Enforce SConscripts to use the new build variable
@@ -184,6 +236,9 @@ def generate(env):
     if env.GetOption('num_jobs') <= 1:
         env.SetOption('num_jobs', num_jobs())
 
+    env.Decider('MD5-timestamp')
+    env.SetOption('max_drift', 60)
+
     # C preprocessor options
     cppdefines = []
     if env['build'] in ('debug', 'checked'):
@@ -499,9 +554,19 @@ def generate(env):
     # Default libs
     env.Append(LIBS = [])
 
-    # Load LLVM
+    # Load tools
     if env['llvm']:
         env.Tool('llvm')
+        env.Tool('udis86')
+    
+    pkg_config_modules(env, 'x11', ['x11', 'xext'])
+    pkg_config_modules(env, 'drm', ['libdrm'])
+    pkg_config_modules(env, 'drm_intel', ['libdrm_intel'])
+    pkg_config_modules(env, 'drm_radeon', ['libdrm_radeon'])
+    pkg_config_modules(env, 'xorg', ['xorg-server'])
+    pkg_config_modules(env, 'kms', ['libkms'])
+
+    env['dri'] = env['x11'] and env['drm']
 
     # Custom builders and methods
     env.Tool('custom')
index 39fbb910b6d55685271cc39e392a11d7de05fac5..1b033acb1b3f50d848de1fc694da9e2cdb903719 100644 (file)
@@ -38,6 +38,8 @@ import SCons.Util
 
 
 def generate(env):
+    env['llvm'] = False
+
     try:
         llvm_dir = os.environ['LLVM']
     except KeyError:
@@ -64,13 +66,13 @@ def generate(env):
         # XXX: There is no llvm-config on Windows, so assume a standard layout
         if llvm_dir is None:
             print 'scons: LLVM environment variable must be specified when building for windows'
-            env.Exit(1)
+            return
 
         # Try to determine the LLVM version from llvm/Config/config.h
         llvm_config = os.path.join(llvm_dir, 'include/llvm/Config/config.h')
         if not os.path.exists(llvm_config):
             print 'scons: could not find %s' % llvm_config
-            env.Exit(1)
+            return
         llvm_version_re = re.compile(r'^#define PACKAGE_VERSION "([^"]*)"')
         llvm_version = None
         for line in open(llvm_config, 'rt'):
@@ -81,7 +83,7 @@ def generate(env):
                 break
         if llvm_version is None:
             print 'scons: could not determine the LLVM version from %s' % llvm_config
-            env.Exit(1)
+            return
 
         env.Prepend(CPPPATH = [os.path.join(llvm_dir, 'include')])
         env.AppendUnique(CPPDEFINES = [
@@ -133,7 +135,7 @@ def generate(env):
     else:
         if not env.Detect('llvm-config'):
             print 'scons: llvm-config script not found' % llvm_version
-            env.Exit(1)
+            return
 
         llvm_version = env.backtick('llvm-config --version').rstrip()
         llvm_version = distutils.version.LooseVersion(llvm_version)
@@ -144,11 +146,12 @@ def generate(env):
             env.ParseConfig('llvm-config --ldflags')
         except OSError:
             print 'scons: llvm-config version %s failed' % llvm_version
-            env.Exit(1)
+            return
         else:
             env['LINK'] = env['CXX']
 
     assert llvm_version is not None
+    env['llvm'] = True
 
     print 'scons: Found LLVM version %s' % llvm_version
     env['LLVM_VERSION'] = llvm_version
index ba71d4eb0b801da7d0211c9d38a1e2915ccd065e..bb91d3c35cf6e7febf646b2430fd29930f30128d 100644 (file)
@@ -31,8 +31,10 @@ def generate(env):
     conf = env.Configure()
 
     if conf.CheckHeader('udis86.h'): # and conf.CheckLib('udis86'):
-        env.Append(CPPDEFINES = [('HAVE_UDIS86', '1')])
+        env['UDIS86'] = True
         env.Prepend(LIBS = ['udis86'])
+    else:
+        env['UDIS86'] = False
 
     conf.Finish()
 
index c3e34be6f760f020ad2b797d6d937fcd98da21e4..c42d9bff2d7fcd36f90be02985f7f5987c7a6ca2 100644 (file)
@@ -1,19 +1,17 @@
 Import('*')
 
-if 'egl' in env['statetrackers']:
-    SConscript('mapi/vgapi/SConscript')
-    SConscript('egl/main/SConscript')
+SConscript('mapi/vgapi/SConscript')
 
-if 'mesa' in env['statetrackers']:
-    if platform == 'windows':
-        SConscript('talloc/SConscript')
+if env['platform'] == 'windows':
+    SConscript('egl/main/SConscript')
+    SConscript('talloc/SConscript')
 
-    SConscript('glsl/SConscript')
-    SConscript('mapi/glapi/SConscript')
-    SConscript('mesa/SConscript')
+SConscript('glsl/SConscript')
+SConscript('mapi/glapi/SConscript')
+SConscript('mesa/SConscript')
 
-    if platform != 'embedded':
-        SConscript('glut/glx/SConscript')
+if env['platform'] != 'embedded':
+    SConscript('glut/glx/SConscript')
 
 SConscript('gallium/SConscript')
 
index 08e82c65e9beb964586a8cae3f4ee40f8c7b7561..47709e3c59f5a93b21c4605ce2d3d5ea64f5bb44 100644 (file)
@@ -24,8 +24,8 @@ $(EGL_DRIVER_PATH): $(EGL_DRIVER)
 
 $(EGL_DRIVER): $(EGL_OBJECTS) Makefile $(TOP)/src/egl/drivers/Makefile.template
        @$(MKLIB) -o $(EGL_DRIVER) -noprefix \
-               -linker '$(CC)' -ldflags '$(LDFLAGS)' \
-               -L$(TOP)/$(LIB_DIR) $(MKLIB_OPTIONS) \
+               -linker '$(CC)' -ldflags '-L$(TOP)/$(LIB_DIR) $(LDFLAGS)' \
+               $(MKLIB_OPTIONS) \
                $(EGL_OBJECTS) $(EGL_LIBS) -l$(EGL_LIB)
 
 .c.o:
index eb8996f7a7551bfc1463024d5ba761554a5c5bf7..a83f32b0d1b7d9533b39c8959f7c1d1b07871f40 100644 (file)
@@ -272,7 +272,7 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
    if (conf != NULL) {
       memcpy(&conf->base, &base, sizeof base);
       conf->dri_config = dri_config;
-      _eglAddConfig(disp, &conf->base);
+      _eglLinkConfig(&conf->base);
    }
 
    return conf;
@@ -750,7 +750,7 @@ dri2_create_screen(_EGLDisplay *disp)
    if (dri2_dpy->dri2->base.version >= 2)
       api_mask = dri2_dpy->dri2->getAPIMask(dri2_dpy->dri_screen);
    else
-      api_mask = __DRI_API_OPENGL;
+      api_mask = 1 << __DRI_API_OPENGL;
 
    disp->ClientAPIsMask = 0;
    if (api_mask & (1 <<__DRI_API_OPENGL))
@@ -899,10 +899,20 @@ const int i915_chip_ids[] = {
    0x29b2, /* PCI_CHIP_Q35_G */
    0x29c2, /* PCI_CHIP_G33_G */
    0x29d2, /* PCI_CHIP_Q33_G */
+   0xa001, /* PCI_CHIP_IGD_G */
    0xa011, /* Pineview */
 };
 
 const int i965_chip_ids[] = {
+   0x0042, /* PCI_CHIP_ILD_G */
+   0x0046, /* PCI_CHIP_ILM_G */
+   0x0102, /* PCI_CHIP_SANDYBRIDGE_GT1 */
+   0x0106, /* PCI_CHIP_SANDYBRIDGE_M_GT1 */
+   0x010a, /* PCI_CHIP_SANDYBRIDGE_S */
+   0x0112, /* PCI_CHIP_SANDYBRIDGE_GT2 */
+   0x0116, /* PCI_CHIP_SANDYBRIDGE_M_GT2 */
+   0x0122, /* PCI_CHIP_SANDYBRIDGE_GT2_PLUS */
+   0x0126, /* PCI_CHIP_SANDYBRIDGE_M_GT2_PLUS */
    0x29a2, /* PCI_CHIP_I965_G */
    0x2992, /* PCI_CHIP_I965_Q */
    0x2982, /* PCI_CHIP_I965_G_1 */
@@ -914,11 +924,440 @@ const int i965_chip_ids[] = {
    0x2e12, /* PCI_CHIP_Q45_G */
    0x2e22, /* PCI_CHIP_G45_G */
    0x2e32, /* PCI_CHIP_G41_G */
+   0x2e42, /* PCI_CHIP_B43_G */
+   0x2e92, /* PCI_CHIP_B43_G1 */
+};
+
+const int r100_chip_ids[] = {
+   0x4C57, /* PCI_CHIP_RADEON_LW */
+   0x4C58, /* PCI_CHIP_RADEON_LX */
+   0x4C59, /* PCI_CHIP_RADEON_LY */
+   0x4C5A, /* PCI_CHIP_RADEON_LZ */
+   0x5144, /* PCI_CHIP_RADEON_QD */
+   0x5145, /* PCI_CHIP_RADEON_QE */
+   0x5146, /* PCI_CHIP_RADEON_QF */
+   0x5147, /* PCI_CHIP_RADEON_QG */
+   0x5159, /* PCI_CHIP_RADEON_QY */
+   0x515A, /* PCI_CHIP_RADEON_QZ */
+   0x5157, /* PCI_CHIP_RV200_QW */
+   0x5158, /* PCI_CHIP_RV200_QX */
+   0x515E, /* PCI_CHIP_RN50_515E */
+   0x5969, /* PCI_CHIP_RN50_5969 */
+   0x4136, /* PCI_CHIP_RS100_4136 */
+   0x4336, /* PCI_CHIP_RS100_4336 */
+   0x4137, /* PCI_CHIP_RS200_4137 */
+   0x4337, /* PCI_CHIP_RS200_4337 */
+   0x4237, /* PCI_CHIP_RS250_4237 */
+   0x4437, /* PCI_CHIP_RS250_4437 */
+};
+
+const int r200_chip_ids[] = {
+   0x5148, /* PCI_CHIP_R200_QH */
+   0x514C, /* PCI_CHIP_R200_QL */
+   0x514D, /* PCI_CHIP_R200_QM */
+   0x4242, /* PCI_CHIP_R200_BB */
+   0x4243, /* PCI_CHIP_R200_BC */
+   0x4966, /* PCI_CHIP_RV250_If */
+   0x4967, /* PCI_CHIP_RV250_Ig */
+   0x4C64, /* PCI_CHIP_RV250_Ld */
+   0x4C66, /* PCI_CHIP_RV250_Lf */
+   0x4C67, /* PCI_CHIP_RV250_Lg */
+   0x5960, /* PCI_CHIP_RV280_5960 */
+   0x5961, /* PCI_CHIP_RV280_5961 */
+   0x5962, /* PCI_CHIP_RV280_5962 */
+   0x5964, /* PCI_CHIP_RV280_5964 */
+   0x5965, /* PCI_CHIP_RV280_5965 */
+   0x5C61, /* PCI_CHIP_RV280_5C61 */
+   0x5C63, /* PCI_CHIP_RV280_5C63 */
+   0x5834, /* PCI_CHIP_RS300_5834 */
+   0x5835, /* PCI_CHIP_RS300_5835 */
+   0x7834, /* PCI_CHIP_RS350_7834 */
+   0x7835, /* PCI_CHIP_RS350_7835 */
+};
+
+const int r300_chip_ids[] = {
+   0x4144, /* PCI_CHIP_R300_AD */
+   0x4145, /* PCI_CHIP_R300_AE */
+   0x4146, /* PCI_CHIP_R300_AF */
+   0x4147, /* PCI_CHIP_R300_AG */
+   0x4E44, /* PCI_CHIP_R300_ND */
+   0x4E45, /* PCI_CHIP_R300_NE */
+   0x4E46, /* PCI_CHIP_R300_NF */
+   0x4E47, /* PCI_CHIP_R300_NG */
+   0x4E48, /* PCI_CHIP_R350_NH */
+   0x4E49, /* PCI_CHIP_R350_NI */
+   0x4E4B, /* PCI_CHIP_R350_NK */
+   0x4148, /* PCI_CHIP_R350_AH */
+   0x4149, /* PCI_CHIP_R350_AI */
+   0x414A, /* PCI_CHIP_R350_AJ */
+   0x414B, /* PCI_CHIP_R350_AK */
+   0x4E4A, /* PCI_CHIP_R360_NJ */
+   0x4150, /* PCI_CHIP_RV350_AP */
+   0x4151, /* PCI_CHIP_RV350_AQ */
+   0x4152, /* PCI_CHIP_RV350_AR */
+   0x4153, /* PCI_CHIP_RV350_AS */
+   0x4154, /* PCI_CHIP_RV350_AT */
+   0x4155, /* PCI_CHIP_RV350_AU */
+   0x4156, /* PCI_CHIP_RV350_AV */
+   0x4E50, /* PCI_CHIP_RV350_NP */
+   0x4E51, /* PCI_CHIP_RV350_NQ */
+   0x4E52, /* PCI_CHIP_RV350_NR */
+   0x4E53, /* PCI_CHIP_RV350_NS */
+   0x4E54, /* PCI_CHIP_RV350_NT */
+   0x4E56, /* PCI_CHIP_RV350_NV */
+   0x5460, /* PCI_CHIP_RV370_5460 */
+   0x5462, /* PCI_CHIP_RV370_5462 */
+   0x5464, /* PCI_CHIP_RV370_5464 */
+   0x5B60, /* PCI_CHIP_RV370_5B60 */
+   0x5B62, /* PCI_CHIP_RV370_5B62 */
+   0x5B63, /* PCI_CHIP_RV370_5B63 */
+   0x5B64, /* PCI_CHIP_RV370_5B64 */
+   0x5B65, /* PCI_CHIP_RV370_5B65 */
+   0x3150, /* PCI_CHIP_RV380_3150 */
+   0x3152, /* PCI_CHIP_RV380_3152 */
+   0x3154, /* PCI_CHIP_RV380_3154 */
+   0x3155, /* PCI_CHIP_RV380_3155 */
+   0x3E50, /* PCI_CHIP_RV380_3E50 */
+   0x3E54, /* PCI_CHIP_RV380_3E54 */
+   0x4A48, /* PCI_CHIP_R420_JH */
+   0x4A49, /* PCI_CHIP_R420_JI */
+   0x4A4A, /* PCI_CHIP_R420_JJ */
+   0x4A4B, /* PCI_CHIP_R420_JK */
+   0x4A4C, /* PCI_CHIP_R420_JL */
+   0x4A4D, /* PCI_CHIP_R420_JM */
+   0x4A4E, /* PCI_CHIP_R420_JN */
+   0x4A4F, /* PCI_CHIP_R420_JO */
+   0x4A50, /* PCI_CHIP_R420_JP */
+   0x4A54, /* PCI_CHIP_R420_JT */
+   0x5548, /* PCI_CHIP_R423_UH */
+   0x5549, /* PCI_CHIP_R423_UI */
+   0x554A, /* PCI_CHIP_R423_UJ */
+   0x554B, /* PCI_CHIP_R423_UK */
+   0x5550, /* PCI_CHIP_R423_5550 */
+   0x5551, /* PCI_CHIP_R423_UQ */
+   0x5552, /* PCI_CHIP_R423_UR */
+   0x5554, /* PCI_CHIP_R423_UT */
+   0x5D57, /* PCI_CHIP_R423_5D57 */
+   0x554C, /* PCI_CHIP_R430_554C */
+   0x554D, /* PCI_CHIP_R430_554D */
+   0x554E, /* PCI_CHIP_R430_554E */
+   0x554F, /* PCI_CHIP_R430_554F */
+   0x5D48, /* PCI_CHIP_R430_5D48 */
+   0x5D49, /* PCI_CHIP_R430_5D49 */
+   0x5D4A, /* PCI_CHIP_R430_5D4A */
+   0x5D4C, /* PCI_CHIP_R480_5D4C */
+   0x5D4D, /* PCI_CHIP_R480_5D4D */
+   0x5D4E, /* PCI_CHIP_R480_5D4E */
+   0x5D4F, /* PCI_CHIP_R480_5D4F */
+   0x5D50, /* PCI_CHIP_R480_5D50 */
+   0x5D52, /* PCI_CHIP_R480_5D52 */
+   0x4B49, /* PCI_CHIP_R481_4B49 */
+   0x4B4A, /* PCI_CHIP_R481_4B4A */
+   0x4B4B, /* PCI_CHIP_R481_4B4B */
+   0x4B4C, /* PCI_CHIP_R481_4B4C */
+   0x564A, /* PCI_CHIP_RV410_564A */
+   0x564B, /* PCI_CHIP_RV410_564B */
+   0x564F, /* PCI_CHIP_RV410_564F */
+   0x5652, /* PCI_CHIP_RV410_5652 */
+   0x5653, /* PCI_CHIP_RV410_5653 */
+   0x5657, /* PCI_CHIP_RV410_5657 */
+   0x5E48, /* PCI_CHIP_RV410_5E48 */
+   0x5E4A, /* PCI_CHIP_RV410_5E4A */
+   0x5E4B, /* PCI_CHIP_RV410_5E4B */
+   0x5E4C, /* PCI_CHIP_RV410_5E4C */
+   0x5E4D, /* PCI_CHIP_RV410_5E4D */
+   0x5E4F, /* PCI_CHIP_RV410_5E4F */
+   0x5A41, /* PCI_CHIP_RS400_5A41 */
+   0x5A42, /* PCI_CHIP_RS400_5A42 */
+   0x5A61, /* PCI_CHIP_RC410_5A61 */
+   0x5A62, /* PCI_CHIP_RC410_5A62 */
+   0x5954, /* PCI_CHIP_RS480_5954 */
+   0x5955, /* PCI_CHIP_RS480_5955 */
+   0x5974, /* PCI_CHIP_RS482_5974 */
+   0x5975, /* PCI_CHIP_RS482_5975 */
+   0x7100, /* PCI_CHIP_R520_7100 */
+   0x7101, /* PCI_CHIP_R520_7101 */
+   0x7102, /* PCI_CHIP_R520_7102 */
+   0x7103, /* PCI_CHIP_R520_7103 */
+   0x7104, /* PCI_CHIP_R520_7104 */
+   0x7105, /* PCI_CHIP_R520_7105 */
+   0x7106, /* PCI_CHIP_R520_7106 */
+   0x7108, /* PCI_CHIP_R520_7108 */
+   0x7109, /* PCI_CHIP_R520_7109 */
+   0x710A, /* PCI_CHIP_R520_710A */
+   0x710B, /* PCI_CHIP_R520_710B */
+   0x710C, /* PCI_CHIP_R520_710C */
+   0x710E, /* PCI_CHIP_R520_710E */
+   0x710F, /* PCI_CHIP_R520_710F */
+   0x7140, /* PCI_CHIP_RV515_7140 */
+   0x7141, /* PCI_CHIP_RV515_7141 */
+   0x7142, /* PCI_CHIP_RV515_7142 */
+   0x7143, /* PCI_CHIP_RV515_7143 */
+   0x7144, /* PCI_CHIP_RV515_7144 */
+   0x7145, /* PCI_CHIP_RV515_7145 */
+   0x7146, /* PCI_CHIP_RV515_7146 */
+   0x7147, /* PCI_CHIP_RV515_7147 */
+   0x7149, /* PCI_CHIP_RV515_7149 */
+   0x714A, /* PCI_CHIP_RV515_714A */
+   0x714B, /* PCI_CHIP_RV515_714B */
+   0x714C, /* PCI_CHIP_RV515_714C */
+   0x714D, /* PCI_CHIP_RV515_714D */
+   0x714E, /* PCI_CHIP_RV515_714E */
+   0x714F, /* PCI_CHIP_RV515_714F */
+   0x7151, /* PCI_CHIP_RV515_7151 */
+   0x7152, /* PCI_CHIP_RV515_7152 */
+   0x7153, /* PCI_CHIP_RV515_7153 */
+   0x715E, /* PCI_CHIP_RV515_715E */
+   0x715F, /* PCI_CHIP_RV515_715F */
+   0x7180, /* PCI_CHIP_RV515_7180 */
+   0x7181, /* PCI_CHIP_RV515_7181 */
+   0x7183, /* PCI_CHIP_RV515_7183 */
+   0x7186, /* PCI_CHIP_RV515_7186 */
+   0x7187, /* PCI_CHIP_RV515_7187 */
+   0x7188, /* PCI_CHIP_RV515_7188 */
+   0x718A, /* PCI_CHIP_RV515_718A */
+   0x718B, /* PCI_CHIP_RV515_718B */
+   0x718C, /* PCI_CHIP_RV515_718C */
+   0x718D, /* PCI_CHIP_RV515_718D */
+   0x718F, /* PCI_CHIP_RV515_718F */
+   0x7193, /* PCI_CHIP_RV515_7193 */
+   0x7196, /* PCI_CHIP_RV515_7196 */
+   0x719B, /* PCI_CHIP_RV515_719B */
+   0x719F, /* PCI_CHIP_RV515_719F */
+   0x7200, /* PCI_CHIP_RV515_7200 */
+   0x7210, /* PCI_CHIP_RV515_7210 */
+   0x7211, /* PCI_CHIP_RV515_7211 */
+   0x71C0, /* PCI_CHIP_RV530_71C0 */
+   0x71C1, /* PCI_CHIP_RV530_71C1 */
+   0x71C2, /* PCI_CHIP_RV530_71C2 */
+   0x71C3, /* PCI_CHIP_RV530_71C3 */
+   0x71C4, /* PCI_CHIP_RV530_71C4 */
+   0x71C5, /* PCI_CHIP_RV530_71C5 */
+   0x71C6, /* PCI_CHIP_RV530_71C6 */
+   0x71C7, /* PCI_CHIP_RV530_71C7 */
+   0x71CD, /* PCI_CHIP_RV530_71CD */
+   0x71CE, /* PCI_CHIP_RV530_71CE */
+   0x71D2, /* PCI_CHIP_RV530_71D2 */
+   0x71D4, /* PCI_CHIP_RV530_71D4 */
+   0x71D5, /* PCI_CHIP_RV530_71D5 */
+   0x71D6, /* PCI_CHIP_RV530_71D6 */
+   0x71DA, /* PCI_CHIP_RV530_71DA */
+   0x71DE, /* PCI_CHIP_RV530_71DE */
+   0x7281, /* PCI_CHIP_RV560_7281 */
+   0x7283, /* PCI_CHIP_RV560_7283 */
+   0x7287, /* PCI_CHIP_RV560_7287 */
+   0x7290, /* PCI_CHIP_RV560_7290 */
+   0x7291, /* PCI_CHIP_RV560_7291 */
+   0x7293, /* PCI_CHIP_RV560_7293 */
+   0x7297, /* PCI_CHIP_RV560_7297 */
+   0x7280, /* PCI_CHIP_RV570_7280 */
+   0x7288, /* PCI_CHIP_RV570_7288 */
+   0x7289, /* PCI_CHIP_RV570_7289 */
+   0x728B, /* PCI_CHIP_RV570_728B */
+   0x728C, /* PCI_CHIP_RV570_728C */
+   0x7240, /* PCI_CHIP_R580_7240 */
+   0x7243, /* PCI_CHIP_R580_7243 */
+   0x7244, /* PCI_CHIP_R580_7244 */
+   0x7245, /* PCI_CHIP_R580_7245 */
+   0x7246, /* PCI_CHIP_R580_7246 */
+   0x7247, /* PCI_CHIP_R580_7247 */
+   0x7248, /* PCI_CHIP_R580_7248 */
+   0x7249, /* PCI_CHIP_R580_7249 */
+   0x724A, /* PCI_CHIP_R580_724A */
+   0x724B, /* PCI_CHIP_R580_724B */
+   0x724C, /* PCI_CHIP_R580_724C */
+   0x724D, /* PCI_CHIP_R580_724D */
+   0x724E, /* PCI_CHIP_R580_724E */
+   0x724F, /* PCI_CHIP_R580_724F */
+   0x7284, /* PCI_CHIP_R580_7284 */
+   0x793F, /* PCI_CHIP_RS600_793F */
+   0x7941, /* PCI_CHIP_RS600_7941 */
+   0x7942, /* PCI_CHIP_RS600_7942 */
+   0x791E, /* PCI_CHIP_RS690_791E */
+   0x791F, /* PCI_CHIP_RS690_791F */
+   0x796C, /* PCI_CHIP_RS740_796C */
+   0x796D, /* PCI_CHIP_RS740_796D */
+   0x796E, /* PCI_CHIP_RS740_796E */
+   0x796F, /* PCI_CHIP_RS740_796F */
+};
+
+const int r600_chip_ids[] = {
+   0x9400, /* PCI_CHIP_R600_9400 */
+   0x9401, /* PCI_CHIP_R600_9401 */
+   0x9402, /* PCI_CHIP_R600_9402 */
+   0x9403, /* PCI_CHIP_R600_9403 */
+   0x9405, /* PCI_CHIP_R600_9405 */
+   0x940A, /* PCI_CHIP_R600_940A */
+   0x940B, /* PCI_CHIP_R600_940B */
+   0x940F, /* PCI_CHIP_R600_940F */
+   0x94C0, /* PCI_CHIP_RV610_94C0 */
+   0x94C1, /* PCI_CHIP_RV610_94C1 */
+   0x94C3, /* PCI_CHIP_RV610_94C3 */
+   0x94C4, /* PCI_CHIP_RV610_94C4 */
+   0x94C5, /* PCI_CHIP_RV610_94C5 */
+   0x94C6, /* PCI_CHIP_RV610_94C6 */
+   0x94C7, /* PCI_CHIP_RV610_94C7 */
+   0x94C8, /* PCI_CHIP_RV610_94C8 */
+   0x94C9, /* PCI_CHIP_RV610_94C9 */
+   0x94CB, /* PCI_CHIP_RV610_94CB */
+   0x94CC, /* PCI_CHIP_RV610_94CC */
+   0x94CD, /* PCI_CHIP_RV610_94CD */
+   0x9580, /* PCI_CHIP_RV630_9580 */
+   0x9581, /* PCI_CHIP_RV630_9581 */
+   0x9583, /* PCI_CHIP_RV630_9583 */
+   0x9586, /* PCI_CHIP_RV630_9586 */
+   0x9587, /* PCI_CHIP_RV630_9587 */
+   0x9588, /* PCI_CHIP_RV630_9588 */
+   0x9589, /* PCI_CHIP_RV630_9589 */
+   0x958A, /* PCI_CHIP_RV630_958A */
+   0x958B, /* PCI_CHIP_RV630_958B */
+   0x958C, /* PCI_CHIP_RV630_958C */
+   0x958D, /* PCI_CHIP_RV630_958D */
+   0x958E, /* PCI_CHIP_RV630_958E */
+   0x958F, /* PCI_CHIP_RV630_958F */
+   0x9500, /* PCI_CHIP_RV670_9500 */
+   0x9501, /* PCI_CHIP_RV670_9501 */
+   0x9504, /* PCI_CHIP_RV670_9504 */
+   0x9505, /* PCI_CHIP_RV670_9505 */
+   0x9506, /* PCI_CHIP_RV670_9506 */
+   0x9507, /* PCI_CHIP_RV670_9507 */
+   0x9508, /* PCI_CHIP_RV670_9508 */
+   0x9509, /* PCI_CHIP_RV670_9509 */
+   0x950F, /* PCI_CHIP_RV670_950F */
+   0x9511, /* PCI_CHIP_RV670_9511 */
+   0x9515, /* PCI_CHIP_RV670_9515 */
+   0x9517, /* PCI_CHIP_RV670_9517 */
+   0x9519, /* PCI_CHIP_RV670_9519 */
+   0x95C0, /* PCI_CHIP_RV620_95C0 */
+   0x95C2, /* PCI_CHIP_RV620_95C2 */
+   0x95C4, /* PCI_CHIP_RV620_95C4 */
+   0x95C5, /* PCI_CHIP_RV620_95C5 */
+   0x95C6, /* PCI_CHIP_RV620_95C6 */
+   0x95C7, /* PCI_CHIP_RV620_95C7 */
+   0x95C9, /* PCI_CHIP_RV620_95C9 */
+   0x95CC, /* PCI_CHIP_RV620_95CC */
+   0x95CD, /* PCI_CHIP_RV620_95CD */
+   0x95CE, /* PCI_CHIP_RV620_95CE */
+   0x95CF, /* PCI_CHIP_RV620_95CF */
+   0x9590, /* PCI_CHIP_RV635_9590 */
+   0x9591, /* PCI_CHIP_RV635_9591 */
+   0x9593, /* PCI_CHIP_RV635_9593 */
+   0x9595, /* PCI_CHIP_RV635_9595 */
+   0x9596, /* PCI_CHIP_RV635_9596 */
+   0x9597, /* PCI_CHIP_RV635_9597 */
+   0x9598, /* PCI_CHIP_RV635_9598 */
+   0x9599, /* PCI_CHIP_RV635_9599 */
+   0x959B, /* PCI_CHIP_RV635_959B */
+   0x9610, /* PCI_CHIP_RS780_9610 */
+   0x9611, /* PCI_CHIP_RS780_9611 */
+   0x9612, /* PCI_CHIP_RS780_9612 */
+   0x9613, /* PCI_CHIP_RS780_9613 */
+   0x9614, /* PCI_CHIP_RS780_9614 */
+   0x9615, /* PCI_CHIP_RS780_9615 */
+   0x9616, /* PCI_CHIP_RS780_9616 */
+   0x9710, /* PCI_CHIP_RS880_9710 */
+   0x9711, /* PCI_CHIP_RS880_9711 */
+   0x9712, /* PCI_CHIP_RS880_9712 */
+   0x9713, /* PCI_CHIP_RS880_9713 */
+   0x9714, /* PCI_CHIP_RS880_9714 */
+   0x9715, /* PCI_CHIP_RS880_9715 */
+   0x9440, /* PCI_CHIP_RV770_9440 */
+   0x9441, /* PCI_CHIP_RV770_9441 */
+   0x9442, /* PCI_CHIP_RV770_9442 */
+   0x9443, /* PCI_CHIP_RV770_9443 */
+   0x9444, /* PCI_CHIP_RV770_9444 */
+   0x9446, /* PCI_CHIP_RV770_9446 */
+   0x944A, /* PCI_CHIP_RV770_944A */
+   0x944B, /* PCI_CHIP_RV770_944B */
+   0x944C, /* PCI_CHIP_RV770_944C */
+   0x944E, /* PCI_CHIP_RV770_944E */
+   0x9450, /* PCI_CHIP_RV770_9450 */
+   0x9452, /* PCI_CHIP_RV770_9452 */
+   0x9456, /* PCI_CHIP_RV770_9456 */
+   0x945A, /* PCI_CHIP_RV770_945A */
+   0x945B, /* PCI_CHIP_RV770_945B */
+   0x945E, /* PCI_CHIP_RV770_945E */
+   0x9460, /* PCI_CHIP_RV790_9460 */
+   0x9462, /* PCI_CHIP_RV790_9462 */
+   0x946A, /* PCI_CHIP_RV770_946A */
+   0x946B, /* PCI_CHIP_RV770_946B */
+   0x947A, /* PCI_CHIP_RV770_947A */
+   0x947B, /* PCI_CHIP_RV770_947B */
+   0x9480, /* PCI_CHIP_RV730_9480 */
+   0x9487, /* PCI_CHIP_RV730_9487 */
+   0x9488, /* PCI_CHIP_RV730_9488 */
+   0x9489, /* PCI_CHIP_RV730_9489 */
+   0x948A, /* PCI_CHIP_RV730_948A */
+   0x948F, /* PCI_CHIP_RV730_948F */
+   0x9490, /* PCI_CHIP_RV730_9490 */
+   0x9491, /* PCI_CHIP_RV730_9491 */
+   0x9495, /* PCI_CHIP_RV730_9495 */
+   0x9498, /* PCI_CHIP_RV730_9498 */
+   0x949C, /* PCI_CHIP_RV730_949C */
+   0x949E, /* PCI_CHIP_RV730_949E */
+   0x949F, /* PCI_CHIP_RV730_949F */
+   0x9540, /* PCI_CHIP_RV710_9540 */
+   0x9541, /* PCI_CHIP_RV710_9541 */
+   0x9542, /* PCI_CHIP_RV710_9542 */
+   0x954E, /* PCI_CHIP_RV710_954E */
+   0x954F, /* PCI_CHIP_RV710_954F */
+   0x9552, /* PCI_CHIP_RV710_9552 */
+   0x9553, /* PCI_CHIP_RV710_9553 */
+   0x9555, /* PCI_CHIP_RV710_9555 */
+   0x9557, /* PCI_CHIP_RV710_9557 */
+   0x955F, /* PCI_CHIP_RV710_955F */
+   0x94A0, /* PCI_CHIP_RV740_94A0 */
+   0x94A1, /* PCI_CHIP_RV740_94A1 */
+   0x94A3, /* PCI_CHIP_RV740_94A3 */
+   0x94B1, /* PCI_CHIP_RV740_94B1 */
+   0x94B3, /* PCI_CHIP_RV740_94B3 */
+   0x94B4, /* PCI_CHIP_RV740_94B4 */
+   0x94B5, /* PCI_CHIP_RV740_94B5 */
+   0x94B9, /* PCI_CHIP_RV740_94B9 */
+   0x68E0, /* PCI_CHIP_CEDAR_68E0 */
+   0x68E1, /* PCI_CHIP_CEDAR_68E1 */
+   0x68E4, /* PCI_CHIP_CEDAR_68E4 */
+   0x68E5, /* PCI_CHIP_CEDAR_68E5 */
+   0x68E8, /* PCI_CHIP_CEDAR_68E8 */
+   0x68E9, /* PCI_CHIP_CEDAR_68E9 */
+   0x68F1, /* PCI_CHIP_CEDAR_68F1 */
+   0x68F8, /* PCI_CHIP_CEDAR_68F8 */
+   0x68F9, /* PCI_CHIP_CEDAR_68F9 */
+   0x68FE, /* PCI_CHIP_CEDAR_68FE */
+   0x68C0, /* PCI_CHIP_REDWOOD_68C0 */
+   0x68C1, /* PCI_CHIP_REDWOOD_68C1 */
+   0x68C8, /* PCI_CHIP_REDWOOD_68C8 */
+   0x68C9, /* PCI_CHIP_REDWOOD_68C9 */
+   0x68D8, /* PCI_CHIP_REDWOOD_68D8 */
+   0x68D9, /* PCI_CHIP_REDWOOD_68D9 */
+   0x68DA, /* PCI_CHIP_REDWOOD_68DA */
+   0x68DE, /* PCI_CHIP_REDWOOD_68DE */
+   0x68A0, /* PCI_CHIP_JUNIPER_68A0 */
+   0x68A1, /* PCI_CHIP_JUNIPER_68A1 */
+   0x68A8, /* PCI_CHIP_JUNIPER_68A8 */
+   0x68A9, /* PCI_CHIP_JUNIPER_68A9 */
+   0x68B0, /* PCI_CHIP_JUNIPER_68B0 */
+   0x68B8, /* PCI_CHIP_JUNIPER_68B8 */
+   0x68B9, /* PCI_CHIP_JUNIPER_68B9 */
+   0x68BE, /* PCI_CHIP_JUNIPER_68BE */
+   0x6880, /* PCI_CHIP_CYPRESS_6880 */
+   0x6888, /* PCI_CHIP_CYPRESS_6888 */
+   0x6889, /* PCI_CHIP_CYPRESS_6889 */
+   0x688A, /* PCI_CHIP_CYPRESS_688A */
+   0x6898, /* PCI_CHIP_CYPRESS_6898 */
+   0x6899, /* PCI_CHIP_CYPRESS_6899 */
+   0x689E, /* PCI_CHIP_CYPRESS_689E */
+   0x689C, /* PCI_CHIP_HEMLOCK_689C */
+   0x689D, /* PCI_CHIP_HEMLOCK_689D */
 };
 
 const struct dri2_driver_map driver_map[] = {
    { 0x8086, "i915", i915_chip_ids, ARRAY_SIZE(i915_chip_ids) },
    { 0x8086, "i965", i965_chip_ids, ARRAY_SIZE(i965_chip_ids) },
+   { 0x1002, "radeon", r100_chip_ids, ARRAY_SIZE(r100_chip_ids) },
+   { 0x1002, "r200", r200_chip_ids, ARRAY_SIZE(r200_chip_ids) },
+   { 0x1002, "r300", r300_chip_ids, ARRAY_SIZE(r300_chip_ids) },
+   { 0x1002, "r600", r600_chip_ids, ARRAY_SIZE(r600_chip_ids) },
 };
 
 static char *
@@ -1160,7 +1599,7 @@ dri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
 
    (void) drv;
 
-   if (_eglIsSurfaceBound(surf))
+   if (!_eglPutSurface(surf))
       return EGL_TRUE;
 
    (*dri2_dpy->core->destroyDrawable)(dri2_surf->dri_drawable);
@@ -1187,15 +1626,17 @@ dri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,
    struct dri2_egl_surface *dri2_dsurf = dri2_egl_surface(dsurf);
    struct dri2_egl_surface *dri2_rsurf = dri2_egl_surface(rsurf);
    struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
+   _EGLContext *old_ctx;
+   _EGLSurface *old_dsurf, *old_rsurf;
    __DRIdrawable *ddraw, *rdraw;
    __DRIcontext *cctx;
 
-   /* bind the new context and return the "orphaned" one */
-   if (!_eglBindContext(&ctx, &dsurf, &rsurf))
+   /* make new bindings */
+   if (!_eglBindContext(ctx, dsurf, rsurf, &old_ctx, &old_dsurf, &old_rsurf))
       return EGL_FALSE;
 
    /* flush before context switch */
-   if (ctx && dri2_drv->glFlush)
+   if (old_ctx && dri2_drv->glFlush)
       dri2_drv->glFlush();
 
    ddraw = (dri2_dsurf) ? dri2_dsurf->dri_drawable : NULL;
@@ -1204,16 +1645,29 @@ dri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,
 
    if ((cctx == NULL && ddraw == NULL && rdraw == NULL) ||
        dri2_dpy->core->bindContext(cctx, ddraw, rdraw)) {
-      if (dsurf && !_eglIsSurfaceLinked(dsurf))
-        dri2_destroy_surface(drv, disp, dsurf);
-      if (rsurf && rsurf != dsurf && !_eglIsSurfaceLinked(dsurf))
-        dri2_destroy_surface(drv, disp, rsurf);
-      if (ctx != NULL && !_eglIsContextLinked(ctx))
-        dri2_dpy->core->unbindContext(dri2_egl_context(ctx)->dri_context);
+      dri2_destroy_surface(drv, disp, old_dsurf);
+      dri2_destroy_surface(drv, disp, old_rsurf);
+      if (old_ctx) {
+        dri2_dpy->core->unbindContext(dri2_egl_context(old_ctx)->dri_context);
+         /* no destroy? */
+         _eglPutContext(old_ctx);
+      }
 
       return EGL_TRUE;
    } else {
-      _eglBindContext(&ctx, &dsurf, &rsurf);
+      /* undo the previous _eglBindContext */
+      _eglBindContext(old_ctx, old_dsurf, old_rsurf, &ctx, &dsurf, &rsurf);
+      assert(&dri2_ctx->base == ctx &&
+             &dri2_dsurf->base == dsurf &&
+             &dri2_rsurf->base == rsurf);
+
+      _eglPutSurface(dsurf);
+      _eglPutSurface(rsurf);
+      _eglPutContext(ctx);
+
+      _eglPutSurface(old_dsurf);
+      _eglPutSurface(old_rsurf);
+      _eglPutContext(old_ctx);
 
       return EGL_FALSE;
    }
index 9bebc61de9cbad33b1859c9a84ec3910dae0f98c..8ec7c48c50e4b82ca197fb459553c6ac22006e02 100644 (file)
@@ -452,7 +452,7 @@ create_configs(_EGLDisplay *dpy, struct GLX_egl_display *GLX_dpy,
          memcpy(GLX_conf, &template, sizeof(template));
          GLX_conf->index = i;
 
-         _eglAddConfig(dpy, &GLX_conf->Base);
+         _eglLinkConfig(&GLX_conf->Base);
          id++;
       }
    }
@@ -677,14 +677,16 @@ GLX_eglMakeCurrent(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,
    struct GLX_egl_surface *GLX_dsurf = GLX_egl_surface(dsurf);
    struct GLX_egl_surface *GLX_rsurf = GLX_egl_surface(rsurf);
    struct GLX_egl_context *GLX_ctx = GLX_egl_context(ctx);
+   _EGLContext *old_ctx;
+   _EGLSurface *old_dsurf, *old_rsurf;
    GLXDrawable ddraw, rdraw;
    GLXContext cctx;
    EGLBoolean ret = EGL_FALSE;
 
    (void) drv;
 
-   /* bind the new context and return the "orphaned" one */
-   if (!_eglBindContext(&ctx, &dsurf, &rsurf))
+   /* make new bindings */
+   if (!_eglBindContext(ctx, dsurf, rsurf, &old_ctx, &old_dsurf, &old_rsurf))
       return EGL_FALSE;
 
    ddraw = (GLX_dsurf) ? GLX_dsurf->glx_drawable : None;
@@ -697,13 +699,27 @@ GLX_eglMakeCurrent(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,
       ret = glXMakeCurrent(GLX_dpy->dpy, ddraw, cctx);
 
    if (ret) {
-      if (dsurf && !_eglIsSurfaceLinked(dsurf))
-         destroy_surface(disp, dsurf);
-      if (rsurf && rsurf != dsurf && !_eglIsSurfaceLinked(rsurf))
-         destroy_surface(disp, rsurf);
+      if (_eglPutSurface(old_dsurf))
+         destroy_surface(disp, old_dsurf);
+      if (_eglPutSurface(old_rsurf))
+         destroy_surface(disp, old_rsurf);
+      /* no destroy? */
+      _eglPutContext(old_ctx);
    }
    else {
-      _eglBindContext(&ctx, &dsurf, &rsurf);
+      /* undo the previous _eglBindContext */
+      _eglBindContext(old_ctx, old_dsurf, old_rsurf, &ctx, &dsurf, &rsurf);
+      assert(&GLX_ctx->Base == ctx &&
+             &GLX_dsurf->Base == dsurf &&
+             &GLX_rsurf->Base == rsurf);
+
+      _eglPutSurface(dsurf);
+      _eglPutSurface(rsurf);
+      _eglPutContext(ctx);
+
+      _eglPutSurface(old_dsurf);
+      _eglPutSurface(old_rsurf);
+      _eglPutContext(old_ctx);
    }
 
    return ret;
@@ -907,7 +923,7 @@ GLX_eglDestroySurface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
 {
    (void) drv;
 
-   if (!_eglIsSurfaceBound(surf))
+   if (_eglPutSurface(surf))
       destroy_surface(disp, surf);
 
    return EGL_TRUE;
index 8ade85b35722dfc2e8f906d1a53b5937d9acd8f9..f001b81600fdcdcde9db8dabf1b58f0642a06a64 100644 (file)
@@ -4,49 +4,49 @@
 
 Import('*')
 
-if env['platform'] != 'winddk':
-
-       env = env.Clone()
-
-       env.Append(CPPDEFINES = [
-               '_EGL_NATIVE_PLATFORM=_EGL_PLATFORM_WINDOWS',
-               '_EGL_DRIVER_SEARCH_DIR=\\"\\"',
-               '_EGL_OS_WINDOWS',
-               '_EGL_GET_CORE_ADDRESSES',
-               'KHRONOS_DLL_EXPORTS',
-       ])
-
-       env.Append(CPPPATH = [
-               '#/include',
-       ])
-
-       egl_sources = [
-               'eglapi.c',
-               'eglarray.c',
-               'eglconfig.c',
-               'eglcontext.c',
-               'eglcurrent.c',
-               'egldisplay.c',
-               'egldriver.c',
-               'eglfallbacks.c',
-               'eglglobals.c',
-               'eglimage.c',
-               'egllog.c',
-               'eglmisc.c',
-               'eglmode.c',
-               'eglscreen.c',
-               'eglstring.c',
-               'eglsurface.c',
-               'eglsync.c',
-       ]
-
-       egl = env.SharedLibrary(
-               target = 'libEGL',
-               source = egl_sources + ['egl.def'],
-       )
-
-       env.InstallSharedLibrary(egl, version=(1, 4, 0))
-
-       egl = [env.FindIxes(egl, 'LIBPREFIX', 'LIBSUFFIX')]
-
-       Export('egl')
+env = env.Clone()
+
+env.Append(CPPDEFINES = [
+    '_EGL_NATIVE_PLATFORM=_EGL_PLATFORM_WINDOWS',
+    '_EGL_DRIVER_SEARCH_DIR=\\"\\"',
+    '_EGL_OS_WINDOWS',
+    '_EGL_GET_CORE_ADDRESSES',
+    'KHRONOS_DLL_EXPORTS',
+])
+
+env.Append(CPPPATH = [
+    '#/include',
+])
+
+egl_sources = [
+    'eglapi.c',
+    'eglarray.c',
+    'eglconfig.c',
+    'eglcontext.c',
+    'eglcurrent.c',
+    'egldisplay.c',
+    'egldriver.c',
+    'eglfallbacks.c',
+    'eglglobals.c',
+    'eglimage.c',
+    'egllog.c',
+    'eglmisc.c',
+    'eglmode.c',
+    'eglscreen.c',
+    'eglstring.c',
+    'eglsurface.c',
+    'eglsync.c',
+]
+
+egl = env.SharedLibrary(
+    target = 'libEGL',
+    source = egl_sources + ['egl.def'],
+)
+
+installed_egl = env.InstallSharedLibrary(egl, version=(1, 4, 0))
+
+env.Alias('egl', installed_egl)
+
+egl = [env.FindIxes(egl, 'LIBPREFIX', 'LIBSUFFIX')]
+
+Export('egl')
index e8f856f6beb35e14ed10571da705b1d6c3ea3abb..efa9e97346b127e093429aa2d8731ecee120100b 100644 (file)
@@ -416,7 +416,7 @@ eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
       RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT);
 
    context = drv->API.CreateContext(drv, disp, conf, share, attrib_list);
-   ret = (context) ? _eglLinkContext(context, disp) : EGL_NO_CONTEXT;
+   ret = (context) ? _eglLinkContext(context) : EGL_NO_CONTEXT;
 
    RETURN_EGL_EVAL(disp, ret);
 }
@@ -515,7 +515,7 @@ eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
       RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
 
    surf = drv->API.CreateWindowSurface(drv, disp, conf, window, attrib_list);
-   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
+   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
 
    RETURN_EGL_EVAL(disp, ret);
 }
@@ -536,7 +536,7 @@ eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
       RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
 
    surf = drv->API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list);
-   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
+   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
 
    RETURN_EGL_EVAL(disp, ret);
 }
@@ -555,7 +555,7 @@ eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
    _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
 
    surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list);
-   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
+   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
 
    RETURN_EGL_EVAL(disp, ret);
 }
@@ -648,11 +648,12 @@ eglSwapInterval(EGLDisplay dpy, EGLint interval)
 
    _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
 
-   if (!ctx || !_eglIsContextLinked(ctx) || ctx->Resource.Display != disp)
+   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
+       ctx->Resource.Display != disp)
       RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
 
    surf = ctx->DrawSurface;
-   if (!_eglIsSurfaceLinked(surf))
+   if (_eglGetSurfaceHandle(surf) == EGL_NO_SURFACE)
       RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
 
    ret = drv->API.SwapInterval(drv, disp, surf, interval);
@@ -673,7 +674,8 @@ eglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
    _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
 
    /* surface must be bound to current context in EGL 1.4 */
-   if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface)
+   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
+       surf != ctx->DrawSurface)
       RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
 
    ret = drv->API.SwapBuffers(drv, disp, surf);
@@ -714,7 +716,8 @@ eglWaitClient(void)
    _eglLockMutex(&disp->Mutex);
 
    /* let bad current context imply bad current surface */
-   if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface))
+   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
+       _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE)
       RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
 
    /* a valid current context implies an initialized current display */
@@ -763,7 +766,8 @@ eglWaitNative(EGLint engine)
    _eglLockMutex(&disp->Mutex);
 
    /* let bad current context imply bad current surface */
-   if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface))
+   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
+       _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE)
       RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
 
    /* a valid current context implies an initialized current display */
@@ -1043,7 +1047,7 @@ eglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
    _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
 
    surf = drv->API.CreateScreenSurfaceMESA(drv, disp, conf, attrib_list);
-   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
+   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
 
    RETURN_EGL_EVAL(disp, ret);
 }
@@ -1235,7 +1239,7 @@ eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype,
 
    surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer,
                                                  conf, attrib_list);
-   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
+   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
 
    RETURN_EGL_EVAL(disp, ret);
 }
@@ -1298,7 +1302,7 @@ eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
 
    img = drv->API.CreateImageKHR(drv,
          disp, context, target, buffer, attr_list);
-   ret = (img) ? _eglLinkImage(img, disp) : EGL_NO_IMAGE_KHR;
+   ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
 
    RETURN_EGL_EVAL(disp, ret);
 }
@@ -1344,7 +1348,7 @@ eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
       RETURN_EGL_EVAL(disp, EGL_NO_SYNC_KHR);
 
    sync = drv->API.CreateSyncKHR(drv, disp, type, attrib_list);
-   ret = (sync) ? _eglLinkSync(sync, disp) : EGL_NO_SYNC_KHR;
+   ret = (sync) ? _eglLinkSync(sync) : EGL_NO_SYNC_KHR;
 
    RETURN_EGL_EVAL(disp, ret);
 }
@@ -1437,7 +1441,8 @@ eglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface,
       RETURN_EGL_EVAL(disp, EGL_FALSE);
 
    /* surface must be bound to current context in EGL 1.4 */
-   if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface)
+   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
+       surf != ctx->DrawSurface)
       RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
 
    ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects);
@@ -1463,7 +1468,7 @@ eglCreateDRMImageMESA(EGLDisplay dpy, const EGLint *attr_list)
       RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
 
    img = drv->API.CreateDRMImageMESA(drv, disp, attr_list);
-   ret = (img) ? _eglLinkImage(img, disp) : EGL_NO_IMAGE_KHR;
+   ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
 
    RETURN_EGL_EVAL(disp, ret);
 }
index fe92efc11ee25913c9169fb5d4507d0f8f339911..c8309fb066a760be3e0554ff01002382d4a31ae4 100644 (file)
@@ -37,7 +37,7 @@ void *
 _eglFindArray(_EGLArray *array, void *elem);
 
 
-void **
+PUBLIC void **
 _eglFilterArray(_EGLArray *array, EGLint *size,
                 _EGLArrayForEach filter, void *filter_data);
 
index 4d313a9bb5b44e29cdd6f3e513dbad1e250b9468..fec94fb20cd52f70086e39f27fa65d99961aa260 100644 (file)
@@ -40,16 +40,18 @@ _eglInitConfig(_EGLConfig *conf, _EGLDisplay *dpy, EGLint id)
 
 
 /**
- * Link a config to a display and return the handle of the link.
+ * Link a config to its display and return the handle of the link.
  * The handle can be passed to client directly.
  *
  * Note that we just save the ptr to the config (we don't copy the config).
  */
-EGLConfig
-_eglAddConfig(_EGLDisplay *dpy, _EGLConfig *conf)
+PUBLIC EGLConfig
+_eglLinkConfig(_EGLConfig *conf)
 {
+   _EGLDisplay *dpy = conf->Display;
+
    /* sanity check */
-   assert(conf->ConfigID > 0);
+   assert(dpy && conf->ConfigID > 0);
 
    if (!dpy->Configs) {
       dpy->Configs = _eglCreateArray("Config", 16);
@@ -57,23 +59,29 @@ _eglAddConfig(_EGLDisplay *dpy, _EGLConfig *conf)
          return (EGLConfig) NULL;
    }
 
-   conf->Display = dpy;
    _eglAppendArray(dpy->Configs, (void *) conf);
 
    return (EGLConfig) conf;
 }
 
 
-EGLBoolean
-_eglCheckConfigHandle(EGLConfig config, _EGLDisplay *dpy)
+/**
+ * Lookup a handle to find the linked config.
+ * Return NULL if the handle has no corresponding linked config.
+ */
+_EGLConfig *
+_eglLookupConfig(EGLConfig config, _EGLDisplay *dpy)
 {
    _EGLConfig *conf;
 
+   if (!dpy)
+      return NULL;
+
    conf = (_EGLConfig *) _eglFindArray(dpy->Configs, (void *) config);
    if (conf)
       assert(conf->Display == dpy);
 
-   return (conf != NULL);
+   return conf;
 }
 
 
@@ -464,10 +472,13 @@ _eglIsConfigAttribValid(_EGLConfig *conf, EGLint attr)
  * Return EGL_FALSE if any of the attribute is invalid.
  */
 EGLBoolean
-_eglParseConfigAttribList(_EGLConfig *conf, const EGLint *attrib_list)
+_eglParseConfigAttribList(_EGLConfig *conf, _EGLDisplay *dpy,
+                          const EGLint *attrib_list)
 {
    EGLint attr, val, i;
 
+   _eglInitConfig(conf, dpy, EGL_DONT_CARE);
+
    /* reset to default values */
    for (i = 0; i < ARRAY_SIZE(_eglValidationTable); i++) {
       attr = _eglValidationTable[i].attr;
@@ -494,7 +505,7 @@ _eglParseConfigAttribList(_EGLConfig *conf, const EGLint *attrib_list)
       return EGL_FALSE;
 
    /* ignore other attributes when EGL_CONFIG_ID is given */
-   if (conf->ConfigID > 0) {
+   if (conf->ConfigID != EGL_DONT_CARE) {
       for (i = 0; i < ARRAY_SIZE(_eglValidationTable); i++) {
          attr = _eglValidationTable[i].attr;
          if (attr != EGL_CONFIG_ID)
@@ -683,8 +694,7 @@ _eglChooseConfig(_EGLDriver *drv, _EGLDisplay *disp, const EGLint *attrib_list,
    if (!num_configs)
       return _eglError(EGL_BAD_PARAMETER, "eglChooseConfigs");
 
-   _eglInitConfig(&criteria, disp, 0);
-   if (!_eglParseConfigAttribList(&criteria, attrib_list))
+   if (!_eglParseConfigAttribList(&criteria, disp, attrib_list))
       return _eglError(EGL_BAD_ATTRIBUTE, "eglChooseConfig");
 
    configList = (_EGLConfig **) _eglFilterArray(disp->Configs, &count,
index 892815fa6310b9caf055fb3d628266ba687cd32e..2169960fd1df478849ed92ed6e64066189fc64d2 100644 (file)
@@ -3,6 +3,7 @@
 
 
 #include <assert.h>
+#include <stddef.h>
 #include "egltypedefs.h"
 
 
@@ -136,34 +137,20 @@ _eglInitConfig(_EGLConfig *config, _EGLDisplay *dpy, EGLint id);
 
 
 PUBLIC EGLConfig
-_eglAddConfig(_EGLDisplay *dpy, _EGLConfig *conf);
+_eglLinkConfig(_EGLConfig *conf);
 
 
-extern EGLBoolean
-_eglCheckConfigHandle(EGLConfig config, _EGLDisplay *dpy);
-
-
-/**
- * Lookup a handle to find the linked config.
- * Return NULL if the handle has no corresponding linked config.
- */
-static INLINE _EGLConfig *
-_eglLookupConfig(EGLConfig config, _EGLDisplay *dpy)
-{
-   _EGLConfig *conf = (_EGLConfig *) config;
-   if (!dpy || !_eglCheckConfigHandle(config, dpy))
-      conf = NULL;
-   return conf;
-}
+extern _EGLConfig *
+_eglLookupConfig(EGLConfig config, _EGLDisplay *dpy);
 
 
 /**
- * Return the handle of a linked config, or NULL.
+ * Return the handle of a linked config.
  */
 static INLINE EGLConfig
 _eglGetConfigHandle(_EGLConfig *conf)
 {
-   return (EGLConfig) ((conf && conf->Display) ? conf : NULL);
+   return (EGLConfig) conf;
 }
 
 
@@ -176,7 +163,8 @@ _eglMatchConfig(const _EGLConfig *conf, const _EGLConfig *criteria);
 
 
 PUBLIC EGLBoolean
-_eglParseConfigAttribList(_EGLConfig *conf, const EGLint *attrib_list);
+_eglParseConfigAttribList(_EGLConfig *conf, _EGLDisplay *dpy,
+                          const EGLint *attrib_list);
 
 
 PUBLIC EGLint
index 113e4e48fb35b3c237b05d108c6663abfd778b34..33dcfa68756b770555ae169e2ca97a262e5af5e8 100644 (file)
@@ -103,8 +103,7 @@ _eglInitContext(_EGLContext *ctx, _EGLDisplay *dpy, _EGLConfig *conf,
       return EGL_FALSE;
    }
 
-   memset(ctx, 0, sizeof(_EGLContext));
-   ctx->Resource.Display = dpy;
+   _eglInitResource(&ctx->Resource, sizeof(*ctx), dpy);
    ctx->ClientAPI = api;
    ctx->Config = conf;
    ctx->WindowRenderBuffer = EGL_NONE;
@@ -250,10 +249,6 @@ _eglCheckMakeCurrent(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read)
    if (!surfaceless && (draw == NULL || read == NULL))
       return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
 
-   /* context stealing from another thread is not allowed */
-   if (ctx->Binding && ctx->Binding != t)
-      return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
-
    /*
     * The spec says
     *
@@ -261,16 +256,23 @@ _eglCheckMakeCurrent(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read)
     * bound to contexts in another thread, an EGL_BAD_ACCESS error is
     * generated."
     *
-    * But it also says
+    * and
     *
     * "at most one context may be bound to a particular surface at a given
     * time"
-    *
-    * The latter is more restrictive so we can check only the latter case.
     */
-   if ((draw && draw->CurrentContext && draw->CurrentContext != ctx) ||
-       (read && read->CurrentContext && read->CurrentContext != ctx))
+   if (ctx->Binding && ctx->Binding != t)
       return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
+   if (draw && draw->CurrentContext && draw->CurrentContext != ctx) {
+      if (draw->CurrentContext->Binding != t ||
+          draw->CurrentContext->ClientAPI != ctx->ClientAPI)
+         return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
+   }
+   if (read && read->CurrentContext && read->CurrentContext != ctx) {
+      if (read->CurrentContext->Binding != t ||
+          read->CurrentContext->ClientAPI != ctx->ClientAPI)
+         return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
+   }
 
    /* simply require the configs to be equal */
    if ((draw && draw->Config != ctx->Config) ||
@@ -301,54 +303,65 @@ _eglCheckMakeCurrent(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read)
 
 /**
  * Bind the context to the current thread and given surfaces.  Return the
- * "orphaned" context and surfaces.  Each argument is both input and output.
+ * previous bound context and surfaces.  The caller should unreference the
+ * returned context and surfaces.
+ *
+ * Making a second call with the resources returned by the first call
+ * unsurprisingly undoes the first call, except for the resouce reference
+ * counts.
  */
 EGLBoolean
-_eglBindContext(_EGLContext **ctx, _EGLSurface **draw, _EGLSurface **read)
+_eglBindContext(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read,
+                _EGLContext **old_ctx,
+                _EGLSurface **old_draw, _EGLSurface **old_read)
 {
    _EGLThreadInfo *t = _eglGetCurrentThread();
-   _EGLContext *newCtx = *ctx, *oldCtx;
-   _EGLSurface *newDraw = *draw, *newRead = *read;
+   _EGLContext *prev_ctx;
+   _EGLSurface *prev_draw, *prev_read;
 
-   if (!_eglCheckMakeCurrent(newCtx, newDraw, newRead))
+   if (!_eglCheckMakeCurrent(ctx, draw, read))
       return EGL_FALSE;
 
+   /* increment refcounts before binding */
+   _eglGetContext(ctx);
+   _eglGetSurface(draw);
+   _eglGetSurface(read);
+
    /* bind the new context */
-   oldCtx = _eglBindContextToThread(newCtx, t);
+   prev_ctx = _eglBindContextToThread(ctx, t);
 
-   /* break old bindings */
-   if (oldCtx) {
-      *ctx = oldCtx;
-      *draw = oldCtx->DrawSurface;
-      *read = oldCtx->ReadSurface;
+   /* break previous bindings */
+   if (prev_ctx) {
+      prev_draw = prev_ctx->DrawSurface;
+      prev_read = prev_ctx->ReadSurface;
 
-      if (*draw)
-         (*draw)->CurrentContext = NULL;
-      if (*read)
-         (*read)->CurrentContext = NULL;
+      if (prev_draw)
+         prev_draw->CurrentContext = NULL;
+      if (prev_read)
+         prev_read->CurrentContext = NULL;
 
-      oldCtx->DrawSurface = NULL;
-      oldCtx->ReadSurface = NULL;
+      prev_ctx->DrawSurface = NULL;
+      prev_ctx->ReadSurface = NULL;
+   }
+   else {
+      prev_draw = prev_read = NULL;
    }
 
    /* establish new bindings */
-   if (newCtx) {
-      if (newDraw)
-         newDraw->CurrentContext = newCtx;
-      if (newRead)
-         newRead->CurrentContext = newCtx;
-
-      newCtx->DrawSurface = newDraw;
-      newCtx->ReadSurface = newRead;
+   if (ctx) {
+      if (draw)
+         draw->CurrentContext = ctx;
+      if (read)
+         read->CurrentContext = ctx;
+
+      ctx->DrawSurface = draw;
+      ctx->ReadSurface = read;
    }
 
-   /* an old context or surface is not orphaned if it is still bound */
-   if (*ctx == newCtx)
-      *ctx = NULL;
-   if (*draw == newDraw || *draw == newRead)
-      *draw = NULL;
-   if (*read == newDraw || *read == newRead)
-      *read = NULL;
+   assert(old_ctx && old_draw && old_read);
+   *old_ctx = prev_ctx;
+   *old_draw = prev_draw;
+   *old_read = prev_read;
 
    return EGL_TRUE;
 }
index 148f160cae0603238d163bf731bbeacb2f14e773..8cd0df173135bd69079541114619bf5dc13ad021 100644 (file)
@@ -39,30 +39,41 @@ _eglQueryContext(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx, EGLint att
 
 
 PUBLIC EGLBoolean
-_eglBindContext(_EGLContext **ctx, _EGLSurface **draw, _EGLSurface **read);
+_eglBindContext(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read,
+                _EGLContext **old_ctx,
+                _EGLSurface **old_draw, _EGLSurface **old_read);
 
 
 /**
- * Return true if the context is bound to a thread.
- *
- * The binding is considered a reference to the context.  Drivers should not
- * destroy a context when it is bound.
+ * Increment reference count for the context.
+ */
+static INLINE _EGLContext *
+_eglGetContext(_EGLContext *ctx)
+{
+   if (ctx)
+      _eglGetResource(&ctx->Resource);
+   return ctx;
+}
+
+
+/**
+ * Decrement reference count for the context.
  */
 static INLINE EGLBoolean
-_eglIsContextBound(_EGLContext *ctx)
+_eglPutContext(_EGLContext *ctx)
 {
-   return (ctx->Binding != NULL);
+   return (ctx) ? _eglPutResource(&ctx->Resource) : EGL_FALSE;
 }
 
 
 /**
- * Link a context to a display and return the handle of the link.
+ * Link a context to its display and return the handle of the link.
  * The handle can be passed to client directly.
  */
 static INLINE EGLContext
-_eglLinkContext(_EGLContext *ctx, _EGLDisplay *dpy)
+_eglLinkContext(_EGLContext *ctx)
 {
-   _eglLinkResource(&ctx->Resource, _EGL_RESOURCE_CONTEXT, dpy);
+   _eglLinkResource(&ctx->Resource, _EGL_RESOURCE_CONTEXT);
    return (EGLContext) ctx;
 }
 
@@ -104,18 +115,4 @@ _eglGetContextHandle(_EGLContext *ctx)
 }
 
 
-/**
- * Return true if the context is linked to a display.
- *
- * The link is considered a reference to the context (the display is owning the
- * context).  Drivers should not destroy a context when it is linked.
- */
-static INLINE EGLBoolean
-_eglIsContextLinked(_EGLContext *ctx)
-{
-   _EGLResource *res = (_EGLResource *) ctx;
-   return (res && _eglIsResourceLinked(res));
-}
-
-
 #endif /* EGLCONTEXT_INCLUDED */
index c0e8c119a94c306997bb8330f85e165ac6ef581f..cbca9ff2c2f4c6a8e953aa148ec11de724b12d09 100644 (file)
 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 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
+#if PTHREADS
 #include <pthread.h>
 
 static _EGL_DECLARE_MUTEX(_egl_TSDMutex);
@@ -48,14 +22,26 @@ static EGLBoolean _egl_TSDInitialized;
 static pthread_key_t _egl_TSD;
 static void (*_egl_FreeTSD)(_EGLThreadInfo *);
 
+#ifdef GLX_USE_TLS
+static __thread const _EGLThreadInfo *_egl_TLS
+   __attribute__ ((tls_model("initial-exec")));
+#endif
+
 static INLINE void _eglSetTSD(const _EGLThreadInfo *t)
 {
    pthread_setspecific(_egl_TSD, (const void *) t);
+#ifdef GLX_USE_TLS
+   _egl_TLS = t;
+#endif
 }
 
 static INLINE _EGLThreadInfo *_eglGetTSD(void)
 {
+#ifdef GLX_USE_TLS
+   return (_EGLThreadInfo *) _egl_TLS;
+#else
    return (_EGLThreadInfo *) pthread_getspecific(_egl_TSD);
+#endif
 }
 
 static INLINE void _eglFiniTSD(void)
index cc0f03e01ba3218305f091d28c8cc85df7fba5ab..565e44d2d23c8fc98d292aaa77983772042d2bdb 100644 (file)
@@ -233,17 +233,53 @@ _eglCheckResource(void *res, _EGLResourceType type, _EGLDisplay *dpy)
 
 
 /**
- * Link a resource to a display.
+ * Initialize a display resource.
  */
 void
-_eglLinkResource(_EGLResource *res, _EGLResourceType type, _EGLDisplay *dpy)
+_eglInitResource(_EGLResource *res, EGLint size, _EGLDisplay *dpy)
 {
-   assert(!res->Display || res->Display == dpy);
-
+   memset(res, 0, size);
    res->Display = dpy;
+   res->RefCount = 1;
+}
+
+
+/**
+ * Increment reference count for the resource.
+ */
+void
+_eglGetResource(_EGLResource *res)
+{
+   assert(res && res->RefCount > 0);
+   /* hopefully a resource is always manipulated with its display locked */
+   res->RefCount++;
+}
+
+
+/**
+ * Decrement reference count for the resource.
+ */
+EGLBoolean
+_eglPutResource(_EGLResource *res)
+{
+   assert(res && res->RefCount > 0);
+   res->RefCount--;
+   return (!res->RefCount);
+}
+
+
+/**
+ * Link a resource to its display.
+ */
+void
+_eglLinkResource(_EGLResource *res, _EGLResourceType type)
+{
+   assert(res->Display);
+
    res->IsLinked = EGL_TRUE;
-   res->Next = dpy->ResourceLists[type];
-   dpy->ResourceLists[type] = res;
+   res->Next = res->Display->ResourceLists[type];
+   res->Display->ResourceLists[type] = res;
+   _eglGetResource(res);
 }
 
 
@@ -270,6 +306,9 @@ _eglUnlinkResource(_EGLResource *res, _EGLResourceType type)
    }
 
    res->Next = NULL;
-   /* do not reset res->Display */
    res->IsLinked = EGL_FALSE;
+   _eglPutResource(res);
+
+   /* We always unlink before destroy.  The driver still owns a reference */
+   assert(res->RefCount);
 }
index 3863cce0108f99724a06040920d8b99491bbf5db..bcba05480a86676f9599a75e250c049f120a46d2 100644 (file)
@@ -40,6 +40,7 @@ struct _egl_resource
    /* which display the resource belongs to */
    _EGLDisplay *Display;
    EGLBoolean IsLinked;
+   EGLint RefCount;
 
    /* used to link resources of the same type */
    _EGLResource *Next;
@@ -162,7 +163,19 @@ _eglGetDisplayHandle(_EGLDisplay *dpy)
 
 
 extern void
-_eglLinkResource(_EGLResource *res, _EGLResourceType type, _EGLDisplay *dpy);
+_eglInitResource(_EGLResource *res, EGLint size, _EGLDisplay *dpy);
+
+
+PUBLIC void
+_eglGetResource(_EGLResource *res);
+
+
+PUBLIC EGLBoolean
+_eglPutResource(_EGLResource *res);
+
+
+extern void
+_eglLinkResource(_EGLResource *res, _EGLResourceType type);
 
 
 extern void
index 2359253ff137a0350fead125cba3a76370fa25af..ff0011c4b15f3e0913e19a59b5061183daa5085c 100644 (file)
@@ -395,35 +395,62 @@ _eglPreloadForEach(const char *search_path,
 static const char *
 _eglGetSearchPath(void)
 {
-   static const char *search_path;
+   static char search_path[1024];
 
 #if defined(_EGL_OS_UNIX) || defined(_EGL_OS_WINDOWS)
-   if (!search_path) {
-      static char buffer[1024];
-      const char *p;
+   if (search_path[0] == '\0') {
+      char *buf = search_path;
+      size_t len = sizeof(search_path);
+      EGLBoolean use_env;
+      char dir_sep;
       int ret;
 
-      p = getenv("EGL_DRIVERS_PATH");
 #if defined(_EGL_OS_UNIX)
-      if (p && (geteuid() != getuid() || getegid() != getgid())) {
+      use_env = (geteuid() == getuid() && getegid() == getgid());
+      dir_sep = '/';
+#else
+      use_env = EGL_TRUE;
+      dir_sep = '\\';
+#endif
+
+      if (use_env) {
+         char *p;
+
+         /* extract the dirname from EGL_DRIVER */
+         p = getenv("EGL_DRIVER");
+         if (p && strchr(p, dir_sep)) {
+            ret = _eglsnprintf(buf, len, "%s", p);
+            if (ret > 0 && ret < len) {
+               p = strrchr(buf, dir_sep);
+               *p++ = ':';
+
+               len -= p - buf;
+               buf = p;
+            }
+         }
+
+         /* append EGL_DRIVERS_PATH */
+         p = getenv("EGL_DRIVERS_PATH");
+         if (p) {
+            ret = _eglsnprintf(buf, len, "%s:", p);
+            if (ret > 0 && ret < len) {
+               buf += ret;
+               len -= ret;
+            }
+         }
+      }
+      else {
          _eglLog(_EGL_DEBUG,
                "ignore EGL_DRIVERS_PATH for setuid/setgid binaries");
-         p = NULL;
       }
-#endif /* _EGL_OS_UNIX */
 
-      if (p) {
-         ret = _eglsnprintf(buffer, sizeof(buffer),
-               "%s:%s", p, _EGL_DRIVER_SEARCH_DIR);
-         if (ret > 0 && ret < sizeof(buffer))
-            search_path = buffer;
-      }
+      ret = _eglsnprintf(buf, len, "%s", _EGL_DRIVER_SEARCH_DIR);
+      if (ret < 0 || ret >= len)
+         search_path[0] = '\0';
+
+      _eglLog(_EGL_DEBUG, "EGL search path is %s", search_path);
    }
-   if (!search_path)
-      search_path = _EGL_DRIVER_SEARCH_DIR;
-#else
-   search_path = "";
-#endif
+#endif /* defined(_EGL_OS_UNIX) || defined(_EGL_OS_WINDOWS) */
 
    return search_path;
 }
index 1ca7c6cd9368e2a12129d570f907020e894f0228..1a0aaad1f8c2b27b9ad0b4041e3debbdc222f990 100644 (file)
@@ -4,7 +4,7 @@
 
 #include "egltypedefs.h"
 #include "eglapi.h"
-
+#include <stddef.h>
 
 /**
  * Define an inline driver typecast function.
index af4a29fb0e2463c74a6bcc0688030984ba353550..6d4ee4e08b92bb4e9dfff30469b6b905f2341494 100644 (file)
@@ -2,7 +2,6 @@
 #include <string.h>
 
 #include "eglimage.h"
-#include "eglcurrent.h"
 #include "egllog.h"
 
 
@@ -81,8 +80,7 @@ _eglParseImageAttribList(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
 EGLBoolean
 _eglInitImage(_EGLImage *img, _EGLDisplay *dpy)
 {
-   memset(img, 0, sizeof(_EGLImage));
-   img->Resource.Display = dpy;
+   _eglInitResource(&img->Resource, sizeof(*img), dpy);
 
    return EGL_TRUE;
 }
index 7cd92c112540b62d14d990210dcbdde5787432ee..adb939a9e02332944f8601d9a232d70fdc333217 100644 (file)
@@ -43,13 +43,35 @@ _eglInitImage(_EGLImage *img, _EGLDisplay *dpy);
 
 
 /**
- * Link an image to a display and return the handle of the link.
+ * Increment reference count for the image.
+ */
+static INLINE _EGLImage *
+_eglGetImage(_EGLImage *img)
+{
+   if (img)
+      _eglGetResource(&img->Resource);
+   return img;
+}
+
+
+/**
+ * Decrement reference count for the image.
+ */
+static INLINE EGLBoolean
+_eglPutImage(_EGLImage *img)
+{
+   return (img) ? _eglPutResource(&img->Resource) : EGL_FALSE;
+}
+
+
+/**
+ * Link an image to its display and return the handle of the link.
  * The handle can be passed to client directly.
  */
 static INLINE EGLImageKHR
-_eglLinkImage(_EGLImage *img, _EGLDisplay *dpy)
+_eglLinkImage(_EGLImage *img)
 {
-   _eglLinkResource(&img->Resource, _EGL_RESOURCE_IMAGE, dpy);
+   _eglLinkResource(&img->Resource, _EGL_RESOURCE_IMAGE);
    return (EGLImageKHR) img;
 }
 
@@ -91,15 +113,4 @@ _eglGetImageHandle(_EGLImage *img)
 }
 
 
-/**
- * Return true if the image is linked to a display.
- */
-static INLINE EGLBoolean
-_eglIsImageLinked(_EGLImage *img)
-{
-   _EGLResource *res = (_EGLResource *) img;
-   return (res && _eglIsResourceLinked(res));
-}
-
-
 #endif /* EGLIMAGE_INCLUDED */
index 8f3bae2243d9e512a591bf3c836163137def0d5f..12c55f901a576cc0706f797df68fc8dfa8d03e93 100644 (file)
@@ -151,6 +151,7 @@ _eglLog(EGLint level, const char *fmtStr, ...)
 {
    va_list args;
    char msg[MAXSTRING];
+   int ret;
 
    /* one-time initialization; a little race here is fine */
    if (!logging.initialized)
@@ -162,7 +163,9 @@ _eglLog(EGLint level, const char *fmtStr, ...)
 
    if (logging.logger) {
       va_start(args, fmtStr);
-      vsnprintf(msg, MAXSTRING, fmtStr, args);
+      ret = vsnprintf(msg, MAXSTRING, fmtStr, args);
+      if (ret < 0 || ret >= MAXSTRING)
+         strcpy(msg, "<message truncated>");
       va_end(args);
 
       logging.logger(level, msg);
index ed107d5d7a71ace28dd51d245fc5af7c0a183566..a9653496c3270a5036a0b4d7932ea9d34b8adeff 100644 (file)
@@ -3,11 +3,9 @@
 #include <string.h>
 
 #include "egldisplay.h"
-#include "egldriver.h"
 #include "eglmode.h"
 #include "eglcurrent.h"
 #include "eglscreen.h"
-#include "eglstring.h"
 
 
 #ifdef EGL_MESA_screen_surface
@@ -31,56 +29,24 @@ _eglLookupMode(EGLModeMESA mode, _EGLDisplay *disp)
    /* loop over all screens on the display */
    for (scrnum = 0; scrnum < disp->Screens->Size; scrnum++) {
       const _EGLScreen *scrn = disp->Screens->Elements[scrnum];
-      EGLint i;
-      /* search list of modes for handle */
-      for (i = 0; i < scrn->NumModes; i++) {
-         if (scrn->Modes[i].Handle == mode) {
-            return scrn->Modes + i;
-         }
-      }
-   }
+      EGLint idx;
 
-   return NULL;
-}
+      /*
+       * the mode ids of a screen ranges from scrn->Handle to scrn->Handle +
+       * scrn->NumModes
+       */
+      if (mode >= scrn->Handle &&
+          mode < scrn->Handle + _EGL_SCREEN_MAX_MODES) {
+         idx = mode - scrn->Handle;
 
+         assert(idx < scrn->NumModes && scrn->Modes[idx].Handle == mode);
 
-/**
- * Add a new mode with the given attributes (width, height, depth, refreshRate)
- * to the given screen.
- * Assign a new mode ID/handle to the mode as well.
- * \return pointer to the new _EGLMode
- */
-_EGLMode *
-_eglAddNewMode(_EGLScreen *screen, EGLint width, EGLint height,
-               EGLint refreshRate, const char *name)
-{
-   EGLint n;
-   _EGLMode *newModes;
-
-   assert(screen);
-   assert(width > 0);
-   assert(height > 0);
-   assert(refreshRate > 0);
-
-   n = screen->NumModes;
-   newModes = (_EGLMode *) realloc(screen->Modes, (n+1) * sizeof(_EGLMode));
-   if (newModes) {
-      screen->Modes = newModes;
-      screen->Modes[n].Handle = n + 1;
-      screen->Modes[n].Width = width;
-      screen->Modes[n].Height = height;
-      screen->Modes[n].RefreshRate = refreshRate;
-      screen->Modes[n].Optimal = EGL_FALSE;
-      screen->Modes[n].Interlaced = EGL_FALSE;
-      screen->Modes[n].Name = _eglstrdup(name);
-      screen->NumModes++;
-      return screen->Modes + n;
-   }
-   else {
-      return NULL;
+         return &scrn->Modes[idx];
+      }
    }
-}
 
+   return NULL;
+}
 
 
 /**
index 9167cbc4b9b93030486769938b24e9c0b29ee23f..ed4eb2c34af429a6f56baa516615d9c70307ea0c 100644 (file)
@@ -32,11 +32,6 @@ extern _EGLMode *
 _eglLookupMode(EGLModeMESA mode, _EGLDisplay *dpy);
 
 
-PUBLIC _EGLMode *
-_eglAddNewMode(_EGLScreen *screen, EGLint width, EGLint height,
-               EGLint refreshRate, const char *name);
-
-
 extern EGLBoolean
 _eglChooseModeMESA(_EGLDriver *drv, _EGLDisplay *dpy, _EGLScreen *scrn,
                    const EGLint *attrib_list, EGLModeMESA *modes,
index 2ae403494e2a60c13052ba700a6b54debcf4ca72..3abe85ff22f1ab0210a71429c99f824409955e2b 100644 (file)
@@ -18,7 +18,6 @@
 #include "egldisplay.h"
 #include "eglcurrent.h"
 #include "eglmode.h"
-#include "eglconfig.h"
 #include "eglsurface.h"
 #include "eglscreen.h"
 #include "eglmutex.h"
@@ -42,7 +41,8 @@ _eglAllocScreenHandle(void)
    EGLScreenMESA s;
 
    _eglLockMutex(&_eglNextScreenHandleMutex);
-   s = _eglNextScreenHandle++;
+   s = _eglNextScreenHandle;
+   _eglNextScreenHandle += _EGL_SCREEN_MAX_MODES;
    _eglUnlockMutex(&_eglNextScreenHandleMutex);
 
    return s;
@@ -53,60 +53,80 @@ _eglAllocScreenHandle(void)
  * Initialize an _EGLScreen object to default values.
  */
 void
-_eglInitScreen(_EGLScreen *screen)
+_eglInitScreen(_EGLScreen *screen, _EGLDisplay *dpy, EGLint num_modes)
 {
    memset(screen, 0, sizeof(_EGLScreen));
+
+   screen->Display = dpy;
+   screen->NumModes = num_modes;
    screen->StepX = 1;
    screen->StepY = 1;
+
+   if (num_modes > _EGL_SCREEN_MAX_MODES)
+      num_modes = _EGL_SCREEN_MAX_MODES;
+   screen->Modes = (_EGLMode *) calloc(num_modes, sizeof(*screen->Modes));
+   screen->NumModes = (screen->Modes) ? num_modes : 0;
 }
 
 
 /**
- * Given a public screen handle, return the internal _EGLScreen object.
+ * Link a screen to its display and return the handle of the link.
+ * The handle can be passed to client directly.
  */
-_EGLScreen *
-_eglLookupScreen(EGLScreenMESA screen, _EGLDisplay *display)
+EGLScreenMESA
+_eglLinkScreen(_EGLScreen *screen)
 {
+   _EGLDisplay *display;
    EGLint i;
 
-   if (!display || !display->Screens)
-      return NULL;
+   assert(screen && screen->Display);
+   display = screen->Display;
 
-   for (i = 0; i < display->Screens->Size; i++) {
-      _EGLScreen *scr = (_EGLScreen *) display->Screens->Elements[i];
-      if (scr->Handle == screen)
-         return scr;
+   if (!display->Screens) {
+      display->Screens = _eglCreateArray("Screen", 4);
+      if (!display->Screens)
+         return (EGLScreenMESA) 0;
    }
-   return NULL;
+
+   screen->Handle = _eglAllocScreenHandle();
+   for (i = 0; i < screen->NumModes; i++)
+      screen->Modes[i].Handle = screen->Handle + i;
+
+   _eglAppendArray(display->Screens, (void *) screen);
+
+   return screen->Handle;
 }
 
 
 /**
- * Add the given _EGLScreen to the display's list of screens.
+ * Lookup a handle to find the linked config.
+ * Return NULL if the handle has no corresponding linked config.
  */
-void
-_eglAddScreen(_EGLDisplay *display, _EGLScreen *screen)
+_EGLScreen *
+_eglLookupScreen(EGLScreenMESA screen, _EGLDisplay *display)
 {
-   assert(display);
-   assert(screen);
+   EGLint i;
 
-   if (!display->Screens) {
-      display->Screens = _eglCreateArray("Screen", 4);
-      if (!display->Screens)
-         return;
+   if (!display || !display->Screens)
+      return NULL;
+
+   for (i = 0; i < display->Screens->Size; i++) {
+      _EGLScreen *scr = (_EGLScreen *) display->Screens->Elements[i];
+      if (scr->Handle == screen) {
+         assert(scr->Display == display);
+         return scr;
+      }
    }
-   screen->Handle = _eglAllocScreenHandle();
-   _eglAppendArray(display->Screens, (void *) screen);
+   return NULL;
 }
 
 
-
 static EGLBoolean
 _eglFlattenScreen(void *elem, void *buffer)
 {
    _EGLScreen *scr = (_EGLScreen *) elem;
    EGLScreenMESA *handle = (EGLScreenMESA *) buffer;
-   *handle = scr->Handle;
+   *handle = _eglGetScreenHandle(scr);
    return EGL_TRUE;
 }
 
@@ -122,22 +142,6 @@ _eglGetScreensMESA(_EGLDriver *drv, _EGLDisplay *display, EGLScreenMESA *screens
 }
 
 
-/**
- * Set a screen's current display mode.
- * Note: mode = EGL_NO_MODE is valid (turns off the screen)
- *
- * This is just a placeholder function; drivers will always override
- * this with code that _really_ sets the mode.
- */
-EGLBoolean
-_eglScreenModeMESA(_EGLDriver *drv, _EGLDisplay *dpy, _EGLScreen *scrn,
-                   _EGLMode *m)
-{
-   scrn->CurrentMode = m;
-   return EGL_TRUE;
-}
-
-
 /**
  * Set a screen's surface origin.
  */
@@ -198,33 +202,4 @@ _eglQueryScreenMESA(_EGLDriver *drv, _EGLDisplay *dpy, _EGLScreen *scrn,
 }
 
 
-/**
- * Delete the modes associated with given screen.
- */
-void
-_eglDestroyScreenModes(_EGLScreen *scrn)
-{
-   EGLint i;
-   for (i = 0; i < scrn->NumModes; i++) {
-      if (scrn->Modes[i].Name)
-         free((char *) scrn->Modes[i].Name); /* cast away const */
-   }
-   if (scrn->Modes)
-      free(scrn->Modes);
-   scrn->Modes = NULL;
-   scrn->NumModes = 0;
-}
-
-      
-/**
- * Default fallback routine - drivers should usually override this.
- */
-void
-_eglDestroyScreen(_EGLScreen *scrn)
-{
-   _eglDestroyScreenModes(scrn);
-   free(scrn);
-}
-
-
 #endif /* EGL_MESA_screen_surface */
index e564793e511273fa89403f8a418184218ca139ad..2a99f23c50a24952e0c3d1b05ebd85c41e503a3b 100644 (file)
@@ -8,6 +8,9 @@
 #ifdef EGL_MESA_screen_surface
 
 
+#define _EGL_SCREEN_MAX_MODES 16
+
+
 /**
  * Per-screen information.
  * Note that an EGL screen doesn't have a size.  A screen may be set to
@@ -19,6 +22,8 @@
  */
 struct _egl_screen
 {
+   _EGLDisplay *Display;
+
    EGLScreenMESA Handle; /* The public/opaque handle which names this object */
 
    _EGLMode *CurrentMode;
@@ -33,33 +38,35 @@ struct _egl_screen
 
 
 PUBLIC void
-_eglInitScreen(_EGLScreen *screen);
+_eglInitScreen(_EGLScreen *screen, _EGLDisplay *dpy, EGLint num_modes);
+
+
+PUBLIC EGLScreenMESA
+_eglLinkScreen(_EGLScreen *screen);
 
 
 extern _EGLScreen *
 _eglLookupScreen(EGLScreenMESA screen, _EGLDisplay *dpy);
 
 
-PUBLIC void
-_eglAddScreen(_EGLDisplay *display, _EGLScreen *screen);
+/**
+ * Return the handle of a linked screen.
+ */
+static INLINE EGLScreenMESA
+_eglGetScreenHandle(_EGLScreen *screen)
+{
+   return (screen) ? screen->Handle : (EGLScreenMESA) 0;
+}
 
 
 extern EGLBoolean
 _eglGetScreensMESA(_EGLDriver *drv, _EGLDisplay *dpy, EGLScreenMESA *screens, EGLint max_screens, EGLint *num_screens);
 
 
-extern EGLBoolean
-_eglScreenModeMESA(_EGLDriver *drv, _EGLDisplay *dpy, _EGLScreen *scrn, _EGLMode *m);
-
-
 extern EGLBoolean
 _eglScreenPositionMESA(_EGLDriver *drv, _EGLDisplay *dpy, _EGLScreen *scrn, EGLint x, EGLint y);
 
 
-extern EGLBoolean
-_eglQueryDisplayMESA(_EGLDriver *drv, _EGLDisplay *dpy, EGLint attribute, EGLint *value);
-
-
 extern EGLBoolean
 _eglQueryScreenSurfaceMESA(_EGLDriver *drv, _EGLDisplay *dpy,
                            _EGLScreen *scrn, _EGLSurface **surface);
@@ -73,14 +80,6 @@ extern EGLBoolean
 _eglQueryScreenMESA(_EGLDriver *drv, _EGLDisplay *dpy, _EGLScreen *scrn, EGLint attribute, EGLint *value);
 
 
-extern void
-_eglDestroyScreenModes(_EGLScreen *scrn);
-
-
-PUBLIC void
-_eglDestroyScreen(_EGLScreen *scrn);
-
-
 #endif /* EGL_MESA_screen_surface */
 
 
index 74f10230eaada4f9c35965cf860818f275d1146e..cc505045e12967a19faeacf2310638cdbdd0dda6 100644 (file)
@@ -269,8 +269,7 @@ _eglInitSurface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type,
       return EGL_FALSE;
    }
 
-   memset(surf, 0, sizeof(_EGLSurface));
-   surf->Resource.Display = dpy;
+   _eglInitResource(&surf->Resource, sizeof(*surf), dpy);
    surf->Type = type;
    surf->Config = conf;
 
index 729499e80a31da1bdb27cdc415749a3fc44ad495..ef01b32ede3d1892ed54a86d08d80757e0bc6a46 100644 (file)
@@ -68,26 +68,35 @@ _eglSwapInterval(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint in
 
 
 /**
- * Return true if there is a context bound to the surface.
- *
- * The binding is considered a reference to the surface.  Drivers should not
- * destroy a surface when it is bound.
+ * Increment reference count for the surface.
+ */
+static INLINE _EGLSurface *
+_eglGetSurface(_EGLSurface *surf)
+{
+   if (surf)
+      _eglGetResource(&surf->Resource);
+   return surf;
+}
+
+
+/**
+ * Decrement reference count for the surface.
  */
 static INLINE EGLBoolean
-_eglIsSurfaceBound(_EGLSurface *surf)
+_eglPutSurface(_EGLSurface *surf)
 {
-   return (surf->CurrentContext != NULL);
+   return (surf) ? _eglPutResource(&surf->Resource) : EGL_FALSE;
 }
 
 
 /**
- * Link a surface to a display and return the handle of the link.
+ * Link a surface to its display and return the handle of the link.
  * The handle can be passed to client directly.
  */
 static INLINE EGLSurface
-_eglLinkSurface(_EGLSurface *surf, _EGLDisplay *dpy)
+_eglLinkSurface(_EGLSurface *surf)
 {
-   _eglLinkResource(&surf->Resource, _EGL_RESOURCE_SURFACE, dpy);
+   _eglLinkResource(&surf->Resource, _EGL_RESOURCE_SURFACE);
    return (EGLSurface) surf;
 }
 
@@ -129,18 +138,4 @@ _eglGetSurfaceHandle(_EGLSurface *surf)
 }
 
 
-/**
- * Return true if the surface is linked to a display.
- *
- * The link is considered a reference to the surface (the display is owning the
- * surface).  Drivers should not destroy a surface when it is linked.
- */
-static INLINE EGLBoolean
-_eglIsSurfaceLinked(_EGLSurface *surf)
-{
-   _EGLResource *res = (_EGLResource *) surf;
-   return (res && _eglIsResourceLinked(res));
-}
-
-
 #endif /* EGLSURFACE_INCLUDED */
index b9cd99a332cece80a46bd8581dd85a7599b7204a..95e97c735424a0fb07b93227b86cea845e709bf5 100644 (file)
@@ -50,10 +50,7 @@ _eglInitSync(_EGLSync *sync, _EGLDisplay *dpy, EGLenum type,
        !(type == EGL_SYNC_FENCE_KHR && dpy->Extensions.KHR_fence_sync))
       return _eglError(EGL_BAD_ATTRIBUTE, "eglCreateSyncKHR");
 
-   memset(sync, 0, sizeof(*sync));
-
-   sync->Resource.Display = dpy;
-
+   _eglInitResource(&sync->Resource, sizeof(*sync), dpy);
    sync->Type = type;
    sync->SyncStatus = EGL_UNSIGNALED_KHR;
    sync->SyncCondition = EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR;
index 052d0166813b449088787eb9d72c7d21f037ea7d..a0025237e7aaa1e499f6c8b3ec2495c9f8316bd6 100644 (file)
@@ -34,13 +34,35 @@ _eglGetSyncAttribKHR(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSync *sync,
 
 
 /**
- * Link a sync to a display and return the handle of the link.
+ * Increment reference count for the sync.
+ */
+static INLINE _EGLSync *
+_eglGetSync(_EGLSync *sync)
+{
+   if (sync)
+      _eglGetResource(&sync->Resource);
+   return sync;
+}
+
+
+/**
+ * Decrement reference count for the sync.
+ */
+static INLINE EGLBoolean
+_eglPutSync(_EGLSync *sync)
+{
+   return (sync) ? _eglPutResource(&sync->Resource) : EGL_FALSE;
+}
+
+
+/**
+ * Link a sync to its display and return the handle of the link.
  * The handle can be passed to client directly.
  */
 static INLINE EGLSyncKHR
-_eglLinkSync(_EGLSync *sync, _EGLDisplay *dpy)
+_eglLinkSync(_EGLSync *sync)
 {
-   _eglLinkResource(&sync->Resource, _EGL_RESOURCE_SYNC, dpy);
+   _eglLinkResource(&sync->Resource, _EGL_RESOURCE_SYNC);
    return (EGLSyncKHR) sync;
 }
 
@@ -81,20 +103,6 @@ _eglGetSyncHandle(_EGLSync *sync)
 }
 
 
-/**
- * Return true if the sync is linked to a display.
- *
- * The link is considered a reference to the sync (the display is owning the
- * sync).  Drivers should not destroy a sync when it is linked.
- */
-static INLINE EGLBoolean
-_eglIsSyncLinked(_EGLSync *sync)
-{
-   _EGLResource *res = (_EGLResource *) sync;
-   return (res && _eglIsResourceLinked(res));
-}
-
-
 #endif /* EGL_KHR_reusable_sync */
 
 
index 3c171552bed1b613e1466707de7fce999a7be26b..0efab834f66b4691a40efb6ab346d0e694dd48bd 100644 (file)
-import os
+Import('env')
 
-Import('*')
+# 
+# Auxiliary modules
+#
 
 SConscript('auxiliary/SConscript')
 
-for driver in env['drivers']:
-       SConscript(os.path.join('drivers', driver, 'SConscript'))
+#
+# Drivers
+#
+
+SConscript([
+    'drivers/failover/SConscript', 
+    'drivers/galahad/SConscript',
+    'drivers/identity/SConscript', 
+    'drivers/llvmpipe/SConscript', 
+    'drivers/rbug/SConscript',
+    'drivers/softpipe/SConscript',
+    'drivers/svga/SConscript', 
+    'drivers/trace/SConscript', 
+])
+
+if not env['msvc']:
+    # These drivers do not build on MSVC compilers
+    SConscript([
+        'drivers/i915/SConscript', 
+        'drivers/i965/SConscript',
+        'drivers/r300/SConscript',
+    ])
+
+if env['drm']:
+    # These drivers depend on drm headers
+    if env['drm_radeon']:
+        SConscript([
+            'drivers/r600/SConscript',
+        ])
+    # XXX: nouveau drivers have a tight dependency on libdrm, so to enable
+    # we need some version logic before we enable them. Also, ATM there is
+    # no nouveau target in scons
+    # if env['drm_nouveau']:
+    #     SConscript([
+    #         'drivers/nouveau/SConscript', 
+    #         'drivers/nv50/SConscript', 
+    #         'drivers/nvfx/SConscript',
+    #     ])
+
+#
+# State trackers
+#
 
 # Needed by some state trackers
 SConscript('winsys/sw/null/SConscript')
 
 SConscript('state_trackers/python/SConscript')
-if platform != 'embedded':
-       SConscript('state_trackers/glx/xlib/SConscript')
-       SConscript('state_trackers/dri/SConscript')
-       SConscript('state_trackers/xorg/SConscript')
-       SConscript('state_trackers/egl/SConscript')
-       SConscript('state_trackers/vega/SConscript')
+if env['platform'] != 'embedded':
+    SConscript('state_trackers/vega/SConscript')
+
+    if env['x11']:
+        SConscript('state_trackers/glx/xlib/SConscript')
+
+    if env['dri']:
+        SConscript('state_trackers/dri/SConscript')
+
+    if env['dri'] and env['xorg']:
+        SConscript('state_trackers/xorg/SConscript')
+
+if env['platform'] == 'windows':
+    SConscript([
+        'state_trackers/egl/SConscript',
+        'state_trackers/wgl/SConscript',
+    ])
 
-if platform == 'windows':
-       SConscript('state_trackers/wgl/SConscript')
+#
+# Winsys
+# 
 
 SConscript('winsys/SConscript')
 
-SConscript('targets/SConscript')
+#
+# Targets
+#
+
+SConscript([
+    'targets/graw-null/SConscript',
+])
+
+if env['x11']:
+    SConscript([
+        'targets/graw-xlib/SConscript',
+        'targets/libgl-xlib/SConscript',
+    ])
+
+if env['platform'] == 'windows':
+    SConscript([
+        'targets/graw-gdi/SConscript',
+        'targets/libgl-gdi/SConscript',
+        #'egl-gdi/SConscript',
+    ])
+
+if env['dri']:
+    SConscript([
+        'targets/SConscript.dri',
+        'targets/dri-swrast/SConscript',
+        'targets/dri-vmwgfx/SConscript',
+        #'targets/dri-nouveau/SConscript',
+    ])
+    if env['drm_intel']:
+        SConscript([
+            'targets/dri-i915/SConscript',
+            'targets/dri-i965/SConscript',
+        ])
+    if env['drm_radeon']:
+        SConscript([
+            'targets/dri-r300/SConscript',
+            'targets/dri-r600/SConscript',
+        ])
+
+if env['xorg'] and env['drm']:
+    SConscript([
+        #'targets/xorg-i915/SConscript',
+        #'targets/xorg-i965/SConscript',
+        #'targets/xorg-nouveau/SConscript',
+        #'targets/xorg-radeon/SConscript',
+        'targets/xorg-vmwgfx/SConscript',
+    ])
+
+
+#
+# Unit tests & tools
+#
 
-if platform != 'embedded':
-       SConscript('tests/unit/SConscript')
-       SConscript('tests/graw/SConscript')
+if env['platform'] != 'embedded':
+    SConscript('tests/unit/SConscript')
+    SConscript('tests/graw/SConscript')
index abd33f6eef11c4462de01f5bfee1a48a482854e2..53a0847f0320c87368fa83d41cbb05ebf0007f4a 100644 (file)
@@ -142,8 +142,7 @@ C_SOURCES = \
        util/u_tile.c \
        util/u_transfer.c \
        util/u_resource.c \
-       util/u_upload_mgr.c \
-       target-helpers/wrap_screen.c
+       util/u_upload_mgr.c
 
        # Disabling until pipe-video branch gets merged in
        #vl/vl_bitstream_parser.c \
@@ -211,16 +210,16 @@ include ../Makefile.template
 
 
 indices/u_indices_gen.c: indices/u_indices_gen.py
-       python $< > $@
+       $(PYTHON2) $< > $@
 
 indices/u_unfilled_gen.c: indices/u_unfilled_gen.py
-       python $< > $@
+       $(PYTHON2) $< > $@
 
 util/u_format_srgb.c: util/u_format_srgb.py
-       python $< > $@
+       $(PYTHON2) $< > $@
 
 util/u_format_table.c: util/u_format_table.py util/u_format_pack.py util/u_format_parse.py util/u_format.csv
-       python util/u_format_table.py util/u_format.csv > $@
+       $(PYTHON2) util/u_format_table.py util/u_format.csv > $@
 
 util/u_half.c: util/u_half.py
-       python util/u_half.py > $@
+       $(PYTHON2) util/u_half.py > $@
index 94cd74424a07133115e380f99feb12df365b7084..75c27dd242010b1c0baba73889db683b879ffbcd 100644 (file)
@@ -7,8 +7,6 @@ env.Append(CPPPATH = [
     'util',
 ])
 
-env.Tool('udis86')
-
 env.CodeGenerate(
     target = 'indices/u_indices_gen.c', 
     script = 'indices/u_indices_gen.py', 
@@ -198,43 +196,45 @@ source = [
     #'vl/vl_compositor.c',
     #'vl/vl_csc.c',
     #'vl/vl_shader_build.c',
-    'target-helpers/wrap_screen.c',
 ]
 
 if env['llvm']:
+    if env['UDIS86']:
+        env.Append(CPPDEFINES = [('HAVE_UDIS86', '1')])
+
     source += [
-    'gallivm/lp_bld_arit.c',
-    'gallivm/lp_bld_assert.c',
-    'gallivm/lp_bld_bitarit.c',
-    'gallivm/lp_bld_const.c',
-    'gallivm/lp_bld_conv.c',
-    'gallivm/lp_bld_debug.c',
-    'gallivm/lp_bld_flow.c',
-    'gallivm/lp_bld_format_aos.c',
-    'gallivm/lp_bld_format_soa.c',
-    'gallivm/lp_bld_format_yuv.c',
-    'gallivm/lp_bld_gather.c',
-    'gallivm/lp_bld_init.c',
-    'gallivm/lp_bld_intr.c',
-    'gallivm/lp_bld_logic.c',
-    'gallivm/lp_bld_misc.cpp',
-    'gallivm/lp_bld_pack.c',
-    'gallivm/lp_bld_printf.c',
-    'gallivm/lp_bld_quad.c',
-    'gallivm/lp_bld_sample.c',
-    'gallivm/lp_bld_sample_aos.c',
-    'gallivm/lp_bld_sample_soa.c',
-    'gallivm/lp_bld_struct.c',
-    'gallivm/lp_bld_swizzle.c',
-    'gallivm/lp_bld_tgsi_aos.c',
-    'gallivm/lp_bld_tgsi_info.c',
-    'gallivm/lp_bld_tgsi_soa.c',
-    'gallivm/lp_bld_type.c',
-    'draw/draw_llvm.c',
-    'draw/draw_llvm_sample.c',
-    'draw/draw_llvm_translate.c',
-    'draw/draw_pt_fetch_shade_pipeline_llvm.c',
-    'draw/draw_vs_llvm.c'
+        'gallivm/lp_bld_arit.c',
+        'gallivm/lp_bld_assert.c',
+        'gallivm/lp_bld_bitarit.c',
+        'gallivm/lp_bld_const.c',
+        'gallivm/lp_bld_conv.c',
+        'gallivm/lp_bld_debug.c',
+        'gallivm/lp_bld_flow.c',
+        'gallivm/lp_bld_format_aos.c',
+        'gallivm/lp_bld_format_soa.c',
+        'gallivm/lp_bld_format_yuv.c',
+        'gallivm/lp_bld_gather.c',
+        'gallivm/lp_bld_init.c',
+        'gallivm/lp_bld_intr.c',
+        'gallivm/lp_bld_logic.c',
+        'gallivm/lp_bld_misc.cpp',
+        'gallivm/lp_bld_pack.c',
+        'gallivm/lp_bld_printf.c',
+        'gallivm/lp_bld_quad.c',
+        'gallivm/lp_bld_sample.c',
+        'gallivm/lp_bld_sample_aos.c',
+        'gallivm/lp_bld_sample_soa.c',
+        'gallivm/lp_bld_struct.c',
+        'gallivm/lp_bld_swizzle.c',
+        'gallivm/lp_bld_tgsi_aos.c',
+        'gallivm/lp_bld_tgsi_info.c',
+        'gallivm/lp_bld_tgsi_soa.c',
+        'gallivm/lp_bld_type.c',
+        'draw/draw_llvm.c',
+        'draw/draw_llvm_sample.c',
+        'draw/draw_llvm_translate.c',
+        'draw/draw_pt_fetch_shade_pipeline_llvm.c',
+        'draw/draw_vs_llvm.c'
     ]
 
 gallium = env.ConvenienceLibrary(
@@ -242,4 +242,6 @@ gallium = env.ConvenienceLibrary(
     source = source,
 )
 
+env.Alias('gallium', gallium)
+
 Export('gallium')
index 140e596f99447fafc984991fa3179cb4d9aca775..2b5f01cda74c4091d77e0faf39eea1883e40578f 100644 (file)
@@ -1164,11 +1164,6 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant)
 
    sampler->destroy(sampler);
 
-#ifdef PIPE_ARCH_X86
-   /* Avoid corrupting the FPU stack on 32bit OSes. */
-   lp_build_intrinsic(builder, "llvm.x86.mmx.emms", LLVMVoidType(), NULL, 0);
-#endif
-
    ret = LLVMBuildLoad(builder, ret_ptr,"");
    LLVMBuildRet(builder, ret);
       
@@ -1378,11 +1373,6 @@ draw_llvm_generate_elts(struct draw_llvm *llvm, struct draw_llvm_variant *varian
 
    sampler->destroy(sampler);
 
-#ifdef PIPE_ARCH_X86
-   /* Avoid corrupting the FPU stack on 32bit OSes. */
-   lp_build_intrinsic(builder, "llvm.x86.mmx.emms", LLVMVoidType(), NULL, 0);
-#endif
-
    ret = LLVMBuildLoad(builder, ret_ptr,"");   
    LLVMBuildRet(builder, ret);
    
index 5598ca5c489ca856ed08f6bcb5bff4c6914f6925..0b9a6f745fb648365991495275f568c8c34c07e7 100644 (file)
@@ -145,13 +145,7 @@ lp_build_init(void)
          LLVMAddCFGSimplificationPass(lp_build_pass);
          LLVMAddPromoteMemoryToRegisterPass(lp_build_pass);
          LLVMAddConstantPropagationPass(lp_build_pass);
-         if(util_cpu_caps.has_sse4_1) {
-            /* FIXME: There is a bug in this pass, whereby the combination of fptosi
-             * and sitofp (necessary for trunc/floor/ceil/round implementation)
-             * somehow becomes invalid code.
-             */
-            LLVMAddInstructionCombiningPass(lp_build_pass);
-         }
+         LLVMAddInstructionCombiningPass(lp_build_pass);
          LLVMAddGVNPass(lp_build_pass);
       } else {
          /* We need at least this pass to prevent the backends to fail in
index 3c318cc8c806f44dc1cbbf247ef9f622f244b7d3..7f0f058c2225d75dd53fca86bec148f486f690e6 100644 (file)
@@ -58,6 +58,7 @@
 #include "lp_bld_tgsi.h"
 #include "lp_bld_limits.h"
 #include "lp_bld_debug.h"
+#include "lp_bld_printf.h"
 
 
 #define FOR_EACH_CHANNEL( CHAN )\
@@ -119,9 +120,12 @@ struct lp_build_tgsi_soa_context
 {
    struct lp_build_context base;
 
-   /* Builder for integer masks and indices */
+   /* Builder for vector integer masks and indices */
    struct lp_build_context uint_bld;
 
+   /* Builder for scalar elements of shader's data type (float) */
+   struct lp_build_context elem_bld;
+
    LLVMValueRef consts_ptr;
    const LLVMValueRef *pos;
    const LLVMValueRef (*inputs)[NUM_CHANNELS];
@@ -140,6 +144,18 @@ struct lp_build_tgsi_soa_context
     */
    LLVMValueRef temps_array;
 
+   /* We allocate/use this array of output if (1 << TGSI_FILE_OUTPUT) is
+    * set in the indirect_files field.
+    * The outputs[] array above is unused then.
+    */
+   LLVMValueRef outputs_array;
+
+   /* We allocate/use this array of inputs if (1 << TGSI_FILE_INPUT) is
+    * set in the indirect_files field.
+    * The inputs[] array above is unused then.
+    */
+   LLVMValueRef inputs_array;
+
    const struct tgsi_shader_info *info;
    /** bitmask indicating which register files are accessed indirectly */
    unsigned indirect_files;
@@ -435,6 +451,26 @@ get_temp_ptr(struct lp_build_tgsi_soa_context *bld,
    }
 }
 
+/**
+ * Return pointer to a output register channel (src or dest).
+ * Note that indirect addressing cannot be handled here.
+ * \param index  which output register
+ * \param chan  which channel of the output register.
+ */
+static LLVMValueRef
+get_output_ptr(struct lp_build_tgsi_soa_context *bld,
+               unsigned index,
+               unsigned chan)
+{
+   assert(chan < 4);
+   if (bld->indirect_files & (1 << TGSI_FILE_OUTPUT)) {
+      LLVMValueRef lindex = lp_build_const_int32(index * 4 + chan);
+      return LLVMBuildGEP(bld->base.builder, bld->outputs_array, &lindex, 1, "");
+   }
+   else {
+      return bld->outputs[index][chan];
+   }
+}
 
 /**
  * Gather vector.
@@ -457,7 +493,7 @@ build_gather(struct lp_build_tgsi_soa_context *bld,
       LLVMValueRef index = LLVMBuildExtractElement(bld->base.builder,
                                                    indexes, ii, "");
       LLVMValueRef scalar_ptr = LLVMBuildGEP(bld->base.builder, base_ptr,
-                                             &index, 1, "");
+                                             &index, 1, "gather_ptr");
       LLVMValueRef scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, "");
 
       res = LLVMBuildInsertElement(bld->base.builder, res, scalar, ii, "");
@@ -467,9 +503,61 @@ build_gather(struct lp_build_tgsi_soa_context *bld,
 }
 
 
+/**
+ * Scatter/store vector.
+ */
+static void
+emit_mask_scatter(struct lp_build_tgsi_soa_context *bld,
+                  LLVMValueRef base_ptr,
+                  LLVMValueRef indexes,
+                  LLVMValueRef values,
+                  struct lp_exec_mask *mask,
+                  LLVMValueRef pred)
+{
+   LLVMBuilderRef builder = bld->base.builder;
+   unsigned i;
+
+   /* Mix the predicate and execution mask */
+   if (mask->has_mask) {
+      if (pred) {
+         pred = LLVMBuildAnd(mask->bld->builder, pred, mask->exec_mask, "");
+      }
+      else {
+         pred = mask->exec_mask;
+      }
+   }
+
+   /*
+    * Loop over elements of index_vec, store scalar value.
+    */
+   for (i = 0; i < bld->base.type.length; i++) {
+      LLVMValueRef ii = LLVMConstInt(LLVMInt32Type(), i, 0);
+      LLVMValueRef index = LLVMBuildExtractElement(builder, indexes, ii, "");
+      LLVMValueRef scalar_ptr = LLVMBuildGEP(builder, base_ptr, &index, 1, "scatter_ptr");
+      LLVMValueRef val = LLVMBuildExtractElement(builder, values, ii, "scatter_val");
+      LLVMValueRef scalar_pred = pred ?
+         LLVMBuildExtractElement(builder, pred, ii, "scatter_pred") : NULL;
+
+      if (0)
+         lp_build_printf(builder, "scatter %d: val %f at %d %p\n",
+                         ii, val, index, scalar_ptr);
+
+      if (scalar_pred) {
+         LLVMValueRef real_val, dst_val;
+         dst_val = LLVMBuildLoad(builder, scalar_ptr, "");
+         real_val = lp_build_select(&bld->elem_bld, scalar_pred, val, dst_val);
+         LLVMBuildStore(builder, real_val, scalar_ptr);
+      }
+      else {
+         LLVMBuildStore(builder, val, scalar_ptr);
+      }
+   }
+}
+
+
 /**
  * Read the current value of the ADDR register, convert the floats to
- * ints, multiply by four and return the vector of offsets.
+ * ints, add the base index and return the vector of offsets.
  * The offsets will be used to index into the constant buffer or
  * temporary register file.
  */
@@ -577,7 +665,38 @@ emit_fetch(
       break;
 
    case TGSI_FILE_INPUT:
-      res = bld->inputs[reg->Register.Index][swizzle];
+      if (reg->Register.Indirect) {
+         LLVMValueRef swizzle_vec =
+            lp_build_const_int_vec(uint_bld->type, swizzle);
+         LLVMValueRef length_vec =
+            lp_build_const_int_vec(uint_bld->type, bld->base.type.length);
+         LLVMValueRef index_vec;  /* index into the const buffer */
+         LLVMValueRef inputs_array;
+         LLVMTypeRef float4_ptr_type;
+
+         /* index_vec = (indirect_index * 4 + swizzle) * length */
+         index_vec = lp_build_shl_imm(uint_bld, indirect_index, 2);
+         index_vec = lp_build_add(uint_bld, index_vec, swizzle_vec);
+         index_vec = lp_build_mul(uint_bld, index_vec, length_vec);
+
+         /* cast inputs_array pointer to float* */
+         float4_ptr_type = LLVMPointerType(LLVMFloatType(), 0);
+         inputs_array = LLVMBuildBitCast(uint_bld->builder, bld->inputs_array,
+                                        float4_ptr_type, "");
+
+         /* Gather values from the temporary register array */
+         res = build_gather(bld, inputs_array, index_vec);
+      } else {
+         if (bld->indirect_files & (1 << TGSI_FILE_INPUT)) {
+            LLVMValueRef lindex = lp_build_const_int32(reg->Register.Index * 4 + swizzle);
+            LLVMValueRef input_ptr =  LLVMBuildGEP(bld->base.builder,
+                                                   bld->inputs_array, &lindex, 1, "");
+            res = LLVMBuildLoad(bld->base.builder, input_ptr, "");
+         }
+         else {
+            res = bld->inputs[reg->Register.Index][swizzle];
+         }
+      }
       assert(res);
       break;
 
@@ -748,6 +867,7 @@ emit_store(
    LLVMValueRef value)
 {
    const struct tgsi_full_dst_register *reg = &inst->Dst[index];
+   struct lp_build_context *uint_bld = &bld->uint_bld;
    LLVMValueRef indirect_index = NULL;
 
    switch( inst->Instruction.Saturate ) {
@@ -779,15 +899,81 @@ emit_store(
 
    switch( reg->Register.File ) {
    case TGSI_FILE_OUTPUT:
-      lp_exec_mask_store(&bld->exec_mask, pred, value,
-                         bld->outputs[reg->Register.Index][chan_index]);
+      if (reg->Register.Indirect) {
+         LLVMBuilderRef builder = bld->base.builder;
+         LLVMValueRef chan_vec =
+            lp_build_const_int_vec(uint_bld->type, chan_index);
+         LLVMValueRef length_vec =
+            lp_build_const_int_vec(uint_bld->type, bld->base.type.length);
+         LLVMValueRef index_vec;  /* indexes into the temp registers */
+         LLVMValueRef outputs_array;
+         LLVMValueRef pixel_offsets;
+         LLVMTypeRef float_ptr_type;
+         int i;
+
+         /* build pixel offset vector: {0, 1, 2, 3, ...} */
+         pixel_offsets = uint_bld->undef;
+         for (i = 0; i < bld->base.type.length; i++) {
+            LLVMValueRef ii = lp_build_const_int32(i);
+            pixel_offsets = LLVMBuildInsertElement(builder, pixel_offsets,
+                                                   ii, ii, "");
+         }
+
+         /* index_vec = (indirect_index * 4 + chan_index) * length + offsets */
+         index_vec = lp_build_shl_imm(uint_bld, indirect_index, 2);
+         index_vec = lp_build_add(uint_bld, index_vec, chan_vec);
+         index_vec = lp_build_mul(uint_bld, index_vec, length_vec);
+         index_vec = lp_build_add(uint_bld, index_vec, pixel_offsets);
+
+         float_ptr_type = LLVMPointerType(LLVMFloatType(), 0);
+         outputs_array = LLVMBuildBitCast(builder, bld->outputs_array,
+                                          float_ptr_type, "");
+
+         /* Scatter store values into temp registers */
+         emit_mask_scatter(bld, outputs_array, index_vec, value,
+                           &bld->exec_mask, pred);
+      }
+      else {
+         LLVMValueRef out_ptr = get_output_ptr(bld, reg->Register.Index,
+                                               chan_index);
+         lp_exec_mask_store(&bld->exec_mask, pred, value, out_ptr);
+      }
       break;
 
    case TGSI_FILE_TEMPORARY:
       if (reg->Register.Indirect) {
-         /* XXX not done yet */
-         debug_printf("WARNING: LLVM scatter store of temp regs"
-                      " not implemented\n");
+         LLVMBuilderRef builder = bld->base.builder;
+         LLVMValueRef chan_vec =
+            lp_build_const_int_vec(uint_bld->type, chan_index);
+         LLVMValueRef length_vec =
+            lp_build_const_int_vec(uint_bld->type, bld->base.type.length);
+         LLVMValueRef index_vec;  /* indexes into the temp registers */
+         LLVMValueRef temps_array;
+         LLVMValueRef pixel_offsets;
+         LLVMTypeRef float_ptr_type;
+         int i;
+
+         /* build pixel offset vector: {0, 1, 2, 3, ...} */
+         pixel_offsets = uint_bld->undef; 
+         for (i = 0; i < bld->base.type.length; i++) {
+            LLVMValueRef ii = lp_build_const_int32(i);
+            pixel_offsets = LLVMBuildInsertElement(builder, pixel_offsets,
+                                                   ii, ii, "");
+         }
+
+         /* index_vec = (indirect_index * 4 + chan_index) * length + offsets */
+         index_vec = lp_build_shl_imm(uint_bld, indirect_index, 2);
+         index_vec = lp_build_add(uint_bld, index_vec, chan_vec);
+         index_vec = lp_build_mul(uint_bld, index_vec, length_vec);
+         index_vec = lp_build_add(uint_bld, index_vec, pixel_offsets);
+
+         float_ptr_type = LLVMPointerType(LLVMFloatType(), 0);
+         temps_array = LLVMBuildBitCast(builder, bld->temps_array,
+                                        float_ptr_type, "");
+
+         /* Scatter store values into temp registers */
+         emit_mask_scatter(bld, temps_array, index_vec, value,
+                           &bld->exec_mask, pred);
       }
       else {
          LLVMValueRef temp_ptr = get_temp_ptr(bld, reg->Register.Index,
@@ -1040,15 +1226,60 @@ emit_kilp(struct lp_build_tgsi_soa_context *bld,
       lp_build_mask_check(bld->mask);
 }
 
+
+/**
+ * Emit code which will dump the value of all the temporary registers
+ * to stdout.
+ */
+static void
+emit_dump_temps(struct lp_build_tgsi_soa_context *bld)
+{
+   LLVMBuilderRef builder = bld->base.builder;
+   LLVMValueRef temp_ptr;
+   LLVMValueRef i0 = lp_build_const_int32(0);
+   LLVMValueRef i1 = lp_build_const_int32(1);
+   LLVMValueRef i2 = lp_build_const_int32(2);
+   LLVMValueRef i3 = lp_build_const_int32(3);
+   int index;
+   int n = bld->info->file_max[TGSI_FILE_TEMPORARY];
+
+   for (index = 0; index < n; index++) {
+      LLVMValueRef idx = lp_build_const_int32(index);
+      LLVMValueRef v[4][4], res;
+      int chan;
+
+      lp_build_printf(builder, "TEMP[%d]:\n", idx);
+
+      for (chan = 0; chan < 4; chan++) {
+         temp_ptr = get_temp_ptr(bld, index, chan);
+         res = LLVMBuildLoad(bld->base.builder, temp_ptr, "");
+         v[chan][0] = LLVMBuildExtractElement(builder, res, i0, "");
+         v[chan][1] = LLVMBuildExtractElement(builder, res, i1, "");
+         v[chan][2] = LLVMBuildExtractElement(builder, res, i2, "");
+         v[chan][3] = LLVMBuildExtractElement(builder, res, i3, "");
+      }
+
+      lp_build_printf(builder, "  X: %f %f %f %f\n",
+                      v[0][0], v[0][1], v[0][2], v[0][3]);
+      lp_build_printf(builder, "  Y: %f %f %f %f\n",
+                      v[1][0], v[1][1], v[1][2], v[1][3]);
+      lp_build_printf(builder, "  Z: %f %f %f %f\n",
+                      v[2][0], v[2][1], v[2][2], v[2][3]);
+      lp_build_printf(builder, "  W: %f %f %f %f\n",
+                      v[3][0], v[3][1], v[3][2], v[3][3]);
+   }
+}
+
+
+
 static void
 emit_declaration(
    struct lp_build_tgsi_soa_context *bld,
    const struct tgsi_full_declaration *decl)
 {
    LLVMTypeRef vec_type = bld->base.vec_type;
-
-   unsigned first = decl->Range.First;
-   unsigned last = decl->Range.Last;
+   const unsigned first = decl->Range.First;
+   const unsigned last = decl->Range.Last;
    unsigned idx, i;
 
    for (idx = first; idx <= last; ++idx) {
@@ -1056,36 +1287,33 @@ emit_declaration(
       switch (decl->Declaration.File) {
       case TGSI_FILE_TEMPORARY:
          assert(idx < LP_MAX_TGSI_TEMPS);
-         if (bld->indirect_files & (1 << TGSI_FILE_TEMPORARY)) {
-            LLVMValueRef array_size = LLVMConstInt(LLVMInt32Type(),
-                                                   last*4 + 4, 0);
-            bld->temps_array = lp_build_array_alloca(bld->base.builder,
-                                                     vec_type, array_size, "");
-         } else {
+         if (!(bld->indirect_files & (1 << TGSI_FILE_TEMPORARY))) {
             for (i = 0; i < NUM_CHANNELS; i++)
                bld->temps[idx][i] = lp_build_alloca(bld->base.builder,
-                                                    vec_type, "");
+                                                    vec_type, "temp");
          }
          break;
 
       case TGSI_FILE_OUTPUT:
-         for (i = 0; i < NUM_CHANNELS; i++)
-            bld->outputs[idx][i] = lp_build_alloca(bld->base.builder,
-                                                   vec_type, "");
+         if (!(bld->indirect_files & (1 << TGSI_FILE_OUTPUT))) {
+            for (i = 0; i < NUM_CHANNELS; i++)
+               bld->outputs[idx][i] = lp_build_alloca(bld->base.builder,
+                                                      vec_type, "output");
+         }
          break;
 
       case TGSI_FILE_ADDRESS:
          assert(idx < LP_MAX_TGSI_ADDRS);
          for (i = 0; i < NUM_CHANNELS; i++)
             bld->addr[idx][i] = lp_build_alloca(bld->base.builder,
-                                                vec_type, "");
+                                                vec_type, "addr");
          break;
 
       case TGSI_FILE_PREDICATE:
          assert(idx < LP_MAX_TGSI_PREDS);
          for (i = 0; i < NUM_CHANNELS; i++)
             bld->preds[idx][i] = lp_build_alloca(bld->base.builder,
-                                                 vec_type, "");
+                                                 vec_type, "predicate");
          break;
 
       default:
@@ -1740,6 +1968,10 @@ emit_instruction(
       break;
 
    case TGSI_OPCODE_END:
+      if (0) {
+         /* for debugging */
+         emit_dump_temps(bld);
+      }
       *pc = -1;
       break;
 
@@ -2082,6 +2314,7 @@ lp_build_tgsi_soa(LLVMBuilderRef builder,
    memset(&bld, 0, sizeof bld);
    lp_build_context_init(&bld.base, builder, type);
    lp_build_context_init(&bld.uint_bld, builder, lp_uint_type(type));
+   lp_build_context_init(&bld.elem_bld, builder, lp_elem_type(type));
    bld.mask = mask;
    bld.pos = pos;
    bld.inputs = inputs;
@@ -2100,6 +2333,48 @@ lp_build_tgsi_soa(LLVMBuilderRef builder,
 
    lp_exec_mask_init(&bld.exec_mask, &bld.base);
 
+   if (bld.indirect_files & (1 << TGSI_FILE_TEMPORARY)) {
+      LLVMValueRef array_size = LLVMConstInt(LLVMInt32Type(),
+                                             info->file_max[TGSI_FILE_TEMPORARY]*4 + 4, 0);
+      bld.temps_array = lp_build_array_alloca(bld.base.builder,
+                                              bld.base.vec_type, array_size,
+                                              "temp_array");
+   }
+
+   if (bld.indirect_files & (1 << TGSI_FILE_OUTPUT)) {
+      LLVMValueRef array_size = LLVMConstInt(LLVMInt32Type(),
+                                             info->file_max[TGSI_FILE_OUTPUT]*4 + 4, 0);
+      bld.outputs_array = lp_build_array_alloca(bld.base.builder,
+                                                bld.base.vec_type, array_size,
+                                                "output_array");
+   }
+
+   /* If we have indirect addressing in inputs we need to copy them into
+    * our alloca array to be able to iterate over them */
+   if (bld.indirect_files & (1 << TGSI_FILE_INPUT)) {
+      unsigned index, chan;
+      LLVMTypeRef vec_type = bld.base.vec_type;
+      LLVMValueRef array_size = LLVMConstInt(LLVMInt32Type(),
+                                             info->file_max[TGSI_FILE_INPUT]*4 + 4, 0);
+      bld.inputs_array = lp_build_array_alloca(bld.base.builder,
+                                               vec_type, array_size,
+                                               "input_array");
+
+      assert(info->num_inputs <= info->file_max[TGSI_FILE_INPUT] + 1);
+
+      for (index = 0; index < info->num_inputs; ++index) {
+         for (chan = 0; chan < NUM_CHANNELS; ++chan) {
+            LLVMValueRef lindex = lp_build_const_int32(index * 4 + chan);
+            LLVMValueRef input_ptr =
+               LLVMBuildGEP(bld.base.builder, bld.inputs_array,
+                            &lindex, 1, "");
+            LLVMValueRef value = bld.inputs[index][chan];
+            if (value)
+               LLVMBuildStore(bld.base.builder, value, input_ptr);
+         }
+      }
+   }
+
    tgsi_parse_init( &parse, tokens );
 
    while( !tgsi_parse_end_of_tokens( &parse ) ) {
@@ -2169,6 +2444,18 @@ lp_build_tgsi_soa(LLVMBuilderRef builder,
                        opcode_info->mnemonic);
    }
 
+   /* If we have indirect addressing in outputs we need to copy our alloca array
+    * to the outputs slots specified by the called */
+   if (bld.indirect_files & (1 << TGSI_FILE_OUTPUT)) {
+      unsigned index, chan;
+      assert(info->num_outputs <= info->file_max[TGSI_FILE_OUTPUT] + 1);
+      for (index = 0; index < info->num_outputs; ++index) {
+         for (chan = 0; chan < NUM_CHANNELS; ++chan) {
+            bld.outputs[index][chan] = get_output_ptr(&bld, index, chan);
+         }
+      }
+   }
+
    if (0) {
       LLVMBasicBlockRef block = LLVMGetInsertBlock(builder);
       LLVMValueRef function = LLVMGetBasicBlockParent(block);
index 06f1aae6dcc1c604c02defabddb6cf2476677ff8..5205c7ada91ae284ce86a8ba7e58f81b7ab21529 100644 (file)
@@ -187,6 +187,22 @@ lp_build_int32_vec4_type(void)
 }
 
 
+/**
+ * Create element of vector type
+ */
+struct lp_type
+lp_elem_type(struct lp_type type)
+{
+   struct lp_type res_type;
+
+   assert(type.length > 1);
+   res_type = type;
+   res_type.length = 1;
+
+   return res_type;
+}
+
+
 /**
  * Create unsigned integer type variation of given type.
  */
index fec1d3dfbc637ba552234bd1fb8f08c045eff54a..a135d0df847d9885a024aea355ec8474c36ba0bc 100644 (file)
@@ -364,6 +364,10 @@ lp_unorm8_vec4_type(void)
 }
 
 
+struct lp_type
+lp_elem_type(struct lp_type type);
+
+
 struct lp_type
 lp_uint_type(struct lp_type type);
 
index 37e7d063e2bf4c7f1e9d7d3204b262956a8e2aa0..afd3ff6dcea0738faffc5a5139d85f69ec825973 100644 (file)
@@ -106,7 +106,7 @@ os_file_stream_create(const char *filename)
    stream->base.flush = &os_stdc_stream_flush;
    stream->base.vprintf = &os_stdc_stream_vprintf;
 
-   stream->file = fopen(filename, "w");
+   stream->file = fopen(filename, "wb");
    if(!stream->file)
       goto no_file;
 
diff --git a/src/gallium/auxiliary/pipebuffer/SConscript b/src/gallium/auxiliary/pipebuffer/SConscript
deleted file mode 100644 (file)
index a074a55..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-Import('*')
-
-pipebuffer = env.ConvenienceLibrary(
-       target = 'pipebuffer',
-       source = [
-               'pb_buffer_fenced.c',
-               'pb_buffer_malloc.c',
-               'pb_bufmgr_alt.c',
-               'pb_bufmgr_cache.c',
-               'pb_bufmgr_debug.c',
-               'pb_bufmgr_mm.c',
-               'pb_bufmgr_ondemand.c',
-               'pb_bufmgr_pool.c',
-               'pb_bufmgr_slab.c',
-               'pb_validate.c',
-       ])
-
-auxiliaries.insert(0, pipebuffer)
index ef4b306cb677dfd165480d0b1847f85aaf0e2119..330838d23cf1ec4f337458cb7c924708d5aafa64 100644 (file)
@@ -97,7 +97,7 @@ void (*ppc_get_func(struct ppc_function *p))(void)
       return (void (*)(void)) NULL;
    else
 #endif
-      return (void (*)(void)) p->store;
+      return (void (*)(void)) pointer_to_func(p->store);
 }
 
 
diff --git a/src/gallium/auxiliary/target-helpers/wrap_screen.c b/src/gallium/auxiliary/target-helpers/wrap_screen.c
deleted file mode 100644 (file)
index df5d56a..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/**************************************************************************
- * 
- * Copyright 2007 Tungsten Graphics, Inc., Bismarck, ND., USA
- * 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 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 HOLDERS, AUTHORS 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.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- * 
- * 
- **************************************************************************/
-
-/*
- * Authors:
- *   Keith Whitwell
- */
-
-#include "target-helpers/wrap_screen.h"
-#include "trace/tr_public.h"
-#include "rbug/rbug_public.h"
-#include "identity/id_public.h"
-#include "util/u_debug.h"
-
-
-/* Centralized code to inject common wrapping layers:
- */
-struct pipe_screen *
-gallium_wrap_screen( struct pipe_screen *screen )
-{
-   /* Screen wrapping functions are required not to fail.  If it is
-    * impossible to wrap a screen, the unwrapped screen should be
-    * returned instead.  Any failure condition should be returned in
-    * an OUT argument.
-    *
-    * Otherwise it is really messy trying to clean up in this code.
-    */
-   if (debug_get_bool_option("GALLIUM_WRAP", FALSE)) {
-      screen = identity_screen_create(screen);
-   }
-
-   /* Trace does its own checking if it should run */
-   screen = trace_screen_create(screen);
-
-   /* Rbug does its own checking if it should run */
-   screen = rbug_screen_create(screen);
-
-   return screen;
-}
-
-
-
-
diff --git a/src/gallium/auxiliary/target-helpers/wrap_screen.h b/src/gallium/auxiliary/target-helpers/wrap_screen.h
deleted file mode 100644 (file)
index 7e76beb..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef WRAP_SCREEN_HELPER_H
-#define WRAP_SCREEN_HELPER_H
-
-#include "pipe/p_compiler.h"