.dir-locals.el | 1 Android.common.mk | 12 Makefile.am | 1 VERSION | 2 appveyor.yml | 11 configure.ac | 15 docs/GL3.txt | 12 docs/envvars.html | 30 docs/index.html | 6 docs/install.html | 3 docs/relnotes.html | 1 docs/relnotes/11.1.2.html | 182 docs/relnotes/11.2.0.html | 8 include/D3D9/d3d9types.h | 1 include/c99/inttypes.h | 305 include/c99/stdbool.h | 46 include/c99/stdint.h | 247 include/c99_compat.h | 8 include/c99_math.h | 49 include/d3dadapter/present.h | 3 include/pci_ids/i965_pci_ids.h | 18 scons/gallium.py | 16 src/compiler/.gitignore | 1 src/compiler/Makefile.am | 2 src/compiler/builtin_type_macros.h | 1 src/compiler/glsl/.gitignore | 1 src/compiler/glsl/ast.h | 12 src/compiler/glsl/ast_function.cpp | 166 src/compiler/glsl/ast_to_hir.cpp | 191 src/compiler/glsl/ast_type.cpp | 13 src/compiler/glsl/builtin_functions.cpp | 4 src/compiler/glsl/builtin_variables.cpp | 15 src/compiler/glsl/glcpp/glcpp-parse.y | 3 src/compiler/glsl/glsl_lexer.ll | 4 src/compiler/glsl/glsl_parser_extras.cpp | 115 src/compiler/glsl/glsl_parser_extras.h | 12 src/compiler/glsl/ir.cpp | 17 src/compiler/glsl/ir.h | 19 src/compiler/glsl/ir_clone.cpp | 1 src/compiler/glsl/link_uniform_initializers.cpp | 1 src/compiler/glsl/link_uniforms.cpp | 164 src/compiler/glsl/link_varyings.cpp | 54 src/compiler/glsl/linker.cpp | 411 - src/compiler/glsl/linker.h | 17 src/compiler/glsl/lower_discard_flow.cpp | 4 src/compiler/glsl/main.cpp | 17 src/compiler/glsl/opt_tree_grafting.cpp | 11 src/compiler/glsl/program.h | 5 src/compiler/glsl/tests/sampler_types_test.cpp | 2 src/compiler/glsl/tests/uniform_initializer_utils.cpp | 3 src/compiler/glsl/tests/varyings_test.cpp | 78 src/compiler/glsl_types.cpp | 204 src/compiler/glsl_types.h | 38 src/compiler/nir/glsl_to_nir.cpp | 37 src/compiler/nir/nir.c | 24 src/compiler/nir/nir.h | 130 src/compiler/nir/nir_algebraic.py | 9 src/compiler/nir/nir_builder.h | 2 src/compiler/nir/nir_clone.c | 8 src/compiler/nir/nir_instr_set.c | 18 src/compiler/nir/nir_intrinsics.c | 10 src/compiler/nir/nir_intrinsics.h | 177 src/compiler/nir/nir_lower_atomics.c | 4 src/compiler/nir/nir_lower_clip.c | 8 src/compiler/nir/nir_lower_gs_intrinsics.c | 4 src/compiler/nir/nir_lower_io.c | 12 src/compiler/nir/nir_lower_locals_to_regs.c | 2 src/compiler/nir/nir_lower_samplers.c | 29 src/compiler/nir/nir_lower_tex.c | 6 src/compiler/nir/nir_lower_two_sided_color.c | 4 src/compiler/nir/nir_lower_var_copies.c | 2 src/compiler/nir/nir_lower_vars_to_ssa.c | 5 src/compiler/nir/nir_lower_vec_to_movs.c | 4 src/compiler/nir/nir_opt_algebraic.py | 17 src/compiler/nir/nir_opt_constant_folding.c | 11 src/compiler/nir/nir_print.c | 74 src/compiler/nir/nir_remove_dead_variables.c | 5 src/compiler/nir/nir_validate.c | 5 src/compiler/nir_types.cpp | 144 src/compiler/nir_types.h | 38 src/egl/Android.mk | 5 src/egl/drivers/dri2/platform_android.c | 14 src/egl/drivers/dri2/platform_x11.c | 9 src/egl/main/eglapi.c | 10 src/egl/main/eglsync.c | 3 src/gallium/auxiliary/Makefile.am | 4 src/gallium/auxiliary/Makefile.sources | 4 src/gallium/auxiliary/SConscript | 2 src/gallium/auxiliary/cso_cache/cso_context.c | 270 src/gallium/auxiliary/cso_cache/cso_context.h | 84 src/gallium/auxiliary/draw/draw_pipe_pstipple.c | 330 src/gallium/auxiliary/gallivm/lp_bld_debug.cpp | 53 src/gallium/auxiliary/gallivm/lp_bld_init.c | 2 src/gallium/auxiliary/gallivm/lp_bld_limits.h | 3 src/gallium/auxiliary/gallivm/lp_bld_misc.cpp | 30 src/gallium/auxiliary/gallivm/lp_bld_misc.h | 7 src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 7 src/gallium/auxiliary/hud/font.c | 2 src/gallium/auxiliary/hud/hud_context.c | 56 src/gallium/auxiliary/nir/tgsi_to_nir.c | 19 src/gallium/auxiliary/pipe-loader/SConscript | 2 src/gallium/auxiliary/pipebuffer/pb_bufmgr_mm.c | 4 src/gallium/auxiliary/postprocess/pp_run.c | 58 src/gallium/auxiliary/tgsi/tgsi_build.c | 1 src/gallium/auxiliary/tgsi/tgsi_dump.c | 7 src/gallium/auxiliary/tgsi/tgsi_exec.c | 8 src/gallium/auxiliary/tgsi/tgsi_exec.h | 3 src/gallium/auxiliary/tgsi/tgsi_info.c | 1 src/gallium/auxiliary/tgsi/tgsi_scan.c | 755 +- src/gallium/auxiliary/tgsi/tgsi_scan.h | 1 src/gallium/auxiliary/tgsi/tgsi_strings.c | 1 src/gallium/auxiliary/tgsi/tgsi_text.c | 16 src/gallium/auxiliary/tgsi/tgsi_transform.h | 2 src/gallium/auxiliary/tgsi/tgsi_ureg.c | 38 src/gallium/auxiliary/tgsi/tgsi_ureg.h | 3 src/gallium/auxiliary/util/u_blit.c | 52 src/gallium/auxiliary/util/u_box.h | 12 src/gallium/auxiliary/util/u_cpu_detect.c | 3 src/gallium/auxiliary/util/u_debug.c | 468 - src/gallium/auxiliary/util/u_debug.h | 39 src/gallium/auxiliary/util/u_debug_image.c | 348 + src/gallium/auxiliary/util/u_debug_image.h | 74 src/gallium/auxiliary/util/u_debug_stack.c | 61 src/gallium/auxiliary/util/u_inlines.h | 11 src/gallium/auxiliary/util/u_pstipple.c | 4 src/gallium/auxiliary/util/u_pstipple.h | 5 src/gallium/auxiliary/util/u_staging.c | 50 src/gallium/auxiliary/util/u_staging.h | 24 src/gallium/auxiliary/vl/vl_zscan.c | 7 src/gallium/auxiliary/vl/vl_zscan.h | 1 src/gallium/docs/source/context.rst | 5 src/gallium/docs/source/screen.rst | 18 src/gallium/drivers/ddebug/dd_context.c | 28 src/gallium/drivers/ddebug/dd_pipe.h | 2 src/gallium/drivers/freedreno/a2xx/a2xx.xml.h | 11 src/gallium/drivers/freedreno/a3xx/a3xx.xml.h | 277 src/gallium/drivers/freedreno/a3xx/fd3_emit.c | 3 src/gallium/drivers/freedreno/a4xx/a4xx.xml.h | 1042 +++ src/gallium/drivers/freedreno/a4xx/fd4_context.h | 2 src/gallium/drivers/freedreno/a4xx/fd4_emit.c | 3 src/gallium/drivers/freedreno/a4xx/fd4_query.c | 138 src/gallium/drivers/freedreno/adreno_common.xml.h | 13 src/gallium/drivers/freedreno/adreno_pm4.xml.h | 42 src/gallium/drivers/freedreno/freedreno_context.h | 3 src/gallium/drivers/freedreno/freedreno_query.h | 12 src/gallium/drivers/freedreno/freedreno_query_hw.c | 33 src/gallium/drivers/freedreno/freedreno_query_hw.h | 6 src/gallium/drivers/freedreno/freedreno_screen.c | 22 src/gallium/drivers/freedreno/freedreno_screen.h | 1 src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c | 32 src/gallium/drivers/freedreno/ir3/ir3_ra.c | 30 src/gallium/drivers/i915/i915_screen.c | 3 src/gallium/drivers/ilo/ilo_draw.c | 2 src/gallium/drivers/ilo/ilo_gpgpu.c | 8 src/gallium/drivers/ilo/ilo_query.c | 9 src/gallium/drivers/ilo/ilo_render.c | 2 src/gallium/drivers/ilo/ilo_screen.c | 7 src/gallium/drivers/ilo/ilo_state.c | 2 src/gallium/drivers/llvmpipe/Makefile.am | 4 src/gallium/drivers/llvmpipe/SConscript | 2 src/gallium/drivers/llvmpipe/lp_flush.c | 1 src/gallium/drivers/llvmpipe/lp_rast.c | 8 src/gallium/drivers/llvmpipe/lp_screen.c | 4 src/gallium/drivers/llvmpipe/lp_setup_context.h | 15 src/gallium/drivers/llvmpipe/lp_setup_line.c | 20 src/gallium/drivers/llvmpipe/lp_setup_tri.c | 20 src/gallium/drivers/nouveau/Makefile.sources | 5 src/gallium/drivers/nouveau/codegen/nv50_ir.h | 2 src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp | 22 src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp | 97 src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp | 5 src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp | 39 src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp | 54 src/gallium/drivers/nouveau/codegen/nv50_ir_inlines.h | 4 src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp | 103 src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.h | 1 src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 35 src/gallium/drivers/nouveau/codegen/nv50_ir_print.cpp | 10 src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp | 2 src/gallium/drivers/nouveau/codegen/nv50_ir_target.cpp | 1 src/gallium/drivers/nouveau/nv30/nv30_query.c | 7 src/gallium/drivers/nouveau/nv30/nv30_screen.c | 6 src/gallium/drivers/nouveau/nv50/g80_defs.xml.h | 279 src/gallium/drivers/nouveau/nv50/g80_texture.xml.h | 451 + src/gallium/drivers/nouveau/nv50/nv50_compute.c | 16 src/gallium/drivers/nouveau/nv50/nv50_context.h | 8 src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h | 263 src/gallium/drivers/nouveau/nv50/nv50_formats.c | 744 +- src/gallium/drivers/nouveau/nv50/nv50_program.c | 9 src/gallium/drivers/nouveau/nv50/nv50_query_hw.c | 6 src/gallium/drivers/nouveau/nv50/nv50_query_hw_sm.c | 12 src/gallium/drivers/nouveau/nv50/nv50_screen.c | 13 src/gallium/drivers/nouveau/nv50/nv50_screen.h | 18 src/gallium/drivers/nouveau/nv50/nv50_state.c | 69 src/gallium/drivers/nouveau/nv50/nv50_state_validate.c | 3 src/gallium/drivers/nouveau/nv50/nv50_stateobj_tex.h | 1 src/gallium/drivers/nouveau/nv50/nv50_surface.c | 38 src/gallium/drivers/nouveau/nv50/nv50_tex.c | 92 src/gallium/drivers/nouveau/nv50/nv50_texture.xml.h | 306 src/gallium/drivers/nouveau/nv50/nv50_transfer.c | 6 src/gallium/drivers/nouveau/nv50/nv50_vbo.c | 13 src/gallium/drivers/nouveau/nv_object.xml.h | 2 src/gallium/drivers/nouveau/nvc0/gm107_texture.xml.h | 365 + src/gallium/drivers/nouveau/nvc0/mme/Makefile | 2 src/gallium/drivers/nouveau/nvc0/mme/com9097.mme | 49 src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h | 33 src/gallium/drivers/nouveau/nvc0/mme/com90c0.mme | 24 src/gallium/drivers/nouveau/nvc0/mme/com90c0.mme.h | 19 src/gallium/drivers/nouveau/nvc0/nvc0_compute.c | 231 src/gallium/drivers/nouveau/nvc0/nvc0_compute.h | 1 src/gallium/drivers/nouveau/nvc0/nvc0_context.c | 41 src/gallium/drivers/nouveau/nvc0/nvc0_context.h | 18 src/gallium/drivers/nouveau/nvc0/nvc0_macros.h | 4 src/gallium/drivers/nouveau/nvc0/nvc0_program.c | 3 src/gallium/drivers/nouveau/nvc0/nvc0_query.c | 21 src/gallium/drivers/nouveau/nvc0/nvc0_query.h | 7 src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c | 123 src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.h | 2 src/gallium/drivers/nouveau/nvc0/nvc0_query_hw_sm.c | 12 src/gallium/drivers/nouveau/nvc0/nvc0_screen.c | 58 src/gallium/drivers/nouveau/nvc0/nvc0_screen.h | 21 src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c | 2 src/gallium/drivers/nouveau/nvc0/nvc0_state.c | 34 src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c | 44 src/gallium/drivers/nouveau/nvc0/nvc0_surface.c | 36 src/gallium/drivers/nouveau/nvc0/nvc0_tex.c | 385 - src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c | 2 src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c | 38 src/gallium/drivers/nouveau/nvc0/nve4_compute.c | 28 src/gallium/drivers/nouveau/nvc0/nve4_compute.h | 1 src/gallium/drivers/r300/r300_screen.c | 10 src/gallium/drivers/r300/r300_transfer.c | 2 src/gallium/drivers/r600/evergreen_compute.c | 94 src/gallium/drivers/r600/evergreen_compute_internal.h | 19 src/gallium/drivers/r600/evergreen_state.c | 12 src/gallium/drivers/r600/r600_llvm.c | 5 src/gallium/drivers/r600/r600_pipe.c | 17 src/gallium/drivers/r600/r600_uvd.c | 2 src/gallium/drivers/radeon/r600_buffer_common.c | 4 src/gallium/drivers/radeon/r600_cs.h | 2 src/gallium/drivers/radeon/r600_perfcounter.c | 38 src/gallium/drivers/radeon/r600_pipe_common.c | 200 src/gallium/drivers/radeon/r600_pipe_common.h | 13 src/gallium/drivers/radeon/r600_query.c | 94 src/gallium/drivers/radeon/r600_query.h | 32 src/gallium/drivers/radeon/r600_texture.c | 48 src/gallium/drivers/radeon/radeon_elf_util.c | 26 src/gallium/drivers/radeon/radeon_elf_util.h | 14 src/gallium/drivers/radeon/radeon_llvm.h | 7 src/gallium/drivers/radeon/radeon_llvm_emit.c | 13 src/gallium/drivers/radeon/radeon_llvm_emit.h | 1 src/gallium/drivers/radeon/radeon_llvm_util.c | 6 src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c | 107 src/gallium/drivers/radeon/radeon_uvd.c | 3 src/gallium/drivers/radeon/radeon_winsys.h | 49 src/gallium/drivers/radeonsi/cik_sdma.c | 2 src/gallium/drivers/radeonsi/si_blit.c | 2 src/gallium/drivers/radeonsi/si_compute.c | 86 src/gallium/drivers/radeonsi/si_descriptors.c | 116 src/gallium/drivers/radeonsi/si_hw_context.c | 3 src/gallium/drivers/radeonsi/si_perfcounter.c | 121 src/gallium/drivers/radeonsi/si_pipe.c | 108 src/gallium/drivers/radeonsi/si_pipe.h | 31 src/gallium/drivers/radeonsi/si_shader.c | 3391 +++++++--- src/gallium/drivers/radeonsi/si_shader.h | 221 src/gallium/drivers/radeonsi/si_state.c | 365 - src/gallium/drivers/radeonsi/si_state.h | 24 src/gallium/drivers/radeonsi/si_state_shaders.c | 666 + src/gallium/drivers/radeonsi/sid.h | 3 src/gallium/drivers/softpipe/Makefile.am | 2 src/gallium/drivers/softpipe/SConscript | 2 src/gallium/drivers/softpipe/sp_flush.c | 1 src/gallium/drivers/softpipe/sp_screen.c | 5 src/gallium/drivers/svga/svga_pipe_flush.c | 1 src/gallium/drivers/svga/svga_screen.c | 13 src/gallium/drivers/svga/svga_tgsi_vgpu10.c | 4 src/gallium/drivers/trace/Makefile.am | 2 src/gallium/drivers/trace/SConscript | 2 src/gallium/drivers/trace/tr_context.c | 271 src/gallium/drivers/trace/tr_dump_state.c | 60 src/gallium/drivers/trace/tr_dump_state.h | 4 src/gallium/drivers/trace/tr_screen.c | 25 src/gallium/drivers/vc4/vc4_nir_lower_txf_ms.c | 6 src/gallium/drivers/vc4/vc4_program.c | 4 src/gallium/drivers/vc4/vc4_qir.c | 1 src/gallium/drivers/vc4/vc4_qir_schedule.c | 2 src/gallium/drivers/vc4/vc4_qpu_emit.c | 2 src/gallium/drivers/vc4/vc4_screen.c | 7 src/gallium/drivers/virgl/virgl_screen.c | 4 src/gallium/include/pipe/p_context.h | 53 src/gallium/include/pipe/p_defines.h | 22 src/gallium/include/pipe/p_screen.h | 6 src/gallium/include/pipe/p_shader_tokens.h | 4 src/gallium/include/pipe/p_state.h | 56 src/gallium/state_trackers/clover/core/kernel.cpp | 13 src/gallium/state_trackers/nine/Makefile.sources | 3 src/gallium/state_trackers/nine/adapter9.c | 55 src/gallium/state_trackers/nine/adapter9.h | 18 src/gallium/state_trackers/nine/authenticatedchannel9.c | 10 src/gallium/state_trackers/nine/authenticatedchannel9.h | 10 src/gallium/state_trackers/nine/basetexture9.c | 16 src/gallium/state_trackers/nine/basetexture9.h | 14 src/gallium/state_trackers/nine/buffer9.c | 248 src/gallium/state_trackers/nine/buffer9.h | 101 src/gallium/state_trackers/nine/cryptosession9.c | 18 src/gallium/state_trackers/nine/cryptosession9.h | 18 src/gallium/state_trackers/nine/cubetexture9.c | 27 src/gallium/state_trackers/nine/cubetexture9.h | 10 src/gallium/state_trackers/nine/device9.c | 403 - src/gallium/state_trackers/nine/device9.h | 246 src/gallium/state_trackers/nine/device9ex.c | 88 src/gallium/state_trackers/nine/device9ex.h | 47 src/gallium/state_trackers/nine/device9video.c | 6 src/gallium/state_trackers/nine/device9video.h | 6 src/gallium/state_trackers/nine/guid.c | 18 src/gallium/state_trackers/nine/guid.h | 4 src/gallium/state_trackers/nine/indexbuffer9.c | 107 src/gallium/state_trackers/nine/indexbuffer9.h | 15 src/gallium/state_trackers/nine/iunknown.c | 8 src/gallium/state_trackers/nine/iunknown.h | 9 src/gallium/state_trackers/nine/nine_ff.c | 117 src/gallium/state_trackers/nine/nine_flags.h | 14 src/gallium/state_trackers/nine/nine_limits.h | 211 src/gallium/state_trackers/nine/nine_lock.c | 444 - src/gallium/state_trackers/nine/nine_pdata.h | 1 src/gallium/state_trackers/nine/nine_pipe.c | 11 src/gallium/state_trackers/nine/nine_pipe.h | 8 src/gallium/state_trackers/nine/nine_shader.c | 57 src/gallium/state_trackers/nine/nine_shader.h | 1 src/gallium/state_trackers/nine/nine_state.c | 61 src/gallium/state_trackers/nine/nine_state.h | 39 src/gallium/state_trackers/nine/nineexoverlayextension.c | 2 src/gallium/state_trackers/nine/nineexoverlayextension.h | 2 src/gallium/state_trackers/nine/pixelshader9.c | 3 src/gallium/state_trackers/nine/pixelshader9.h | 7 src/gallium/state_trackers/nine/query9.c | 8 src/gallium/state_trackers/nine/query9.h | 8 src/gallium/state_trackers/nine/resource9.c | 63 src/gallium/state_trackers/nine/resource9.h | 16 src/gallium/state_trackers/nine/stateblock9.c | 54 src/gallium/state_trackers/nine/stateblock9.h | 4 src/gallium/state_trackers/nine/surface9.c | 43 src/gallium/state_trackers/nine/surface9.h | 12 src/gallium/state_trackers/nine/swapchain9.c | 70 src/gallium/state_trackers/nine/swapchain9.h | 15 src/gallium/state_trackers/nine/swapchain9ex.c | 6 src/gallium/state_trackers/nine/swapchain9ex.h | 6 src/gallium/state_trackers/nine/texture9.c | 50 src/gallium/state_trackers/nine/texture9.h | 10 src/gallium/state_trackers/nine/vertexbuffer9.c | 135 src/gallium/state_trackers/nine/vertexbuffer9.h | 19 src/gallium/state_trackers/nine/vertexdeclaration9.c | 29 src/gallium/state_trackers/nine/vertexdeclaration9.h | 4 src/gallium/state_trackers/nine/vertexshader9.c | 2 src/gallium/state_trackers/nine/vertexshader9.h | 2 src/gallium/state_trackers/nine/volume9.c | 29 src/gallium/state_trackers/nine/volume9.h | 14 src/gallium/state_trackers/nine/volumetexture9.c | 23 src/gallium/state_trackers/nine/volumetexture9.h | 10 src/gallium/state_trackers/omx/vid_dec_h264.c | 7 src/gallium/targets/d3dadapter9/drm.c | 61 src/gallium/targets/graw-null/graw_util.c | 1 src/gallium/tests/graw/graw_util.h | 1 src/gallium/tests/trivial/compute.c | 11 src/gallium/tests/trivial/quad-tex.c | 2 src/gallium/tests/trivial/tri.c | 2 src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 41 src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c | 1 src/gallium/winsys/radeon/drm/radeon_drm_bo.c | 8 src/gallium/winsys/radeon/drm/radeon_drm_cs.c | 6 src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 70 src/glx/dri2_glx.c | 11 src/glx/dri3_glx.c | 7 src/glx/dri_common.c | 28 src/glx/drisw_glx.c | 4 src/glx/glxextensions.c | 1 src/glx/glxextensions.h | 1 src/mapi/glapi/gen/gl_API.xml | 23 src/mapi/glapi/gen/gl_genexec.py | 1 src/mesa/Makefile.sources | 8 src/mesa/drivers/common/meta.c | 30 src/mesa/drivers/common/meta.h | 5 src/mesa/drivers/common/meta_copy_image.c | 14 src/mesa/drivers/dri/common/dri_util.c | 1 src/mesa/drivers/dri/common/xmlpool/t_options.h | 5 src/mesa/drivers/dri/i915/intel_tex_validate.c | 1 src/mesa/drivers/dri/i965/Makefile.sources | 2 src/mesa/drivers/dri/i965/brw_blorp.cpp | 10 src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 7 src/mesa/drivers/dri/i965/brw_blorp_blit_eu.cpp | 2 src/mesa/drivers/dri/i965/brw_compiler.h | 5 src/mesa/drivers/dri/i965/brw_compute.c | 96 src/mesa/drivers/dri/i965/brw_context.c | 42 src/mesa/drivers/dri/i965/brw_context.h | 9 src/mesa/drivers/dri/i965/brw_defines.h | 44 src/mesa/drivers/dri/i965/brw_device_info.c | 19 src/mesa/drivers/dri/i965/brw_draw.c | 18 src/mesa/drivers/dri/i965/brw_fs.cpp | 156 src/mesa/drivers/dri/i965/brw_fs.h | 8 src/mesa/drivers/dri/i965/brw_fs_builder.h | 12 src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp | 6 src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp | 2 src/mesa/drivers/dri/i965/brw_fs_generator.cpp | 20 src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 72 src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp | 2 src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 40 src/mesa/drivers/dri/i965/brw_link.cpp | 2 src/mesa/drivers/dri/i965/brw_meta_fast_clear.c | 22 src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c | 23 src/mesa/drivers/dri/i965/brw_meta_updownsample.c | 38 src/mesa/drivers/dri/i965/brw_misc_state.c | 2 src/mesa/drivers/dri/i965/brw_nir.c | 23 src/mesa/drivers/dri/i965/brw_nir.h | 7 src/mesa/drivers/dri/i965/brw_nir_attribute_workarounds.c | 176 src/mesa/drivers/dri/i965/brw_pipe_control.c | 2 src/mesa/drivers/dri/i965/brw_program.c | 2 src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp | 7 src/mesa/drivers/dri/i965/brw_shader.cpp | 3 src/mesa/drivers/dri/i965/brw_state.h | 1 src/mesa/drivers/dri/i965/brw_state_cache.c | 23 src/mesa/drivers/dri/i965/brw_state_upload.c | 4 src/mesa/drivers/dri/i965/brw_surface_formats.c | 2 src/mesa/drivers/dri/i965/brw_vec4.cpp | 71 src/mesa/drivers/dri/i965/brw_vec4.h | 5 src/mesa/drivers/dri/i965/brw_vec4_builder.h | 17 src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp | 14 src/mesa/drivers/dri/i965/brw_vec4_generator.cpp | 23 src/mesa/drivers/dri/i965/brw_vec4_gs_nir.cpp | 4 src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp | 25 src/mesa/drivers/dri/i965/brw_vec4_nir.cpp | 49 src/mesa/drivers/dri/i965/brw_vec4_tcs.cpp | 4 src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 27 src/mesa/drivers/dri/i965/brw_vec4_vs_visitor.cpp | 109 src/mesa/drivers/dri/i965/brw_wm_iz.cpp | 9 src/mesa/drivers/dri/i965/brw_wm_state.c | 3 src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 43 src/mesa/drivers/dri/i965/gen6_constant_state.c | 190 src/mesa/drivers/dri/i965/gen6_vs_state.c | 89 src/mesa/drivers/dri/i965/gen7_l3_state.c | 41 src/mesa/drivers/dri/i965/gen7_vs_state.c | 75 src/mesa/drivers/dri/i965/gen7_wm_state.c | 13 src/mesa/drivers/dri/i965/gen8_gs_state.c | 2 src/mesa/drivers/dri/i965/gen8_ps_state.c | 9 src/mesa/drivers/dri/i965/gen8_surface_state.c | 68 src/mesa/drivers/dri/i965/intel_blit.c | 4 src/mesa/drivers/dri/i965/intel_copy_image.c | 18 src/mesa/drivers/dri/i965/intel_extensions.c | 3 src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 222 src/mesa/drivers/dri/i965/intel_mipmap_tree.h | 24 src/mesa/drivers/dri/i965/intel_pixel_bitmap.c | 2 src/mesa/drivers/dri/i965/intel_pixel_read.c | 2 src/mesa/drivers/dri/i965/intel_reg.h | 2 src/mesa/drivers/dri/i965/intel_tex_image.c | 2 src/mesa/drivers/dri/i965/intel_tex_subimage.c | 2 src/mesa/drivers/dri/i965/intel_tex_validate.c | 1 src/mesa/drivers/dri/i965/intel_tiled_memcpy.c | 69 src/mesa/drivers/dri/i965/test_vec4_cmod_propagation.cpp | 14 src/mesa/drivers/dri/i965/test_vec4_copy_propagation.cpp | 10 src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp | 10 src/mesa/main/attrib.c | 4 src/mesa/main/bufferobj.c | 77 src/mesa/main/buffers.c | 6 src/mesa/main/clear.c | 87 src/mesa/main/compute.c | 3 src/mesa/main/config.h | 11 src/mesa/main/context.c | 3 src/mesa/main/dd.h | 26 src/mesa/main/debug_output.c | 1301 +++ src/mesa/main/debug_output.h | 107 src/mesa/main/dlist.c | 456 + src/mesa/main/dlist.h | 85 src/mesa/main/enable.c | 5 src/mesa/main/errors.c | 1286 --- src/mesa/main/errors.h | 48 src/mesa/main/extensions_table.h | 5 src/mesa/main/fbobject.c | 147 src/mesa/main/fbobject.h | 8 src/mesa/main/format_utils.c | 74 src/mesa/main/formatquery.c | 5 src/mesa/main/framebuffer.h | 5 src/mesa/main/genmipmap.c | 2 src/mesa/main/get.c | 64 src/mesa/main/get_hash_params.py | 33 src/mesa/main/getstring.c | 1 src/mesa/main/glformats.c | 8 src/mesa/main/hash.c | 4 src/mesa/main/image.c | 33 src/mesa/main/imports.c | 8 src/mesa/main/imports.h | 3 src/mesa/main/mipmap.c | 21 src/mesa/main/mtypes.h | 47 src/mesa/main/objectlabel.c | 13 src/mesa/main/pipelineobj.c | 5 src/mesa/main/program_resource.c | 4 src/mesa/main/queryobj.c | 280 src/mesa/main/readpix.c | 69 src/mesa/main/shaderapi.c | 1 src/mesa/main/shared.c | 17 src/mesa/main/state.c | 2 src/mesa/main/syncobj.c | 89 src/mesa/main/syncobj.h | 11 src/mesa/main/texgetimage.c | 14 src/mesa/main/teximage.c | 50 src/mesa/main/teximage.h | 60 src/mesa/main/texobj.c | 33 src/mesa/main/texobj.h | 19 src/mesa/main/texparam.c | 23 src/mesa/main/texstate.c | 2 src/mesa/main/texstore.c | 3 src/mesa/main/textureview.c | 9 src/mesa/main/transformfeedback.h | 3 src/mesa/main/viewport.c | 4 src/mesa/program/ir_to_mesa.cpp | 93 src/mesa/program/prog_parameter.c | 70 src/mesa/program/prog_parameter.h | 7 src/mesa/program/prog_statevars.c | 3 src/mesa/program/prog_to_nir.c | 5 src/mesa/program/program.c | 7 src/mesa/program/sampler.cpp | 144 src/mesa/program/sampler.h | 39 src/mesa/state_tracker/st_atom.c | 60 src/mesa/state_tracker/st_atom.h | 17 src/mesa/state_tracker/st_atom_atomicbuf.c | 26 src/mesa/state_tracker/st_atom_constbuf.c | 46 src/mesa/state_tracker/st_atom_image.c | 236 src/mesa/state_tracker/st_atom_sampler.c | 8 src/mesa/state_tracker/st_atom_shader.c | 53 src/mesa/state_tracker/st_atom_storagebuf.c | 25 src/mesa/state_tracker/st_atom_texture.c | 62 src/mesa/state_tracker/st_cb_bitmap.c | 515 - src/mesa/state_tracker/st_cb_bitmap.h | 3 src/mesa/state_tracker/st_cb_bufferobjects.c | 3 src/mesa/state_tracker/st_cb_clear.c | 162 src/mesa/state_tracker/st_cb_compute.c | 85 src/mesa/state_tracker/st_cb_compute.h | 38 src/mesa/state_tracker/st_cb_drawpixels.c | 329 src/mesa/state_tracker/st_cb_drawtex.c | 62 src/mesa/state_tracker/st_cb_msaa.c | 2 src/mesa/state_tracker/st_cb_program.c | 61 src/mesa/state_tracker/st_cb_queryobj.c | 109 src/mesa/state_tracker/st_cb_rasterpos.c | 2 src/mesa/state_tracker/st_cb_readpixels.c | 2 src/mesa/state_tracker/st_cb_texture.c | 1183 +++ src/mesa/state_tracker/st_cb_texture.h | 5 src/mesa/state_tracker/st_cb_texturebarrier.c | 3 src/mesa/state_tracker/st_context.c | 84 src/mesa/state_tracker/st_context.h | 56 src/mesa/state_tracker/st_draw.c | 96 src/mesa/state_tracker/st_draw.h | 7 src/mesa/state_tracker/st_draw_feedback.c | 2 src/mesa/state_tracker/st_extensions.c | 73 src/mesa/state_tracker/st_format.c | 42 src/mesa/state_tracker/st_format.h | 8 src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 502 + src/mesa/state_tracker/st_manager.c | 7 src/mesa/state_tracker/st_program.c | 423 - src/mesa/state_tracker/st_program.h | 127 src/mesa/vbo/vbo.h | 3 src/mesa/vbo/vbo_exec_array.c | 148 src/mesa/vbo/vbo_minmax_index.c | 378 + src/mesa/x86-64/xform4.S | 40 src/util/Makefile.am | 2 src/util/SConscript | 2 src/util/hash_table.c | 29 src/util/hash_table.h | 11 src/util/set.c | 3 src/util/tests/hash_table/Makefile.am | 1 src/util/tests/hash_table/clear.c | 91 src/util/u_atomic.h | 59 569 files changed, 22740 insertions(+), 12283 deletions(-)
New commits: commit 35b7adb937eeefd4ac8ca3ebb2c7347cc7bcbcf9 Author: Emil Velikov <[email protected]> Date: Mon Feb 22 10:14:23 2016 +0000 Update version to 11.2.0-rc1 Signed-off-by: Emil Velikov <[email protected]> diff --git a/VERSION b/VERSION index 96cb839..94ba9ae 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -11.2.0-devel +11.2.0-rc1 commit 4cd5e5b48e24a8b8ff7255022208d3e5fe6557d8 Author: Emil Velikov <[email protected]> Date: Mon Feb 22 10:22:21 2016 +0000 nouveau: update the Makefile.sources list Reflect the nv50->g80 change and the new gm107_texture header. Signed-off-by: Emil Velikov <[email protected]> diff --git a/src/gallium/drivers/nouveau/Makefile.sources b/src/gallium/drivers/nouveau/Makefile.sources index 31a9365..43ffce6 100644 --- a/src/gallium/drivers/nouveau/Makefile.sources +++ b/src/gallium/drivers/nouveau/Makefile.sources @@ -60,6 +60,8 @@ NV30_C_SOURCES := \ nv30/nvfx_vertprog.c NV50_C_SOURCES := \ + nv50/g80_defs.xml.h \ + nv50/g80_texture.xml.h \ nv50/nv50_2d.xml.h \ nv50/nv50_3ddefs.xml.h \ nv50/nv50_3d.xml.h \ @@ -68,7 +70,6 @@ NV50_C_SOURCES := \ nv50/nv50_compute.xml.h \ nv50/nv50_context.c \ nv50/nv50_context.h \ - nv50/nv50_defs.xml.h \ nv50/nv50_formats.c \ nv50/nv50_miptree.c \ nv50/nv50_program.c \ @@ -93,7 +94,6 @@ NV50_C_SOURCES := \ nv50/nv50_state_validate.c \ nv50/nv50_surface.c \ nv50/nv50_tex.c \ - nv50/nv50_texture.xml.h \ nv50/nv50_transfer.c \ nv50/nv50_transfer.h \ nv50/nv50_vbo.c \ @@ -147,6 +147,7 @@ NVC0_CODEGEN_SOURCES := \ codegen/nv50_ir_target_nvc0.h NVC0_C_SOURCES := \ + nvc0/gm107_texture.xml.h \ nvc0/nvc0_3d.xml.h \ nvc0/nvc0_compute.c \ nvc0/nvc0_compute.h \ commit ff360a52e6700d1085876169ed3b328910b394de Author: Marek Olšák <[email protected]> Date: Thu Feb 11 15:49:34 2016 +0100 radeonsi: implement binary shaders & shader cache in memory (v2) v2: handle _mesa_hash_table_insert failure other cosmetic changes Reviewed-by: Nicolai Hähnle <[email protected]> diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 30f3ec0..37fd4a2 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -564,7 +564,7 @@ static void si_destroy_screen(struct pipe_screen* pscreen) } } pipe_mutex_destroy(sscreen->shader_parts_mutex); - + si_destroy_shader_cache(sscreen); r600_destroy_common_screen(&sscreen->b); } @@ -612,7 +612,8 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws) sscreen->b.b.resource_create = r600_resource_create_common; if (!r600_common_screen_init(&sscreen->b, ws) || - !si_init_gs_info(sscreen)) { + !si_init_gs_info(sscreen) || + !si_init_shader_cache(sscreen)) { FREE(sscreen); return NULL; } diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index 1ac7bc4..ef860a5 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -80,6 +80,7 @@ #define SI_MAX_BORDER_COLORS 4096 struct si_compute; +struct hash_table; struct si_screen { struct r600_common_screen b; @@ -94,6 +95,21 @@ struct si_screen { struct si_shader_part *tcs_epilogs; struct si_shader_part *ps_prologs; struct si_shader_part *ps_epilogs; + + /* Shader cache in memory. + * + * Design & limitations: + * - The shader cache is per screen (= per process), never saved to + * disk, and skips redundant shader compilations from TGSI to bytecode. + * - It can only be used with one-variant-per-shader support, in which + * case only the main (typically middle) part of shaders is cached. + * - Only VS, TCS, TES, PS are cached, out of which only the hw VS + * variants of VS and TES are cached, so LS and ES aren't. + * - GS and CS aren't cached, but it's certainly possible to cache + * those as well. + */ + pipe_mutex shader_cache_mutex; + struct hash_table *shader_cache; }; struct si_blend_color { diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index b299b7b..ff5c24d 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -364,8 +364,10 @@ struct si_shader { struct r600_resource *bo; struct r600_resource *scratch_bo; union si_shader_key key; - struct radeon_shader_binary binary; bool is_binary_shared; + + /* The following data is all that's needed for binary shaders. */ + struct radeon_shader_binary binary; struct si_shader_config config; struct si_shader_info info; }; diff --git a/src/gallium/drivers/radeonsi/si_state.h b/src/gallium/drivers/radeonsi/si_state.h index f64c4d4..40792cb 100644 --- a/src/gallium/drivers/radeonsi/si_state.h +++ b/src/gallium/drivers/radeonsi/si_state.h @@ -280,6 +280,8 @@ si_create_sampler_view_custom(struct pipe_context *ctx, /* si_state_shader.c */ bool si_update_shaders(struct si_context *sctx); void si_init_shader_functions(struct si_context *sctx); +bool si_init_shader_cache(struct si_screen *sscreen); +void si_destroy_shader_cache(struct si_screen *sscreen); /* si_state_draw.c */ void si_emit_cache_flush(struct si_context *sctx, struct r600_atom *atom); diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index c62cbb7..a6753a7 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -32,10 +32,221 @@ #include "tgsi/tgsi_parse.h" #include "tgsi/tgsi_ureg.h" +#include "util/hash_table.h" +#include "util/u_hash.h" #include "util/u_memory.h" #include "util/u_prim.h" #include "util/u_simple_shaders.h" +/* SHADER_CACHE */ + +/** + * Return the TGSI binary in a buffer. The first 4 bytes contain its size as + * integer. + */ +static void *si_get_tgsi_binary(struct si_shader_selector *sel) +{ + unsigned tgsi_size = tgsi_num_tokens(sel->tokens) * + sizeof(struct tgsi_token); + unsigned size = 4 + tgsi_size + sizeof(sel->so); + char *result = (char*)MALLOC(size); + + if (!result) + return NULL; + + *((uint32_t*)result) = size; + memcpy(result + 4, sel->tokens, tgsi_size); + memcpy(result + 4 + tgsi_size, &sel->so, sizeof(sel->so)); + return result; +} + +/** Copy "data" to "ptr" and return the next dword following copied data. */ +static uint32_t *write_data(uint32_t *ptr, const void *data, unsigned size) +{ + memcpy(ptr, data, size); + ptr += DIV_ROUND_UP(size, 4); + return ptr; +} + +/** Read data from "ptr". Return the next dword following the data. */ +static uint32_t *read_data(uint32_t *ptr, void *data, unsigned size) +{ + memcpy(data, ptr, size); + ptr += DIV_ROUND_UP(size, 4); + return ptr; +} + +/** + * Write the size as uint followed by the data. Return the next dword + * following the copied data. + */ +static uint32_t *write_chunk(uint32_t *ptr, const void *data, unsigned size) +{ + *ptr++ = size; + return write_data(ptr, data, size); +} + +/** + * Read the size as uint followed by the data. Return both via parameters. + * Return the next dword following the data. + */ +static uint32_t *read_chunk(uint32_t *ptr, void **data, unsigned *size) +{ + *size = *ptr++; + assert(*data == NULL); + *data = malloc(*size); + return read_data(ptr, *data, *size); +} + +/** + * Return the shader binary in a buffer. The first 4 bytes contain its size + * as integer. + */ +static void *si_get_shader_binary(struct si_shader *shader) +{ + /* There is always a size of data followed by the data itself. */ + unsigned relocs_size = shader->binary.reloc_count * + sizeof(shader->binary.relocs[0]); + unsigned disasm_size = strlen(shader->binary.disasm_string) + 1; + unsigned size = + 4 + /* total size */ + 4 + /* CRC32 of the data below */ + align(sizeof(shader->config), 4) + + align(sizeof(shader->info), 4) + + 4 + align(shader->binary.code_size, 4) + + 4 + align(shader->binary.rodata_size, 4) + + 4 + align(relocs_size, 4) + + 4 + align(disasm_size, 4); + void *buffer = CALLOC(1, size); + uint32_t *ptr = (uint32_t*)buffer; + + if (!buffer) + return NULL; + + *ptr++ = size; + ptr++; /* CRC32 is calculated at the end. */ + + ptr = write_data(ptr, &shader->config, sizeof(shader->config)); + ptr = write_data(ptr, &shader->info, sizeof(shader->info)); + ptr = write_chunk(ptr, shader->binary.code, shader->binary.code_size); + ptr = write_chunk(ptr, shader->binary.rodata, shader->binary.rodata_size); + ptr = write_chunk(ptr, shader->binary.relocs, relocs_size); + ptr = write_chunk(ptr, shader->binary.disasm_string, disasm_size); + assert((char *)ptr - (char *)buffer == size); + + /* Compute CRC32. */ + ptr = (uint32_t*)buffer; + ptr++; + *ptr = util_hash_crc32(ptr + 1, size - 8); + + return buffer; +} + +static bool si_load_shader_binary(struct si_shader *shader, void *binary) +{ + uint32_t *ptr = (uint32_t*)binary; + uint32_t size = *ptr++; + uint32_t crc32 = *ptr++; + unsigned chunk_size; + + if (util_hash_crc32(ptr, size - 8) != crc32) { + fprintf(stderr, "radeonsi: binary shader has invalid CRC32\n"); + return false; + } + + ptr = read_data(ptr, &shader->config, sizeof(shader->config)); + ptr = read_data(ptr, &shader->info, sizeof(shader->info)); + ptr = read_chunk(ptr, (void**)&shader->binary.code, + &shader->binary.code_size); + ptr = read_chunk(ptr, (void**)&shader->binary.rodata, + &shader->binary.rodata_size); + ptr = read_chunk(ptr, (void**)&shader->binary.relocs, &chunk_size); + shader->binary.reloc_count = chunk_size / sizeof(shader->binary.relocs[0]); + ptr = read_chunk(ptr, (void**)&shader->binary.disasm_string, &chunk_size); + + return true; +} + +/** + * Insert a shader into the cache. It's assumed the shader is not in the cache. + * Use si_shader_cache_load_shader before calling this. + * + * Returns false on failure, in which case the tgsi_binary should be freed. + */ +static bool si_shader_cache_insert_shader(struct si_screen *sscreen, + void *tgsi_binary, + struct si_shader *shader) +{ + void *hw_binary = si_get_shader_binary(shader); + + if (!hw_binary) + return false; + + if (_mesa_hash_table_insert(sscreen->shader_cache, tgsi_binary, + hw_binary) == NULL) { + FREE(hw_binary); + return false; + } + + return true; +} + +static bool si_shader_cache_load_shader(struct si_screen *sscreen, + void *tgsi_binary, + struct si_shader *shader) +{ + struct hash_entry *entry = + _mesa_hash_table_search(sscreen->shader_cache, tgsi_binary); + if (!entry) + return false; + + return si_load_shader_binary(shader, entry->data); +} + +static uint32_t si_shader_cache_key_hash(const void *key) +{ + /* The first dword is the key size. */ + return util_hash_crc32(key, *(uint32_t*)key); +} + +static bool si_shader_cache_key_equals(const void *a, const void *b) +{ + uint32_t *keya = (uint32_t*)a; + uint32_t *keyb = (uint32_t*)b; + + /* The first dword is the key size. */ + if (*keya != *keyb) + return false; + + return memcmp(keya, keyb, *keya) == 0; +} + +static void si_destroy_shader_cache_entry(struct hash_entry *entry) +{ + FREE((void*)entry->key); + FREE(entry->data); +} + +bool si_init_shader_cache(struct si_screen *sscreen) +{ + pipe_mutex_init(sscreen->shader_cache_mutex); + sscreen->shader_cache = + _mesa_hash_table_create(NULL, + si_shader_cache_key_hash, + si_shader_cache_key_equals); + return sscreen->shader_cache != NULL; +} + +void si_destroy_shader_cache(struct si_screen *sscreen) +{ + if (sscreen->shader_cache) + _mesa_hash_table_destroy(sscreen->shader_cache, + si_destroy_shader_cache_entry); + pipe_mutex_destroy(sscreen->shader_cache_mutex); +} + +/* SHADER STATES */ + static void si_set_tesseval_regs(struct si_shader *shader, struct si_pm4_state *pm4) { @@ -936,17 +1147,37 @@ static void *si_create_shader_selector(struct pipe_context *ctx, if (sel->type != PIPE_SHADER_GEOMETRY && !sscreen->use_monolithic_shaders) { struct si_shader *shader = CALLOC_STRUCT(si_shader); + void *tgsi_binary; if (!shader) goto error; shader->selector = sel; - if (si_compile_tgsi_shader(sscreen, sctx->tm, shader, false, - &sctx->b.debug) != 0) { - FREE(shader); - goto error; + tgsi_binary = si_get_tgsi_binary(sel); + + /* Try to load the shader from the shader cache. */ + pipe_mutex_lock(sscreen->shader_cache_mutex); + + if (tgsi_binary && + si_shader_cache_load_shader(sscreen, tgsi_binary, shader)) { + FREE(tgsi_binary); + } else { + /* Compile the shader if it hasn't been loaded from the cache. */ + if (si_compile_tgsi_shader(sscreen, sctx->tm, shader, false, + &sctx->b.debug) != 0) { + FREE(shader); + FREE(tgsi_binary); + pipe_mutex_unlock(sscreen->shader_cache_mutex); + goto error; + } + + if (tgsi_binary && + !si_shader_cache_insert_shader(sscreen, tgsi_binary, shader)) + FREE(tgsi_binary); } + pipe_mutex_unlock(sscreen->shader_cache_mutex); + sel->main_shader_part = shader; }

